[PATCH rdma-next 35/50] RDMA/mlx4: Remove support for kernel CQ resize
From: Leon Romanovsky
Date: Fri Feb 13 2026 - 06:06:55 EST
From: Leon Romanovsky <leonro@xxxxxxxxxx>
No upper‑layer protocol currently uses CQ resize, and the feature has no
active callers. Drop the unused functionality.
Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxx>
---
drivers/infiniband/hw/mlx4/cq.c | 167 +++++-----------------------------------
1 file changed, 21 insertions(+), 146 deletions(-)
diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/cq.c
index 83169060d120..05fad06b89c2 100644
--- a/drivers/infiniband/hw/mlx4/cq.c
+++ b/drivers/infiniband/hw/mlx4/cq.c
@@ -296,30 +296,6 @@ int mlx4_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
return err;
}
-static int mlx4_alloc_resize_buf(struct mlx4_ib_dev *dev, struct mlx4_ib_cq *cq,
- int entries)
-{
- int err;
-
- if (cq->resize_buf)
- return -EBUSY;
-
- cq->resize_buf = kmalloc(sizeof *cq->resize_buf, GFP_KERNEL);
- if (!cq->resize_buf)
- return -ENOMEM;
-
- err = mlx4_ib_alloc_cq_buf(dev, &cq->resize_buf->buf, entries);
- if (err) {
- kfree(cq->resize_buf);
- cq->resize_buf = NULL;
- return err;
- }
-
- cq->resize_buf->cqe = entries - 1;
-
- return 0;
-}
-
static int mlx4_alloc_resize_umem(struct mlx4_ib_dev *dev, struct mlx4_ib_cq *cq,
int entries, struct ib_udata *udata)
{
@@ -329,9 +305,6 @@ static int mlx4_alloc_resize_umem(struct mlx4_ib_dev *dev, struct mlx4_ib_cq *cq
int n;
int err;
- if (cq->resize_umem)
- return -EBUSY;
-
if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd))
return -EFAULT;
@@ -371,91 +344,36 @@ static int mlx4_alloc_resize_umem(struct mlx4_ib_dev *dev, struct mlx4_ib_cq *cq
err_umem:
ib_umem_release(cq->resize_umem);
-
+ cq->resize_umem = NULL;
err_buf:
kfree(cq->resize_buf);
cq->resize_buf = NULL;
return err;
}
-static int mlx4_ib_get_outstanding_cqes(struct mlx4_ib_cq *cq)
-{
- u32 i;
-
- i = cq->mcq.cons_index;
- while (get_sw_cqe(cq, i))
- ++i;
-
- return i - cq->mcq.cons_index;
-}
-
-static void mlx4_ib_cq_resize_copy_cqes(struct mlx4_ib_cq *cq)
-{
- struct mlx4_cqe *cqe, *new_cqe;
- int i;
- int cqe_size = cq->buf.entry_size;
- int cqe_inc = cqe_size == 64 ? 1 : 0;
-
- i = cq->mcq.cons_index;
- cqe = get_cqe(cq, i & cq->ibcq.cqe);
- cqe += cqe_inc;
-
- while ((cqe->owner_sr_opcode & MLX4_CQE_OPCODE_MASK) != MLX4_CQE_OPCODE_RESIZE) {
- new_cqe = get_cqe_from_buf(&cq->resize_buf->buf,
- (i + 1) & cq->resize_buf->cqe);
- memcpy(new_cqe, get_cqe(cq, i & cq->ibcq.cqe), cqe_size);
- new_cqe += cqe_inc;
-
- new_cqe->owner_sr_opcode = (cqe->owner_sr_opcode & ~MLX4_CQE_OWNER_MASK) |
- (((i + 1) & (cq->resize_buf->cqe + 1)) ? MLX4_CQE_OWNER_MASK : 0);
- cqe = get_cqe(cq, ++i & cq->ibcq.cqe);
- cqe += cqe_inc;
- }
- ++cq->mcq.cons_index;
-}
-
int mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata)
{
struct mlx4_ib_dev *dev = to_mdev(ibcq->device);
struct mlx4_ib_cq *cq = to_mcq(ibcq);
struct mlx4_mtt mtt;
- int outst_cqe;
int err;
- mutex_lock(&cq->resize_mutex);
- if (entries < 1 || entries > dev->dev->caps.max_cqes) {
- err = -EINVAL;
- goto out;
- }
+ if (entries < 1 || entries > dev->dev->caps.max_cqes)
+ return -EINVAL;
entries = roundup_pow_of_two(entries + 1);
- if (entries == ibcq->cqe + 1) {
- err = 0;
- goto out;
- }
-
- if (entries > dev->dev->caps.max_cqes + 1) {
- err = -EINVAL;
- goto out;
- }
+ if (entries == ibcq->cqe + 1)
+ return 0;
- if (ibcq->uobject) {
- err = mlx4_alloc_resize_umem(dev, cq, entries, udata);
- if (err)
- goto out;
- } else {
- /* Can't be smaller than the number of outstanding CQEs */
- outst_cqe = mlx4_ib_get_outstanding_cqes(cq);
- if (entries < outst_cqe + 1) {
- err = -EINVAL;
- goto out;
- }
+ if (entries > dev->dev->caps.max_cqes + 1)
+ return -EINVAL;
- err = mlx4_alloc_resize_buf(dev, cq, entries);
- if (err)
- goto out;
+ mutex_lock(&cq->resize_mutex);
+ err = mlx4_alloc_resize_umem(dev, cq, entries, udata);
+ if (err) {
+ mutex_unlock(&cq->resize_mutex);
+ return err;
}
-
mtt = cq->buf.mtt;
err = mlx4_cq_resize(dev->dev, &cq->mcq, entries, &cq->resize_buf->buf.mtt);
@@ -463,52 +381,26 @@ int mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata)
goto err_buf;
mlx4_mtt_cleanup(dev->dev, &mtt);
- if (ibcq->uobject) {
- cq->buf = cq->resize_buf->buf;
- cq->ibcq.cqe = cq->resize_buf->cqe;
- ib_umem_release(cq->ibcq.umem);
- cq->ibcq.umem = cq->resize_umem;
-
- kfree(cq->resize_buf);
- cq->resize_buf = NULL;
- cq->resize_umem = NULL;
- } else {
- struct mlx4_ib_cq_buf tmp_buf;
- int tmp_cqe = 0;
-
- spin_lock_irq(&cq->lock);
- if (cq->resize_buf) {
- mlx4_ib_cq_resize_copy_cqes(cq);
- tmp_buf = cq->buf;
- tmp_cqe = cq->ibcq.cqe;
- cq->buf = cq->resize_buf->buf;
- cq->ibcq.cqe = cq->resize_buf->cqe;
-
- kfree(cq->resize_buf);
- cq->resize_buf = NULL;
- }
- spin_unlock_irq(&cq->lock);
+ cq->buf = cq->resize_buf->buf;
+ cq->ibcq.cqe = cq->resize_buf->cqe;
+ ib_umem_release(cq->ibcq.umem);
+ cq->ibcq.umem = cq->resize_umem;
- if (tmp_cqe)
- mlx4_ib_free_cq_buf(dev, &tmp_buf, tmp_cqe);
- }
+ kfree(cq->resize_buf);
+ cq->resize_buf = NULL;
+ cq->resize_umem = NULL;
+ mutex_unlock(&cq->resize_mutex);
+ return 0;
- goto out;
err_buf:
mlx4_mtt_cleanup(dev->dev, &cq->resize_buf->buf.mtt);
- if (!ibcq->uobject)
- mlx4_ib_free_cq_buf(dev, &cq->resize_buf->buf,
- cq->resize_buf->cqe);
-
kfree(cq->resize_buf);
cq->resize_buf = NULL;
ib_umem_release(cq->resize_umem);
cq->resize_umem = NULL;
-out:
mutex_unlock(&cq->resize_mutex);
-
return err;
}
@@ -707,7 +599,6 @@ static int mlx4_ib_poll_one(struct mlx4_ib_cq *cq,
u16 wqe_ctr;
unsigned tail = 0;
-repoll:
cqe = next_cqe_sw(cq);
if (!cqe)
return -EAGAIN;
@@ -727,22 +618,6 @@ static int mlx4_ib_poll_one(struct mlx4_ib_cq *cq,
is_error = (cqe->owner_sr_opcode & MLX4_CQE_OPCODE_MASK) ==
MLX4_CQE_OPCODE_ERROR;
- /* Resize CQ in progress */
- if (unlikely((cqe->owner_sr_opcode & MLX4_CQE_OPCODE_MASK) == MLX4_CQE_OPCODE_RESIZE)) {
- if (cq->resize_buf) {
- struct mlx4_ib_dev *dev = to_mdev(cq->ibcq.device);
-
- mlx4_ib_free_cq_buf(dev, &cq->buf, cq->ibcq.cqe);
- cq->buf = cq->resize_buf->buf;
- cq->ibcq.cqe = cq->resize_buf->cqe;
-
- kfree(cq->resize_buf);
- cq->resize_buf = NULL;
- }
-
- goto repoll;
- }
-
if (!*cur_qp ||
(be32_to_cpu(cqe->vlan_my_qpn) & MLX4_CQE_QPN_MASK) != (*cur_qp)->mqp.qpn) {
/*
--
2.52.0