@@ -2158,32 +2158,39 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_SUBSCRIBE_EVENT)(
21582158
21592159static int devx_umem_get (struct mlx5_ib_dev * dev , struct ib_ucontext * ucontext ,
21602160 struct uverbs_attr_bundle * attrs ,
2161- struct devx_umem * obj )
2161+ struct devx_umem * obj , u32 access_flags )
21622162{
21632163 u64 addr ;
21642164 size_t size ;
2165- u32 access ;
21662165 int err ;
21672166
21682167 if (uverbs_copy_from (& addr , attrs , MLX5_IB_ATTR_DEVX_UMEM_REG_ADDR ) ||
21692168 uverbs_copy_from (& size , attrs , MLX5_IB_ATTR_DEVX_UMEM_REG_LEN ))
21702169 return - EFAULT ;
21712170
2172- err = uverbs_get_flags32 (& access , attrs ,
2173- MLX5_IB_ATTR_DEVX_UMEM_REG_ACCESS ,
2174- IB_ACCESS_LOCAL_WRITE |
2175- IB_ACCESS_REMOTE_WRITE |
2176- IB_ACCESS_REMOTE_READ );
2171+ err = ib_check_mr_access (& dev -> ib_dev , access_flags );
21772172 if (err )
21782173 return err ;
21792174
2180- err = ib_check_mr_access (& dev -> ib_dev , access );
2181- if (err )
2182- return err ;
2175+ if (uverbs_attr_is_valid (attrs , MLX5_IB_ATTR_DEVX_UMEM_REG_DMABUF_FD )) {
2176+ struct ib_umem_dmabuf * umem_dmabuf ;
2177+ int dmabuf_fd ;
2178+
2179+ err = uverbs_get_raw_fd (& dmabuf_fd , attrs ,
2180+ MLX5_IB_ATTR_DEVX_UMEM_REG_DMABUF_FD );
2181+ if (err )
2182+ return - EFAULT ;
21832183
2184- obj -> umem = ib_umem_get (& dev -> ib_dev , addr , size , access );
2185- if (IS_ERR (obj -> umem ))
2186- return PTR_ERR (obj -> umem );
2184+ umem_dmabuf = ib_umem_dmabuf_get_pinned (
2185+ & dev -> ib_dev , addr , size , dmabuf_fd , access_flags );
2186+ if (IS_ERR (umem_dmabuf ))
2187+ return PTR_ERR (umem_dmabuf );
2188+ obj -> umem = & umem_dmabuf -> umem ;
2189+ } else {
2190+ obj -> umem = ib_umem_get (& dev -> ib_dev , addr , size , access_flags );
2191+ if (IS_ERR (obj -> umem ))
2192+ return PTR_ERR (obj -> umem );
2193+ }
21872194 return 0 ;
21882195}
21892196
@@ -2222,7 +2229,8 @@ static unsigned int devx_umem_find_best_pgsize(struct ib_umem *umem,
22222229static int devx_umem_reg_cmd_alloc (struct mlx5_ib_dev * dev ,
22232230 struct uverbs_attr_bundle * attrs ,
22242231 struct devx_umem * obj ,
2225- struct devx_umem_reg_cmd * cmd )
2232+ struct devx_umem_reg_cmd * cmd ,
2233+ int access )
22262234{
22272235 unsigned long pgsz_bitmap ;
22282236 unsigned int page_size ;
@@ -2271,6 +2279,9 @@ static int devx_umem_reg_cmd_alloc(struct mlx5_ib_dev *dev,
22712279 MLX5_SET (umem , umem , page_offset ,
22722280 ib_umem_dma_offset (obj -> umem , page_size ));
22732281
2282+ if (mlx5_umem_needs_ats (dev , obj -> umem , access ))
2283+ MLX5_SET (umem , umem , ats , 1 );
2284+
22742285 mlx5_ib_populate_pas (obj -> umem , page_size , mtt ,
22752286 (obj -> umem -> writable ? MLX5_IB_MTT_WRITE : 0 ) |
22762287 MLX5_IB_MTT_READ );
@@ -2288,20 +2299,30 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_UMEM_REG)(
22882299 struct mlx5_ib_ucontext * c = rdma_udata_to_drv_context (
22892300 & attrs -> driver_udata , struct mlx5_ib_ucontext , ibucontext );
22902301 struct mlx5_ib_dev * dev = to_mdev (c -> ibucontext .device );
2302+ int access_flags ;
22912303 int err ;
22922304
22932305 if (!c -> devx_uid )
22942306 return - EINVAL ;
22952307
2308+ err = uverbs_get_flags32 (& access_flags , attrs ,
2309+ MLX5_IB_ATTR_DEVX_UMEM_REG_ACCESS ,
2310+ IB_ACCESS_LOCAL_WRITE |
2311+ IB_ACCESS_REMOTE_WRITE |
2312+ IB_ACCESS_REMOTE_READ |
2313+ IB_ACCESS_RELAXED_ORDERING );
2314+ if (err )
2315+ return err ;
2316+
22962317 obj = kzalloc (sizeof (struct devx_umem ), GFP_KERNEL );
22972318 if (!obj )
22982319 return - ENOMEM ;
22992320
2300- err = devx_umem_get (dev , & c -> ibucontext , attrs , obj );
2321+ err = devx_umem_get (dev , & c -> ibucontext , attrs , obj , access_flags );
23012322 if (err )
23022323 goto err_obj_free ;
23032324
2304- err = devx_umem_reg_cmd_alloc (dev , attrs , obj , & cmd );
2325+ err = devx_umem_reg_cmd_alloc (dev , attrs , obj , & cmd , access_flags );
23052326 if (err )
23062327 goto err_umem_release ;
23072328
@@ -2833,6 +2854,8 @@ DECLARE_UVERBS_NAMED_METHOD(
28332854 UVERBS_ATTR_PTR_IN (MLX5_IB_ATTR_DEVX_UMEM_REG_LEN ,
28342855 UVERBS_ATTR_TYPE (u64 ),
28352856 UA_MANDATORY ),
2857+ UVERBS_ATTR_RAW_FD (MLX5_IB_ATTR_DEVX_UMEM_REG_DMABUF_FD ,
2858+ UA_OPTIONAL ),
28362859 UVERBS_ATTR_FLAGS_IN (MLX5_IB_ATTR_DEVX_UMEM_REG_ACCESS ,
28372860 enum ib_access_flags ),
28382861 UVERBS_ATTR_CONST_IN (MLX5_IB_ATTR_DEVX_UMEM_REG_PGSZ_BITMAP ,
0 commit comments