Patchwork [3.5.y.z,extended,stable] Patch "SUNRPC: Add barriers to ensure read ordering in" has been added to staging queue

mail settings
Submitter Luis Henriques
Date April 1, 2013, 3:05 p.m.
Message ID <>
Download mbox | patch
Permalink /patch/232754/
State New
Headers show


Luis Henriques - April 1, 2013, 3:05 p.m.
This is a note to let you know that I have just added a patch titled

    SUNRPC: Add barriers to ensure read ordering in

to the linux-3.5.y-queue branch of the 3.5.y.z extended stable tree 
which can be found at:;a=shortlog;h=refs/heads/linux-3.5.y-queue

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.5.y.z tree, see



From a34ac4a9d0f6f9d8aff195e82187f052b95eb38a Mon Sep 17 00:00:00 2001
From: Trond Myklebust <>
Date: Mon, 25 Mar 2013 11:23:40 -0400
Subject: [PATCH] SUNRPC: Add barriers to ensure read ordering in

commit 1166fde6a923c30f4351515b6a9a1efc513e7d00 upstream.

We need to be careful when testing task->tk_waitqueue in
rpc_wake_up_task_queue_locked, because it can be changed while we
are holding the queue->lock.
By adding appropriate memory barriers, we can ensure that it is safe to
test task->tk_waitqueue for equality if the RPC_TASK_QUEUED bit is set.

Signed-off-by: Trond Myklebust <>
Signed-off-by: Luis Henriques <>
 net/sunrpc/sched.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)



diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c
index 85b9235..72d89e1 100644
--- a/net/sunrpc/sched.c
+++ b/net/sunrpc/sched.c
@@ -143,6 +143,8 @@  static void __rpc_add_wait_queue(struct rpc_wait_queue *queue,
 		list_add_tail(&task->u.tk_wait.list, &queue->tasks[0]);
 	task->tk_waitqueue = queue;
+	/* barrier matches the read in rpc_wake_up_task_queue_locked() */
+	smp_wmb();

 	dprintk("RPC: %5u added to queue %p \"%s\"\n",
@@ -399,8 +401,11 @@  static void __rpc_do_wake_up_task(struct rpc_wait_queue *queue, struct rpc_task
 static void rpc_wake_up_task_queue_locked(struct rpc_wait_queue *queue, struct rpc_task *task)
-	if (RPC_IS_QUEUED(task) && task->tk_waitqueue == queue)
-		__rpc_do_wake_up_task(queue, task);
+	if (RPC_IS_QUEUED(task)) {
+		smp_rmb();
+		if (task->tk_waitqueue == queue)
+			__rpc_do_wake_up_task(queue, task);
+	}