]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net/mlx5e: Fix maxrate wraparound in threshold between units
authorGal Pressman <gal@nvidia.com>
Sun, 9 Nov 2025 09:37:51 +0000 (11:37 +0200)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 11 Nov 2025 14:05:44 +0000 (15:05 +0100)
The previous calculation used roundup() which caused an overflow for
rates between 25.5Gbps and 26Gbps.
For example, a rate of 25.6Gbps would result in using 100Mbps units with
value of 256, which would overflow the 8 bits field.

Simplify the upper_limit_mbps calculation by removing the
unnecessary roundup, and adjust the comparison to use <= to correctly
handle the boundary condition.

Fixes: d8880795dabf ("net/mlx5e: Implement DCBNL IEEE max rate")
Signed-off-by: Gal Pressman <gal@nvidia.com>
Reviewed-by: Nimrod Oren <noren@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Link: https://patch.msgid.link/1762681073-1084058-4-git-send-email-tariqt@nvidia.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c

index d166c0d5189e19b5d669bc67eb8faa4d59293ba9..34561447105287abd4495704ead33316008e73b5 100644 (file)
@@ -595,18 +595,19 @@ static int mlx5e_dcbnl_ieee_setmaxrate(struct net_device *netdev,
        struct mlx5_core_dev *mdev = priv->mdev;
        u8 max_bw_value[IEEE_8021QAZ_MAX_TCS];
        u8 max_bw_unit[IEEE_8021QAZ_MAX_TCS];
-       __u64 upper_limit_mbps = roundup(255 * MLX5E_100MB, MLX5E_1GB);
+       __u64 upper_limit_mbps;
        int i;
 
        memset(max_bw_value, 0, sizeof(max_bw_value));
        memset(max_bw_unit, 0, sizeof(max_bw_unit));
+       upper_limit_mbps = 255 * MLX5E_100MB;
 
        for (i = 0; i <= mlx5_max_tc(mdev); i++) {
                if (!maxrate->tc_maxrate[i]) {
                        max_bw_unit[i]  = MLX5_BW_NO_LIMIT;
                        continue;
                }
-               if (maxrate->tc_maxrate[i] < upper_limit_mbps) {
+               if (maxrate->tc_maxrate[i] <= upper_limit_mbps) {
                        max_bw_value[i] = div_u64(maxrate->tc_maxrate[i],
                                                  MLX5E_100MB);
                        max_bw_value[i] = max_bw_value[i] ? max_bw_value[i] : 1;