]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/sunrpc/xprtrdma/svc_rdma_transport.c
Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[karo-tx-linux.git] / net / sunrpc / xprtrdma / svc_rdma_transport.c
index fc8f14c7bfec60dc5828340861a747e49f06193e..a9d9cb1ba4c6068b1a80c225cb147d1993a75d76 100644 (file)
@@ -272,85 +272,6 @@ static void svc_rdma_destroy_ctxts(struct svcxprt_rdma *xprt)
        }
 }
 
-static struct svc_rdma_req_map *alloc_req_map(gfp_t flags)
-{
-       struct svc_rdma_req_map *map;
-
-       map = kmalloc(sizeof(*map), flags);
-       if (map)
-               INIT_LIST_HEAD(&map->free);
-       return map;
-}
-
-static bool svc_rdma_prealloc_maps(struct svcxprt_rdma *xprt)
-{
-       unsigned int i;
-
-       /* One for each receive buffer on this connection. */
-       i = xprt->sc_max_requests;
-
-       while (i--) {
-               struct svc_rdma_req_map *map;
-
-               map = alloc_req_map(GFP_KERNEL);
-               if (!map) {
-                       dprintk("svcrdma: No memory for request map\n");
-                       return false;
-               }
-               list_add(&map->free, &xprt->sc_maps);
-       }
-       return true;
-}
-
-struct svc_rdma_req_map *svc_rdma_get_req_map(struct svcxprt_rdma *xprt)
-{
-       struct svc_rdma_req_map *map = NULL;
-
-       spin_lock(&xprt->sc_map_lock);
-       if (list_empty(&xprt->sc_maps))
-               goto out_empty;
-
-       map = list_first_entry(&xprt->sc_maps,
-                              struct svc_rdma_req_map, free);
-       list_del_init(&map->free);
-       spin_unlock(&xprt->sc_map_lock);
-
-out:
-       map->count = 0;
-       return map;
-
-out_empty:
-       spin_unlock(&xprt->sc_map_lock);
-
-       /* Pre-allocation amount was incorrect */
-       map = alloc_req_map(GFP_NOIO);
-       if (map)
-               goto out;
-
-       WARN_ONCE(1, "svcrdma: empty request map list?\n");
-       return NULL;
-}
-
-void svc_rdma_put_req_map(struct svcxprt_rdma *xprt,
-                         struct svc_rdma_req_map *map)
-{
-       spin_lock(&xprt->sc_map_lock);
-       list_add(&map->free, &xprt->sc_maps);
-       spin_unlock(&xprt->sc_map_lock);
-}
-
-static void svc_rdma_destroy_maps(struct svcxprt_rdma *xprt)
-{
-       while (!list_empty(&xprt->sc_maps)) {
-               struct svc_rdma_req_map *map;
-
-               map = list_first_entry(&xprt->sc_maps,
-                                      struct svc_rdma_req_map, free);
-               list_del(&map->free);
-               kfree(map);
-       }
-}
-
 /* QP event handler */
 static void qp_event_handler(struct ib_event *event, void *context)
 {
@@ -473,24 +394,6 @@ void svc_rdma_wc_send(struct ib_cq *cq, struct ib_wc *wc)
        svc_rdma_put_context(ctxt, 1);
 }
 
-/**
- * svc_rdma_wc_write - Invoked by RDMA provider for each polled Write WC
- * @cq:        completion queue
- * @wc:        completed WR
- *
- */
-void svc_rdma_wc_write(struct ib_cq *cq, struct ib_wc *wc)
-{
-       struct ib_cqe *cqe = wc->wr_cqe;
-       struct svc_rdma_op_ctxt *ctxt;
-
-       svc_rdma_send_wc_common_put(cq, wc, "write");
-
-       ctxt = container_of(cqe, struct svc_rdma_op_ctxt, cqe);
-       svc_rdma_unmap_dma(ctxt);
-       svc_rdma_put_context(ctxt, 0);
-}
-
 /**
  * svc_rdma_wc_reg - Invoked by RDMA provider for each polled FASTREG WC
  * @cq:        completion queue
@@ -561,14 +464,14 @@ static struct svcxprt_rdma *rdma_create_xprt(struct svc_serv *serv,
        INIT_LIST_HEAD(&cma_xprt->sc_read_complete_q);
        INIT_LIST_HEAD(&cma_xprt->sc_frmr_q);
        INIT_LIST_HEAD(&cma_xprt->sc_ctxts);
-       INIT_LIST_HEAD(&cma_xprt->sc_maps);
+       INIT_LIST_HEAD(&cma_xprt->sc_rw_ctxts);
        init_waitqueue_head(&cma_xprt->sc_send_wait);
 
        spin_lock_init(&cma_xprt->sc_lock);
        spin_lock_init(&cma_xprt->sc_rq_dto_lock);
        spin_lock_init(&cma_xprt->sc_frmr_q_lock);
        spin_lock_init(&cma_xprt->sc_ctxt_lock);
-       spin_lock_init(&cma_xprt->sc_map_lock);
+       spin_lock_init(&cma_xprt->sc_rw_ctxt_lock);
 
        /*
         * Note that this implies that the underlying transport support
@@ -999,6 +902,7 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
                newxprt, newxprt->sc_cm_id);
 
        dev = newxprt->sc_cm_id->device;
+       newxprt->sc_port_num = newxprt->sc_cm_id->port_num;
 
        /* Qualify the transport resource defaults with the
         * capabilities of this particular device */
@@ -1014,13 +918,11 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
                                            svcrdma_max_bc_requests);
        newxprt->sc_rq_depth = newxprt->sc_max_requests +
                               newxprt->sc_max_bc_requests;
-       newxprt->sc_sq_depth = RPCRDMA_SQ_DEPTH_MULT * newxprt->sc_rq_depth;
+       newxprt->sc_sq_depth = newxprt->sc_rq_depth;
        atomic_set(&newxprt->sc_sq_avail, newxprt->sc_sq_depth);
 
        if (!svc_rdma_prealloc_ctxts(newxprt))
                goto errout;
-       if (!svc_rdma_prealloc_maps(newxprt))
-               goto errout;
 
        /*
         * Limit ORD based on client limit, local device limit, and
@@ -1050,6 +952,8 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)
        memset(&qp_attr, 0, sizeof qp_attr);
        qp_attr.event_handler = qp_event_handler;
        qp_attr.qp_context = &newxprt->sc_xprt;
+       qp_attr.port_num = newxprt->sc_cm_id->port_num;
+       qp_attr.cap.max_rdma_ctxs = newxprt->sc_max_requests;
        qp_attr.cap.max_send_wr = newxprt->sc_sq_depth;
        qp_attr.cap.max_recv_wr = newxprt->sc_rq_depth;
        qp_attr.cap.max_send_sge = newxprt->sc_max_sge;
@@ -1248,8 +1152,8 @@ static void __svc_rdma_free(struct work_struct *work)
        }
 
        rdma_dealloc_frmr_q(rdma);
+       svc_rdma_destroy_rw_ctxts(rdma);
        svc_rdma_destroy_ctxts(rdma);
-       svc_rdma_destroy_maps(rdma);
 
        /* Destroy the QP if present (not a listener) */
        if (rdma->sc_qp && !IS_ERR(rdma->sc_qp))