@@ -238,7 +238,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_REG_DMABUF_MR)(
238238 return ret ;
239239
240240 mr = pd -> device -> ops .reg_user_mr_dmabuf (pd , offset , length , iova , fd ,
241- access_flags ,
241+ access_flags , NULL ,
242242 attrs );
243243 if (IS_ERR (mr ))
244244 return PTR_ERR (mr );
@@ -276,6 +276,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_REG_MR)(
276276 u32 valid_access_flags = IB_ACCESS_SUPPORTED ;
277277 u64 length , iova , fd_offset = 0 , addr = 0 ;
278278 struct ib_device * ib_dev = pd -> device ;
279+ struct ib_dmah * dmah = NULL ;
279280 bool has_fd_offset = false;
280281 bool has_addr = false;
281282 bool has_fd = false;
@@ -340,6 +341,13 @@ static int UVERBS_HANDLER(UVERBS_METHOD_REG_MR)(
340341 return - EINVAL ;
341342 }
342343
344+ if (uverbs_attr_is_valid (attrs , UVERBS_ATTR_REG_MR_DMA_HANDLE )) {
345+ dmah = uverbs_attr_get_obj (attrs ,
346+ UVERBS_ATTR_REG_MR_DMA_HANDLE );
347+ if (IS_ERR (dmah ))
348+ return PTR_ERR (dmah );
349+ }
350+
343351 ret = uverbs_get_flags32 (& access_flags , attrs ,
344352 UVERBS_ATTR_REG_MR_ACCESS_FLAGS ,
345353 valid_access_flags );
@@ -351,11 +359,12 @@ static int UVERBS_HANDLER(UVERBS_METHOD_REG_MR)(
351359 return ret ;
352360
353361 if (has_fd )
354- mr = pd -> device -> ops .reg_user_mr_dmabuf (pd , fd_offset , length , iova ,
355- fd , access_flags , attrs );
362+ mr = pd -> device -> ops .reg_user_mr_dmabuf (pd , fd_offset , length ,
363+ iova , fd , access_flags ,
364+ dmah , attrs );
356365 else
357- mr = pd -> device -> ops .reg_user_mr (pd , addr , length ,
358- iova , access_flags , NULL );
366+ mr = pd -> device -> ops .reg_user_mr (pd , addr , length , iova ,
367+ access_flags , dmah , NULL );
359368
360369 if (IS_ERR (mr ))
361370 return PTR_ERR (mr );
@@ -365,6 +374,10 @@ static int UVERBS_HANDLER(UVERBS_METHOD_REG_MR)(
365374 mr -> type = IB_MR_TYPE_USER ;
366375 mr -> uobject = uobj ;
367376 atomic_inc (& pd -> usecnt );
377+ if (dmah ) {
378+ mr -> dmah = dmah ;
379+ atomic_inc (& dmah -> usecnt );
380+ }
368381 rdma_restrack_new (& mr -> res , RDMA_RESTRACK_MR );
369382 rdma_restrack_set_name (& mr -> res , NULL );
370383 rdma_restrack_add (& mr -> res );
@@ -488,6 +501,10 @@ DECLARE_UVERBS_NAMED_METHOD(
488501 UVERBS_OBJECT_PD ,
489502 UVERBS_ACCESS_READ ,
490503 UA_MANDATORY ),
504+ UVERBS_ATTR_IDR (UVERBS_ATTR_REG_MR_DMA_HANDLE ,
505+ UVERBS_OBJECT_DMAH ,
506+ UVERBS_ACCESS_READ ,
507+ UA_OPTIONAL ),
491508 UVERBS_ATTR_PTR_IN (UVERBS_ATTR_REG_MR_IOVA ,
492509 UVERBS_ATTR_TYPE (u64 ),
493510 UA_MANDATORY ),
0 commit comments