diff options
Diffstat (limited to 'net/sunrpc/sched.c')
| -rw-r--r-- | net/sunrpc/sched.c | 9 | 
1 files changed, 7 insertions, 2 deletions
diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c index fb20f25ddec..f8529fc8e54 100644 --- a/net/sunrpc/sched.c +++ b/net/sunrpc/sched.c @@ -180,6 +180,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;  	queue->qlen++; +	/* barrier matches the read in rpc_wake_up_task_queue_locked() */ +	smp_wmb();  	rpc_set_queued(task);  	dprintk("RPC: %5u added to queue %p \"%s\"\n", @@ -430,8 +432,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); +	}  }  /*  |