RDMA/bnxt_re: Validate rate limit attribute in modify QP

Rate limit transition validation for RC QPs currently relies on
the IB core qp_state_table. Add a driver-level helper to validate
the rate limit attribute directly during QP modify, ensuring it
is only accepted for RC QPs in INIT->RTR, RTR->RTS and RTS->RTS
transitions.

This makes the driver responsible for rate limit validation
and prepares for a follow-up IB core change that delegates
IB_QP_RATE_LIMIT and all future non-standard modify attributes
handling to individual vendor drivers.

Signed-off-by: Maher Sanalla <msanalla@nvidia.com>
Reviewed-by: Michael Guralnik <michaelgur@nvidia.com>
Signed-off-by: Edward Srouji <edwards@nvidia.com>
Link: https://patch.msgid.link/20260524-packet-pacing-v1-6-3d79439f8d08@nvidia.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
This commit is contained in:
Maher Sanalla 2026-05-24 18:38:07 +03:00 committed by Leon Romanovsky
parent 1f307090e9
commit 8cca273136

View File

@ -2406,6 +2406,23 @@ static int bnxt_re_modify_shadow_qp(struct bnxt_re_dev *rdev,
return rc;
}
static bool bnxt_re_is_modify_ok(enum ib_qp_attr_mask ext_mask,
enum ib_qp_type type, enum ib_qp_state cur,
enum ib_qp_state next)
{
if (!ext_mask)
return true;
if (ext_mask & ~IB_QP_RATE_LIMIT)
return false;
/* Rate limit is only supported for RC QPs during specific transitions */
return type == IB_QPT_RC &&
((cur == IB_QPS_INIT && next == IB_QPS_RTR) ||
(cur == IB_QPS_RTR && next == IB_QPS_RTS) ||
(cur == IB_QPS_RTS && next == IB_QPS_RTS));
}
int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,
int qp_attr_mask, struct ib_udata *udata)
{
@ -2430,7 +2447,10 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,
curr_qp_state = __to_ib_qp_state(qp->qplib_qp.cur_qp_state);
new_qp_state = qp_attr->qp_state;
if (!ib_modify_qp_is_ok(curr_qp_state, new_qp_state,
ib_qp->qp_type, qp_attr_mask)) {
ib_qp->qp_type, qp_attr_mask) ||
!bnxt_re_is_modify_ok(qp_attr_mask & ~IB_QP_ATTR_STANDARD_BITS,
ib_qp->qp_type, curr_qp_state,
new_qp_state)) {
ibdev_err(&rdev->ibdev,
"Invalid attribute mask: %#x specified ",
qp_attr_mask);