]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
RDMA/core: Reject zero CQE count
authorLeon Romanovsky <leonro@nvidia.com>
Fri, 13 Feb 2026 10:57:44 +0000 (12:57 +0200)
committerLeon Romanovsky <leonro@nvidia.com>
Wed, 25 Feb 2026 13:15:30 +0000 (08:15 -0500)
All drivers already ensure that the number of CQEs is at least 1.
Add this validation to the core so drivers no longer need to repeat it.
Future patches converting to the .create_user_cq() interface will remove
the per‑driver checks.

Link: https://patch.msgid.link/20260213-refactor-umem-v1-8-f3be85847922@nvidia.com
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
drivers/infiniband/core/cq.c
drivers/infiniband/core/uverbs_cmd.c
drivers/infiniband/core/uverbs_std_types_cq.c
drivers/infiniband/core/verbs.c

index 81316228f614636d9389d4db2922f2e6809bbdb5..3d7b6cddd131c4ed07082719fc9e3b4bfdb51459 100644 (file)
@@ -220,6 +220,9 @@ struct ib_cq *__ib_alloc_cq(struct ib_device *dev, void *private, int nr_cqe,
        struct ib_cq *cq;
        int ret = -ENOMEM;
 
+       if (WARN_ON_ONCE(!nr_cqe))
+               return ERR_PTR(-EINVAL);
+
        cq = rdma_zalloc_drv_obj(dev, ib_cq);
        if (!cq)
                return ERR_PTR(ret);
index 7322ea4cfcbf08fbc5118cf173d70b8bd0f102e1..0bfb16cbc6fab45a90d0d4a0a32380e0daafeec9 100644 (file)
@@ -1032,6 +1032,9 @@ static int create_cq(struct uverbs_attr_bundle *attrs,
        if (cmd->comp_vector >= attrs->ufile->device->num_comp_vectors)
                return -EINVAL;
 
+       if (!cmd->cqe)
+               return -EINVAL;
+
        obj = (struct ib_ucq_object *)uobj_alloc(UVERBS_OBJECT_CQ, attrs,
                                                 &ib_dev);
        if (IS_ERR(obj))
index b999d8d6269497bc0c87701298cc49926e116e83..d2c8f71f934cc8e0aa618f8c97dbeb7c20df69d2 100644 (file)
@@ -84,12 +84,15 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)(
 
        ret = uverbs_copy_from(&attr.comp_vector, attrs,
                               UVERBS_ATTR_CREATE_CQ_COMP_VECTOR);
-       if (!ret)
-               ret = uverbs_copy_from(&attr.cqe, attrs,
-                                      UVERBS_ATTR_CREATE_CQ_CQE);
-       if (!ret)
-               ret = uverbs_copy_from(&user_handle, attrs,
-                                      UVERBS_ATTR_CREATE_CQ_USER_HANDLE);
+       if (ret)
+               return ret;
+
+       ret = uverbs_copy_from(&attr.cqe, attrs, UVERBS_ATTR_CREATE_CQ_CQE);
+       if (ret || !attr.cqe)
+               return ret ? : -EINVAL;
+
+       ret = uverbs_copy_from(&user_handle, attrs,
+                              UVERBS_ATTR_CREATE_CQ_USER_HANDLE);
        if (ret)
                return ret;
 
index 22179954b88028ad3f53790631c4864a4e60315e..721cd4321238012e04fe072566f6cc00bf9f957c 100644 (file)
@@ -2203,6 +2203,9 @@ struct ib_cq *__ib_create_cq(struct ib_device *device,
        if (!cq)
                return ERR_PTR(-ENOMEM);
 
+       if (WARN_ON_ONCE(!cq_attr->cqe))
+               return ERR_PTR(-EINVAL);
+
        cq->device = device;
        cq->comp_handler = comp_handler;
        cq->event_handler = event_handler;