SUNRPC: Don't wake queued RPC calls multiple times in xprt_transmit
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Wed, 29 Aug 2018 13:30:19 +0000 (09:30 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Sun, 30 Sep 2018 19:35:14 +0000 (15:35 -0400)
Rather than waking up the entire queue of RPC messages a second time,
just wake up the task that was put to sleep.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
net/sunrpc/xprt.c

index 649a40cfae6dd157290857467e5b63325c5c877d..3a3b3445a7c0c21460cb7c8cd6c9237a0cf03649 100644 (file)
@@ -1079,13 +1079,10 @@ void xprt_transmit(struct rpc_task *task)
                spin_lock(&xprt->recv_lock);
                if (test_bit(RPC_TASK_NEED_RECV, &task->tk_runstate)) {
                        rpc_sleep_on(&xprt->pending, task, xprt_timer);
-                       /*
-                        * Send an extra queue wakeup call if the
-                        * connection was dropped in case the call to
-                        * rpc_sleep_on() raced.
-                        */
+                       /* Wake up immediately if the connection was dropped */
                        if (!xprt_connected(xprt))
-                               xprt_wake_pending_tasks(xprt, -ENOTCONN);
+                               rpc_wake_up_queued_task_set_status(&xprt->pending,
+                                               task, -ENOTCONN);
                }
                spin_unlock(&xprt->recv_lock);
        }