Commit a272019a authored by Yishai Hadas's avatar Yishai Hadas Committed by Leon Romanovsky
Browse files

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: default avatarYishai Hadas <yishaih@nvidia.com>
Reviewed-by: default avatarEdward Srouji <edwards@nvidia.com>
Link: https://patch.msgid.link/2ae1e628c0675db81f092cc00d3ad6fbf6139405.1752752567.git.leon@kernel.org


Signed-off-by: default avatarLeon Romanovsky <leon@kernel.org>
parent 3c819070
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -741,7 +741,7 @@ static int ib_uverbs_reg_mr(struct uverbs_attr_bundle *attrs)
	}

	mr = pd->device->ops.reg_user_mr(pd, cmd.start, cmd.length, cmd.hca_va,
					 cmd.access_flags,
					 cmd.access_flags, NULL,
					 &attrs->driver_udata);
	if (IS_ERR(mr)) {
		ret = PTR_ERR(mr);
+22 −5
Original line number Diff line number Diff line
@@ -238,7 +238,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_REG_DMABUF_MR)(
		return ret;

	mr = pd->device->ops.reg_user_mr_dmabuf(pd, offset, length, iova, fd,
						access_flags,
						access_flags, NULL,
						attrs);
	if (IS_ERR(mr))
		return PTR_ERR(mr);
@@ -276,6 +276,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_REG_MR)(
	u32 valid_access_flags = IB_ACCESS_SUPPORTED;
	u64 length, iova, fd_offset = 0, addr = 0;
	struct ib_device *ib_dev = pd->device;
	struct ib_dmah *dmah = NULL;
	bool has_fd_offset = false;
	bool has_addr = false;
	bool has_fd = false;
@@ -340,6 +341,13 @@ static int UVERBS_HANDLER(UVERBS_METHOD_REG_MR)(
			return -EINVAL;
	}

	if (uverbs_attr_is_valid(attrs, UVERBS_ATTR_REG_MR_DMA_HANDLE)) {
		dmah = uverbs_attr_get_obj(attrs,
					   UVERBS_ATTR_REG_MR_DMA_HANDLE);
		if (IS_ERR(dmah))
			return PTR_ERR(dmah);
	}

	ret = uverbs_get_flags32(&access_flags, attrs,
				 UVERBS_ATTR_REG_MR_ACCESS_FLAGS,
				 valid_access_flags);
@@ -351,11 +359,12 @@ static int UVERBS_HANDLER(UVERBS_METHOD_REG_MR)(
		return ret;

	if (has_fd)
		mr = pd->device->ops.reg_user_mr_dmabuf(pd, fd_offset, length, iova,
							fd, access_flags, attrs);
		mr = pd->device->ops.reg_user_mr_dmabuf(pd, fd_offset, length,
							iova, fd, access_flags,
							dmah, attrs);
	else
		mr = pd->device->ops.reg_user_mr(pd, addr, length,
						 iova, access_flags, NULL);
		mr = pd->device->ops.reg_user_mr(pd, addr, length, iova,
						 access_flags, dmah, NULL);

	if (IS_ERR(mr))
		return PTR_ERR(mr);
@@ -365,6 +374,10 @@ static int UVERBS_HANDLER(UVERBS_METHOD_REG_MR)(
	mr->type = IB_MR_TYPE_USER;
	mr->uobject = uobj;
	atomic_inc(&pd->usecnt);
	if (dmah) {
		mr->dmah = dmah;
		atomic_inc(&dmah->usecnt);
	}
	rdma_restrack_new(&mr->res, RDMA_RESTRACK_MR);
	rdma_restrack_set_name(&mr->res, NULL);
	rdma_restrack_add(&mr->res);
@@ -488,6 +501,10 @@ DECLARE_UVERBS_NAMED_METHOD(
			UVERBS_OBJECT_PD,
			UVERBS_ACCESS_READ,
			UA_MANDATORY),
	UVERBS_ATTR_IDR(UVERBS_ATTR_REG_MR_DMA_HANDLE,
			UVERBS_OBJECT_DMAH,
			UVERBS_ACCESS_READ,
			UA_OPTIONAL),
	UVERBS_ATTR_PTR_IN(UVERBS_ATTR_REG_MR_IOVA,
			   UVERBS_ATTR_TYPE(u64),
			   UA_MANDATORY),
+4 −1
Original line number Diff line number Diff line
@@ -2223,7 +2223,7 @@ struct ib_mr *ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
	}

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

	if (IS_ERR(mr))
		return mr;
@@ -2262,6 +2262,7 @@ int ib_dereg_mr_user(struct ib_mr *mr, struct ib_udata *udata)
{
	struct ib_pd *pd = mr->pd;
	struct ib_dm *dm = mr->dm;
	struct ib_dmah *dmah = mr->dmah;
	struct ib_sig_attrs *sig_attrs = mr->sig_attrs;
	int ret;

@@ -2272,6 +2273,8 @@ int ib_dereg_mr_user(struct ib_mr *mr, struct ib_udata *udata)
		atomic_dec(&pd->usecnt);
		if (dm)
			atomic_dec(&dm->usecnt);
		if (dmah)
			atomic_dec(&dmah->usecnt);
		kfree(sig_attrs);
	}

+8 −0
Original line number Diff line number Diff line
@@ -4235,6 +4235,7 @@ static struct ib_mr *__bnxt_re_user_reg_mr(struct ib_pd *ib_pd, u64 length, u64

struct ib_mr *bnxt_re_reg_user_mr(struct ib_pd *ib_pd, u64 start, u64 length,
				  u64 virt_addr, int mr_access_flags,
				  struct ib_dmah *dmah,
				  struct ib_udata *udata)
{
	struct bnxt_re_pd *pd = container_of(ib_pd, struct bnxt_re_pd, ib_pd);
@@ -4242,6 +4243,9 @@ struct ib_mr *bnxt_re_reg_user_mr(struct ib_pd *ib_pd, u64 start, u64 length,
	struct ib_umem *umem;
	struct ib_mr *ib_mr;

	if (dmah)
		return ERR_PTR(-EOPNOTSUPP);

	umem = ib_umem_get(&rdev->ibdev, start, length, mr_access_flags);
	if (IS_ERR(umem))
		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,
struct ib_mr *bnxt_re_reg_user_mr_dmabuf(struct ib_pd *ib_pd, u64 start,
					 u64 length, u64 virt_addr, int fd,
					 int mr_access_flags,
					 struct ib_dmah *dmah,
					 struct uverbs_attr_bundle *attrs)
{
	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,
	struct ib_umem *umem;
	struct ib_mr *ib_mr;

	if (dmah)
		return ERR_PTR(-EOPNOTSUPP);

	umem_dmabuf = ib_umem_dmabuf_get_pinned(&rdev->ibdev, start, length,
						fd, mr_access_flags);
	if (IS_ERR(umem_dmabuf))
+2 −0
Original line number Diff line number Diff line
@@ -258,10 +258,12 @@ struct ib_mw *bnxt_re_alloc_mw(struct ib_pd *ib_pd, enum ib_mw_type type,
int bnxt_re_dealloc_mw(struct ib_mw *mw);
struct ib_mr *bnxt_re_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
				  u64 virt_addr, int mr_access_flags,
				  struct ib_dmah *dmah,
				  struct ib_udata *udata);
struct ib_mr *bnxt_re_reg_user_mr_dmabuf(struct ib_pd *ib_pd, u64 start,
					 u64 length, u64 virt_addr,
					 int fd, int mr_access_flags,
					 struct ib_dmah *dmah,
					 struct uverbs_attr_bundle *attrs);
int bnxt_re_alloc_ucontext(struct ib_ucontext *ctx, struct ib_udata *udata);
void bnxt_re_dealloc_ucontext(struct ib_ucontext *context);
Loading