* [PATCH for-next v2 1/3] RDMA/uverbs: Add a common way to create CQ with umem
2025-07-08 20:23 [PATCH for-next v2 0/3] RDMA: Support CQs with user memory Michael Margolin
@ 2025-07-08 20:23 ` Michael Margolin
0 siblings, 0 replies; 2+ messages in thread
From: Michael Margolin @ 2025-07-08 20:23 UTC (permalink / raw)
To: jgg, leon, linux-rdma; +Cc: sleybo, matua, gal.pressman
Add ioctl command attributes and a common handling for the option to
create CQs with memory buffers passed from userspace. When required
attributes are supplied, create umem and provide it for driver's use.
The extension enables creation of CQs on top of preallocated CPU
virtual or device memory buffers, by supplying VA or dmabuf fd, in a
common way.
Drivers can support this flow by initializing a new create_cq_umem fp
field in their ops struct, with a function that can handle the new
parameter.
Signed-off-by: Michael Margolin <mrgolin@amazon.com>
---
drivers/infiniband/core/device.c | 1 +
drivers/infiniband/core/uverbs_std_types_cq.c | 87 +++++++++++++++++--
include/rdma/ib_verbs.h | 4 +
include/uapi/rdma/ib_user_ioctl_cmds.h | 4 +
4 files changed, 90 insertions(+), 6 deletions(-)
diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c
index 1ca6a9b7ba1a..f301cdce1728 100644
--- a/drivers/infiniband/core/device.c
+++ b/drivers/infiniband/core/device.c
@@ -2728,6 +2728,7 @@ void ib_set_device_ops(struct ib_device *dev, const struct ib_device_ops *ops)
SET_DEVICE_OP(dev_ops, create_ah);
SET_DEVICE_OP(dev_ops, create_counters);
SET_DEVICE_OP(dev_ops, create_cq);
+ SET_DEVICE_OP(dev_ops, create_cq_umem);
SET_DEVICE_OP(dev_ops, create_flow);
SET_DEVICE_OP(dev_ops, create_qp);
SET_DEVICE_OP(dev_ops, create_rwq_ind_table);
diff --git a/drivers/infiniband/core/uverbs_std_types_cq.c b/drivers/infiniband/core/uverbs_std_types_cq.c
index 432054f0a8a4..37cd37556510 100644
--- a/drivers/infiniband/core/uverbs_std_types_cq.c
+++ b/drivers/infiniband/core/uverbs_std_types_cq.c
@@ -64,15 +64,21 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)(
struct ib_ucq_object *obj = container_of(
uverbs_attr_get_uobject(attrs, UVERBS_ATTR_CREATE_CQ_HANDLE),
typeof(*obj), uevent.uobject);
+ struct ib_uverbs_completion_event_file *ev_file = NULL;
struct ib_device *ib_dev = attrs->context->device;
- int ret;
- u64 user_handle;
+ struct ib_umem_dmabuf *umem_dmabuf;
struct ib_cq_init_attr attr = {};
- struct ib_cq *cq;
- struct ib_uverbs_completion_event_file *ev_file = NULL;
struct ib_uobject *ev_file_uobj;
+ struct ib_umem *umem = NULL;
+ u64 buffer_length;
+ u64 buffer_offset;
+ struct ib_cq *cq;
+ u64 user_handle;
+ u64 buffer_va;
+ int buffer_fd;
+ int ret;
- if (!ib_dev->ops.create_cq || !ib_dev->ops.destroy_cq)
+ if ((!ib_dev->ops.create_cq && !ib_dev->ops.create_cq_umem) || !ib_dev->ops.destroy_cq)
return -EOPNOTSUPP;
ret = uverbs_copy_from(&attr.comp_vector, attrs,
@@ -112,9 +118,66 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)(
INIT_LIST_HEAD(&obj->comp_list);
INIT_LIST_HEAD(&obj->uevent.event_list);
+ if (uverbs_attr_is_valid(attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_VA)) {
+
+ ret = uverbs_copy_from(&buffer_va, attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_VA);
+ if (ret)
+ goto err_event_file;
+
+ ret = uverbs_copy_from(&buffer_length, attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_LENGTH);
+ if (ret)
+ goto err_event_file;
+
+ if (uverbs_attr_is_valid(attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_FD) ||
+ uverbs_attr_is_valid(attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_OFFSET) ||
+ !ib_dev->ops.create_cq_umem) {
+ ret = -EINVAL;
+ goto err_event_file;
+ }
+
+ umem = ib_umem_get(ib_dev, buffer_va, buffer_length, IB_ACCESS_LOCAL_WRITE);
+ if (IS_ERR(umem)) {
+ ret = PTR_ERR(umem);
+ goto err_event_file;
+ }
+ } else if (uverbs_attr_is_valid(attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_FD)) {
+
+ ret = uverbs_get_raw_fd(&buffer_fd, attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_FD);
+ if (ret)
+ goto err_event_file;
+
+ ret = uverbs_copy_from(&buffer_offset, attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_OFFSET);
+ if (ret)
+ goto err_event_file;
+
+ ret = uverbs_copy_from(&buffer_length, attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_LENGTH);
+ if (ret)
+ goto err_event_file;
+
+ if (uverbs_attr_is_valid(attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_VA) ||
+ !ib_dev->ops.create_cq_umem) {
+ ret = -EINVAL;
+ goto err_event_file;
+ }
+
+ umem_dmabuf = ib_umem_dmabuf_get_pinned(ib_dev, buffer_offset, buffer_length,
+ buffer_fd, IB_ACCESS_LOCAL_WRITE);
+ if (IS_ERR(umem_dmabuf)) {
+ ret = PTR_ERR(umem_dmabuf);
+ goto err_event_file;
+ }
+ umem = &umem_dmabuf->umem;
+ } else if (uverbs_attr_is_valid(attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_OFFSET) ||
+ uverbs_attr_is_valid(attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_LENGTH) ||
+ !ib_dev->ops.create_cq) {
+ ret = -EINVAL;
+ goto err_event_file;
+ }
+
cq = rdma_zalloc_drv_obj(ib_dev, ib_cq);
if (!cq) {
ret = -ENOMEM;
+ ib_umem_release(umem);
goto err_event_file;
}
@@ -128,7 +191,8 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)(
rdma_restrack_new(&cq->res, RDMA_RESTRACK_CQ);
rdma_restrack_set_name(&cq->res, NULL);
- ret = ib_dev->ops.create_cq(cq, &attr, attrs);
+ ret = umem ? ib_dev->ops.create_cq_umem(cq, &attr, umem, attrs) :
+ ib_dev->ops.create_cq(cq, &attr, attrs);
if (ret)
goto err_free;
@@ -180,6 +244,17 @@ DECLARE_UVERBS_NAMED_METHOD(
UVERBS_OBJECT_ASYNC_EVENT,
UVERBS_ACCESS_READ,
UA_OPTIONAL),
+ UVERBS_ATTR_PTR_IN(UVERBS_ATTR_CREATE_CQ_BUFFER_VA,
+ UVERBS_ATTR_TYPE(u64),
+ UA_OPTIONAL),
+ UVERBS_ATTR_PTR_IN(UVERBS_ATTR_CREATE_CQ_BUFFER_LENGTH,
+ UVERBS_ATTR_TYPE(u64),
+ UA_OPTIONAL),
+ UVERBS_ATTR_RAW_FD(UVERBS_ATTR_CREATE_CQ_BUFFER_FD,
+ UA_OPTIONAL),
+ UVERBS_ATTR_PTR_IN(UVERBS_ATTR_CREATE_CQ_BUFFER_OFFSET,
+ UVERBS_ATTR_TYPE(u64),
+ UA_OPTIONAL),
UVERBS_ATTR_UHW());
static int UVERBS_HANDLER(UVERBS_METHOD_CQ_DESTROY)(
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h
index 010594dc755b..5ad0136d43c4 100644
--- a/include/rdma/ib_verbs.h
+++ b/include/rdma/ib_verbs.h
@@ -2486,6 +2486,10 @@ struct ib_device_ops {
int (*destroy_qp)(struct ib_qp *qp, struct ib_udata *udata);
int (*create_cq)(struct ib_cq *cq, const struct ib_cq_init_attr *attr,
struct uverbs_attr_bundle *attrs);
+ int (*create_cq_umem)(struct ib_cq *cq,
+ const struct ib_cq_init_attr *attr,
+ struct ib_umem *umem,
+ struct uverbs_attr_bundle *attrs);
int (*modify_cq)(struct ib_cq *cq, u16 cq_count, u16 cq_period);
int (*destroy_cq)(struct ib_cq *cq, struct ib_udata *udata);
int (*resize_cq)(struct ib_cq *cq, int cqe, struct ib_udata *udata);
diff --git a/include/uapi/rdma/ib_user_ioctl_cmds.h b/include/uapi/rdma/ib_user_ioctl_cmds.h
index ac7b162611ed..5f3e5bee51b2 100644
--- a/include/uapi/rdma/ib_user_ioctl_cmds.h
+++ b/include/uapi/rdma/ib_user_ioctl_cmds.h
@@ -105,6 +105,10 @@ enum uverbs_attrs_create_cq_cmd_attr_ids {
UVERBS_ATTR_CREATE_CQ_FLAGS,
UVERBS_ATTR_CREATE_CQ_RESP_CQE,
UVERBS_ATTR_CREATE_CQ_EVENT_FD,
+ UVERBS_ATTR_CREATE_CQ_BUFFER_VA,
+ UVERBS_ATTR_CREATE_CQ_BUFFER_LENGTH,
+ UVERBS_ATTR_CREATE_CQ_BUFFER_FD,
+ UVERBS_ATTR_CREATE_CQ_BUFFER_OFFSET,
};
enum uverbs_attrs_destroy_cq_cmd_attr_ids {
--
2.47.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH for-next v2 1/3] RDMA/uverbs: Add a common way to create CQ with umem
@ 2025-07-10 12:51 kernel test robot
0 siblings, 0 replies; 2+ messages in thread
From: kernel test robot @ 2025-07-10 12:51 UTC (permalink / raw)
To: oe-kbuild; +Cc: lkp, Dan Carpenter
BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
In-Reply-To: <20250708202308.24783-2-mrgolin@amazon.com>
References: <20250708202308.24783-2-mrgolin@amazon.com>
TO: Michael Margolin <mrgolin@amazon.com>
TO: jgg@nvidia.com
TO: leon@kernel.org
TO: linux-rdma@vger.kernel.org
CC: sleybo@amazon.com
CC: matua@amazon.com
CC: gal.pressman@linux.dev
Hi Michael,
kernel test robot noticed the following build warnings:
[auto build test WARNING on rdma/for-next]
[also build test WARNING on linus/master v6.16-rc5 next-20250710]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Michael-Margolin/RDMA-uverbs-Add-a-common-way-to-create-CQ-with-umem/20250709-042457
base: https://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma.git for-next
patch link: https://lore.kernel.org/r/20250708202308.24783-2-mrgolin%40amazon.com
patch subject: [PATCH for-next v2 1/3] RDMA/uverbs: Add a common way to create CQ with umem
:::::: branch date: 2 days ago
:::::: commit date: 2 days ago
config: x86_64-randconfig-161-20250710 (https://download.01.org/0day-ci/archive/20250710/202507102045.cmQITbYo-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14+deb12u1) 12.2.0
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <error27@gmail.com>
| Closes: https://lore.kernel.org/r/202507102045.cmQITbYo-lkp@intel.com/
smatch warnings:
drivers/infiniband/core/uverbs_std_types_cq.c:195 ib_uverbs_handler_UVERBS_METHOD_CQ_CREATE() error: we previously assumed 'ib_dev->ops.create_cq' could be null (see line 81)
vim +195 drivers/infiniband/core/uverbs_std_types_cq.c
41b2a71fc848e2 Matan Barak 2018-03-19 60
e83f0ecdc40f2c Jason Gunthorpe 2018-07-25 61 static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)(
15a1b4becba886 Jason Gunthorpe 2018-11-25 62 struct uverbs_attr_bundle *attrs)
41b2a71fc848e2 Matan Barak 2018-03-19 63 {
e83f0ecdc40f2c Jason Gunthorpe 2018-07-25 64 struct ib_ucq_object *obj = container_of(
e83f0ecdc40f2c Jason Gunthorpe 2018-07-25 65 uverbs_attr_get_uobject(attrs, UVERBS_ATTR_CREATE_CQ_HANDLE),
4ec1dcfcdf3756 Jason Gunthorpe 2020-01-08 66 typeof(*obj), uevent.uobject);
982a89ae42c92d Michael Margolin 2025-07-08 67 struct ib_uverbs_completion_event_file *ev_file = NULL;
feec576a6af299 Jason Gunthorpe 2019-04-01 68 struct ib_device *ib_dev = attrs->context->device;
982a89ae42c92d Michael Margolin 2025-07-08 69 struct ib_umem_dmabuf *umem_dmabuf;
41b2a71fc848e2 Matan Barak 2018-03-19 70 struct ib_cq_init_attr attr = {};
41b2a71fc848e2 Matan Barak 2018-03-19 71 struct ib_uobject *ev_file_uobj;
982a89ae42c92d Michael Margolin 2025-07-08 72 struct ib_umem *umem = NULL;
982a89ae42c92d Michael Margolin 2025-07-08 73 u64 buffer_length;
982a89ae42c92d Michael Margolin 2025-07-08 74 u64 buffer_offset;
982a89ae42c92d Michael Margolin 2025-07-08 75 struct ib_cq *cq;
982a89ae42c92d Michael Margolin 2025-07-08 76 u64 user_handle;
982a89ae42c92d Michael Margolin 2025-07-08 77 u64 buffer_va;
982a89ae42c92d Michael Margolin 2025-07-08 78 int buffer_fd;
982a89ae42c92d Michael Margolin 2025-07-08 79 int ret;
41b2a71fc848e2 Matan Barak 2018-03-19 80
982a89ae42c92d Michael Margolin 2025-07-08 @81 if ((!ib_dev->ops.create_cq && !ib_dev->ops.create_cq_umem) || !ib_dev->ops.destroy_cq)
41b2a71fc848e2 Matan Barak 2018-03-19 82 return -EOPNOTSUPP;
41b2a71fc848e2 Matan Barak 2018-03-19 83
41b2a71fc848e2 Matan Barak 2018-03-19 84 ret = uverbs_copy_from(&attr.comp_vector, attrs,
41b2a71fc848e2 Matan Barak 2018-03-19 85 UVERBS_ATTR_CREATE_CQ_COMP_VECTOR);
41b2a71fc848e2 Matan Barak 2018-03-19 86 if (!ret)
41b2a71fc848e2 Matan Barak 2018-03-19 87 ret = uverbs_copy_from(&attr.cqe, attrs,
41b2a71fc848e2 Matan Barak 2018-03-19 88 UVERBS_ATTR_CREATE_CQ_CQE);
41b2a71fc848e2 Matan Barak 2018-03-19 89 if (!ret)
41b2a71fc848e2 Matan Barak 2018-03-19 90 ret = uverbs_copy_from(&user_handle, attrs,
41b2a71fc848e2 Matan Barak 2018-03-19 91 UVERBS_ATTR_CREATE_CQ_USER_HANDLE);
41b2a71fc848e2 Matan Barak 2018-03-19 92 if (ret)
41b2a71fc848e2 Matan Barak 2018-03-19 93 return ret;
41b2a71fc848e2 Matan Barak 2018-03-19 94
bccd06223f2165 Jason Gunthorpe 2018-07-26 95 ret = uverbs_get_flags32(&attr.flags, attrs,
bccd06223f2165 Jason Gunthorpe 2018-07-26 96 UVERBS_ATTR_CREATE_CQ_FLAGS,
bccd06223f2165 Jason Gunthorpe 2018-07-26 97 IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION |
bccd06223f2165 Jason Gunthorpe 2018-07-26 98 IB_UVERBS_CQ_FLAGS_IGNORE_OVERRUN);
bccd06223f2165 Jason Gunthorpe 2018-07-26 99 if (ret)
bccd06223f2165 Jason Gunthorpe 2018-07-26 100 return ret;
41b2a71fc848e2 Matan Barak 2018-03-19 101
3efa38125b81fb Matan Barak 2018-05-31 102 ev_file_uobj = uverbs_attr_get_uobject(attrs, UVERBS_ATTR_CREATE_CQ_COMP_CHANNEL);
3efa38125b81fb Matan Barak 2018-05-31 103 if (!IS_ERR(ev_file_uobj)) {
41b2a71fc848e2 Matan Barak 2018-03-19 104 ev_file = container_of(ev_file_uobj,
41b2a71fc848e2 Matan Barak 2018-03-19 105 struct ib_uverbs_completion_event_file,
d0259e82e7d214 Jason Gunthorpe 2018-07-04 106 uobj);
41b2a71fc848e2 Matan Barak 2018-03-19 107 uverbs_uobject_get(ev_file_uobj);
41b2a71fc848e2 Matan Barak 2018-03-19 108 }
41b2a71fc848e2 Matan Barak 2018-03-19 109
cda9ee494248b8 Yishai Hadas 2020-05-19 110 obj->uevent.event_file = ib_uverbs_get_async_event(
cda9ee494248b8 Yishai Hadas 2020-05-19 111 attrs, UVERBS_ATTR_CREATE_CQ_EVENT_FD);
98a8890f734894 Yishai Hadas 2020-05-19 112
15a1b4becba886 Jason Gunthorpe 2018-11-25 113 if (attr.comp_vector >= attrs->ufile->device->num_comp_vectors) {
41b2a71fc848e2 Matan Barak 2018-03-19 114 ret = -EINVAL;
41b2a71fc848e2 Matan Barak 2018-03-19 115 goto err_event_file;
41b2a71fc848e2 Matan Barak 2018-03-19 116 }
41b2a71fc848e2 Matan Barak 2018-03-19 117
41b2a71fc848e2 Matan Barak 2018-03-19 118 INIT_LIST_HEAD(&obj->comp_list);
4ec1dcfcdf3756 Jason Gunthorpe 2020-01-08 119 INIT_LIST_HEAD(&obj->uevent.event_list);
41b2a71fc848e2 Matan Barak 2018-03-19 120
982a89ae42c92d Michael Margolin 2025-07-08 121 if (uverbs_attr_is_valid(attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_VA)) {
982a89ae42c92d Michael Margolin 2025-07-08 122
982a89ae42c92d Michael Margolin 2025-07-08 123 ret = uverbs_copy_from(&buffer_va, attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_VA);
982a89ae42c92d Michael Margolin 2025-07-08 124 if (ret)
982a89ae42c92d Michael Margolin 2025-07-08 125 goto err_event_file;
982a89ae42c92d Michael Margolin 2025-07-08 126
982a89ae42c92d Michael Margolin 2025-07-08 127 ret = uverbs_copy_from(&buffer_length, attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_LENGTH);
982a89ae42c92d Michael Margolin 2025-07-08 128 if (ret)
982a89ae42c92d Michael Margolin 2025-07-08 129 goto err_event_file;
982a89ae42c92d Michael Margolin 2025-07-08 130
982a89ae42c92d Michael Margolin 2025-07-08 131 if (uverbs_attr_is_valid(attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_FD) ||
982a89ae42c92d Michael Margolin 2025-07-08 132 uverbs_attr_is_valid(attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_OFFSET) ||
982a89ae42c92d Michael Margolin 2025-07-08 133 !ib_dev->ops.create_cq_umem) {
982a89ae42c92d Michael Margolin 2025-07-08 134 ret = -EINVAL;
982a89ae42c92d Michael Margolin 2025-07-08 135 goto err_event_file;
982a89ae42c92d Michael Margolin 2025-07-08 136 }
982a89ae42c92d Michael Margolin 2025-07-08 137
982a89ae42c92d Michael Margolin 2025-07-08 138 umem = ib_umem_get(ib_dev, buffer_va, buffer_length, IB_ACCESS_LOCAL_WRITE);
982a89ae42c92d Michael Margolin 2025-07-08 139 if (IS_ERR(umem)) {
982a89ae42c92d Michael Margolin 2025-07-08 140 ret = PTR_ERR(umem);
982a89ae42c92d Michael Margolin 2025-07-08 141 goto err_event_file;
982a89ae42c92d Michael Margolin 2025-07-08 142 }
982a89ae42c92d Michael Margolin 2025-07-08 143 } else if (uverbs_attr_is_valid(attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_FD)) {
982a89ae42c92d Michael Margolin 2025-07-08 144
982a89ae42c92d Michael Margolin 2025-07-08 145 ret = uverbs_get_raw_fd(&buffer_fd, attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_FD);
982a89ae42c92d Michael Margolin 2025-07-08 146 if (ret)
982a89ae42c92d Michael Margolin 2025-07-08 147 goto err_event_file;
982a89ae42c92d Michael Margolin 2025-07-08 148
982a89ae42c92d Michael Margolin 2025-07-08 149 ret = uverbs_copy_from(&buffer_offset, attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_OFFSET);
982a89ae42c92d Michael Margolin 2025-07-08 150 if (ret)
982a89ae42c92d Michael Margolin 2025-07-08 151 goto err_event_file;
982a89ae42c92d Michael Margolin 2025-07-08 152
982a89ae42c92d Michael Margolin 2025-07-08 153 ret = uverbs_copy_from(&buffer_length, attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_LENGTH);
982a89ae42c92d Michael Margolin 2025-07-08 154 if (ret)
982a89ae42c92d Michael Margolin 2025-07-08 155 goto err_event_file;
982a89ae42c92d Michael Margolin 2025-07-08 156
982a89ae42c92d Michael Margolin 2025-07-08 157 if (uverbs_attr_is_valid(attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_VA) ||
982a89ae42c92d Michael Margolin 2025-07-08 158 !ib_dev->ops.create_cq_umem) {
982a89ae42c92d Michael Margolin 2025-07-08 159 ret = -EINVAL;
982a89ae42c92d Michael Margolin 2025-07-08 160 goto err_event_file;
982a89ae42c92d Michael Margolin 2025-07-08 161 }
982a89ae42c92d Michael Margolin 2025-07-08 162
982a89ae42c92d Michael Margolin 2025-07-08 163 umem_dmabuf = ib_umem_dmabuf_get_pinned(ib_dev, buffer_offset, buffer_length,
982a89ae42c92d Michael Margolin 2025-07-08 164 buffer_fd, IB_ACCESS_LOCAL_WRITE);
982a89ae42c92d Michael Margolin 2025-07-08 165 if (IS_ERR(umem_dmabuf)) {
982a89ae42c92d Michael Margolin 2025-07-08 166 ret = PTR_ERR(umem_dmabuf);
982a89ae42c92d Michael Margolin 2025-07-08 167 goto err_event_file;
982a89ae42c92d Michael Margolin 2025-07-08 168 }
982a89ae42c92d Michael Margolin 2025-07-08 169 umem = &umem_dmabuf->umem;
982a89ae42c92d Michael Margolin 2025-07-08 170 } else if (uverbs_attr_is_valid(attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_OFFSET) ||
982a89ae42c92d Michael Margolin 2025-07-08 171 uverbs_attr_is_valid(attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_LENGTH) ||
982a89ae42c92d Michael Margolin 2025-07-08 172 !ib_dev->ops.create_cq) {
982a89ae42c92d Michael Margolin 2025-07-08 173 ret = -EINVAL;
982a89ae42c92d Michael Margolin 2025-07-08 174 goto err_event_file;
982a89ae42c92d Michael Margolin 2025-07-08 175 }
982a89ae42c92d Michael Margolin 2025-07-08 176
e39afe3d6dbd90 Leon Romanovsky 2019-05-28 177 cq = rdma_zalloc_drv_obj(ib_dev, ib_cq);
e39afe3d6dbd90 Leon Romanovsky 2019-05-28 178 if (!cq) {
e39afe3d6dbd90 Leon Romanovsky 2019-05-28 179 ret = -ENOMEM;
982a89ae42c92d Michael Margolin 2025-07-08 180 ib_umem_release(umem);
41b2a71fc848e2 Matan Barak 2018-03-19 181 goto err_event_file;
41b2a71fc848e2 Matan Barak 2018-03-19 182 }
41b2a71fc848e2 Matan Barak 2018-03-19 183
41b2a71fc848e2 Matan Barak 2018-03-19 184 cq->device = ib_dev;
5bd48c18c8cea0 Jason Gunthorpe 2020-01-08 185 cq->uobject = obj;
41b2a71fc848e2 Matan Barak 2018-03-19 186 cq->comp_handler = ib_uverbs_comp_handler;
41b2a71fc848e2 Matan Barak 2018-03-19 187 cq->event_handler = ib_uverbs_cq_event_handler;
41b2a71fc848e2 Matan Barak 2018-03-19 188 cq->cq_context = ev_file ? &ev_file->ev_queue : NULL;
41b2a71fc848e2 Matan Barak 2018-03-19 189 atomic_set(&cq->usecnt, 0);
e39afe3d6dbd90 Leon Romanovsky 2019-05-28 190
13ef5539def732 Leon Romanovsky 2020-09-22 191 rdma_restrack_new(&cq->res, RDMA_RESTRACK_CQ);
b09c4d70122091 Leon Romanovsky 2020-09-22 192 rdma_restrack_set_name(&cq->res, NULL);
b09c4d70122091 Leon Romanovsky 2020-09-22 193
982a89ae42c92d Michael Margolin 2025-07-08 194 ret = umem ? ib_dev->ops.create_cq_umem(cq, &attr, umem, attrs) :
982a89ae42c92d Michael Margolin 2025-07-08 @195 ib_dev->ops.create_cq(cq, &attr, attrs);
e39afe3d6dbd90 Leon Romanovsky 2019-05-28 196 if (ret)
e39afe3d6dbd90 Leon Romanovsky 2019-05-28 197 goto err_free;
e39afe3d6dbd90 Leon Romanovsky 2019-05-28 198
4ec1dcfcdf3756 Jason Gunthorpe 2020-01-08 199 obj->uevent.uobject.object = cq;
4ec1dcfcdf3756 Jason Gunthorpe 2020-01-08 200 obj->uevent.uobject.user_handle = user_handle;
b09c4d70122091 Leon Romanovsky 2020-09-22 201 rdma_restrack_add(&cq->res);
0ac8903cbbe618 Jason Gunthorpe 2020-05-19 202 uverbs_finalize_uobj_create(attrs, UVERBS_ATTR_CREATE_CQ_HANDLE);
41b2a71fc848e2 Matan Barak 2018-03-19 203
41b2a71fc848e2 Matan Barak 2018-03-19 204 ret = uverbs_copy_to(attrs, UVERBS_ATTR_CREATE_CQ_RESP_CQE, &cq->cqe,
41b2a71fc848e2 Matan Barak 2018-03-19 205 sizeof(cq->cqe));
0ac8903cbbe618 Jason Gunthorpe 2020-05-19 206 return ret;
41b2a71fc848e2 Matan Barak 2018-03-19 207
e39afe3d6dbd90 Leon Romanovsky 2019-05-28 208 err_free:
13ef5539def732 Leon Romanovsky 2020-09-22 209 rdma_restrack_put(&cq->res);
e39afe3d6dbd90 Leon Romanovsky 2019-05-28 210 kfree(cq);
41b2a71fc848e2 Matan Barak 2018-03-19 211 err_event_file:
98a8890f734894 Yishai Hadas 2020-05-19 212 if (obj->uevent.event_file)
98a8890f734894 Yishai Hadas 2020-05-19 213 uverbs_uobject_put(&obj->uevent.event_file->uobj);
41b2a71fc848e2 Matan Barak 2018-03-19 214 if (ev_file)
41b2a71fc848e2 Matan Barak 2018-03-19 215 uverbs_uobject_put(ev_file_uobj);
41b2a71fc848e2 Matan Barak 2018-03-19 216 return ret;
41b2a71fc848e2 Matan Barak 2018-03-19 217 };
41b2a71fc848e2 Matan Barak 2018-03-19 218
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2025-07-10 12:52 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-10 12:51 [PATCH for-next v2 1/3] RDMA/uverbs: Add a common way to create CQ with umem kernel test robot
-- strict thread matches above, loose matches on Subject: below --
2025-07-08 20:23 [PATCH for-next v2 0/3] RDMA: Support CQs with user memory Michael Margolin
2025-07-08 20:23 ` [PATCH for-next v2 1/3] RDMA/uverbs: Add a common way to create CQ with umem Michael Margolin
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.