xprtrdma: Remove rpcrdma_ia::ri_flags
authorChuck Lever <chuck.lever@oracle.com>
Fri, 21 Feb 2020 22:00:44 +0000 (17:00 -0500)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Fri, 27 Mar 2020 14:47:25 +0000 (10:47 -0400)
Clean up:
The upper layer serializes calls to xprt_rdma_close, so there is no
need for an atomic bit operation, saving 8 bytes in rpcrdma_ia.

This enables merging rpcrdma_ia_remove directly into the disconnect
logic.

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

index 745dfd1..d7b7dab 100644 (file)
@@ -385,26 +385,11 @@ out2:
 void xprt_rdma_close(struct rpc_xprt *xprt)
 {
        struct rpcrdma_xprt *r_xprt = rpcx_to_rdmax(xprt);
-       struct rpcrdma_ep *ep = &r_xprt->rx_ep;
-       struct rpcrdma_ia *ia = &r_xprt->rx_ia;
-
-       might_sleep();
 
        trace_xprtrdma_op_close(r_xprt);
 
-       /* Prevent marshaling and sending of new requests */
-       xprt_clear_connected(xprt);
-
-       if (test_and_clear_bit(RPCRDMA_IAF_REMOVING, &ia->ri_flags)) {
-               rpcrdma_ia_remove(ia);
-               goto out;
-       }
-
-       if (ep->rep_connected == -ENODEV)
-               return;
        rpcrdma_xprt_disconnect(r_xprt);
 
-out:
        xprt->reestablish_timeout = 0;
        ++xprt->connect_cookie;
        xprt_disconnect_done(xprt);
index 3df20f3..a7f46bb 100644 (file)
@@ -250,12 +250,11 @@ rpcrdma_cm_event_handler(struct rdma_cm_id *id, struct rdma_cm_event *event)
                        rpcrdma_addrstr(r_xprt), rpcrdma_portstr(r_xprt));
 #endif
                init_completion(&ia->ri_remove_done);
-               set_bit(RPCRDMA_IAF_REMOVING, &ia->ri_flags);
                ep->rep_connected = -ENODEV;
                xprt_force_disconnect(xprt);
                wait_for_completion(&ia->ri_remove_done);
+               trace_xprtrdma_remove(r_xprt);
 
-               ia->ri_id = NULL;
                /* Return 1 to ensure the core destroys the id. */
                return 1;
        case RDMA_CM_EVENT_ESTABLISHED:
@@ -345,37 +344,6 @@ out:
  * Exported functions.
  */
 
-/**
- * rpcrdma_ia_remove - Handle device driver unload
- * @ia: interface adapter being removed
- *
- * Divest transport H/W resources associated with this adapter,
- * but allow it to be restored later.
- *
- * Caller must hold the transport send lock.
- */
-void
-rpcrdma_ia_remove(struct rpcrdma_ia *ia)
-{
-       struct rpcrdma_xprt *r_xprt = container_of(ia, struct rpcrdma_xprt,
-                                                  rx_ia);
-
-       if (ia->ri_id->qp)
-               rpcrdma_xprt_drain(r_xprt);
-
-       rpcrdma_reps_unmap(r_xprt);
-       rpcrdma_reqs_reset(r_xprt);
-       rpcrdma_mrs_destroy(r_xprt);
-       rpcrdma_sendctxs_destroy(r_xprt);
-
-       rpcrdma_ep_destroy(r_xprt);
-
-       /* Allow waiters to continue */
-       complete(&ia->ri_remove_done);
-
-       trace_xprtrdma_remove(r_xprt);
-}
-
 static int rpcrdma_ep_create(struct rpcrdma_xprt *r_xprt)
 {
        struct rpcrdma_ep *ep = &r_xprt->rx_ep;
@@ -573,12 +541,13 @@ void rpcrdma_xprt_disconnect(struct rpcrdma_xprt *r_xprt)
        struct rpcrdma_ep *ep = &r_xprt->rx_ep;
        struct rpcrdma_ia *ia = &r_xprt->rx_ia;
        struct rdma_cm_id *id = ia->ri_id;
-       int rc;
+       int rc, status = ep->rep_connected;
+
+       might_sleep();
 
        if (!id)
-               goto out;
+               return;
 
-       /* returns without wait if ID is not connected */
        rc = rdma_disconnect(id);
        if (!rc)
                wait_event_interruptible(ep->rep_connect_wait,
@@ -589,15 +558,17 @@ void rpcrdma_xprt_disconnect(struct rpcrdma_xprt *r_xprt)
 
        if (id->qp)
                rpcrdma_xprt_drain(r_xprt);
-out:
+       rpcrdma_reps_unmap(r_xprt);
        rpcrdma_reqs_reset(r_xprt);
        rpcrdma_mrs_destroy(r_xprt);
        rpcrdma_sendctxs_destroy(r_xprt);
 
        rpcrdma_ep_destroy(r_xprt);
 
-       if (ia->ri_id)
-               rdma_destroy_id(ia->ri_id);
+       if (status == -ENODEV)
+               complete(&ia->ri_remove_done);
+       else
+               rdma_destroy_id(id);
        ia->ri_id = NULL;
 }
 
@@ -815,10 +786,10 @@ void rpcrdma_mrs_refresh(struct rpcrdma_xprt *r_xprt)
        struct rpcrdma_buffer *buf = &r_xprt->rx_buf;
        struct rpcrdma_ep *ep = &r_xprt->rx_ep;
 
-       /* If there is no underlying device, it's no use to
-        * wake the refresh worker.
+       /* If there is no underlying connection, it's no use
+        * to wake the refresh worker.
         */
-       if (ep->rep_connected != -ENODEV) {
+       if (ep->rep_connected == 1) {
                /* The work is scheduled on a WQ_MEM_RECLAIM
                 * workqueue in order to prevent MR allocation
                 * from recursing into NFS during direct reclaim.
index 8be1b70..d2a0f12 100644 (file)
@@ -75,15 +75,10 @@ struct rpcrdma_ia {
        unsigned int            ri_max_frwr_depth;
        bool                    ri_implicit_roundup;
        enum ib_mr_type         ri_mrtype;
-       unsigned long           ri_flags;
        struct completion       ri_done;
        struct completion       ri_remove_done;
 };
 
-enum {
-       RPCRDMA_IAF_REMOVING = 0,
-};
-
 /*
  * RDMA Endpoint -- one per transport instance
  */
@@ -455,11 +450,6 @@ extern int xprt_rdma_pad_optimize;
 extern unsigned int xprt_rdma_memreg_strategy;
 
 /*
- * Interface Adapter calls - xprtrdma/verbs.c
- */
-void rpcrdma_ia_remove(struct rpcrdma_ia *ia);
-
-/*
  * Endpoint calls - xprtrdma/verbs.c
  */
 int rpcrdma_xprt_connect(struct rpcrdma_xprt *r_xprt);