RDMA/cxgb3: Don't allocate the SW queue for user mode CQs
authorSteve Wise <swise@opengridcomputing.com>
Wed, 27 Jan 2010 20:22:34 +0000 (20:22 +0000)
committerRoland Dreier <rolandd@cisco.com>
Wed, 24 Feb 2010 18:40:29 +0000 (10:40 -0800)
Only kernel mode CQs need the SW queue memory allocated.  The SW queue
for user mode CQs is allocated in userspace by libcxgb3.

Signed-off-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
drivers/infiniband/hw/cxgb3/cxio_hal.c
drivers/infiniband/hw/cxgb3/cxio_hal.h
drivers/infiniband/hw/cxgb3/iwch_provider.c

index 8837d56f9c92302f9bb6890213637eda9ea5a1dc..a28e862f2d6881d9eec49fa8764c5539d4d418d0 100644 (file)
@@ -154,7 +154,7 @@ static int cxio_hal_clear_qp_ctx(struct cxio_rdev *rdev_p, u32 qpid)
        return iwch_cxgb3_ofld_send(rdev_p->t3cdev_p, skb);
 }
 
-int cxio_create_cq(struct cxio_rdev *rdev_p, struct t3_cq *cq)
+int cxio_create_cq(struct cxio_rdev *rdev_p, struct t3_cq *cq, int kernel)
 {
        struct rdma_cq_setup setup;
        int size = (1UL << (cq->size_log2)) * sizeof(struct t3_cqe);
@@ -162,12 +162,12 @@ int cxio_create_cq(struct cxio_rdev *rdev_p, struct t3_cq *cq)
        cq->cqid = cxio_hal_get_cqid(rdev_p->rscp);
        if (!cq->cqid)
                return -ENOMEM;
-       cq->sw_queue = kzalloc(size, GFP_KERNEL);
-       if (!cq->sw_queue)
-               return -ENOMEM;
-       cq->queue = dma_alloc_coherent(&(rdev_p->rnic_info.pdev->dev),
-                                            (1UL << (cq->size_log2)) *
-                                            sizeof(struct t3_cqe),
+       if (kernel) {
+               cq->sw_queue = kzalloc(size, GFP_KERNEL);
+               if (!cq->sw_queue)
+                       return -ENOMEM;
+       }
+       cq->queue = dma_alloc_coherent(&(rdev_p->rnic_info.pdev->dev), size,
                                             &(cq->dma_addr), GFP_KERNEL);
        if (!cq->queue) {
                kfree(cq->sw_queue);
index fc59cfcc99c35b8f98d0904dfe00f1130cb180d0..073373c2c5602d08934d450f4d9fe960e6e24617 100644 (file)
@@ -157,7 +157,7 @@ int cxio_rdev_open(struct cxio_rdev *rdev);
 void cxio_rdev_close(struct cxio_rdev *rdev);
 int cxio_hal_cq_op(struct cxio_rdev *rdev, struct t3_cq *cq,
                   enum t3_cq_opcode op, u32 credit);
-int cxio_create_cq(struct cxio_rdev *rdev, struct t3_cq *cq);
+int cxio_create_cq(struct cxio_rdev *rdev, struct t3_cq *cq, int kernel);
 int cxio_destroy_cq(struct cxio_rdev *rdev, struct t3_cq *cq);
 int cxio_resize_cq(struct cxio_rdev *rdev, struct t3_cq *cq);
 void cxio_release_ucontext(struct cxio_rdev *rdev, struct cxio_ucontext *uctx);
index ed7175549ebd18e0005f08b5877ff88a442a981b..47b35c6608d2d284d5706cc3cad521bf8a9a5ccc 100644 (file)
@@ -187,7 +187,7 @@ static struct ib_cq *iwch_create_cq(struct ib_device *ibdev, int entries, int ve
        entries = roundup_pow_of_two(entries);
        chp->cq.size_log2 = ilog2(entries);
 
-       if (cxio_create_cq(&rhp->rdev, &chp->cq)) {
+       if (cxio_create_cq(&rhp->rdev, &chp->cq, !ucontext)) {
                kfree(chp);
                return ERR_PTR(-ENOMEM);
        }