Skip to content

Commit 9017116

Browse files
committed
libzrdma: Add support for mr related verbs
This patch add the following verbs: reg_mr rereg_mr dereg_mr alloc_mw bind_mw dealloc_mw on-behalf-of: @ZTE [email protected] Signed-off-by: zte_lifuyan <[email protected]>
1 parent 2352460 commit 9017116

File tree

2 files changed

+99
-4
lines changed

2 files changed

+99
-4
lines changed

providers/zrdma/zxdh_verbs.c

Lines changed: 91 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,31 @@ int zxdh_ufree_pd(struct ibv_pd *pd)
137137
struct ibv_mr *zxdh_ureg_mr(struct ibv_pd *pd, void *addr, size_t length,
138138
uint64_t hca_va, int access)
139139
{
140-
return NULL;
140+
struct zxdh_umr *umr;
141+
struct zxdh_ureg_mr cmd;
142+
struct zxdh_ureg_mr_resp resp = {};
143+
int err;
144+
145+
umr = malloc(sizeof(*umr));
146+
if (!umr)
147+
return NULL;
148+
149+
cmd.reg_type = ZXDH_MEMREG_TYPE_MEM;
150+
err = ibv_cmd_reg_mr(pd, addr, length, hca_va, access, &umr->vmr,
151+
&cmd.ibv_cmd, sizeof(cmd), &resp.ibv_resp,
152+
sizeof(resp));
153+
if (err) {
154+
free(umr);
155+
errno = err;
156+
return NULL;
157+
}
158+
umr->acc_flags = access;
159+
umr->host_page_size = resp.host_page_size;
160+
umr->leaf_pbl_size = resp.leaf_pbl_size;
161+
umr->mr_pa_pble_index = resp.mr_pa_hig;
162+
umr->mr_pa_pble_index = (umr->mr_pa_pble_index << 32) | resp.mr_pa_low;
163+
164+
return &umr->vmr.ibv_mr;
141165
}
142166

143167
/*
@@ -152,7 +176,13 @@ struct ibv_mr *zxdh_ureg_mr(struct ibv_pd *pd, void *addr, size_t length,
152176
int zxdh_urereg_mr(struct verbs_mr *vmr, int flags, struct ibv_pd *pd,
153177
void *addr, size_t length, int access)
154178
{
155-
return 0;
179+
struct zxdh_urereg_mr cmd = {};
180+
struct ib_uverbs_rereg_mr_resp resp;
181+
182+
cmd.reg_type = ZXDH_MEMREG_TYPE_MEM;
183+
return ibv_cmd_rereg_mr(vmr, flags, addr, length, (uintptr_t)addr,
184+
access, pd, &cmd.ibv_cmd, sizeof(cmd), &resp,
185+
sizeof(resp));
156186
}
157187

158188
/**
@@ -161,6 +191,14 @@ int zxdh_urereg_mr(struct verbs_mr *vmr, int flags, struct ibv_pd *pd,
161191
*/
162192
int zxdh_udereg_mr(struct verbs_mr *vmr)
163193
{
194+
int ret;
195+
196+
ret = ibv_cmd_dereg_mr(vmr);
197+
if (ret)
198+
return ret;
199+
200+
free(vmr);
201+
164202
return 0;
165203
}
166204

@@ -171,7 +209,21 @@ int zxdh_udereg_mr(struct verbs_mr *vmr)
171209
*/
172210
struct ibv_mw *zxdh_ualloc_mw(struct ibv_pd *pd, enum ibv_mw_type type)
173211
{
174-
return NULL;
212+
struct ibv_mw *mw;
213+
struct ibv_alloc_mw cmd;
214+
struct ib_uverbs_alloc_mw_resp resp;
215+
216+
mw = calloc(1, sizeof(*mw));
217+
if (!mw)
218+
return NULL;
219+
220+
if (ibv_cmd_alloc_mw(pd, type, mw, &cmd, sizeof(cmd), &resp,
221+
sizeof(resp))) {
222+
free(mw);
223+
return NULL;
224+
}
225+
226+
return mw;
175227
}
176228

177229
/**
@@ -183,7 +235,35 @@ struct ibv_mw *zxdh_ualloc_mw(struct ibv_pd *pd, enum ibv_mw_type type)
183235
int zxdh_ubind_mw(struct ibv_qp *qp, struct ibv_mw *mw,
184236
struct ibv_mw_bind *mw_bind)
185237
{
186-
return 0;
238+
struct ibv_mw_bind_info *bind_info = &mw_bind->bind_info;
239+
struct verbs_mr *vmr = verbs_get_mr(bind_info->mr);
240+
struct zxdh_umr *umr = container_of(vmr, struct zxdh_umr, vmr);
241+
struct ibv_send_wr wr = {};
242+
struct ibv_send_wr *bad_wr;
243+
int err;
244+
245+
if (vmr->mr_type != IBV_MR_TYPE_MR)
246+
return -ENOTSUP;
247+
248+
if (umr->acc_flags & IBV_ACCESS_ZERO_BASED)
249+
return -EINVAL;
250+
251+
if (mw->type != IBV_MW_TYPE_1)
252+
return -EINVAL;
253+
254+
wr.opcode = IBV_WR_BIND_MW;
255+
wr.bind_mw.bind_info = mw_bind->bind_info;
256+
wr.bind_mw.mw = mw;
257+
wr.bind_mw.rkey = ibv_inc_rkey(mw->rkey);
258+
259+
wr.wr_id = mw_bind->wr_id;
260+
wr.send_flags = mw_bind->send_flags;
261+
262+
err = zxdh_upost_send(qp, &wr, &bad_wr);
263+
if (!err)
264+
mw->rkey = wr.bind_mw.rkey;
265+
266+
return err;
187267
}
188268

189269
/**
@@ -192,6 +272,13 @@ int zxdh_ubind_mw(struct ibv_qp *qp, struct ibv_mw *mw,
192272
*/
193273
int zxdh_udealloc_mw(struct ibv_mw *mw)
194274
{
275+
int ret;
276+
277+
ret = ibv_cmd_dealloc_mw(mw);
278+
if (ret)
279+
return ret;
280+
free(mw);
281+
195282
return 0;
196283
}
197284

providers/zrdma/zxdh_zrdma.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,14 @@ struct zxdh_uvcontext {
6262
struct zxdh_uvcontext_ops *cxt_ops;
6363
};
6464

65+
struct zxdh_umr {
66+
struct verbs_mr vmr;
67+
uint32_t acc_flags;
68+
uint8_t leaf_pbl_size;
69+
uint8_t host_page_size;
70+
uint64_t mr_pa_pble_index;
71+
};
72+
6573
/* zxdh_verbs.c */
6674
int zxdh_uquery_device_ex(struct ibv_context *context,
6775
const struct ibv_query_device_ex_input *input,

0 commit comments

Comments
 (0)