Allow the driver plug-in library to return additional data in the response
from ibv_cmd_resize_cq().  Also, allow the user library to pass additional
information to ib_modify_qp() and ib_modify_srq().

Signed-off-by: Ralph Campbell <[EMAIL PROTECTED]>

Index: src/linux-kernel/infiniband/include/rdma/ib_user_verbs.h
===================================================================
--- src/linux-kernel/infiniband/include/rdma/ib_user_verbs.h    (revision 8843)
+++ src/linux-kernel/infiniband/include/rdma/ib_user_verbs.h    (working copy)
@@ -275,6 +275,8 @@
 
 struct ib_uverbs_resize_cq_resp {
        __u32 cqe;
+       __u32 reserved;
+       __u64 driver_data[0];
 };
 
 struct ib_uverbs_poll_cq {
Index: src/linux-kernel/infiniband/include/rdma/ib_verbs.h
===================================================================
--- src/linux-kernel/infiniband/include/rdma/ib_verbs.h (revision 8843)
+++ src/linux-kernel/infiniband/include/rdma/ib_verbs.h (working copy)
@@ -911,7 +911,8 @@
                                                 struct ib_udata *udata);
        int                        (*modify_srq)(struct ib_srq *srq,
                                                 struct ib_srq_attr *srq_attr,
-                                                enum ib_srq_attr_mask 
srq_attr_mask);
+                                                enum ib_srq_attr_mask 
srq_attr_mask,
+                                                struct ib_udata *udata);
        int                        (*query_srq)(struct ib_srq *srq,
                                                struct ib_srq_attr *srq_attr);
        int                        (*destroy_srq)(struct ib_srq *srq);
@@ -923,7 +924,8 @@
                                                struct ib_udata *udata);
        int                        (*modify_qp)(struct ib_qp *qp,
                                                struct ib_qp_attr *qp_attr,
-                                               int qp_attr_mask);
+                                               int qp_attr_mask,
+                                               struct ib_udata *udata);
        int                        (*query_qp)(struct ib_qp *qp,
                                               struct ib_qp_attr *qp_attr,
                                               int qp_attr_mask,
Index: src/linux-kernel/infiniband/core/verbs.c
===================================================================
--- src/linux-kernel/infiniband/core/verbs.c    (revision 8843)
+++ src/linux-kernel/infiniband/core/verbs.c    (working copy)
@@ -231,7 +231,7 @@
                  struct ib_srq_attr *srq_attr,
                  enum ib_srq_attr_mask srq_attr_mask)
 {
-       return srq->device->modify_srq(srq, srq_attr, srq_attr_mask);
+       return srq->device->modify_srq(srq, srq_attr, srq_attr_mask, NULL);
 }
 EXPORT_SYMBOL(ib_modify_srq);
 
@@ -547,7 +547,7 @@
                 struct ib_qp_attr *qp_attr,
                 int qp_attr_mask)
 {
-       return qp->device->modify_qp(qp, qp_attr, qp_attr_mask);
+       return qp->device->modify_qp(qp, qp_attr, qp_attr_mask, NULL);
 }
 EXPORT_SYMBOL(ib_modify_qp);
 
Index: src/linux-kernel/infiniband/core/uverbs_cmd.c
===================================================================
--- src/linux-kernel/infiniband/core/uverbs_cmd.c       (revision 8843)
+++ src/linux-kernel/infiniband/core/uverbs_cmd.c       (working copy)
@@ -829,7 +829,6 @@
 err_copy:
        idr_remove_uobj(&ib_uverbs_cq_idr, &obj->uobject);
 
-
 err_free:
        ib_destroy_cq(cq);
 
@@ -1264,6 +1263,7 @@
                            int out_len)
 {
        struct ib_uverbs_modify_qp cmd;
+       struct ib_udata            udata;
        struct ib_qp              *qp;
        struct ib_qp_attr         *attr;
        int                        ret;
@@ -1271,6 +1271,9 @@
        if (copy_from_user(&cmd, buf, sizeof cmd))
                return -EFAULT;
 
+       INIT_UDATA(&udata, buf + sizeof cmd, NULL, in_len - sizeof cmd,
+                  out_len);
+
        attr = kmalloc(sizeof *attr, GFP_KERNEL);
        if (!attr)
                return -ENOMEM;
@@ -1327,7 +1330,7 @@
        attr->alt_ah_attr.ah_flags          = cmd.alt_dest.is_global ? 
IB_AH_GRH : 0;
        attr->alt_ah_attr.port_num          = cmd.alt_dest.port_num;
 
-       ret = ib_modify_qp(qp, attr, cmd.attr_mask);
+       ret = qp->device->modify_qp(qp, attr, cmd.attr_mask, &udata);
 
        put_qp_read(qp);
 
@@ -2045,6 +2048,7 @@
                             int out_len)
 {
        struct ib_uverbs_modify_srq cmd;
+       struct ib_udata             udata;
        struct ib_srq              *srq;
        struct ib_srq_attr          attr;
        int                         ret;
@@ -2052,6 +2056,9 @@
        if (copy_from_user(&cmd, buf, sizeof cmd))
                return -EFAULT;
 
+       INIT_UDATA(&udata, buf + sizeof cmd, NULL, in_len - sizeof cmd,
+                  out_len);
+
        srq = idr_read_srq(cmd.srq_handle, file->ucontext);
        if (!srq)
                return -EINVAL;
@@ -2059,7 +2066,7 @@
        attr.max_wr    = cmd.max_wr;
        attr.srq_limit = cmd.srq_limit;
 
-       ret = ib_modify_srq(srq, &attr, cmd.attr_mask);
+       ret = srq->device->modify_srq(srq, &attr, cmd.attr_mask, &udata);
 
        put_srq_read(srq);
 



_______________________________________________
openib-general mailing list
openib-general@openib.org
http://openib.org/mailman/listinfo/openib-general

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

Reply via email to