These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / net / sunrpc / xprtrdma / transport.c
index 54f23b1..8c545f7 100644 (file)
@@ -48,7 +48,6 @@
  */
 
 #include <linux/module.h>
-#include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/seq_file.h>
 #include <linux/sunrpc/addr.h>
 # define RPCDBG_FACILITY       RPCDBG_TRANS
 #endif
 
-MODULE_LICENSE("Dual BSD/GPL");
-
-MODULE_DESCRIPTION("RPC/RDMA Transport for Linux kernel NFS");
-MODULE_AUTHOR("Network Appliance, Inc.");
-
 /*
  * tunables
  */
@@ -181,10 +175,8 @@ xprt_rdma_format_addresses6(struct rpc_xprt *xprt, struct sockaddr *sap)
 }
 
 static void
-xprt_rdma_format_addresses(struct rpc_xprt *xprt)
+xprt_rdma_format_addresses(struct rpc_xprt *xprt, struct sockaddr *sap)
 {
-       struct sockaddr *sap = (struct sockaddr *)
-                                       &rpcx_to_rdmad(xprt).addr;
        char buf[128];
 
        switch (sap->sa_family) {
@@ -246,6 +238,16 @@ xprt_rdma_connect_worker(struct work_struct *work)
        xprt_clear_connecting(xprt);
 }
 
+static void
+xprt_rdma_inject_disconnect(struct rpc_xprt *xprt)
+{
+       struct rpcrdma_xprt *r_xprt = container_of(xprt, struct rpcrdma_xprt,
+                                                  rx_xprt);
+
+       pr_info("rpcrdma: injecting transport disconnect on xprt=%p\n", xprt);
+       rdma_disconnect(r_xprt->rx_ia.ri_id);
+}
+
 /*
  * xprt_rdma_destroy
  *
@@ -268,8 +270,8 @@ xprt_rdma_destroy(struct rpc_xprt *xprt)
 
        xprt_clear_connected(xprt);
 
-       rpcrdma_buffer_destroy(&r_xprt->rx_buf);
        rpcrdma_ep_destroy(&r_xprt->rx_ep, &r_xprt->rx_ia);
+       rpcrdma_buffer_destroy(&r_xprt->rx_buf);
        rpcrdma_ia_close(&r_xprt->rx_ia);
 
        xprt_rdma_free_addresses(xprt);
@@ -298,7 +300,7 @@ xprt_setup_rdma(struct xprt_create *args)
        struct rpc_xprt *xprt;
        struct rpcrdma_xprt *new_xprt;
        struct rpcrdma_ep *new_ep;
-       struct sockaddr_in *sin;
+       struct sockaddr *sap;
        int rc;
 
        if (args->addrlen > sizeof(xprt->addr)) {
@@ -329,26 +331,20 @@ xprt_setup_rdma(struct xprt_create *args)
         * Set up RDMA-specific connect data.
         */
 
-       /* Put server RDMA address in local cdata */
-       memcpy(&cdata.addr, args->dstaddr, args->addrlen);
+       sap = (struct sockaddr *)&cdata.addr;
+       memcpy(sap, args->dstaddr, args->addrlen);
 
        /* Ensure xprt->addr holds valid server TCP (not RDMA)
         * address, for any side protocols which peek at it */
        xprt->prot = IPPROTO_TCP;
        xprt->addrlen = args->addrlen;
-       memcpy(&xprt->addr, &cdata.addr, xprt->addrlen);
+       memcpy(&xprt->addr, sap, xprt->addrlen);
 
-       sin = (struct sockaddr_in *)&cdata.addr;
-       if (ntohs(sin->sin_port) != 0)
+       if (rpc_get_port(sap))
                xprt_set_bound(xprt);
 
-       dprintk("RPC:       %s: %pI4:%u\n",
-               __func__, &sin->sin_addr.s_addr, ntohs(sin->sin_port));
-
-       /* Set max requests */
        cdata.max_requests = xprt->max_reqs;
 
-       /* Set some length limits */
        cdata.rsize = RPCRDMA_MAX_SEGS * PAGE_SIZE; /* RDMA write max */
        cdata.wsize = RPCRDMA_MAX_SEGS * PAGE_SIZE; /* RDMA read max */
 
@@ -371,8 +367,7 @@ xprt_setup_rdma(struct xprt_create *args)
 
        new_xprt = rpcx_to_rdmax(xprt);
 
-       rc = rpcrdma_ia_open(new_xprt, (struct sockaddr *) &cdata.addr,
-                               xprt_rdma_memreg_strategy);
+       rc = rpcrdma_ia_open(new_xprt, sap, xprt_rdma_memreg_strategy);
        if (rc)
                goto out1;
 
@@ -405,7 +400,7 @@ xprt_setup_rdma(struct xprt_create *args)
        INIT_DELAYED_WORK(&new_xprt->rx_connect_worker,
                          xprt_rdma_connect_worker);
 
-       xprt_rdma_format_addresses(xprt);
+       xprt_rdma_format_addresses(xprt, sap);
        xprt->max_payload = new_xprt->rx_ia.ri_ops->ro_maxpages(new_xprt);
        if (xprt->max_payload == 0)
                goto out4;
@@ -416,6 +411,9 @@ xprt_setup_rdma(struct xprt_create *args)
        if (!try_module_get(THIS_MODULE))
                goto out4;
 
+       dprintk("RPC:       %s: %s:%s\n", __func__,
+               xprt->address_strings[RPC_DISPLAY_ADDR],
+               xprt->address_strings[RPC_DISPLAY_PORT]);
        return xprt;
 
 out4:
@@ -618,12 +616,6 @@ xprt_rdma_send_request(struct rpc_task *task)
        if (req->rl_reply == NULL)              /* e.g. reconnection */
                rpcrdma_recv_buffer_get(req);
 
-       if (req->rl_reply) {
-               req->rl_reply->rr_func = rpcrdma_reply_handler;
-               /* this need only be done once, but... */
-               req->rl_reply->rr_xprt = xprt;
-       }
-
        /* Must suppress retransmit to maintain credits */
        if (req->rl_connect_cookie == xprt->connect_cookie)
                goto drop_connection;
@@ -655,31 +647,41 @@ static void xprt_rdma_print_stats(struct rpc_xprt *xprt, struct seq_file *seq)
        if (xprt_connected(xprt))
                idle_time = (long)(jiffies - xprt->last_used) / HZ;
 
-       seq_printf(seq,
-         "\txprt:\trdma %u %lu %lu %lu %ld %lu %lu %lu %Lu %Lu "
-         "%lu %lu %lu %Lu %Lu %Lu %Lu %lu %lu %lu\n",
-
-          0,   /* need a local port? */
-          xprt->stat.bind_count,
-          xprt->stat.connect_count,
-          xprt->stat.connect_time,
-          idle_time,
-          xprt->stat.sends,
-          xprt->stat.recvs,
-          xprt->stat.bad_xids,
-          xprt->stat.req_u,
-          xprt->stat.bklog_u,
-
-          r_xprt->rx_stats.read_chunk_count,
-          r_xprt->rx_stats.write_chunk_count,
-          r_xprt->rx_stats.reply_chunk_count,
-          r_xprt->rx_stats.total_rdma_request,
-          r_xprt->rx_stats.total_rdma_reply,
-          r_xprt->rx_stats.pullup_copy_count,
-          r_xprt->rx_stats.fixup_copy_count,
-          r_xprt->rx_stats.hardway_register_count,
-          r_xprt->rx_stats.failed_marshal_count,
-          r_xprt->rx_stats.bad_reply_count);
+       seq_puts(seq, "\txprt:\trdma ");
+       seq_printf(seq, "%u %lu %lu %lu %ld %lu %lu %lu %llu %llu ",
+                  0,   /* need a local port? */
+                  xprt->stat.bind_count,
+                  xprt->stat.connect_count,
+                  xprt->stat.connect_time,
+                  idle_time,
+                  xprt->stat.sends,
+                  xprt->stat.recvs,
+                  xprt->stat.bad_xids,
+                  xprt->stat.req_u,
+                  xprt->stat.bklog_u);
+       seq_printf(seq, "%lu %lu %lu %llu %llu %llu %llu %lu %lu %lu %lu\n",
+                  r_xprt->rx_stats.read_chunk_count,
+                  r_xprt->rx_stats.write_chunk_count,
+                  r_xprt->rx_stats.reply_chunk_count,
+                  r_xprt->rx_stats.total_rdma_request,
+                  r_xprt->rx_stats.total_rdma_reply,
+                  r_xprt->rx_stats.pullup_copy_count,
+                  r_xprt->rx_stats.fixup_copy_count,
+                  r_xprt->rx_stats.hardway_register_count,
+                  r_xprt->rx_stats.failed_marshal_count,
+                  r_xprt->rx_stats.bad_reply_count,
+                  r_xprt->rx_stats.nomsg_call_count);
+}
+
+static int
+xprt_rdma_enable_swap(struct rpc_xprt *xprt)
+{
+       return 0;
+}
+
+static void
+xprt_rdma_disable_swap(struct rpc_xprt *xprt)
+{
 }
 
 /*
@@ -700,7 +702,16 @@ static struct rpc_xprt_ops xprt_rdma_procs = {
        .send_request           = xprt_rdma_send_request,
        .close                  = xprt_rdma_close,
        .destroy                = xprt_rdma_destroy,
-       .print_stats            = xprt_rdma_print_stats
+       .print_stats            = xprt_rdma_print_stats,
+       .enable_swap            = xprt_rdma_enable_swap,
+       .disable_swap           = xprt_rdma_disable_swap,
+       .inject_disconnect      = xprt_rdma_inject_disconnect,
+#if defined(CONFIG_SUNRPC_BACKCHANNEL)
+       .bc_setup               = xprt_rdma_bc_setup,
+       .bc_up                  = xprt_rdma_bc_up,
+       .bc_free_rqst           = xprt_rdma_bc_free_rqst,
+       .bc_destroy             = xprt_rdma_bc_destroy,
+#endif
 };
 
 static struct xprt_class xprt_rdma = {
@@ -711,7 +722,7 @@ static struct xprt_class xprt_rdma = {
        .setup                  = xprt_setup_rdma,
 };
 
-static void __exit xprt_rdma_cleanup(void)
+void xprt_rdma_cleanup(void)
 {
        int rc;
 
@@ -726,17 +737,32 @@ static void __exit xprt_rdma_cleanup(void)
        if (rc)
                dprintk("RPC:       %s: xprt_unregister returned %i\n",
                        __func__, rc);
+
+       rpcrdma_destroy_wq();
+       frwr_destroy_recovery_wq();
 }
 
-static int __init xprt_rdma_init(void)
+int xprt_rdma_init(void)
 {
        int rc;
 
-       rc = xprt_register_transport(&xprt_rdma);
-
+       rc = frwr_alloc_recovery_wq();
        if (rc)
                return rc;
 
+       rc = rpcrdma_alloc_wq();
+       if (rc) {
+               frwr_destroy_recovery_wq();
+               return rc;
+       }
+
+       rc = xprt_register_transport(&xprt_rdma);
+       if (rc) {
+               rpcrdma_destroy_wq();
+               frwr_destroy_recovery_wq();
+               return rc;
+       }
+
        dprintk("RPCRDMA Module Init, register RPC RDMA transport\n");
 
        dprintk("Defaults:\n");
@@ -753,6 +779,3 @@ static int __init xprt_rdma_init(void)
 #endif
        return 0;
 }
-
-module_init(xprt_rdma_init);
-module_exit(xprt_rdma_cleanup);