|
@@ -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);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/*
|