Cc'd drm people.
-----Original Message----- From: Xiong, Jianxin jianxin.xiong@intel.com Sent: Monday, June 29, 2020 10:32 AM To: linux-rdma@vger.kernel.org Cc: Xiong, Jianxin jianxin.xiong@intel.com; Doug Ledford dledford@redhat.com; Jason Gunthorpe jgg@ziepe.ca; Sumit Semwal sumit.semwal@linaro.org; Leon Romanovsky leon@kernel.org; Vetter, Daniel daniel.vetter@intel.com Subject: [RFC PATCH v2 3/3] RDMA/uverbs: Add uverbs command for dma-buf based MR registration
Add uverbs command for registering user memory region associated with a dma-buf file descriptor.
Signed-off-by: Jianxin Xiong jianxin.xiong@intel.com Reviewed-by: Sean Hefty sean.hefty@intel.com Acked-by: Michael J. Ruhl michael.j.ruhl@intel.com
drivers/infiniband/core/uverbs_std_types_mr.c | 112 ++++++++++++++++++++++++++ include/uapi/rdma/ib_user_ioctl_cmds.h | 14 ++++ 2 files changed, 126 insertions(+)
diff --git a/drivers/infiniband/core/uverbs_std_types_mr.c b/drivers/infiniband/core/uverbs_std_types_mr.c index c1286a5..2c9ff7c 100644 --- a/drivers/infiniband/core/uverbs_std_types_mr.c +++ b/drivers/infiniband/core/uverbs_std_types_mr.c @@ -1,5 +1,6 @@ /*
- Copyright (c) 2018, Mellanox Technologies inc. All rights reserved.
- Copyright (c) 2020, Intel Corporation. All rights reserved.
- This software is available to you under a choice of one of two
- licenses. You may choose to be licensed under the terms of the GNU @@ -154,6 +155,85 @@ static int
UVERBS_HANDLER(UVERBS_METHOD_DM_MR_REG)( return ret; }
+static int UVERBS_HANDLER(UVERBS_METHOD_REG_DMABUF_MR)(
- struct uverbs_attr_bundle *attrs)
+{
- struct ib_uobject *uobj =
uverbs_attr_get_uobject(attrs, UVERBS_ATTR_REG_DMABUF_MR_HANDLE);
- struct ib_pd *pd =
uverbs_attr_get_obj(attrs, UVERBS_ATTR_REG_DMABUF_MR_PD_HANDLE);
- struct ib_device *ib_dev = pd->device;
- u64 addr, length, hca_va;
- u32 fd;
- u32 access_flags;
- struct ib_mr *mr;
- int ret;
- if (!ib_dev->ops.reg_user_mr)
return -EOPNOTSUPP;
- ret = uverbs_copy_from(&addr, attrs, UVERBS_ATTR_REG_DMABUF_MR_ADDR);
- if (ret)
return ret;
- ret = uverbs_copy_from(&length, attrs,
UVERBS_ATTR_REG_DMABUF_MR_LENGTH);
- if (ret)
return ret;
- ret = uverbs_copy_from(&hca_va, attrs,
UVERBS_ATTR_REG_DMABUF_MR_HCA_VA);
- if (ret)
return ret;
- ret = uverbs_copy_from(&fd, attrs,
UVERBS_ATTR_REG_DMABUF_MR_FD);
- if (ret)
return ret;
- ret = uverbs_get_flags32(&access_flags, attrs,
UVERBS_ATTR_REG_DMABUF_MR_ACCESS_FLAGS,
IB_ACCESS_SUPPORTED);
- if (ret)
return ret;
- ret = ib_check_mr_access(access_flags);
- if (ret)
return ret;
- mr = pd->device->ops.reg_user_mr(pd, addr, length, hca_va,
(int)(s32)fd, access_flags,
&attrs->driver_udata);
- if (IS_ERR(mr))
return PTR_ERR(mr);
- mr->device = pd->device;
- mr->pd = pd;
- mr->type = IB_MR_TYPE_USER;
- mr->uobject = uobj;
- atomic_inc(&pd->usecnt);
- uobj->object = mr;
- ret = uverbs_copy_to(attrs, UVERBS_ATTR_REG_DMABUF_MR_RESP_LKEY,
&mr->lkey, sizeof(mr->lkey));
- if (ret)
goto err_dereg;
- ret = uverbs_copy_to(attrs, UVERBS_ATTR_REG_DMABUF_MR_RESP_RKEY,
&mr->rkey, sizeof(mr->rkey));
- if (ret)
goto err_dereg;
- return 0;
+err_dereg:
- ib_dereg_mr_user(mr, uverbs_get_cleared_udata(attrs));
- return ret;
+}
DECLARE_UVERBS_NAMED_METHOD( UVERBS_METHOD_ADVISE_MR, UVERBS_ATTR_IDR(UVERBS_ATTR_ADVISE_MR_PD_HANDLE, @@ -200,6 +280,37 @@ static int UVERBS_HANDLER(UVERBS_METHOD_DM_MR_REG)( UVERBS_ATTR_TYPE(u32), UA_MANDATORY));
+DECLARE_UVERBS_NAMED_METHOD(
- UVERBS_METHOD_REG_DMABUF_MR,
- UVERBS_ATTR_IDR(UVERBS_ATTR_REG_DMABUF_MR_HANDLE,
UVERBS_OBJECT_MR,
UVERBS_ACCESS_NEW,
UA_MANDATORY),
- UVERBS_ATTR_IDR(UVERBS_ATTR_REG_DMABUF_MR_PD_HANDLE,
UVERBS_OBJECT_PD,
UVERBS_ACCESS_READ,
UA_MANDATORY),
- UVERBS_ATTR_PTR_IN(UVERBS_ATTR_REG_DMABUF_MR_ADDR,
UVERBS_ATTR_TYPE(u64),
UA_MANDATORY),
- UVERBS_ATTR_PTR_IN(UVERBS_ATTR_REG_DMABUF_MR_LENGTH,
UVERBS_ATTR_TYPE(u64),
UA_MANDATORY),
- UVERBS_ATTR_PTR_IN(UVERBS_ATTR_REG_DMABUF_MR_HCA_VA,
UVERBS_ATTR_TYPE(u64),
UA_MANDATORY),
- UVERBS_ATTR_PTR_IN(UVERBS_ATTR_REG_DMABUF_MR_FD,
UVERBS_ATTR_TYPE(u32),
UA_MANDATORY),
- UVERBS_ATTR_FLAGS_IN(UVERBS_ATTR_REG_DMABUF_MR_ACCESS_FLAGS,
enum ib_access_flags),
- UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_REG_DMABUF_MR_RESP_LKEY,
UVERBS_ATTR_TYPE(u32),
UA_MANDATORY),
- UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_REG_DMABUF_MR_RESP_RKEY,
UVERBS_ATTR_TYPE(u32),
UA_MANDATORY));
DECLARE_UVERBS_NAMED_METHOD_DESTROY( UVERBS_METHOD_MR_DESTROY, UVERBS_ATTR_IDR(UVERBS_ATTR_DESTROY_MR_HANDLE, @@ -210,6 +321,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_DM_MR_REG)( DECLARE_UVERBS_NAMED_OBJECT( UVERBS_OBJECT_MR, UVERBS_TYPE_ALLOC_IDR(uverbs_free_mr),
- &UVERBS_METHOD(UVERBS_METHOD_REG_DMABUF_MR), &UVERBS_METHOD(UVERBS_METHOD_DM_MR_REG), &UVERBS_METHOD(UVERBS_METHOD_MR_DESTROY), &UVERBS_METHOD(UVERBS_METHOD_ADVISE_MR));
diff --git a/include/uapi/rdma/ib_user_ioctl_cmds.h b/include/uapi/rdma/ib_user_ioctl_cmds.h index d4ddbe4..31aacbf 100644 --- a/include/uapi/rdma/ib_user_ioctl_cmds.h +++ b/include/uapi/rdma/ib_user_ioctl_cmds.h @@ -1,5 +1,6 @@ /*
- Copyright (c) 2018, Mellanox Technologies inc. All rights reserved.
UVERBS_METHOD_DM_MR_REG, UVERBS_METHOD_MR_DESTROY, UVERBS_METHOD_ADVISE_MR,
- Copyright (c) 2020, Intel Corporation. All rights reserved.
- This software is available to you under a choice of one of two
- licenses. You may choose to be licensed under the terms of the GNU @@ -161,6 +162,7 @@ enum uverbs_methods_mr {
- UVERBS_METHOD_REG_DMABUF_MR,
};
enum uverbs_attrs_mr_destroy_ids { @@ -174,6 +176,18 @@ enum uverbs_attrs_advise_mr_cmd_attr_ids { UVERBS_ATTR_ADVISE_MR_SGE_LIST, };
+enum uverbs_attrs_reg_dmabuf_mr_cmd_attr_ids {
- UVERBS_ATTR_REG_DMABUF_MR_HANDLE,
- UVERBS_ATTR_REG_DMABUF_MR_PD_HANDLE,
- UVERBS_ATTR_REG_DMABUF_MR_ADDR,
- UVERBS_ATTR_REG_DMABUF_MR_LENGTH,
- UVERBS_ATTR_REG_DMABUF_MR_HCA_VA,
- UVERBS_ATTR_REG_DMABUF_MR_FD,
- UVERBS_ATTR_REG_DMABUF_MR_ACCESS_FLAGS,
- UVERBS_ATTR_REG_DMABUF_MR_RESP_LKEY,
- UVERBS_ATTR_REG_DMABUF_MR_RESP_RKEY,
+};
enum uverbs_attrs_create_counters_cmd_attr_ids { UVERBS_ATTR_CREATE_COUNTERS_HANDLE, }; -- 1.8.3.1
dri-devel@lists.freedesktop.org