Skip to content

Commit a272019

Browse files
yishaihrleon
authored andcommitted
IB: Extend UVERBS_METHOD_REG_MR to get DMAH
Extend UVERBS_METHOD_REG_MR to get DMAH and pass it to all drivers. It will be used in mlx5 driver as part of the next patch from the series. Signed-off-by: Yishai Hadas <[email protected]> Reviewed-by: Edward Srouji <[email protected]> Link: https://patch.msgid.link/2ae1e628c0675db81f092cc00d3ad6fbf6139405.1752752567.git.leon@kernel.org Signed-off-by: Leon Romanovsky <[email protected]>
1 parent 3c81907 commit a272019

36 files changed

+154
-20
lines changed

drivers/infiniband/core/uverbs_cmd.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -741,7 +741,7 @@ static int ib_uverbs_reg_mr(struct uverbs_attr_bundle *attrs)
741741
}
742742

743743
mr = pd->device->ops.reg_user_mr(pd, cmd.start, cmd.length, cmd.hca_va,
744-
cmd.access_flags,
744+
cmd.access_flags, NULL,
745745
&attrs->driver_udata);
746746
if (IS_ERR(mr)) {
747747
ret = PTR_ERR(mr);

drivers/infiniband/core/uverbs_std_types_mr.c

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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),

drivers/infiniband/core/verbs.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2223,7 +2223,7 @@ struct ib_mr *ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
22232223
}
22242224

22252225
mr = pd->device->ops.reg_user_mr(pd, start, length, virt_addr,
2226-
access_flags, NULL);
2226+
access_flags, NULL, NULL);
22272227

22282228
if (IS_ERR(mr))
22292229
return mr;
@@ -2262,6 +2262,7 @@ int ib_dereg_mr_user(struct ib_mr *mr, struct ib_udata *udata)
22622262
{
22632263
struct ib_pd *pd = mr->pd;
22642264
struct ib_dm *dm = mr->dm;
2265+
struct ib_dmah *dmah = mr->dmah;
22652266
struct ib_sig_attrs *sig_attrs = mr->sig_attrs;
22662267
int ret;
22672268

@@ -2272,6 +2273,8 @@ int ib_dereg_mr_user(struct ib_mr *mr, struct ib_udata *udata)
22722273
atomic_dec(&pd->usecnt);
22732274
if (dm)
22742275
atomic_dec(&dm->usecnt);
2276+
if (dmah)
2277+
atomic_dec(&dmah->usecnt);
22752278
kfree(sig_attrs);
22762279
}
22772280

drivers/infiniband/hw/bnxt_re/ib_verbs.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4235,13 +4235,17 @@ static struct ib_mr *__bnxt_re_user_reg_mr(struct ib_pd *ib_pd, u64 length, u64
42354235

42364236
struct ib_mr *bnxt_re_reg_user_mr(struct ib_pd *ib_pd, u64 start, u64 length,
42374237
u64 virt_addr, int mr_access_flags,
4238+
struct ib_dmah *dmah,
42384239
struct ib_udata *udata)
42394240
{
42404241
struct bnxt_re_pd *pd = container_of(ib_pd, struct bnxt_re_pd, ib_pd);
42414242
struct bnxt_re_dev *rdev = pd->rdev;
42424243
struct ib_umem *umem;
42434244
struct ib_mr *ib_mr;
42444245

4246+
if (dmah)
4247+
return ERR_PTR(-EOPNOTSUPP);
4248+
42454249
umem = ib_umem_get(&rdev->ibdev, start, length, mr_access_flags);
42464250
if (IS_ERR(umem))
42474251
return ERR_CAST(umem);
@@ -4255,6 +4259,7 @@ struct ib_mr *bnxt_re_reg_user_mr(struct ib_pd *ib_pd, u64 start, u64 length,
42554259
struct ib_mr *bnxt_re_reg_user_mr_dmabuf(struct ib_pd *ib_pd, u64 start,
42564260
u64 length, u64 virt_addr, int fd,
42574261
int mr_access_flags,
4262+
struct ib_dmah *dmah,
42584263
struct uverbs_attr_bundle *attrs)
42594264
{
42604265
struct bnxt_re_pd *pd = container_of(ib_pd, struct bnxt_re_pd, ib_pd);
@@ -4263,6 +4268,9 @@ struct ib_mr *bnxt_re_reg_user_mr_dmabuf(struct ib_pd *ib_pd, u64 start,
42634268
struct ib_umem *umem;
42644269
struct ib_mr *ib_mr;
42654270

4271+
if (dmah)
4272+
return ERR_PTR(-EOPNOTSUPP);
4273+
42664274
umem_dmabuf = ib_umem_dmabuf_get_pinned(&rdev->ibdev, start, length,
42674275
fd, mr_access_flags);
42684276
if (IS_ERR(umem_dmabuf))

drivers/infiniband/hw/bnxt_re/ib_verbs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,10 +258,12 @@ struct ib_mw *bnxt_re_alloc_mw(struct ib_pd *ib_pd, enum ib_mw_type type,
258258
int bnxt_re_dealloc_mw(struct ib_mw *mw);
259259
struct ib_mr *bnxt_re_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
260260
u64 virt_addr, int mr_access_flags,
261+
struct ib_dmah *dmah,
261262
struct ib_udata *udata);
262263
struct ib_mr *bnxt_re_reg_user_mr_dmabuf(struct ib_pd *ib_pd, u64 start,
263264
u64 length, u64 virt_addr,
264265
int fd, int mr_access_flags,
266+
struct ib_dmah *dmah,
265267
struct uverbs_attr_bundle *attrs);
266268
int bnxt_re_alloc_ucontext(struct ib_ucontext *ctx, struct ib_udata *udata);
267269
void bnxt_re_dealloc_ucontext(struct ib_ucontext *context);

drivers/infiniband/hw/cxgb4/iw_cxgb4.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1006,6 +1006,7 @@ int c4iw_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg, int sg_nents,
10061006
void c4iw_dealloc(struct uld_ctx *ctx);
10071007
struct ib_mr *c4iw_reg_user_mr(struct ib_pd *pd, u64 start,
10081008
u64 length, u64 virt, int acc,
1009+
struct ib_dmah *dmah,
10091010
struct ib_udata *udata);
10101011
struct ib_mr *c4iw_get_dma_mr(struct ib_pd *pd, int acc);
10111012
int c4iw_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata);

drivers/infiniband/hw/cxgb4/mem.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,8 @@ struct ib_mr *c4iw_get_dma_mr(struct ib_pd *pd, int acc)
489489
}
490490

491491
struct ib_mr *c4iw_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
492-
u64 virt, int acc, struct ib_udata *udata)
492+
u64 virt, int acc, struct ib_dmah *dmah,
493+
struct ib_udata *udata)
493494
{
494495
__be64 *pages;
495496
int shift, n, i;
@@ -501,6 +502,9 @@ struct ib_mr *c4iw_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
501502

502503
pr_debug("ib_pd %p\n", pd);
503504

505+
if (dmah)
506+
return ERR_PTR(-EOPNOTSUPP);
507+
504508
if (length == ~0ULL)
505509
return ERR_PTR(-EINVAL);
506510

drivers/infiniband/hw/efa/efa.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,10 +167,12 @@ int efa_create_cq_umem(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
167167
struct ib_umem *umem, struct uverbs_attr_bundle *attrs);
168168
struct ib_mr *efa_reg_mr(struct ib_pd *ibpd, u64 start, u64 length,
169169
u64 virt_addr, int access_flags,
170+
struct ib_dmah *dmah,
170171
struct ib_udata *udata);
171172
struct ib_mr *efa_reg_user_mr_dmabuf(struct ib_pd *ibpd, u64 start,
172173
u64 length, u64 virt_addr,
173174
int fd, int access_flags,
175+
struct ib_dmah *dmah,
174176
struct uverbs_attr_bundle *attrs);
175177
int efa_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata);
176178
int efa_get_port_immutable(struct ib_device *ibdev, u32 port_num,

drivers/infiniband/hw/efa/efa_verbs.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1765,13 +1765,19 @@ static int efa_register_mr(struct ib_pd *ibpd, struct efa_mr *mr, u64 start,
17651765
struct ib_mr *efa_reg_user_mr_dmabuf(struct ib_pd *ibpd, u64 start,
17661766
u64 length, u64 virt_addr,
17671767
int fd, int access_flags,
1768+
struct ib_dmah *dmah,
17681769
struct uverbs_attr_bundle *attrs)
17691770
{
17701771
struct efa_dev *dev = to_edev(ibpd->device);
17711772
struct ib_umem_dmabuf *umem_dmabuf;
17721773
struct efa_mr *mr;
17731774
int err;
17741775

1776+
if (dmah) {
1777+
err = -EOPNOTSUPP;
1778+
goto err_out;
1779+
}
1780+
17751781
mr = efa_alloc_mr(ibpd, access_flags, &attrs->driver_udata);
17761782
if (IS_ERR(mr)) {
17771783
err = PTR_ERR(mr);
@@ -1804,12 +1810,18 @@ struct ib_mr *efa_reg_user_mr_dmabuf(struct ib_pd *ibpd, u64 start,
18041810

18051811
struct ib_mr *efa_reg_mr(struct ib_pd *ibpd, u64 start, u64 length,
18061812
u64 virt_addr, int access_flags,
1813+
struct ib_dmah *dmah,
18071814
struct ib_udata *udata)
18081815
{
18091816
struct efa_dev *dev = to_edev(ibpd->device);
18101817
struct efa_mr *mr;
18111818
int err;
18121819

1820+
if (dmah) {
1821+
err = -EOPNOTSUPP;
1822+
goto err_out;
1823+
}
1824+
18131825
mr = efa_alloc_mr(ibpd, access_flags, udata);
18141826
if (IS_ERR(mr)) {
18151827
err = PTR_ERR(mr);

drivers/infiniband/hw/erdma/erdma_verbs.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1200,13 +1200,17 @@ int erdma_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg, int sg_nents,
12001200
}
12011201

12021202
struct ib_mr *erdma_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 len,
1203-
u64 virt, int access, struct ib_udata *udata)
1203+
u64 virt, int access, struct ib_dmah *dmah,
1204+
struct ib_udata *udata)
12041205
{
12051206
struct erdma_mr *mr = NULL;
12061207
struct erdma_dev *dev = to_edev(ibpd->device);
12071208
u32 stag;
12081209
int ret;
12091210

1211+
if (dmah)
1212+
return ERR_PTR(-EOPNOTSUPP);
1213+
12101214
if (!len || len > dev->attrs.max_mr_size)
12111215
return ERR_PTR(-EINVAL);
12121216

0 commit comments

Comments
 (0)