]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
RDMA/core: Prepare create CQ path for API unification
authorLeon Romanovsky <leonro@nvidia.com>
Fri, 13 Feb 2026 10:57:43 +0000 (12:57 +0200)
committerLeon Romanovsky <leonro@nvidia.com>
Wed, 25 Feb 2026 13:15:30 +0000 (08:15 -0500)
Ensure that .create_cq_umem() and .create_cq() follow the same API
contract, allowing drivers to be gradually migrated to the umem-aware
CQ management flow.

Link: https://patch.msgid.link/20260213-refactor-umem-v1-7-f3be85847922@nvidia.com
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
drivers/infiniband/core/device.c
drivers/infiniband/core/uverbs_cmd.c
drivers/infiniband/core/uverbs_std_types_cq.c
drivers/infiniband/core/verbs.c
drivers/infiniband/hw/efa/efa.h
drivers/infiniband/hw/efa/efa_main.c
drivers/infiniband/hw/efa/efa_verbs.c
include/rdma/ib_verbs.h

index 1b5f1ee0a557ce04d6b9b5f7e24c4a570d629b27..c7b227e2e65790b121e4fe0be01173092d848fee 100644 (file)
@@ -2700,7 +2700,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_user_cq);
        SET_DEVICE_OP(dev_ops, create_flow);
        SET_DEVICE_OP(dev_ops, create_qp);
        SET_DEVICE_OP(dev_ops, create_rwq_ind_table);
index 87f327fc1f4e1b7828bbf58118ec376864bee352..7322ea4cfcbf08fbc5118cf173d70b8bd0f102e1 100644 (file)
@@ -1068,7 +1068,10 @@ static int create_cq(struct uverbs_attr_bundle *attrs,
        rdma_restrack_new(&cq->res, RDMA_RESTRACK_CQ);
        rdma_restrack_set_name(&cq->res, NULL);
 
-       ret = ib_dev->ops.create_cq(cq, &attr, attrs);
+       if (ib_dev->ops.create_user_cq)
+               ret = ib_dev->ops.create_user_cq(cq, &attr, attrs);
+       else
+               ret = ib_dev->ops.create_cq(cq, &attr, attrs);
        if (ret)
                goto err_free;
        rdma_restrack_add(&cq->res);
index 05809f9ff0f6a3f24618774c7969bba9bbbae3bd..b999d8d6269497bc0c87701298cc49926e116e83 100644 (file)
@@ -78,7 +78,8 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)(
        int buffer_fd;
        int ret;
 
-       if ((!ib_dev->ops.create_cq && !ib_dev->ops.create_cq_umem) || !ib_dev->ops.destroy_cq)
+       if ((!ib_dev->ops.create_cq && !ib_dev->ops.create_user_cq) ||
+           !ib_dev->ops.destroy_cq)
                return -EOPNOTSUPP;
 
        ret = uverbs_copy_from(&attr.comp_vector, attrs,
@@ -130,7 +131,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)(
 
                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) {
+                   !ib_dev->ops.create_user_cq) {
                        ret = -EINVAL;
                        goto err_event_file;
                }
@@ -155,7 +156,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)(
                        goto err_event_file;
 
                if (uverbs_attr_is_valid(attrs, UVERBS_ATTR_CREATE_CQ_BUFFER_VA) ||
-                   !ib_dev->ops.create_cq_umem) {
+                   !ib_dev->ops.create_user_cq) {
                        ret = -EINVAL;
                        goto err_event_file;
                }
@@ -196,11 +197,16 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)(
        rdma_restrack_new(&cq->res, RDMA_RESTRACK_CQ);
        rdma_restrack_set_name(&cq->res, NULL);
 
-       ret = umem ? ib_dev->ops.create_cq_umem(cq, &attr, umem, attrs) :
-               ib_dev->ops.create_cq(cq, &attr, attrs);
+       if (ib_dev->ops.create_user_cq)
+               ret = ib_dev->ops.create_user_cq(cq, &attr, attrs);
+       else
+               ret = ib_dev->ops.create_cq(cq, &attr, attrs);
        if (ret)
                goto err_free;
 
+       /* Check that driver didn't overrun existing umem */
+       WARN_ON(umem && cq->umem != umem);
+
        obj->uevent.uobject.object = cq;
        obj->uevent.uobject.user_handle = user_handle;
        rdma_restrack_add(&cq->res);
index 29694145ce5fe5d467eecfb2ab5a2f1a02cb8e10..22179954b88028ad3f53790631c4864a4e60315e 100644 (file)
@@ -2204,7 +2204,6 @@ struct ib_cq *__ib_create_cq(struct ib_device *device,
                return ERR_PTR(-ENOMEM);
 
        cq->device = device;
-       cq->uobject = NULL;
        cq->comp_handler = comp_handler;
        cq->event_handler = event_handler;
        cq->cq_context = cq_context;
@@ -2219,6 +2218,11 @@ struct ib_cq *__ib_create_cq(struct ib_device *device,
                kfree(cq);
                return ERR_PTR(ret);
        }
+       /*
+        * We are in kernel verbs flow and drivers are not allowed
+        * to set umem pointer, it needs to stay NULL.
+        */
+       WARN_ON_ONCE(cq->umem);
 
        rdma_restrack_add(&cq->res);
        return cq;
index 96f9c3bc98b2e2e41dc059dbff47102ea563e1d8..00b19f2ba3da39ed56727f6786512d5b8419a2bc 100644 (file)
@@ -161,10 +161,8 @@ int efa_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata);
 int efa_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *init_attr,
                  struct ib_udata *udata);
 int efa_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata);
-int efa_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
-                 struct uverbs_attr_bundle *attrs);
-int efa_create_cq_umem(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
-                      struct ib_umem *umem, struct uverbs_attr_bundle *attrs);
+int efa_create_user_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
+                      struct uverbs_attr_bundle *attrs);
 struct ib_mr *efa_reg_mr(struct ib_pd *ibpd, u64 start, u64 length,
                         u64 virt_addr, int access_flags,
                         struct ib_dmah *dmah,
index c1397086dc47c8e1a133bfcd67bc1b3773523177..03c237c8c81ee7f16486f186edd16d1c26814566 100644 (file)
@@ -371,8 +371,7 @@ static const struct ib_device_ops efa_dev_ops = {
        .alloc_hw_device_stats = efa_alloc_hw_device_stats,
        .alloc_pd = efa_alloc_pd,
        .alloc_ucontext = efa_alloc_ucontext,
-       .create_cq = efa_create_cq,
-       .create_cq_umem = efa_create_cq_umem,
+       .create_user_cq = efa_create_user_cq,
        .create_qp = efa_create_qp,
        .create_user_ah = efa_create_ah,
        .dealloc_pd = efa_dealloc_pd,
index 776ae5103706a6dae67249ce7a5ab94835d0969b..9d683cb30cba692c380c82a92e9a9c0be905b327 100644 (file)
@@ -1130,8 +1130,8 @@ static int cq_mmap_entries_setup(struct efa_dev *dev, struct efa_cq *cq,
        return 0;
 }
 
-int efa_create_cq_umem(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
-                      struct ib_umem *umem, struct uverbs_attr_bundle *attrs)
+int efa_create_user_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
+                      struct uverbs_attr_bundle *attrs)
 {
        struct ib_udata *udata = &attrs->driver_udata;
        struct efa_ucontext *ucontext = rdma_udata_to_drv_context(
@@ -1306,12 +1306,6 @@ err_out:
        return err;
 }
 
-int efa_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
-                 struct uverbs_attr_bundle *attrs)
-{
-       return efa_create_cq_umem(ibcq, attr, NULL, attrs);
-}
-
 static int umem_to_page_list(struct efa_dev *dev,
                             struct ib_umem *umem,
                             u64 *page_list,
index 8531eed7b394167ccdd6908fb52e683da0274b00..1b77fd88d0fb01d8f3bd0adc90728fcdf0442d12 100644 (file)
@@ -2538,9 +2538,8 @@ 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,
+       int (*create_user_cq)(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);