From e402838c3cf604dc472b19861a21343fa23e8bf5 Mon Sep 17 00:00:00 2001 From: Sean Hefty Date: Thu, 22 Dec 2011 00:10:11 -0800 Subject: [PATCH] import --- meta | 5 +- patches/open_qp | 208 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 211 insertions(+), 2 deletions(-) create mode 100644 patches/open_qp diff --git a/meta b/meta index 13045b6..f61b803 100644 --- 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 index 0000000..e4229bc --- /dev/null +++ b/patches/open_qp @@ -0,0 +1,208 @@ +Bottom: 743c5750c90cd7c3f85b30f5b5d3a11738b2113c +Top: 3ddad6396082eca0c222a66bf7f2217886a4d086 +Author: Sean Hefty +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 + + +--- + +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) -- 2.46.0