mlxsw: __mlxsw_sp_port_headroom_set(): Fix a use of local variable [Linux 5.0]

This Linux kernel change "mlxsw: __mlxsw_sp_port_headroom_set(): Fix a use of local variable" is included in the Linux 5.0 release. This change is authored by Petr Machata <petrm [at]> on Sun Feb 17 07:18:41 2019 +0000. The commit for this change in Linux stable tree is 2894604 (patch).

mlxsw: __mlxsw_sp_port_headroom_set(): Fix a use of local variable

The function-local variable "delay" enters the loop interpreted as delay
in bits. However, inside the loop it gets overwritten by the result of
mlxsw_sp_pg_buf_delay_get(), and thus leaves the loop as quantity in
cells. Thus on second and further loop iterations, the headroom for a
given priority is configured with a wrong size.

Fix by introducing a loop-local variable, delay_cells. Rename thres to
thres_cells for consistency.

Fixes: f417f04da589 ("mlxsw: spectrum: Refactor port buffer configuration")
Signed-off-by: Petr Machata <[email protected]>
Acked-by: Jiri Pirko <[email protected]>
Signed-off-by: Ido Schimmel <[email protected]>
Signed-off-by: David S. Miller <[email protected]>

There are 12 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
index 32519c9..b65e274 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
@@ -862,8 +862,9 @@ int __mlxsw_sp_port_headroom_set(struct mlxsw_sp_port *mlxsw_sp_port, int mtu,
    for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) {
        bool configure = false;
        bool pfc = false;
+       u16 thres_cells;
+       u16 delay_cells;
        bool lossy;
-       u16 thres;

        for (j = 0; j < IEEE_8021QAZ_MAX_TCS; j++) {
            if (prio_tc[j] == i) {
@@ -877,10 +878,11 @@ int __mlxsw_sp_port_headroom_set(struct mlxsw_sp_port *mlxsw_sp_port, int mtu,

        lossy = !(pfc || pause_en);
-       thres = mlxsw_sp_pg_buf_threshold_get(mlxsw_sp, mtu);
-       delay = mlxsw_sp_pg_buf_delay_get(mlxsw_sp, mtu, delay, pfc,
-                         pause_en);
-       mlxsw_sp_pg_buf_pack(pbmc_pl, i, thres + delay, thres, lossy);
+       thres_cells = mlxsw_sp_pg_buf_threshold_get(mlxsw_sp, mtu);
+       delay_cells = mlxsw_sp_pg_buf_delay_get(mlxsw_sp, mtu, delay,
+                           pfc, pause_en);
+       mlxsw_sp_pg_buf_pack(pbmc_pl, i, thres_cells + delay_cells,
+                    thres_cells, lossy);

    return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(pbmc), pbmc_pl);

Leave a Reply

Your email address will not be published. Required fields are marked *