Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=02d89b87081f516ad3993637f9b75db0d9786554
Commit:     02d89b87081f516ad3993637f9b75db0d9786554
Parent:     8aee74c8ee875448cc6d1cf995c9469eb60ae515
Author:     Roland Dreier <[EMAIL PROTECTED]>
AuthorDate: Wed May 23 15:16:08 2007 -0700
Committer:  Roland Dreier <[EMAIL PROTECTED]>
CommitDate: Wed May 23 15:16:08 2007 -0700

    IB/mlx4: Don't allocate RQ doorbell if using SRQ
    
    If a QP is attached to a shared receive queue (SRQ), then it doesn't
    have a receive queue (RQ).  So don't allocate an RQ doorbell (or map a
    doorbell from userspace for userspace QPs) for that QP.
    
    Signed-off-by: Roland Dreier <[EMAIL PROTECTED]>
---
 drivers/infiniband/hw/mlx4/qp.c |   37 ++++++++++++++++++++++---------------
 1 files changed, 22 insertions(+), 15 deletions(-)

diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c
index a824bc5..88a994d 100644
--- a/drivers/infiniband/hw/mlx4/qp.c
+++ b/drivers/infiniband/hw/mlx4/qp.c
@@ -319,20 +319,24 @@ static int create_qp_common(struct mlx4_ib_dev *dev, 
struct ib_pd *pd,
                if (err)
                        goto err_mtt;
 
-               err = mlx4_ib_db_map_user(to_mucontext(pd->uobject->context),
-                                         ucmd.db_addr, &qp->db);
-               if (err)
-                       goto err_mtt;
+               if (!init_attr->srq) {
+                       err = 
mlx4_ib_db_map_user(to_mucontext(pd->uobject->context),
+                                                 ucmd.db_addr, &qp->db);
+                       if (err)
+                               goto err_mtt;
+               }
        } else {
                err = set_kernel_sq_size(dev, &init_attr->cap, 
init_attr->qp_type, qp);
                if (err)
                        goto err;
 
-               err = mlx4_ib_db_alloc(dev, &qp->db, 0);
-               if (err)
-                       goto err;
+               if (!init_attr->srq) {
+                       err = mlx4_ib_db_alloc(dev, &qp->db, 0);
+                       if (err)
+                               goto err;
 
-               *qp->db.db = 0;
+                       *qp->db.db = 0;
+               }
 
                if (mlx4_buf_alloc(dev->dev, qp->buf_size, PAGE_SIZE * 2, 
&qp->buf)) {
                        err = -ENOMEM;
@@ -386,7 +390,7 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct 
ib_pd *pd,
        return 0;
 
 err_wrid:
-       if (pd->uobject)
+       if (pd->uobject && !init_attr->srq)
                mlx4_ib_db_unmap_user(to_mucontext(pd->uobject->context), 
&qp->db);
        else {
                kfree(qp->sq.wrid);
@@ -403,7 +407,7 @@ err_buf:
                mlx4_buf_free(dev->dev, qp->buf_size, &qp->buf);
 
 err_db:
-       if (!pd->uobject)
+       if (!pd->uobject && !init_attr->srq)
                mlx4_ib_db_free(dev, &qp->db);
 
 err:
@@ -481,14 +485,16 @@ static void destroy_qp_common(struct mlx4_ib_dev *dev, 
struct mlx4_ib_qp *qp,
        mlx4_mtt_cleanup(dev->dev, &qp->mtt);
 
        if (is_user) {
-               mlx4_ib_db_unmap_user(to_mucontext(qp->ibqp.uobject->context),
-                                     &qp->db);
+               if (!qp->ibqp.srq)
+                       
mlx4_ib_db_unmap_user(to_mucontext(qp->ibqp.uobject->context),
+                                             &qp->db);
                ib_umem_release(qp->umem);
        } else {
                kfree(qp->sq.wrid);
                kfree(qp->rq.wrid);
                mlx4_buf_free(dev->dev, qp->buf_size, &qp->buf);
-               mlx4_ib_db_free(dev, &qp->db);
+               if (!qp->ibqp.srq)
+                       mlx4_ib_db_free(dev, &qp->db);
        }
 }
 
@@ -852,7 +858,7 @@ static int __mlx4_ib_modify_qp(struct ib_qp *ibqp,
        if (ibqp->srq)
                context->srqn = cpu_to_be32(1 << 24 | 
to_msrq(ibqp->srq)->msrq.srqn);
 
-       if (cur_state == IB_QPS_RESET && new_state == IB_QPS_INIT)
+       if (!ibqp->srq && cur_state == IB_QPS_RESET && new_state == IB_QPS_INIT)
                context->db_rec_addr = cpu_to_be64(qp->db.dma);
 
        if (cur_state == IB_QPS_INIT &&
@@ -919,7 +925,8 @@ static int __mlx4_ib_modify_qp(struct ib_qp *ibqp,
                qp->rq.tail = 0;
                qp->sq.head = 0;
                qp->sq.tail = 0;
-               *qp->db.db  = 0;
+               if (!ibqp->srq)
+                       *qp->db.db  = 0;
        }
 
 out:
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to