All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.