xprtrdma: Wake tasks after connect worker fails
authorChuck Lever <chuck.lever@oracle.com>
Wed, 23 Oct 2019 14:01:52 +0000 (10:01 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Thu, 24 Oct 2019 14:30:40 +0000 (10:30 -0400)
Pending tasks are currently never awoken when the connect worker
fails. The reason is that XPRT_CONNECTED is always clear after a
failure return of rpcrdma_ep_connect, thus the
xprt_test_and_clear_connected() check in xprt_rdma_connect_worker()
always fails.

- xprt_rdma_close always clears XPRT_CONNECTED.

- rpcrdma_ep_connect always clears XPRT_CONNECTED.

After reviewing the TCP connect worker, it appears that there's no
need for extra test_and_set paranoia in xprt_rdma_connect_worker.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
net/sunrpc/xprtrdma/transport.c

index 0711308277ebdad3169687b7bdf4bb78c43a8d85..361e59146807f2d8fdf69fba05757726c03c27c9 100644 (file)
@@ -243,16 +243,13 @@ xprt_rdma_connect_worker(struct work_struct *work)
        rc = rpcrdma_ep_connect(&r_xprt->rx_ep, &r_xprt->rx_ia);
        xprt_clear_connecting(xprt);
        if (r_xprt->rx_ep.rep_connected > 0) {
-               if (!xprt_test_and_set_connected(xprt)) {
-                       xprt->stat.connect_count++;
-                       xprt->stat.connect_time += (long)jiffies -
-                                                  xprt->stat.connect_start;
-                       xprt_wake_pending_tasks(xprt, -EAGAIN);
-               }
-       } else {
-               if (xprt_test_and_clear_connected(xprt))
-                       xprt_wake_pending_tasks(xprt, rc);
+               xprt->stat.connect_count++;
+               xprt->stat.connect_time += (long)jiffies -
+                                          xprt->stat.connect_start;
+               xprt_set_connected(xprt);
+               rc = -EAGAIN;
        }
+       xprt_wake_pending_tasks(xprt, rc);
 }
 
 /**