--- /dev/null
+Bottom: 6959e49c2b6f7ac0f35d98c0dccbcba4838f0d5d
+Top: 1a16e3381c4b7dbc2761fffbde96a85542425f8d
+Author: Sean Hefty <sean.hefty@intel.com>
+Date: 2012-09-26 14:13:38 -0700
+
+Refresh of open_qp
+
+---
+
+diff --git a/include/infiniband/driver.h b/include/infiniband/driver.h
+index b47a510..7c551b8 100644
+--- a/include/infiniband/driver.h
++++ b/include/infiniband/driver.h
+@@ -164,8 +164,8 @@ int ibv_cmd_create_qp_ex(struct verbs_context *context,
+ struct verbs_qp *qp, struct ibv_qp_init_attr_ex *attr_ex,
+ 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,
++int ibv_cmd_open_qp(struct verbs_xrcd *xrcd,
++ struct verbs_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,
+diff --git a/include/infiniband/verbs.h b/include/infiniband/verbs.h
+index 3c4cbe8..d0c3e1d 100644
+--- a/include/infiniband/verbs.h
++++ b/include/infiniband/verbs.h
+@@ -1179,8 +1179,16 @@ ibv_create_qp_ex(struct ibv_context *context, struct ibv_qp_init_attr_ex *qp_ini
+ /**
+ * 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);
++static inline struct ibv_qp *
++ibv_open_qp(struct ibv_xrcd *xrcd, struct ibv_qp_open_attr *qp_open_attr);
++{
++ struct verbs_context *vctx = verbs_get_ctx_op(xrcd->context, open_qp);
++ if (!vctx) {
++ errno = ENOSYS;
++ return NULL;
++ }
++ return vctx->open_qp(context, qp_open_attr);
++}
+
+ /**
+ * ibv_modify_qp - Modify a queue pair.
+diff --git a/src/cmd.c b/src/cmd.c
+index 75afdc2..da13177 100644
+--- a/src/cmd.c
++++ b/src/cmd.c
+@@ -797,7 +797,7 @@ int ibv_cmd_create_qp(struct ibv_pd *pd,
+ return 0;
+ }
+
+-int ibv_cmd_open_qp(struct ibv_xrcd *xrcd, struct ibv_qp *qp,
++int ibv_cmd_open_qp(struct verbs_xrcd *xrcd, struct verbs_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)
+@@ -814,7 +814,20 @@ int ibv_cmd_open_qp(struct ibv_xrcd *xrcd, struct ibv_qp *qp,
+
+ VALGRIND_MAKE_MEM_DEFINED(resp, resp_size);
+
+- qp->handle = resp->qp_handle;
++ qp->qp.handle = resp->qp_handle;
++ qp->qp.context = xrcd->xrcd.context;
++ qp->qp.qp_context = qp_open_attr->qp_context;
++ qp->qp.pd = NULL;
++ qp->qp.send_cq = qp->qp.recv_cq = NULL;
++ qp->qp.srq = NULL;
++ qp->qp.qp_num = qp_open_attr->qp_num;
++ qp->qp.qp_type = qp_open_attr->qp_type;
++ qp->qp.state = IBV_QPS_UNKNOWN;
++ qp->qp.events_completed = 0;
++ pthread_mutex_init(&qp->qp.mutex, NULL);
++ pthread_cond_init(&qp->qp.cond, NULL);
++ qp->comp_mask = IBV_QP_XRCD;
++ qp->xrcd = xrcd;
+
+ return 0;
+ }
+diff --git a/src/libibverbs.map b/src/libibverbs.map
+index c9b29c6..5ad8312 100644
+--- a/src/libibverbs.map
++++ b/src/libibverbs.map
+@@ -102,7 +102,6 @@ IBVERBS_1.1 {
+ ibv_cmd_close_xrcd;
+ ibv_cmd_create_srq_ex;
+ ibv_cmd_create_qp_ex;
+- ibv_open_qp;
+ ibv_cmd_open_qp;
+
+ } IBVERBS_1.0;
+diff --git a/src/verbs.c b/src/verbs.c
+index dbb2210..b5938f2 100644
+--- a/src/verbs.c
++++ b/src/verbs.c
+@@ -418,42 +418,6 @@ 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 verbs_context *context_ex;
+- struct ibv_qp *qp;
+-
+- context_ex = verbs_get_ctx(xrcd->context);
+- if (!context_ex->open_qp ||
+- qp_open_attr->comp_mask >= IBV_QP_OPEN_ATTR_RESERVED) {
+- errno = ENOSYS;
+- return NULL;
+- }
+-
+- qp = context_ex->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->comp_mask |= IBV_QP_XRCD;
+- qp->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)