| From 2e87d68851a5163272c3db1a7dd38470debeca97 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 24 Nov 2025 10:00:43 -0800 |
| Subject: net/mlx5e: Fix validation logic in rate limiting |
| |
| From: Danielle Costantino <dcostantino@meta.com> |
| |
| [ Upstream commit d2099d9f16dbfa1c5266d4230ff7860047bb0b68 ] |
| |
| The rate limiting validation condition currently checks the output |
| variable max_bw_value[i] instead of the input value |
| maxrate->tc_maxrate[i]. This causes the validation to compare an |
| uninitialized or stale value rather than the actual requested rate. |
| |
| The condition should check the input rate to properly validate against |
| the upper limit: |
| |
| } else if (maxrate->tc_maxrate[i] <= upper_limit_gbps) { |
| |
| This aligns with the pattern used in the first branch, which correctly |
| checks maxrate->tc_maxrate[i] against upper_limit_mbps. |
| |
| The current implementation can lead to unreliable validation behavior: |
| |
| - For rates between 25.5 Gbps and 255 Gbps, if max_bw_value[i] is 0 |
| from initialization, the GBPS path may be taken regardless of whether |
| the actual rate is within bounds |
| |
| - When processing multiple TCs (i > 0), max_bw_value[i] contains the |
| value computed for the previous TC, affecting the validation logic |
| |
| - The overflow check for rates exceeding 255 Gbps may not trigger |
| consistently depending on previous array values |
| |
| This patch ensures the validation correctly examines the requested rate |
| value for proper bounds checking. |
| |
| Fixes: 43b27d1bd88a ("net/mlx5e: Fix wraparound in rate limiting for values above 255 Gbps") |
| Signed-off-by: Danielle Costantino <dcostantino@meta.com> |
| Reviewed-by: Gal Pressman <gal@nvidia.com> |
| Link: https://patch.msgid.link/20251124180043.2314428-1-dcostantino@meta.com |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c b/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c |
| index 2ca32fb1961e1..84e700777941e 100644 |
| --- a/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c |
| +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c |
| @@ -627,7 +627,7 @@ static int mlx5e_dcbnl_ieee_setmaxrate(struct net_device *netdev, |
| MLX5E_100MB); |
| max_bw_value[i] = max_bw_value[i] ? max_bw_value[i] : 1; |
| max_bw_unit[i] = MLX5_100_MBPS_UNIT; |
| - } else if (max_bw_value[i] <= upper_limit_gbps) { |
| + } else if (maxrate->tc_maxrate[i] <= upper_limit_gbps) { |
| max_bw_value[i] = div_u64(maxrate->tc_maxrate[i], |
| MLX5E_1GB); |
| max_bw_unit[i] = MLX5_GBPS_UNIT; |
| -- |
| 2.51.0 |
| |