1 Added support for XRC receive-only QPs (version 2).
3 Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
6 1. xrc_ops changed to more_ops
8 diff --git a/src/mlx4.c b/src/mlx4.c
9 index 27ca75d..e5ded78 100644
12 @@ -74,6 +74,11 @@ static struct ibv_more_ops mlx4_more_ops = {
13 .create_xrc_srq = mlx4_create_xrc_srq,
14 .open_xrc_domain = mlx4_open_xrc_domain,
15 .close_xrc_domain = mlx4_close_xrc_domain,
16 + .create_xrc_rcv_qp = mlx4_create_xrc_rcv_qp,
17 + .modify_xrc_rcv_qp = mlx4_modify_xrc_rcv_qp,
18 + .query_xrc_rcv_qp = mlx4_query_xrc_rcv_qp,
19 + .reg_xrc_rcv_qp = mlx4_reg_xrc_rcv_qp,
20 + .unreg_xrc_rcv_qp = mlx4_unreg_xrc_rcv_qp,
24 diff --git a/src/mlx4.h b/src/mlx4.h
25 index 3eadb98..6307a2d 100644
28 @@ -429,6 +429,21 @@ struct ibv_xrc_domain *mlx4_open_xrc_domain(struct ibv_context *context,
31 int mlx4_close_xrc_domain(struct ibv_xrc_domain *d);
32 +int mlx4_create_xrc_rcv_qp(struct ibv_qp_init_attr *init_attr,
33 + uint32_t *xrc_qp_num);
34 +int mlx4_modify_xrc_rcv_qp(struct ibv_xrc_domain *xrc_domain,
35 + uint32_t xrc_qp_num,
36 + struct ibv_qp_attr *attr,
38 +int mlx4_query_xrc_rcv_qp(struct ibv_xrc_domain *xrc_domain,
39 + uint32_t xrc_qp_num,
40 + struct ibv_qp_attr *attr,
42 + struct ibv_qp_init_attr *init_attr);
43 +int mlx4_reg_xrc_rcv_qp(struct ibv_xrc_domain *xrc_domain,
44 + uint32_t xrc_qp_num);
45 +int mlx4_unreg_xrc_rcv_qp(struct ibv_xrc_domain *xrc_domain,
46 + uint32_t xrc_qp_num);
50 diff --git a/src/verbs.c b/src/verbs.c
51 index b7c9c8e..8261eae 100644
54 @@ -778,4 +778,59 @@ int mlx4_close_xrc_domain(struct ibv_xrc_domain *d)
59 +int mlx4_create_xrc_rcv_qp(struct ibv_qp_init_attr *init_attr,
60 + uint32_t *xrc_qp_num)
63 + return ibv_cmd_create_xrc_rcv_qp(init_attr, xrc_qp_num);
66 +int mlx4_modify_xrc_rcv_qp(struct ibv_xrc_domain *xrc_domain,
67 + uint32_t xrc_qp_num,
68 + struct ibv_qp_attr *attr,
71 + return ibv_cmd_modify_xrc_rcv_qp(xrc_domain, xrc_qp_num,
75 +int mlx4_query_xrc_rcv_qp(struct ibv_xrc_domain *xrc_domain,
76 + uint32_t xrc_qp_num,
77 + struct ibv_qp_attr *attr,
79 + struct ibv_qp_init_attr *init_attr)
83 + ret = ibv_cmd_query_xrc_rcv_qp(xrc_domain, xrc_qp_num,
84 + attr, attr_mask, init_attr);
88 + init_attr->cap.max_send_wr = init_attr->cap.max_send_sge = 1;
89 + init_attr->cap.max_recv_sge = init_attr->cap.max_recv_wr = 0;
90 + init_attr->cap.max_inline_data = 0;
91 + init_attr->recv_cq = init_attr->send_cq = NULL;
92 + init_attr->srq = NULL;
93 + init_attr->xrc_domain = xrc_domain;
94 + init_attr->qp_type = IBV_QPT_XRC;
95 + init_attr->qp_context = NULL;
96 + attr->cap = init_attr->cap;
101 +int mlx4_reg_xrc_rcv_qp(struct ibv_xrc_domain *xrc_domain,
102 + uint32_t xrc_qp_num)
104 + return ibv_cmd_reg_xrc_rcv_qp(xrc_domain, xrc_qp_num);
107 +int mlx4_unreg_xrc_rcv_qp(struct ibv_xrc_domain *xrc_domain,
108 + uint32_t xrc_qp_num)
110 + return ibv_cmd_unreg_xrc_rcv_qp(xrc_domain, xrc_qp_num);