@@ -137,7 +137,31 @@ int zxdh_ufree_pd(struct ibv_pd *pd)
137137struct 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,
152176int 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 */
162192int 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 */
172210struct 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)
183235int 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 */
193273int 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
0 commit comments