* [PATCH rdma-next 0/8] RDMA: Extend packet pacing support to UD and UC QPs
@ 2026-05-24 15:38 Edward Srouji
2026-05-24 15:38 ` [PATCH rdma-next 1/8] net/mlx5: Add UD and UC packet pacing caps Edward Srouji
` (8 more replies)
0 siblings, 9 replies; 10+ messages in thread
From: Edward Srouji @ 2026-05-24 15:38 UTC (permalink / raw)
To: Leon Romanovsky, Saeed Mahameed, Tariq Toukan, Mark Bloch,
Jason Gunthorpe, Selvin Xavier, Kalesh AP, Abhijit Gangurde,
Allen Hubbe
Cc: linux-rdma, netdev, linux-kernel, Edward Srouji, Maher Sanalla,
Michael Guralnik
The primary goal of this series is to extend mlx5 packet pacing (rate
limit) beyond raw packet QPs to cover UD and UC QPs while keeping the
IB core free of vendor-specific policy for non-standard modify
attributes.
Today, IB_QP_RATE_LIMIT is restricted by the IB core qp_state_table
to RC QPs only. It is also the only non-standard modify QP attribute,
but as rate limit support expands across vendors, and as additional
non-standard attributes are likely to follow, centralizing such policy
in the core becomes impractical. Each driver is better positioned to
enforce its own supported QP types and transitions over non-standard
attributes. The series therefore removes IB_QP_RATE_LIMIT from the
qp_state_table and modifies the affected vendor drivers to validate the
attribute locally, preserving their existing behavior.
The patches are ordered so that every vendor driver validates
the attribute internally before the core delegation takes effect.
Patches 1-5 implement the mlx5 feature itself, patches 6-7 prepare
bnxt_re and ionic, and patch 8 performs the IB core change.
Signed-off-by: Edward Srouji <edwards@nvidia.com>
---
Maher Sanalla (8):
net/mlx5: Add UD and UC packet pacing caps
RDMA/mlx5: Refactor raw packet QP rate limit handling
RDMA/mlx5: Add support for rate limit in UD and UC QPs
RDMA/mlx5: Support deferred rate limit configuration
RDMA/mlx5: Report packet pacing capabilities when querying device
RDMA/bnxt_re: Validate rate limit attribute in modify QP
RDMA/ionic: Validate rate limit attribute in modify QP
IB/core: Delegate IB_QP_RATE_LIMIT validation to drivers
drivers/infiniband/core/verbs.c | 13 +-
drivers/infiniband/hw/bnxt_re/ib_verbs.c | 22 ++-
drivers/infiniband/hw/ionic/ionic_controlpath.c | 21 +-
drivers/infiniband/hw/mlx5/main.c | 37 ++--
drivers/infiniband/hw/mlx5/mlx5_ib.h | 1 +
drivers/infiniband/hw/mlx5/qp.c | 253 +++++++++++++++++-------
include/linux/mlx5/mlx5_ifc.h | 8 +-
include/linux/mlx5/qp.h | 1 +
8 files changed, 256 insertions(+), 100 deletions(-)
---
base-commit: 67464f388d52ec172be62c99fc43697437ffa384
change-id: 20260524-packet-pacing-bef6875f3970
Best regards,
--
Edward Srouji <edwards@nvidia.com>
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH rdma-next 1/8] net/mlx5: Add UD and UC packet pacing caps
2026-05-24 15:38 [PATCH rdma-next 0/8] RDMA: Extend packet pacing support to UD and UC QPs Edward Srouji
@ 2026-05-24 15:38 ` Edward Srouji
2026-05-24 15:38 ` [PATCH rdma-next 2/8] RDMA/mlx5: Refactor raw packet QP rate limit handling Edward Srouji
` (7 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Edward Srouji @ 2026-05-24 15:38 UTC (permalink / raw)
To: Leon Romanovsky, Saeed Mahameed, Tariq Toukan, Mark Bloch,
Jason Gunthorpe, Selvin Xavier, Kalesh AP, Abhijit Gangurde,
Allen Hubbe
Cc: linux-rdma, netdev, linux-kernel, Edward Srouji, Maher Sanalla,
Michael Guralnik
From: Maher Sanalla <msanalla@nvidia.com>
Add the needed capabilities in mlx5_ifc to support packet pacing for UC
and UD QPs.
Signed-off-by: Maher Sanalla <msanalla@nvidia.com>
Reviewed-by: Michael Guralnik <michaelgur@nvidia.com>
Signed-off-by: Edward Srouji <edwards@nvidia.com>
---
include/linux/mlx5/mlx5_ifc.h | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/include/linux/mlx5/mlx5_ifc.h b/include/linux/mlx5/mlx5_ifc.h
index 49f3ad4b1a7c548e57da0004a7a7c1e0e03f3534..f56de77cde3aa015c00d13e32402e9ccb8ef9468 100644
--- a/include/linux/mlx5/mlx5_ifc.h
+++ b/include/linux/mlx5/mlx5_ifc.h
@@ -1116,7 +1116,10 @@ struct mlx5_ifc_qos_cap_bits {
u8 log_esw_max_sched_depth[0x4];
u8 reserved_at_10[0x10];
- u8 reserved_at_20[0x9];
+ u8 reserved_at_20[0x2];
+ u8 packet_pacing_req_ud[0x1];
+ u8 packet_pacing_req_uc[0x1];
+ u8 reserved_at_24[0x5];
u8 esw_cross_esw_sched[0x1];
u8 reserved_at_2a[0x1];
u8 log_max_qos_nic_queue_group[0x5];
@@ -3707,7 +3710,8 @@ struct mlx5_ifc_qpc_bits {
u8 cur_retry_count[0x3];
u8 reserved_at_39b[0x5];
- u8 reserved_at_3a0[0x20];
+ u8 reserved_at_3a0[0x10];
+ u8 packet_pacing_rate_limit_index[0x10];
u8 reserved_at_3c0[0x8];
u8 next_send_psn[0x18];
--
2.49.0
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH rdma-next 2/8] RDMA/mlx5: Refactor raw packet QP rate limit handling
2026-05-24 15:38 [PATCH rdma-next 0/8] RDMA: Extend packet pacing support to UD and UC QPs Edward Srouji
2026-05-24 15:38 ` [PATCH rdma-next 1/8] net/mlx5: Add UD and UC packet pacing caps Edward Srouji
@ 2026-05-24 15:38 ` Edward Srouji
2026-05-24 15:38 ` [PATCH rdma-next 3/8] RDMA/mlx5: Add support for rate limit in UD and UC QPs Edward Srouji
` (6 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Edward Srouji @ 2026-05-24 15:38 UTC (permalink / raw)
To: Leon Romanovsky, Saeed Mahameed, Tariq Toukan, Mark Bloch,
Jason Gunthorpe, Selvin Xavier, Kalesh AP, Abhijit Gangurde,
Allen Hubbe
Cc: linux-rdma, netdev, linux-kernel, Edward Srouji, Maher Sanalla,
Michael Guralnik
From: Maher Sanalla <msanalla@nvidia.com>
Refactor the raw packet QP modify path to extract rate limit
configuration into a qp_rl_parse() helper that parses user attributes,
and a qp_rl_prepare() helper that handles FW rate limit table
adjustments before the SQ modify itself.
Use qp_rl_commit() to commit changes to QP once FW call
succeeds, and qp_rl_rollback() to rollback changes done to
the FW rate limit table in the prepare stage, in case the
modify operation fails.
These helpers will be reused for extending rate limit support to
additional QP types in the following patch.
Signed-off-by: Maher Sanalla <msanalla@nvidia.com>
Reviewed-by: Michael Guralnik <michaelgur@nvidia.com>
Signed-off-by: Edward Srouji <edwards@nvidia.com>
---
drivers/infiniband/hw/mlx5/qp.c | 168 ++++++++++++++++++++++++++--------------
1 file changed, 110 insertions(+), 58 deletions(-)
diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c
index 6f88f9c52ad09860474824c88fdc73858045bbd0..fde319a021908317d96f3cdd212ea5ebf691f13a 100644
--- a/drivers/infiniband/hw/mlx5/qp.c
+++ b/drivers/infiniband/hw/mlx5/qp.c
@@ -64,12 +64,19 @@ enum {
MLX5_QP_RM_GO_BACK_N = 0x1,
};
+struct mlx5_rate_limit_ctx {
+ struct mlx5_rate_limit rl_old;
+ struct mlx5_rate_limit rl_desired;
+ u16 rl_desired_index;
+ bool rl_changed;
+};
+
struct mlx5_modify_raw_qp_param {
u16 operation;
u32 set_mask; /* raw_qp_set_mask_map */
- struct mlx5_rate_limit rl;
+ struct mlx5_rate_limit_ctx rl_ctx;
u8 rq_q_ctr_id;
u32 port;
@@ -3833,15 +3840,88 @@ static int modify_raw_packet_qp_rq(
return err;
}
+static int qp_rl_parse(struct mlx5_ib_dev *dev,
+ const struct ib_qp_attr *attr,
+ const struct mlx5_ib_modify_qp *ucmd,
+ struct mlx5_rate_limit *rl_desired)
+{
+ rl_desired->rate = attr->rate_limit;
+
+ if (ucmd->burst_info.max_burst_sz) {
+ if (!attr->rate_limit ||
+ !MLX5_CAP_QOS(dev->mdev, packet_pacing_burst_bound))
+ return -EINVAL;
+ rl_desired->max_burst_sz = ucmd->burst_info.max_burst_sz;
+ }
+
+ if (ucmd->burst_info.typical_pkt_sz) {
+ if (!attr->rate_limit ||
+ !MLX5_CAP_QOS(dev->mdev, packet_pacing_typical_size))
+ return -EINVAL;
+ rl_desired->typical_pkt_sz = ucmd->burst_info.typical_pkt_sz;
+ }
+
+ return 0;
+}
+
+static int qp_rl_prepare(struct mlx5_ib_dev *dev,
+ struct mlx5_ib_qp *qp, u16 op,
+ struct mlx5_rate_limit_ctx *ctx)
+{
+ int err;
+
+ ctx->rl_old = qp->rl;
+
+ if (!qp->sq.wqe_cnt)
+ return 0;
+
+ if (op != MLX5_CMD_OP_RTR2RTS_QP &&
+ op != MLX5_CMD_OP_RTS2RTS_QP)
+ return 0;
+
+ ctx->rl_changed = true;
+
+ if (ctx->rl_desired.rate) {
+ err = mlx5_rl_add_rate(dev->mdev, &ctx->rl_desired_index,
+ &ctx->rl_desired);
+ if (err) {
+ pr_err("Failed configuring rate limit(err %d): rate %u, max_burst_sz %u, typical_pkt_sz %u\n",
+ err, ctx->rl_desired.rate,
+ ctx->rl_desired.max_burst_sz,
+ ctx->rl_desired.typical_pkt_sz);
+ return err;
+ }
+ }
+
+ return 0;
+}
+
+static void qp_rl_rollback(struct mlx5_core_dev *dev,
+ struct mlx5_rate_limit_ctx *ctx)
+{
+ if (ctx->rl_desired_index)
+ mlx5_rl_remove_rate(dev, &ctx->rl_desired);
+}
+
+static void qp_rl_commit(struct mlx5_core_dev *dev,
+ struct mlx5_ib_qp *qp,
+ struct mlx5_rate_limit_ctx *ctx)
+{
+ if (!ctx->rl_changed)
+ return;
+
+ if (ctx->rl_old.rate)
+ mlx5_rl_remove_rate(dev, &ctx->rl_old);
+
+ qp->rl = ctx->rl_desired;
+}
+
static int modify_raw_packet_qp_sq(
struct mlx5_core_dev *dev, struct mlx5_ib_sq *sq, int new_state,
const struct mlx5_modify_raw_qp_param *raw_qp_param, struct ib_pd *pd)
{
+ const struct mlx5_rate_limit_ctx *rl_ctx = &raw_qp_param->rl_ctx;
struct mlx5_ib_qp *ibqp = sq->base.container_mibqp;
- struct mlx5_rate_limit old_rl = ibqp->rl;
- struct mlx5_rate_limit new_rl = old_rl;
- bool new_rate_added = false;
- u16 rl_index = 0;
void *in;
void *sqc;
int inlen;
@@ -3859,49 +3939,26 @@ static int modify_raw_packet_qp_sq(
MLX5_SET(sqc, sqc, state, new_state);
if (raw_qp_param->set_mask & MLX5_RAW_QP_RATE_LIMIT) {
- if (new_state != MLX5_SQC_STATE_RDY)
+ if (new_state != MLX5_SQC_STATE_RDY) {
pr_warn("%s: Rate limit can only be changed when SQ is moving to RDY\n",
__func__);
- else
- new_rl = raw_qp_param->rl;
- }
-
- if (!mlx5_rl_are_equal(&old_rl, &new_rl)) {
- if (new_rl.rate) {
- err = mlx5_rl_add_rate(dev, &rl_index, &new_rl);
- if (err) {
- pr_err("Failed configuring rate limit(err %d): \
- rate %u, max_burst_sz %u, typical_pkt_sz %u\n",
- err, new_rl.rate, new_rl.max_burst_sz,
- new_rl.typical_pkt_sz);
-
- goto out;
- }
- new_rate_added = true;
+ } else if (rl_ctx->rl_changed) {
+ MLX5_SET64(modify_sq_in, in, modify_bitmask, 1);
+ /* index 0 means no limit */
+ MLX5_SET(sqc, sqc, packet_pacing_rate_limit_index,
+ rl_ctx->rl_desired_index);
}
-
- MLX5_SET64(modify_sq_in, in, modify_bitmask, 1);
- /* index 0 means no limit */
- MLX5_SET(sqc, sqc, packet_pacing_rate_limit_index, rl_index);
}
err = mlx5_core_modify_sq(dev, sq->base.mqp.qpn, in);
- if (err) {
- /* Remove new rate from table if failed */
- if (new_rate_added)
- mlx5_rl_remove_rate(dev, &new_rl);
+ if (err)
goto out;
- }
- /* Only remove the old rate after new rate was set */
- if ((old_rl.rate && !mlx5_rl_are_equal(&old_rl, &new_rl)) ||
- (new_state != MLX5_SQC_STATE_RDY)) {
- mlx5_rl_remove_rate(dev, &old_rl);
- if (new_state != MLX5_SQC_STATE_RDY)
- memset(&new_rl, 0, sizeof(new_rl));
+ if (new_state != MLX5_SQC_STATE_RDY) {
+ mlx5_rl_remove_rate(dev, &ibqp->rl);
+ memset(&ibqp->rl, 0, sizeof(ibqp->rl));
}
- ibqp->rl = new_rl;
sq->state = new_state;
out:
@@ -4376,34 +4433,29 @@ static int __mlx5_ib_modify_qp(struct ib_qp *ibqp,
raw_qp_param.port = attr->port_num;
if (attr_mask & IB_QP_RATE_LIMIT) {
- raw_qp_param.rl.rate = attr->rate_limit;
-
- if (ucmd->burst_info.max_burst_sz) {
- if (attr->rate_limit &&
- MLX5_CAP_QOS(dev->mdev, packet_pacing_burst_bound)) {
- raw_qp_param.rl.max_burst_sz =
- ucmd->burst_info.max_burst_sz;
- } else {
- err = -EINVAL;
- goto out;
- }
- }
+ err = qp_rl_parse(dev, qp, attr, ucmd,
+ &raw_qp_param.rl_ctx.rl_desired);
+ if (err)
+ goto out;
- if (ucmd->burst_info.typical_pkt_sz) {
- if (attr->rate_limit &&
- MLX5_CAP_QOS(dev->mdev, packet_pacing_typical_size)) {
- raw_qp_param.rl.typical_pkt_sz =
- ucmd->burst_info.typical_pkt_sz;
- } else {
- err = -EINVAL;
+ if (!mlx5_rl_are_equal(&raw_qp_param.rl_ctx.rl_desired,
+ &qp->rl)) {
+ err = qp_rl_prepare(dev, qp, op,
+ &raw_qp_param.rl_ctx);
+ if (err)
goto out;
- }
}
raw_qp_param.set_mask |= MLX5_RAW_QP_RATE_LIMIT;
}
err = modify_raw_packet_qp(dev, qp, &raw_qp_param, tx_affinity);
+ if (err) {
+ qp_rl_rollback(dev->mdev, &raw_qp_param.rl_ctx);
+ goto out;
+ }
+
+ qp_rl_commit(dev->mdev, qp, &raw_qp_param.rl_ctx);
} else {
if (udata) {
/* For the kernel flows, the resp will stay zero */
--
2.49.0
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH rdma-next 3/8] RDMA/mlx5: Add support for rate limit in UD and UC QPs
2026-05-24 15:38 [PATCH rdma-next 0/8] RDMA: Extend packet pacing support to UD and UC QPs Edward Srouji
2026-05-24 15:38 ` [PATCH rdma-next 1/8] net/mlx5: Add UD and UC packet pacing caps Edward Srouji
2026-05-24 15:38 ` [PATCH rdma-next 2/8] RDMA/mlx5: Refactor raw packet QP rate limit handling Edward Srouji
@ 2026-05-24 15:38 ` Edward Srouji
2026-05-24 15:38 ` [PATCH rdma-next 4/8] RDMA/mlx5: Support deferred rate limit configuration Edward Srouji
` (5 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Edward Srouji @ 2026-05-24 15:38 UTC (permalink / raw)
To: Leon Romanovsky, Saeed Mahameed, Tariq Toukan, Mark Bloch,
Jason Gunthorpe, Selvin Xavier, Kalesh AP, Abhijit Gangurde,
Allen Hubbe
Cc: linux-rdma, netdev, linux-kernel, Edward Srouji, Maher Sanalla,
Michael Guralnik
From: Maher Sanalla <msanalla@nvidia.com>
Rate limiting is currently supported only for raw packet QPs, where
the packet pacing index is programmed into the SQC during SQ modify.
Extend rate limit support to UD and UC QPs by setting the pacing
index in the QPC during RTR2RTS and RTS2RTS transitions.
Signed-off-by: Maher Sanalla <msanalla@nvidia.com>
Reviewed-by: Michael Guralnik <michaelgur@nvidia.com>
Signed-off-by: Edward Srouji <edwards@nvidia.com>
---
drivers/infiniband/hw/mlx5/qp.c | 107 ++++++++++++++++++++++++++++------------
include/linux/mlx5/qp.h | 1 +
2 files changed, 76 insertions(+), 32 deletions(-)
diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c
index fde319a021908317d96f3cdd212ea5ebf691f13a..e96d26253e3b1fabee23947b1a61ab26e7c7067f 100644
--- a/drivers/infiniband/hw/mlx5/qp.c
+++ b/drivers/infiniband/hw/mlx5/qp.c
@@ -2725,6 +2725,10 @@ static void destroy_qp_common(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
if (err)
mlx5_ib_warn(dev, "failed to destroy QP 0x%x\n",
base->mqp.qpn);
+ if (qp->rl.rate) {
+ mlx5_rl_remove_rate(dev->mdev, &qp->rl);
+ memset(&qp->rl, 0, sizeof(qp->rl));
+ }
}
destroy_qp(dev, qp, base, udata);
@@ -3673,8 +3677,10 @@ static enum mlx5_qp_optpar opt_mask[MLX5_QP_NUM_STATE][MLX5_QP_NUM_STATE][MLX5_Q
MLX5_QP_OPTPAR_RNR_TIMEOUT,
[MLX5_QP_ST_UC] = MLX5_QP_OPTPAR_ALT_ADDR_PATH |
MLX5_QP_OPTPAR_RWE |
- MLX5_QP_OPTPAR_PM_STATE,
- [MLX5_QP_ST_UD] = MLX5_QP_OPTPAR_Q_KEY,
+ MLX5_QP_OPTPAR_PM_STATE |
+ MLX5_QP_OPTPAR_PP_INDEX,
+ [MLX5_QP_ST_UD] = MLX5_QP_OPTPAR_Q_KEY |
+ MLX5_QP_OPTPAR_PP_INDEX,
[MLX5_QP_ST_XRC] = MLX5_QP_OPTPAR_ALT_ADDR_PATH |
MLX5_QP_OPTPAR_RRE |
MLX5_QP_OPTPAR_RAE |
@@ -3693,10 +3699,12 @@ static enum mlx5_qp_optpar opt_mask[MLX5_QP_NUM_STATE][MLX5_QP_NUM_STATE][MLX5_Q
MLX5_QP_OPTPAR_ALT_ADDR_PATH,
[MLX5_QP_ST_UC] = MLX5_QP_OPTPAR_RWE |
MLX5_QP_OPTPAR_PM_STATE |
- MLX5_QP_OPTPAR_ALT_ADDR_PATH,
+ MLX5_QP_OPTPAR_ALT_ADDR_PATH |
+ MLX5_QP_OPTPAR_PP_INDEX,
[MLX5_QP_ST_UD] = MLX5_QP_OPTPAR_Q_KEY |
MLX5_QP_OPTPAR_SRQN |
- MLX5_QP_OPTPAR_CQN_RCV,
+ MLX5_QP_OPTPAR_CQN_RCV |
+ MLX5_QP_OPTPAR_PP_INDEX,
[MLX5_QP_ST_XRC] = MLX5_QP_OPTPAR_RRE |
MLX5_QP_OPTPAR_RAE |
MLX5_QP_OPTPAR_RWE |
@@ -3840,11 +3848,31 @@ static int modify_raw_packet_qp_rq(
return err;
}
+static bool qp_rate_limit_supported(struct mlx5_ib_dev *dev,
+ struct mlx5_ib_qp *qp)
+{
+ if (qp->type == IB_QPT_RAW_PACKET ||
+ qp->flags & IB_QP_CREATE_SOURCE_QPN)
+ return true;
+
+ if (qp->type == IB_QPT_UD)
+ return MLX5_CAP_QOS(dev->mdev, packet_pacing_req_ud);
+
+ if (qp->type == IB_QPT_UC)
+ return MLX5_CAP_QOS(dev->mdev, packet_pacing_req_uc);
+
+ return false;
+}
+
static int qp_rl_parse(struct mlx5_ib_dev *dev,
+ struct mlx5_ib_qp *qp,
const struct ib_qp_attr *attr,
const struct mlx5_ib_modify_qp *ucmd,
struct mlx5_rate_limit *rl_desired)
{
+ if (!qp_rate_limit_supported(dev, qp))
+ return -EOPNOTSUPP;
+
rl_desired->rate = attr->rate_limit;
if (ucmd->burst_info.max_burst_sz) {
@@ -3905,15 +3933,20 @@ static void qp_rl_rollback(struct mlx5_core_dev *dev,
static void qp_rl_commit(struct mlx5_core_dev *dev,
struct mlx5_ib_qp *qp,
- struct mlx5_rate_limit_ctx *ctx)
+ struct mlx5_rate_limit_ctx *ctx,
+ enum ib_qp_state new_state)
{
- if (!ctx->rl_changed)
- return;
-
- if (ctx->rl_old.rate)
- mlx5_rl_remove_rate(dev, &ctx->rl_old);
+ if (ctx->rl_changed) {
+ if (ctx->rl_old.rate)
+ mlx5_rl_remove_rate(dev, &ctx->rl_old);
+ qp->rl = ctx->rl_desired;
+ }
- qp->rl = ctx->rl_desired;
+ if (new_state == IB_QPS_RESET || new_state == IB_QPS_ERR) {
+ if (qp->rl.rate)
+ mlx5_rl_remove_rate(dev, &qp->rl);
+ memset(&qp->rl, 0, sizeof(qp->rl));
+ }
}
static int modify_raw_packet_qp_sq(
@@ -4220,6 +4253,7 @@ static int __mlx5_ib_modify_qp(struct ib_qp *ibqp,
struct mlx5_ib_qp *qp = to_mqp(ibqp);
struct mlx5_ib_qp_base *base = &qp->trans_qp.base;
struct mlx5_ib_cq *send_cq, *recv_cq;
+ struct mlx5_rate_limit_ctx rl_ctx = {};
struct mlx5_ib_pd *pd;
enum mlx5_qp_state mlx5_cur, mlx5_new;
void *qpc, *pri_path, *alt_path;
@@ -4410,20 +4444,31 @@ static int __mlx5_ib_modify_qp(struct ib_qp *ibqp,
goto out;
}
+ if (attr_mask & IB_QP_RATE_LIMIT) {
+ err = qp_rl_parse(dev, qp, attr, ucmd, &rl_ctx.rl_desired);
+ if (err)
+ goto out;
+ } else {
+ rl_ctx.rl_desired = qp->rl;
+ }
+
op = optab[mlx5_cur][mlx5_new];
+ if (!mlx5_rl_are_equal(&rl_ctx.rl_desired, &qp->rl)) {
+ err = qp_rl_prepare(dev, qp, op, &rl_ctx);
+ if (err)
+ goto out;
+ }
optpar |= ib_mask_to_mlx5_opt(attr_mask);
+ if (rl_ctx.rl_changed)
+ optpar |= MLX5_QP_OPTPAR_PP_INDEX;
optpar &= opt_mask[mlx5_cur][mlx5_new][mlx5_st];
- if (attr_mask & IB_QP_RATE_LIMIT && qp->type != IB_QPT_RAW_PACKET) {
- err = -EOPNOTSUPP;
- goto out;
- }
-
if (qp->type == IB_QPT_RAW_PACKET ||
qp->flags & IB_QP_CREATE_SOURCE_QPN) {
struct mlx5_modify_raw_qp_param raw_qp_param = {};
raw_qp_param.operation = op;
+ raw_qp_param.rl_ctx = rl_ctx;
if (cur_state == IB_QPS_RESET && new_state == IB_QPS_INIT) {
raw_qp_param.rq_q_ctr_id = set_id;
raw_qp_param.set_mask |= MLX5_RAW_QP_MOD_SET_RQ_Q_CTR_ID;
@@ -4432,22 +4477,8 @@ static int __mlx5_ib_modify_qp(struct ib_qp *ibqp,
if (attr_mask & IB_QP_PORT)
raw_qp_param.port = attr->port_num;
- if (attr_mask & IB_QP_RATE_LIMIT) {
- err = qp_rl_parse(dev, qp, attr, ucmd,
- &raw_qp_param.rl_ctx.rl_desired);
- if (err)
- goto out;
-
- if (!mlx5_rl_are_equal(&raw_qp_param.rl_ctx.rl_desired,
- &qp->rl)) {
- err = qp_rl_prepare(dev, qp, op,
- &raw_qp_param.rl_ctx);
- if (err)
- goto out;
- }
-
+ if (rl_ctx.rl_changed)
raw_qp_param.set_mask |= MLX5_RAW_QP_RATE_LIMIT;
- }
err = modify_raw_packet_qp(dev, qp, &raw_qp_param, tx_affinity);
if (err) {
@@ -4455,8 +4486,13 @@ static int __mlx5_ib_modify_qp(struct ib_qp *ibqp,
goto out;
}
- qp_rl_commit(dev->mdev, qp, &raw_qp_param.rl_ctx);
+ qp_rl_commit(dev->mdev, qp, &raw_qp_param.rl_ctx, new_state);
} else {
+ if (rl_ctx.rl_changed) {
+ MLX5_SET(qpc, qpc, packet_pacing_rate_limit_index,
+ rl_ctx.rl_desired_index);
+ }
+
if (udata) {
/* For the kernel flows, the resp will stay zero */
resp->ece_options =
@@ -4466,6 +4502,13 @@ static int __mlx5_ib_modify_qp(struct ib_qp *ibqp,
}
err = mlx5_core_qp_modify(dev, op, optpar, qpc, &base->mqp,
&resp->ece_options);
+
+ if (err) {
+ qp_rl_rollback(dev->mdev, &rl_ctx);
+ goto out;
+ }
+
+ qp_rl_commit(dev->mdev, qp, &rl_ctx, new_state);
}
if (err)
diff --git a/include/linux/mlx5/qp.h b/include/linux/mlx5/qp.h
index d67aedc6ea68ae9f514a1de11626792bfe847c04..40f889403b075ebc6b860705206843aafa5d9a32 100644
--- a/include/linux/mlx5/qp.h
+++ b/include/linux/mlx5/qp.h
@@ -72,6 +72,7 @@ enum mlx5_qp_optpar {
MLX5_QP_OPTPAR_CQN_RCV = 1 << 19,
MLX5_QP_OPTPAR_DC_HS = 1 << 20,
MLX5_QP_OPTPAR_DC_KEY = 1 << 21,
+ MLX5_QP_OPTPAR_PP_INDEX = 1 << 22,
MLX5_QP_OPTPAR_COUNTER_SET_ID = 1 << 25,
};
--
2.49.0
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH rdma-next 4/8] RDMA/mlx5: Support deferred rate limit configuration
2026-05-24 15:38 [PATCH rdma-next 0/8] RDMA: Extend packet pacing support to UD and UC QPs Edward Srouji
` (2 preceding siblings ...)
2026-05-24 15:38 ` [PATCH rdma-next 3/8] RDMA/mlx5: Add support for rate limit in UD and UC QPs Edward Srouji
@ 2026-05-24 15:38 ` Edward Srouji
2026-05-24 15:38 ` [PATCH rdma-next 5/8] RDMA/mlx5: Report packet pacing capabilities when querying device Edward Srouji
` (4 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Edward Srouji @ 2026-05-24 15:38 UTC (permalink / raw)
To: Leon Romanovsky, Saeed Mahameed, Tariq Toukan, Mark Bloch,
Jason Gunthorpe, Selvin Xavier, Kalesh AP, Abhijit Gangurde,
Allen Hubbe
Cc: linux-rdma, netdev, linux-kernel, Edward Srouji, Maher Sanalla,
Michael Guralnik
From: Maher Sanalla <msanalla@nvidia.com>
Allow passing a rate limit attribute in modify QP flows even when the
QP is in a state that does not support packet pacing programming in
the lower layers.
When the user sets a rate limit during a QP transition that is not to
RTS, store the value in the mlx5 QP struct and program it to FW when
the QP later transitions to RTS, which is the state that allows
configuring the rate limit index in the QP context.
Signed-off-by: Maher Sanalla <msanalla@nvidia.com>
Reviewed-by: Michael Guralnik <michaelgur@nvidia.com>
Signed-off-by: Edward Srouji <edwards@nvidia.com>
---
drivers/infiniband/hw/mlx5/mlx5_ib.h | 1 +
drivers/infiniband/hw/mlx5/qp.c | 14 +++++++++++++-
2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/drivers/infiniband/hw/mlx5/mlx5_ib.h b/drivers/infiniband/hw/mlx5/mlx5_ib.h
index e156dc4d752996cc4ae465bb567b0c1305d07fed..c74a53da99393cf4d4c0823cd12f9eccaa28f212 100644
--- a/drivers/infiniband/hw/mlx5/mlx5_ib.h
+++ b/drivers/infiniband/hw/mlx5/mlx5_ib.h
@@ -536,6 +536,7 @@ struct mlx5_ib_qp {
struct list_head cq_recv_list;
struct list_head cq_send_list;
struct mlx5_rate_limit rl;
+ struct mlx5_rate_limit rl_desired;
u32 underlay_qpn;
u32 flags_en;
/*
diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c
index e96d26253e3b1fabee23947b1a61ab26e7c7067f..66ab16b017c8311d44b521c023cfaf23ac42190a 100644
--- a/drivers/infiniband/hw/mlx5/qp.c
+++ b/drivers/infiniband/hw/mlx5/qp.c
@@ -3946,7 +3946,11 @@ static void qp_rl_commit(struct mlx5_core_dev *dev,
if (qp->rl.rate)
mlx5_rl_remove_rate(dev, &qp->rl);
memset(&qp->rl, 0, sizeof(qp->rl));
+ memset(&qp->rl_desired, 0, sizeof(qp->rl_desired));
+ return;
}
+
+ qp->rl_desired = ctx->rl_desired;
}
static int modify_raw_packet_qp_sq(
@@ -3990,6 +3994,7 @@ static int modify_raw_packet_qp_sq(
if (new_state != MLX5_SQC_STATE_RDY) {
mlx5_rl_remove_rate(dev, &ibqp->rl);
memset(&ibqp->rl, 0, sizeof(ibqp->rl));
+ memset(&ibqp->rl_desired, 0, sizeof(ibqp->rl_desired));
}
sq->state = new_state;
@@ -4449,7 +4454,7 @@ static int __mlx5_ib_modify_qp(struct ib_qp *ibqp,
if (err)
goto out;
} else {
- rl_ctx.rl_desired = qp->rl;
+ rl_ctx.rl_desired = qp->rl_desired;
}
op = optab[mlx5_cur][mlx5_new];
@@ -4833,6 +4838,13 @@ int mlx5_ib_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
attr_mask);
goto out;
}
+ } else if (attr_mask == IB_QP_RATE_LIMIT && cur_state != IB_QPS_RTS) {
+ struct mlx5_rate_limit rl_desired = {};
+
+ err = qp_rl_parse(dev, qp, attr, &ucmd, &rl_desired);
+ if (!err)
+ qp->rl_desired = rl_desired;
+ goto out;
} else if (qp_type != MLX5_IB_QPT_REG_UMR &&
qp_type != MLX5_IB_QPT_DCI &&
!ib_modify_qp_is_ok(cur_state, new_state, qp_type,
--
2.49.0
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH rdma-next 5/8] RDMA/mlx5: Report packet pacing capabilities when querying device
2026-05-24 15:38 [PATCH rdma-next 0/8] RDMA: Extend packet pacing support to UD and UC QPs Edward Srouji
` (3 preceding siblings ...)
2026-05-24 15:38 ` [PATCH rdma-next 4/8] RDMA/mlx5: Support deferred rate limit configuration Edward Srouji
@ 2026-05-24 15:38 ` Edward Srouji
2026-05-24 15:38 ` [PATCH rdma-next 6/8] RDMA/bnxt_re: Validate rate limit attribute in modify QP Edward Srouji
` (3 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Edward Srouji @ 2026-05-24 15:38 UTC (permalink / raw)
To: Leon Romanovsky, Saeed Mahameed, Tariq Toukan, Mark Bloch,
Jason Gunthorpe, Selvin Xavier, Kalesh AP, Abhijit Gangurde,
Allen Hubbe
Cc: linux-rdma, netdev, linux-kernel, Edward Srouji, Maher Sanalla,
Michael Guralnik
From: Maher Sanalla <msanalla@nvidia.com>
When querying device, report packet pacing capabilities for UD and
UC QPs when device supports it.
Signed-off-by: Maher Sanalla <msanalla@nvidia.com>
Reviewed-by: Michael Guralnik <michaelgur@nvidia.com>
Signed-off-by: Edward Srouji <edwards@nvidia.com>
---
drivers/infiniband/hw/mlx5/main.c | 37 +++++++++++++++++++++++--------------
1 file changed, 23 insertions(+), 14 deletions(-)
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
index 428811fa805b68bf6a011685e027b8407a3e1719..fee5329cf398092c5096ca67aa23880b6e829177 100644
--- a/drivers/infiniband/hw/mlx5/main.c
+++ b/drivers/infiniband/hw/mlx5/main.c
@@ -1214,20 +1214,29 @@ static int mlx5_ib_query_device(struct ib_device *ibdev,
}
}
- if (offsetofend(typeof(resp), packet_pacing_caps) <= uhw_outlen &&
- raw_support) {
- if (MLX5_CAP_QOS(mdev, packet_pacing) &&
- MLX5_CAP_GEN(mdev, qos)) {
- resp.packet_pacing_caps.qp_rate_limit_max =
- MLX5_CAP_QOS(mdev, packet_pacing_max_rate);
- resp.packet_pacing_caps.qp_rate_limit_min =
- MLX5_CAP_QOS(mdev, packet_pacing_min_rate);
- resp.packet_pacing_caps.supported_qpts |=
- 1 << IB_QPT_RAW_PACKET;
- if (MLX5_CAP_QOS(mdev, packet_pacing_burst_bound) &&
- MLX5_CAP_QOS(mdev, packet_pacing_typical_size))
- resp.packet_pacing_caps.cap_flags |=
- MLX5_IB_PP_SUPPORT_BURST;
+ if (offsetofend(typeof(resp), packet_pacing_caps) <= uhw_outlen) {
+ if (MLX5_CAP_GEN(mdev, qos)) {
+ if (MLX5_CAP_QOS(mdev, packet_pacing) && raw_support)
+ resp.packet_pacing_caps.supported_qpts |=
+ BIT(IB_QPT_RAW_PACKET);
+ if (MLX5_CAP_QOS(mdev, packet_pacing_req_ud))
+ resp.packet_pacing_caps.supported_qpts |=
+ BIT(IB_QPT_UD);
+ if (MLX5_CAP_QOS(mdev, packet_pacing_req_uc))
+ resp.packet_pacing_caps.supported_qpts |=
+ BIT(IB_QPT_UC);
+
+ if (resp.packet_pacing_caps.supported_qpts) {
+ resp.packet_pacing_caps.qp_rate_limit_max =
+ MLX5_CAP_QOS(mdev, packet_pacing_max_rate);
+ resp.packet_pacing_caps.qp_rate_limit_min =
+ MLX5_CAP_QOS(mdev, packet_pacing_min_rate);
+
+ if (MLX5_CAP_QOS(mdev, packet_pacing_burst_bound) &&
+ MLX5_CAP_QOS(mdev, packet_pacing_typical_size))
+ resp.packet_pacing_caps.cap_flags |=
+ MLX5_IB_PP_SUPPORT_BURST;
+ }
}
resp.response_length += sizeof(resp.packet_pacing_caps);
}
--
2.49.0
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH rdma-next 6/8] RDMA/bnxt_re: Validate rate limit attribute in modify QP
2026-05-24 15:38 [PATCH rdma-next 0/8] RDMA: Extend packet pacing support to UD and UC QPs Edward Srouji
` (4 preceding siblings ...)
2026-05-24 15:38 ` [PATCH rdma-next 5/8] RDMA/mlx5: Report packet pacing capabilities when querying device Edward Srouji
@ 2026-05-24 15:38 ` Edward Srouji
2026-05-24 15:38 ` [PATCH rdma-next 7/8] RDMA/ionic: " Edward Srouji
` (2 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Edward Srouji @ 2026-05-24 15:38 UTC (permalink / raw)
To: Leon Romanovsky, Saeed Mahameed, Tariq Toukan, Mark Bloch,
Jason Gunthorpe, Selvin Xavier, Kalesh AP, Abhijit Gangurde,
Allen Hubbe
Cc: linux-rdma, netdev, linux-kernel, Edward Srouji, Maher Sanalla,
Michael Guralnik
From: Maher Sanalla <msanalla@nvidia.com>
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>
---
drivers/infiniband/hw/bnxt_re/ib_verbs.c | 22 +++++++++++++++++++++-
1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
index ccb362d6d2e669160174cc562d4e3d8d22b110db..14d2533d7439f2c160ceeea3d0c1e2fe9abcd9f5 100644
--- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c
+++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
@@ -2286,6 +2286,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)
{
@@ -2310,7 +2327,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);
--
2.49.0
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH rdma-next 7/8] RDMA/ionic: Validate rate limit attribute in modify QP
2026-05-24 15:38 [PATCH rdma-next 0/8] RDMA: Extend packet pacing support to UD and UC QPs Edward Srouji
` (5 preceding siblings ...)
2026-05-24 15:38 ` [PATCH rdma-next 6/8] RDMA/bnxt_re: Validate rate limit attribute in modify QP Edward Srouji
@ 2026-05-24 15:38 ` Edward Srouji
2026-05-24 15:38 ` [PATCH rdma-next 8/8] IB/core: Delegate IB_QP_RATE_LIMIT validation to drivers Edward Srouji
2026-06-11 11:06 ` [PATCH rdma-next 0/8] RDMA: Extend packet pacing support to UD and UC QPs Leon Romanovsky
8 siblings, 0 replies; 10+ messages in thread
From: Edward Srouji @ 2026-05-24 15:38 UTC (permalink / raw)
To: Leon Romanovsky, Saeed Mahameed, Tariq Toukan, Mark Bloch,
Jason Gunthorpe, Selvin Xavier, Kalesh AP, Abhijit Gangurde,
Allen Hubbe
Cc: linux-rdma, netdev, linux-kernel, Edward Srouji, Maher Sanalla,
Michael Guralnik
From: Maher Sanalla <msanalla@nvidia.com>
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>
---
drivers/infiniband/hw/ionic/ionic_controlpath.c | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/drivers/infiniband/hw/ionic/ionic_controlpath.c b/drivers/infiniband/hw/ionic/ionic_controlpath.c
index 2b01345848ddb7ee9b34e5c9bb074912734536e1..72e111027f1f5fede5aa21f0265219392f29a3ee 100644
--- a/drivers/infiniband/hw/ionic/ionic_controlpath.c
+++ b/drivers/infiniband/hw/ionic/ionic_controlpath.c
@@ -2535,6 +2535,23 @@ static bool ionic_qp_cur_state_is_ok(enum ib_qp_state q_state,
return false;
}
+static bool ionic_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));
+}
+
static int ionic_check_modify_qp(struct ionic_qp *qp, struct ib_qp_attr *attr,
int mask)
{
@@ -2547,7 +2564,9 @@ static int ionic_check_modify_qp(struct ionic_qp *qp, struct ib_qp_attr *attr,
!ionic_qp_cur_state_is_ok(qp->state, attr->cur_qp_state))
return -EINVAL;
- if (!ib_modify_qp_is_ok(cur_state, next_state, qp->ibqp.qp_type, mask))
+ if (!ib_modify_qp_is_ok(cur_state, next_state, qp->ibqp.qp_type, mask) ||
+ !ionic_is_modify_ok(mask & ~IB_QP_ATTR_STANDARD_BITS,
+ qp->ibqp.qp_type, cur_state, next_state))
return -EINVAL;
/* unprivileged qp not allowed privileged qkey */
--
2.49.0
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH rdma-next 8/8] IB/core: Delegate IB_QP_RATE_LIMIT validation to drivers
2026-05-24 15:38 [PATCH rdma-next 0/8] RDMA: Extend packet pacing support to UD and UC QPs Edward Srouji
` (6 preceding siblings ...)
2026-05-24 15:38 ` [PATCH rdma-next 7/8] RDMA/ionic: " Edward Srouji
@ 2026-05-24 15:38 ` Edward Srouji
2026-06-11 11:06 ` [PATCH rdma-next 0/8] RDMA: Extend packet pacing support to UD and UC QPs Leon Romanovsky
8 siblings, 0 replies; 10+ messages in thread
From: Edward Srouji @ 2026-05-24 15:38 UTC (permalink / raw)
To: Leon Romanovsky, Saeed Mahameed, Tariq Toukan, Mark Bloch,
Jason Gunthorpe, Selvin Xavier, Kalesh AP, Abhijit Gangurde,
Allen Hubbe
Cc: linux-rdma, netdev, linux-kernel, Edward Srouji, Maher Sanalla,
Michael Guralnik
From: Maher Sanalla <msanalla@nvidia.com>
Remove IB_QP_RATE_LIMIT from the qp_state_table and instead
pass it through ib_modify_qp_is_ok() unconditionally. This
delegates rate limit attribute validation to the individual
drivers that support it.
As rate limit support expands to additional QP types and transitions
across different vendors, centralizing this policy in the core becomes
impractical. Each driver is better positioned to enforce its own
supported QP types and transitions over non-standard attributes.
Future support for non-standard attributes will be handled per vendor
driver instead of in generic IB core qp_state_table.
Signed-off-by: Maher Sanalla <msanalla@nvidia.com>
Reviewed-by: Michael Guralnik <michaelgur@nvidia.com>
Signed-off-by: Edward Srouji <edwards@nvidia.com>
---
drivers/infiniband/core/verbs.c | 13 ++++---------
1 file changed, 4 insertions(+), 9 deletions(-)
diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c
index bac87de9cc6735c5d25420a7fac8facdd77d5f09..d105106fe9dc2a86001f771c0b7ab887e576642d 100644
--- a/drivers/infiniband/core/verbs.c
+++ b/drivers/infiniband/core/verbs.c
@@ -1538,8 +1538,7 @@ static const struct {
IB_QP_PKEY_INDEX),
[IB_QPT_RC] = (IB_QP_ALT_PATH |
IB_QP_ACCESS_FLAGS |
- IB_QP_PKEY_INDEX |
- IB_QP_RATE_LIMIT),
+ IB_QP_PKEY_INDEX),
[IB_QPT_XRC_INI] = (IB_QP_ALT_PATH |
IB_QP_ACCESS_FLAGS |
IB_QP_PKEY_INDEX),
@@ -1587,8 +1586,7 @@ static const struct {
IB_QP_ALT_PATH |
IB_QP_ACCESS_FLAGS |
IB_QP_MIN_RNR_TIMER |
- IB_QP_PATH_MIG_STATE |
- IB_QP_RATE_LIMIT),
+ IB_QP_PATH_MIG_STATE),
[IB_QPT_XRC_INI] = (IB_QP_CUR_STATE |
IB_QP_ALT_PATH |
IB_QP_ACCESS_FLAGS |
@@ -1602,7 +1600,6 @@ static const struct {
IB_QP_QKEY),
[IB_QPT_GSI] = (IB_QP_CUR_STATE |
IB_QP_QKEY),
- [IB_QPT_RAW_PACKET] = IB_QP_RATE_LIMIT,
}
}
},
@@ -1622,8 +1619,7 @@ static const struct {
IB_QP_ACCESS_FLAGS |
IB_QP_ALT_PATH |
IB_QP_PATH_MIG_STATE |
- IB_QP_MIN_RNR_TIMER |
- IB_QP_RATE_LIMIT),
+ IB_QP_MIN_RNR_TIMER),
[IB_QPT_XRC_INI] = (IB_QP_CUR_STATE |
IB_QP_ACCESS_FLAGS |
IB_QP_ALT_PATH |
@@ -1637,7 +1633,6 @@ static const struct {
IB_QP_QKEY),
[IB_QPT_GSI] = (IB_QP_CUR_STATE |
IB_QP_QKEY),
- [IB_QPT_RAW_PACKET] = IB_QP_RATE_LIMIT,
}
},
[IB_QPS_SQD] = {
@@ -1775,7 +1770,7 @@ bool ib_modify_qp_is_ok(enum ib_qp_state cur_state, enum ib_qp_state next_state,
if ((mask & req_param) != req_param)
return false;
- if (mask & ~(req_param | opt_param | IB_QP_STATE))
+ if (mask & ~(req_param | opt_param | IB_QP_STATE | IB_QP_RATE_LIMIT))
return false;
return true;
--
2.49.0
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH rdma-next 0/8] RDMA: Extend packet pacing support to UD and UC QPs
2026-05-24 15:38 [PATCH rdma-next 0/8] RDMA: Extend packet pacing support to UD and UC QPs Edward Srouji
` (7 preceding siblings ...)
2026-05-24 15:38 ` [PATCH rdma-next 8/8] IB/core: Delegate IB_QP_RATE_LIMIT validation to drivers Edward Srouji
@ 2026-06-11 11:06 ` Leon Romanovsky
8 siblings, 0 replies; 10+ messages in thread
From: Leon Romanovsky @ 2026-06-11 11:06 UTC (permalink / raw)
To: Saeed Mahameed, Tariq Toukan, Mark Bloch, Jason Gunthorpe,
Selvin Xavier, Kalesh AP, Abhijit Gangurde, Allen Hubbe,
Edward Srouji
Cc: linux-rdma, netdev, linux-kernel, Maher Sanalla, Michael Guralnik
On Sun, 24 May 2026 18:38:01 +0300, Edward Srouji wrote:
> The primary goal of this series is to extend mlx5 packet pacing (rate
> limit) beyond raw packet QPs to cover UD and UC QPs while keeping the
> IB core free of vendor-specific policy for non-standard modify
> attributes.
>
> Today, IB_QP_RATE_LIMIT is restricted by the IB core qp_state_table
> to RC QPs only. It is also the only non-standard modify QP attribute,
> but as rate limit support expands across vendors, and as additional
> non-standard attributes are likely to follow, centralizing such policy
> in the core becomes impractical. Each driver is better positioned to
> enforce its own supported QP types and transitions over non-standard
> attributes. The series therefore removes IB_QP_RATE_LIMIT from the
> qp_state_table and modifies the affected vendor drivers to validate the
> attribute locally, preserving their existing behavior.
>
> [...]
Applied, thanks!
[1/8] net/mlx5: Add UD and UC packet pacing caps
https://git.kernel.org/rdma/rdma/c/a7b8dac8881dc6
[2/8] RDMA/mlx5: Refactor raw packet QP rate limit handling
https://git.kernel.org/rdma/rdma/c/e1008f19fa977d
[3/8] RDMA/mlx5: Add support for rate limit in UD and UC QPs
https://git.kernel.org/rdma/rdma/c/29e0a014ddfbdb
[4/8] RDMA/mlx5: Support deferred rate limit configuration
https://git.kernel.org/rdma/rdma/c/915bbc8578e3f7
[5/8] RDMA/mlx5: Report packet pacing capabilities when querying device
https://git.kernel.org/rdma/rdma/c/1f307090e95750
[6/8] RDMA/bnxt_re: Validate rate limit attribute in modify QP
https://git.kernel.org/rdma/rdma/c/8cca27313636c3
[7/8] RDMA/ionic: Validate rate limit attribute in modify QP
https://git.kernel.org/rdma/rdma/c/c2cd90ab881c69
[8/8] IB/core: Delegate IB_QP_RATE_LIMIT validation to drivers
https://git.kernel.org/rdma/rdma/c/8b0c66fa058b34
Best regards,
--
Leon Romanovsky <leon@kernel.org>
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2026-06-11 11:06 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-05-24 15:38 [PATCH rdma-next 0/8] RDMA: Extend packet pacing support to UD and UC QPs Edward Srouji
2026-05-24 15:38 ` [PATCH rdma-next 1/8] net/mlx5: Add UD and UC packet pacing caps Edward Srouji
2026-05-24 15:38 ` [PATCH rdma-next 2/8] RDMA/mlx5: Refactor raw packet QP rate limit handling Edward Srouji
2026-05-24 15:38 ` [PATCH rdma-next 3/8] RDMA/mlx5: Add support for rate limit in UD and UC QPs Edward Srouji
2026-05-24 15:38 ` [PATCH rdma-next 4/8] RDMA/mlx5: Support deferred rate limit configuration Edward Srouji
2026-05-24 15:38 ` [PATCH rdma-next 5/8] RDMA/mlx5: Report packet pacing capabilities when querying device Edward Srouji
2026-05-24 15:38 ` [PATCH rdma-next 6/8] RDMA/bnxt_re: Validate rate limit attribute in modify QP Edward Srouji
2026-05-24 15:38 ` [PATCH rdma-next 7/8] RDMA/ionic: " Edward Srouji
2026-05-24 15:38 ` [PATCH rdma-next 8/8] IB/core: Delegate IB_QP_RATE_LIMIT validation to drivers Edward Srouji
2026-06-11 11:06 ` [PATCH rdma-next 0/8] RDMA: Extend packet pacing support to UD and UC QPs Leon Romanovsky
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®