mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
RDMA/mlx5: Fix CQ resize destination index mask
In copy_resize_cqes, the destination CQE index is computed as
(i + 1) & cq->resize_buf->nent, but resize_buf->nent is produced by
roundup_pow_of_two(), so it is a power of two with exactly one bit set.
Masking with a single-bit value can only yield 0 or nent itself. The
buffer has nent entries, so valid indices are 0 .. nent - 1 and nent is
one past the last slot; whenever the masked result is nent the following
memcpy writes one entry out of bounds.
Use (nent - 1) as the wrap mask instead. For a power-of-two nent,
(i + 1) & (nent - 1) is the correct modulo-nent reduction, keeping the
index within [0, nent - 1]. This matches get_sw_cqe(), which addresses
the CQ buffer via n & cq->ibcq.cqe, where cq->ibcq.cqe == entries - 1 is
exactly the nent - 1 wrap mask.
Fixes: bde51583f4 ("IB/mlx5: Add support for resize CQ")
Signed-off-by: Li RongQing <lirongqing@baidu.com>
Link: https://patch.msgid.link/20261019050503.2313-1-lirongqing@baidu.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
This commit is contained in:
parent
9dd8b9a337
commit
0fe31052d9
|
|
@ -1316,7 +1316,7 @@ static int copy_resize_cqes(struct mlx5_ib_cq *cq)
|
|||
|
||||
while (get_cqe_opcode(scqe64) != MLX5_CQE_RESIZE_CQ) {
|
||||
dcqe = mlx5_frag_buf_get_wqe(&cq->resize_buf->fbc,
|
||||
(i + 1) & cq->resize_buf->nent);
|
||||
(i + 1) & (cq->resize_buf->nent - 1));
|
||||
dcqe64 = dsize == 64 ? dcqe : dcqe + 64;
|
||||
sw_own = sw_ownership_bit(i + 1, cq->resize_buf->nent);
|
||||
memcpy(dcqe, scqe, dsize);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user