]> git.openfabrics.org - ~shefty/libibverbs.git/commitdiff
import
authorSean Hefty <sean.hefty@intel.com>
Thu, 22 Dec 2011 08:10:11 +0000 (00:10 -0800)
committerSean Hefty <sean.hefty@intel.com>
Thu, 22 Dec 2011 08:10:11 +0000 (00:10 -0800)
meta
patches/open_qp [new file with mode: 0644]

diff --git a/meta b/meta
index 13045b67ffdebe68c2193caaab63d482f3e47fed..f61b8034b54569ff07301ab722cd236cf18a423f 100644 (file)
--- a/meta
+++ b/meta
@@ -1,10 +1,11 @@
 Version: 1
-Previous: 3ed46fbc6498ac1762c9628852a0f02a24cb89b3
-Head: 5099ebb63980b28a82fde95e55bed02ea699092e
+Previous: 72852b367ac0f14a587e196f7a94948229e36d11
+Head: 94332ed744f0a660d7654ddd75619d415c712289
 Applied:
   ext: bd9562c3a152f1aeb3cd985d906fd28d1da11fe1
   xrc: 563fb8c3e4ac4b1bb34706822e65c761cbb918d3
   xrc-man: 58e80c2ab74c3897a6c8f6df09095ff521e83232
   xsrq_sample: 5099ebb63980b28a82fde95e55bed02ea699092e
+  open_qp: 94332ed744f0a660d7654ddd75619d415c712289
 Unapplied:
 Hidden:
diff --git a/patches/open_qp b/patches/open_qp
new file mode 100644 (file)
index 0000000..e4229bc
--- /dev/null
@@ -0,0 +1,208 @@
+Bottom: 743c5750c90cd7c3f85b30f5b5d3a11738b2113c
+Top:    3ddad6396082eca0c222a66bf7f2217886a4d086
+Author: Sean Hefty <sean.hefty@intel.com>
+Date:   2011-12-22 00:10:11 -0800
+
+Add ibv_open_qp()
+
+XRC receive QPs are shareable across multiple processes.  Allow
+any process with access to the xrc domain to open an existing
+QP.  After opening the QP, the process will receive events
+related to the QP and be able to modify the QP.
+
+Signed-off-by: Sean Hefty <sean.hefty@intel.com>
+
+
+---
+
+diff --git a/include/infiniband/driver.h b/include/infiniband/driver.h
+index 9aea854..7fad2a2 100644
+--- a/include/infiniband/driver.h
++++ b/include/infiniband/driver.h
+@@ -122,6 +122,10 @@ int ibv_cmd_create_qp(struct ibv_pd *pd,
+                     struct ibv_qp *qp, struct ibv_qp_init_attr *attr,
+                     struct ibv_create_qp *cmd, size_t cmd_size,
+                     struct ibv_create_qp_resp *resp, size_t resp_size);
++int ibv_cmd_open_qp(struct ibv_xrcd *xrcd,
++                  struct ibv_qp *qp, struct ibv_qp_open_attr *attr,
++                  struct ibv_open_qp *cmd, size_t cmd_size,
++                  struct ibv_create_qp_resp *resp, size_t resp_size);
+ int ibv_cmd_query_qp(struct ibv_qp *qp, struct ibv_qp_attr *qp_attr,
+                    int attr_mask,
+                    struct ibv_qp_init_attr *qp_init_attr,
+diff --git a/include/infiniband/kern-abi.h b/include/infiniband/kern-abi.h
+index 58867c3..68c5fd4 100644
+--- a/include/infiniband/kern-abi.h
++++ b/include/infiniband/kern-abi.h
+@@ -88,7 +88,8 @@ enum {
+       IB_USER_VERBS_CMD_POST_SRQ_RECV,
+       IB_USER_VERBS_CMD_OPEN_XRCD,
+       IB_USER_VERBS_CMD_CLOSE_XRCD,
+-      IB_USER_VERBS_CMD_CREATE_XSRQ
++      IB_USER_VERBS_CMD_CREATE_XSRQ,
++      IB_USER_VERBS_CMD_OPEN_QP
+ };
+ /*
+@@ -476,6 +477,20 @@ struct ibv_create_qp {
+       __u64 driver_data[0];
+ };
++struct ibv_open_qp {
++      __u32 command;
++      __u16 in_words;
++      __u16 out_words;
++      __u64 response;
++      __u64 user_handle;
++      __u32 pd_handle;
++      __u32 qpn;
++      __u8  qp_type;
++      __u8  reserved[7];
++      __u64 driver_data[0];
++};
++
++/* also used for open response */
+ struct ibv_create_qp_resp {
+       __u32 qp_handle;
+       __u32 qpn;
+@@ -853,6 +868,7 @@ enum {
+       IB_USER_VERBS_CMD_OPEN_XRCD_V2 = -1,
+       IB_USER_VERBS_CMD_CLOSE_XRCD_V2 = -1,
+       IB_USER_VERBS_CMD_CREATE_XSRQ_V2 = -1,
++      IB_USER_VERBS_CMD_OPEN_QP_V2 = -1,
+ };
+ struct ibv_destroy_cq_v1 {
+diff --git a/include/infiniband/verbs.h b/include/infiniband/verbs.h
+index acdd466..a499a50 100644
+--- a/include/infiniband/verbs.h
++++ b/include/infiniband/verbs.h
+@@ -459,6 +459,12 @@ struct ibv_qp_init_attr {
+       } ext;
+ };
++struct ibv_qp_open_attr {
++      void                   *qp_context;
++      uint32_t                qp_num;
++      enum ibv_qp_type        qp_type;
++};
++
+ enum ibv_qp_attr_mask {
+       IBV_QP_STATE                    = 1 <<  0,
+       IBV_QP_CUR_STATE                = 1 <<  1,
+@@ -490,7 +496,8 @@ enum ibv_qp_state {
+       IBV_QPS_RTS,
+       IBV_QPS_SQD,
+       IBV_QPS_SQE,
+-      IBV_QPS_ERR
++      IBV_QPS_ERR,
++      IBV_QPS_UNKNOWN
+ };
+ enum ibv_mig_state {
+@@ -766,6 +773,8 @@ struct ibv_xrc_ops {
+       struct ibv_xrcd *       (*open_xrcd)(struct ibv_context *context,
+                                            int fd, int oflags);
+       int                     (*close_xrcd)(struct ibv_xrcd *xrcd);
++      struct ibv_qp *         (*open_qp)(struct ibv_xrcd *xrcd,
++                                         struct ibv_qp_open_attr *attr);
+ };
+ struct ibv_context {
+@@ -1095,6 +1104,12 @@ struct ibv_qp *ibv_create_qp(struct ibv_pd *pd,
+                            struct ibv_qp_init_attr *qp_init_attr);
+ /**
++ * ibv_open_qp - Open a shareable queue pair.
++ */
++struct ibv_qp *ibv_open_qp(struct ibv_xrcd *xrcd,
++                         struct ibv_qp_open_attr *qp_open_attr);
++
++/**
+  * ibv_modify_qp - Modify a queue pair.
+  */
+ int ibv_modify_qp(struct ibv_qp *qp, struct ibv_qp_attr *attr,
+diff --git a/src/cmd.c b/src/cmd.c
+index cd91517..3f348c1 100644
+--- a/src/cmd.c
++++ b/src/cmd.c
+@@ -737,6 +737,28 @@ int ibv_cmd_create_qp(struct ibv_pd *pd,
+       return 0;
+ }
++int ibv_cmd_open_qp(struct ibv_xrcd *xrcd, struct ibv_qp *qp,
++                  struct ibv_qp_open_attr *attr,
++                  struct ibv_open_qp *cmd, size_t cmd_size,
++                  struct ibv_create_qp_resp *resp, size_t resp_size)
++{
++      IBV_INIT_CMD_RESP(cmd, cmd_size, OPEN_QP, resp, resp_size);
++
++      cmd->user_handle = (uintptr_t) qp;
++      cmd->pd_handle   = xrcd->handle;
++      cmd->qpn         = attr->qp_num;
++      cmd->qp_type     = attr->qp_type;
++
++      if (write(xrcd->context->cmd_fd, cmd, cmd_size) != cmd_size)
++              return errno;
++
++      VALGRIND_MAKE_MEM_DEFINED(resp, resp_size);
++
++      qp->handle     = resp->qp_handle;
++
++      return 0;
++}
++
+ int ibv_cmd_query_qp(struct ibv_qp *qp, struct ibv_qp_attr *attr,
+                    int attr_mask,
+                    struct ibv_qp_init_attr *init_attr,
+diff --git a/src/libibverbs.map b/src/libibverbs.map
+index c2f7bb4..efd6712 100644
+--- a/src/libibverbs.map
++++ b/src/libibverbs.map
+@@ -108,4 +108,6 @@ IBVERBS_1.1 {
+               ibv_open_xrcd;
+               ibv_close_xrcd;
+               ibv_create_xsrq;
++              ibv_cmd_open_qp;
++              ibv_open_qp;
+ } IBVERBS_1.0;
+diff --git a/src/verbs.c b/src/verbs.c
+index 40dbef5..1631610 100644
+--- a/src/verbs.c
++++ b/src/verbs.c
+@@ -502,6 +502,35 @@ struct ibv_qp *__ibv_create_qp(struct ibv_pd *pd,
+ }
+ default_symver(__ibv_create_qp, ibv_create_qp);
++struct ibv_qp *__ibv_open_qp(struct ibv_xrcd *xrcd,
++                           struct ibv_qp_open_attr *qp_open_attr)
++{
++      struct ibv_xrc_ops *ops;
++      struct ibv_qp *qp;
++
++      ops = ibv_get_ext_ops(xrcd->context, IBV_XRC_OPS);
++      qp = ops->open_qp(xrcd, qp_open_attr);
++      if (qp) {
++              qp->context    = xrcd->context;
++              qp->qp_context = qp_open_attr->qp_context;
++
++              qp->pd = NULL;
++              qp->send_cq = qp->recv_cq = NULL;
++              qp->srq = NULL;
++              qp->ext.xrc_recv.xrcd = xrcd;
++
++              qp->qp_num  = qp_open_attr->qp_num;
++              qp->qp_type = qp_open_attr->qp_type;
++              qp->state   = IBV_QPS_UNKNOWN;
++              qp->events_completed = 0;
++              pthread_mutex_init(&qp->mutex, NULL);
++              pthread_cond_init(&qp->cond, NULL);
++      }
++
++      return qp;
++}
++default_symver(__ibv_open_qp, ibv_open_qp);
++
+ int __ibv_query_qp(struct ibv_qp *qp, struct ibv_qp_attr *attr,
+                  int attr_mask,
+                  struct ibv_qp_init_attr *init_attr)