Thanks, I extended this even further -- we might as well do similar
checking for QPs and SRQs while we're at it.  How does this seem?

 - R.

--- linux-kernel/infiniband/hw/mthca/mthca_dev.h        (revision 3704)
+++ linux-kernel/infiniband/hw/mthca/mthca_dev.h        (working copy)
@@ -128,12 +128,15 @@ struct mthca_limits {
        int      num_uars;
        int      max_sg;
        int      num_qps;
+       int      max_wqes;
        int      reserved_qps;
        int      num_srqs;
+       int      max_srq_wqes;
        int      reserved_srqs;
        int      num_eecs;
        int      reserved_eecs;
        int      num_cqs;
+       int      max_cqes;
        int      reserved_cqs;
        int      num_eqs;
        int      reserved_eqs;
--- linux-kernel/infiniband/hw/mthca/mthca_main.c       (revision 3704)
+++ linux-kernel/infiniband/hw/mthca/mthca_main.c       (working copy)
@@ -162,9 +162,17 @@ static int __devinit mthca_dev_lim(struc
        mdev->limits.pkey_table_len     = dev_lim->max_pkeys;
        mdev->limits.local_ca_ack_delay = dev_lim->local_ca_ack_delay;
        mdev->limits.max_sg             = dev_lim->max_sg;
+       mdev->limits.max_wqes           = dev_lim->max_qp_sz;
        mdev->limits.reserved_qps       = dev_lim->reserved_qps;
+       mdev->limits.max_srq_wqes       = dev_lim->max_srq_sz;
        mdev->limits.reserved_srqs      = dev_lim->reserved_srqs;
        mdev->limits.reserved_eecs      = dev_lim->reserved_eecs;
+       /*
+        * Subtract 1 from the limit because we need to allocate a
+        * spare CQE so the HCA HW can tell the difference between an
+        * empty CQ and a full CQ.
+        */
+       mdev->limits.max_cqes           = dev_lim->max_cq_sz - 1;
        mdev->limits.reserved_cqs       = dev_lim->reserved_cqs;
        mdev->limits.reserved_eqs       = dev_lim->reserved_eqs;
        mdev->limits.reserved_mtts      = dev_lim->reserved_mtts;
--- linux-kernel/infiniband/hw/mthca/mthca_provider.c   (revision 3704)
+++ linux-kernel/infiniband/hw/mthca/mthca_provider.c   (working copy)
@@ -90,14 +90,17 @@ static int mthca_query_device(struct ib_
 
        props->max_mr_size         = ~0ull;
        props->max_qp              = mdev->limits.num_qps - 
mdev->limits.reserved_qps;
-       props->max_qp_wr           = 0xffff;
+       props->max_qp_wr           = mdev->limits.max_wqes;
        props->max_sge             = mdev->limits.max_sg;
        props->max_cq              = mdev->limits.num_cqs - 
mdev->limits.reserved_cqs;
-       props->max_cqe             = 0xffff;
+       props->max_cqe             = mdev->limits.max_cqes;
        props->max_mr              = mdev->limits.num_mpts - 
mdev->limits.reserved_mrws;
        props->max_pd              = mdev->limits.num_pds - 
mdev->limits.reserved_pds;
        props->max_qp_rd_atom      = 1 << mdev->qp_table.rdb_shift;
        props->max_qp_init_rd_atom = 1 << mdev->qp_table.rdb_shift;
+       props->max_srq             = mdev->limits.num_srqs - 
mdev->limits.reserved_srqs;
+       props->max_srq_wr          = mdev->limits.max_srq_wqes;
+       props->max_srq_sge         = mdev->limits.max_sg;
        props->local_ca_ack_delay  = mdev->limits.local_ca_ack_delay;
        props->atomic_cap          = mdev->limits.flags & DEV_LIM_FLAG_ATOMIC ? 
                                        IB_ATOMIC_HCA : IB_ATOMIC_NONE;
@@ -640,6 +643,9 @@ static struct ib_cq *mthca_create_cq(str
        int nent;
        int err;
 
+       if (entries < 1 || entries > to_mdev(ibdev)->limits.max_cqes)
+               return ERR_PTR(-EINVAL);
+
        if (context) {
                if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd))
                        return ERR_PTR(-EFAULT);
--- linux-kernel/infiniband/hw/mthca/mthca_cmd.c        (revision 3704)
+++ linux-kernel/infiniband/hw/mthca/mthca_cmd.c        (working copy)
@@ -933,9 +933,9 @@ int mthca_QUERY_DEV_LIM(struct mthca_dev
                goto out;
 
        MTHCA_GET(field, outbox, QUERY_DEV_LIM_MAX_SRQ_SZ_OFFSET);
-       dev_lim->max_srq_sz = 1 << field;
+       dev_lim->max_srq_sz = (1 << field) - 1;
        MTHCA_GET(field, outbox, QUERY_DEV_LIM_MAX_QP_SZ_OFFSET);
-       dev_lim->max_qp_sz = 1 << field;
+       dev_lim->max_qp_sz = (1 << field) - 1;
        MTHCA_GET(field, outbox, QUERY_DEV_LIM_RSVD_QP_OFFSET);
        dev_lim->reserved_qps = 1 << (field & 0xf);
        MTHCA_GET(field, outbox, QUERY_DEV_LIM_MAX_QP_OFFSET);
@@ -1045,6 +1045,8 @@ int mthca_QUERY_DEV_LIM(struct mthca_dev
                  dev_lim->max_pds, dev_lim->reserved_pds, 
dev_lim->reserved_uars);
        mthca_dbg(dev, "Max QP/MCG: %d, reserved MGMs: %d\n",
                  dev_lim->max_pds, dev_lim->reserved_mgms);
+       mthca_dbg(dev, "Max CQEs: %d, max WQEs: %d, max SRQ WQEs: %d\n",
+                 dev_lim->max_cq_sz, dev_lim->max_qp_sz, dev_lim->max_srq_sz);
 
        mthca_dbg(dev, "Flags: %08x\n", dev_lim->flags);
 
--- linux-kernel/infiniband/hw/mthca/mthca_srq.c        (revision 3704)
+++ linux-kernel/infiniband/hw/mthca/mthca_srq.c        (working copy)
@@ -186,7 +186,8 @@ int mthca_alloc_srq(struct mthca_dev *de
        int err;
 
        /* Sanity check SRQ size before proceeding */
-       if (attr->max_wr > 16 << 20 || attr->max_sge > 64)
+       if (attr->max_wr  > dev->limits.max_srq_wqes ||
+           attr->max_sge > dev->limits.max_sg)
                return -EINVAL;
 
        srq->max      = attr->max_wr;
--- linux-kernel/infiniband/hw/mthca/mthca_qp.c (revision 3704)
+++ linux-kernel/infiniband/hw/mthca/mthca_qp.c (working copy)
@@ -1112,8 +1112,10 @@ static int mthca_set_qp_size(struct mthc
                             struct mthca_qp *qp)
 {
        /* Sanity check QP size before proceeding */
-       if (cap->max_send_wr  > 65536 || cap->max_recv_wr  > 65536 ||
-           cap->max_send_sge > 64    || cap->max_recv_sge > 64)
+       if (cap->max_send_wr  > dev->limits.max_wqes ||
+           cap->max_recv_wr  > dev->limits.max_wqes ||
+           cap->max_send_sge > dev->limits.max_sg   ||
+           cap->max_recv_sge > dev->limits.max_sg)
                return -EINVAL;
 
        if (mthca_is_memfree(dev)) {
_______________________________________________
openib-general mailing list
[email protected]
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to