Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma
[linux-2.6-microblaze.git] / net / sunrpc / xprtrdma / svc_rdma_transport.c
index 6b36279..fcc3eb8 100644 (file)
@@ -91,7 +91,7 @@ struct svc_xprt_class svc_rdma_class = {
        .xcl_name = "rdma",
        .xcl_owner = THIS_MODULE,
        .xcl_ops = &svc_rdma_ops,
-       .xcl_max_payload = RPCRDMA_MAXPAYLOAD,
+       .xcl_max_payload = RPCSVC_MAXPAYLOAD_RDMA,
        .xcl_ident = XPRT_TRANSPORT_RDMA,
 };
 
@@ -659,6 +659,7 @@ static int rdma_cma_handler(struct rdma_cm_id *cma_id,
                if (xprt) {
                        set_bit(XPT_CLOSE, &xprt->xpt_flags);
                        svc_xprt_enqueue(xprt);
+                       svc_xprt_put(xprt);
                }
                break;
        default:
@@ -733,17 +734,19 @@ static struct svc_rdma_fastreg_mr *rdma_alloc_frmr(struct svcxprt_rdma *xprt)
        struct ib_mr *mr;
        struct ib_fast_reg_page_list *pl;
        struct svc_rdma_fastreg_mr *frmr;
+       u32 num_sg;
 
        frmr = kmalloc(sizeof(*frmr), GFP_KERNEL);
        if (!frmr)
                goto err;
 
-       mr = ib_alloc_fast_reg_mr(xprt->sc_pd, RPCSVC_MAXPAGES);
+       num_sg = min_t(u32, RPCSVC_MAXPAGES, xprt->sc_frmr_pg_list_len);
+       mr = ib_alloc_mr(xprt->sc_pd, IB_MR_TYPE_MEM_REG, num_sg);
        if (IS_ERR(mr))
                goto err_free_frmr;
 
        pl = ib_alloc_fast_reg_page_list(xprt->sc_cm_id->device,
-                                        RPCSVC_MAXPAGES);
+                                        num_sg);
        if (IS_ERR(pl))
                goto err_free_mr;
 
@@ -872,6 +875,8 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
         * capabilities of this particular device */
        newxprt->sc_max_sge = min((size_t)devattr.max_sge,
                                  (size_t)RPCSVC_MAXPAGES);
+       newxprt->sc_max_sge_rd = min_t(size_t, devattr.max_sge_rd,
+                                      RPCSVC_MAXPAGES);
        newxprt->sc_max_requests = min((size_t)devattr.max_qp_wr,
                                   (size_t)svcrdma_max_requests);
        newxprt->sc_sq_depth = RPCRDMA_SQ_DEPTH_MULT * newxprt->sc_max_requests;
@@ -1046,6 +1051,7 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
                "    remote_ip       : %pI4\n"
                "    remote_port     : %d\n"
                "    max_sge         : %d\n"
+               "    max_sge_rd      : %d\n"
                "    sq_depth        : %d\n"
                "    max_requests    : %d\n"
                "    ord             : %d\n",
@@ -1059,6 +1065,7 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
                ntohs(((struct sockaddr_in *)&newxprt->sc_cm_id->
                       route.addr.dst_addr)->sin_port),
                newxprt->sc_max_sge,
+               newxprt->sc_max_sge_rd,
                newxprt->sc_sq_depth,
                newxprt->sc_max_requests,
                newxprt->sc_ord);
@@ -1201,40 +1208,6 @@ static int svc_rdma_secure_port(struct svc_rqst *rqstp)
        return 1;
 }
 
-/*
- * Attempt to register the kvec representing the RPC memory with the
- * device.
- *
- * Returns:
- *  NULL : The device does not support fastreg or there were no more
- *         fastreg mr.
- *  frmr : The kvec register request was successfully posted.
- *    <0 : An error was encountered attempting to register the kvec.
- */
-int svc_rdma_fastreg(struct svcxprt_rdma *xprt,
-                    struct svc_rdma_fastreg_mr *frmr)
-{
-       struct ib_send_wr fastreg_wr;
-       u8 key;
-
-       /* Bump the key */
-       key = (u8)(frmr->mr->lkey & 0x000000FF);
-       ib_update_fast_reg_key(frmr->mr, ++key);
-
-       /* Prepare FASTREG WR */
-       memset(&fastreg_wr, 0, sizeof fastreg_wr);
-       fastreg_wr.opcode = IB_WR_FAST_REG_MR;
-       fastreg_wr.send_flags = IB_SEND_SIGNALED;
-       fastreg_wr.wr.fast_reg.iova_start = (unsigned long)frmr->kva;
-       fastreg_wr.wr.fast_reg.page_list = frmr->page_list;
-       fastreg_wr.wr.fast_reg.page_list_len = frmr->page_list_len;
-       fastreg_wr.wr.fast_reg.page_shift = PAGE_SHIFT;
-       fastreg_wr.wr.fast_reg.length = frmr->map_len;
-       fastreg_wr.wr.fast_reg.access_flags = frmr->access_flags;
-       fastreg_wr.wr.fast_reg.rkey = frmr->mr->lkey;
-       return svc_rdma_send(xprt, &fastreg_wr);
-}
-
 int svc_rdma_send(struct svcxprt_rdma *xprt, struct ib_send_wr *wr)
 {
        struct ib_send_wr *bad_wr, *n_wr;