]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/ofed/libmlx4/fixes/xrc_rcv_qp_v2.patch
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / ofed / libmlx4 / fixes / xrc_rcv_qp_v2.patch
1 Added support for XRC receive-only QPs (version 2).
2
3 Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
4 ---
5 V2:
6 1. xrc_ops changed to more_ops
7
8 diff --git a/src/mlx4.c b/src/mlx4.c
9 index 27ca75d..e5ded78 100644
10 --- a/src/mlx4.c
11 +++ b/src/mlx4.c
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,
21  #endif
22  };
23  #endif
24 diff --git a/src/mlx4.h b/src/mlx4.h
25 index 3eadb98..6307a2d 100644
26 --- a/src/mlx4.h
27 +++ b/src/mlx4.h
28 @@ -429,6 +429,21 @@ struct ibv_xrc_domain *mlx4_open_xrc_domain(struct ibv_context *context,
29                                             int fd, int oflag);
30  
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,
37 +                          int attr_mask);
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,
41 +                         int attr_mask,
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);
47  #endif
48  
49  
50 diff --git a/src/verbs.c b/src/verbs.c
51 index b7c9c8e..8261eae 100644
52 --- a/src/verbs.c
53 +++ b/src/verbs.c
54 @@ -778,4 +778,59 @@ int mlx4_close_xrc_domain(struct ibv_xrc_domain *d)
55         free(d);
56         return 0;
57  }
58 +
59 +int mlx4_create_xrc_rcv_qp(struct ibv_qp_init_attr *init_attr,
60 +                          uint32_t *xrc_qp_num)
61 +{
62 +
63 +       return ibv_cmd_create_xrc_rcv_qp(init_attr, xrc_qp_num);
64 +}
65 +
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,
69 +                          int attr_mask)
70 +{
71 +       return ibv_cmd_modify_xrc_rcv_qp(xrc_domain, xrc_qp_num,
72 +                                        attr, attr_mask);
73 +}
74 +
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,
78 +                         int attr_mask,
79 +                         struct ibv_qp_init_attr *init_attr)
80 +{
81 +       int ret;
82 +
83 +       ret = ibv_cmd_query_xrc_rcv_qp(xrc_domain, xrc_qp_num,
84 +                                      attr, attr_mask, init_attr);
85 +       if (ret)
86 +               return ret;
87 +
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;
97 +
98 +       return 0;
99 +}
100 +
101 +int mlx4_reg_xrc_rcv_qp(struct ibv_xrc_domain *xrc_domain,
102 +                       uint32_t xrc_qp_num)
103 +{
104 +       return ibv_cmd_reg_xrc_rcv_qp(xrc_domain, xrc_qp_num);
105 +}
106 +
107 +int mlx4_unreg_xrc_rcv_qp(struct ibv_xrc_domain *xrc_domain,
108 +                         uint32_t xrc_qp_num)
109 +{
110 +       return ibv_cmd_unreg_xrc_rcv_qp(xrc_domain, xrc_qp_num);
111 +}
112 +
113  #endif