mlxsw: spectrum: Track buffer sizes in struct mlxsw_sp_hdroom
authorPetr Machata <petrm@nvidia.com>
Wed, 16 Sep 2020 06:35:19 +0000 (09:35 +0300)
committerDavid S. Miller <davem@davemloft.net>
Wed, 16 Sep 2020 22:19:30 +0000 (15:19 -0700)
So far, port buffers were always autoconfigured. When dcbnl_setbuffer
callback is implemented, it will allow the user to change the buffer size
configuration by hand. The sizes therefore need to be a configuration
parameter, not always deduced, and therefore belong to struct
mlxsw_sp_hdroom, where the configuration routine should take them from.

Update mlxsw_sp_port_headroom_set() to update these sizes. Have the
function update the sizes even for the case that a given buffer is not
used.

Additionally, change the loop iteration end to DCBX_MAX_BUFFERS instead of
IEEE_8021QAZ_MAX_TCS. The value is the same, but the semantics differ.

Signed-off-by: Petr Machata <petrm@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/spectrum.c
drivers/net/ethernet/mellanox/mlxsw/spectrum.h

index f891ddf19dbc77d9d00fdafb61240e49bf5f4470..533793a15621f3415d46765a6f66ccdfdc1c15f3 100644 (file)
@@ -671,19 +671,28 @@ int mlxsw_sp_port_headroom_set(struct mlxsw_sp_port *mlxsw_sp_port,
        if (err)
                return err;
 
-       for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) {
+       for (i = 0; i < DCBX_MAX_BUFFERS; i++) {
                struct mlxsw_sp_hdroom_buf *buf = &hdroom->bufs.buf[i];
                u16 thres_cells;
                u16 delay_cells;
                u16 total_cells;
 
-               if (!mlxsw_sp_hdroom_buf_is_used(hdroom, i))
-                       continue;
+               if (!mlxsw_sp_hdroom_buf_is_used(hdroom, i)) {
+                       thres_cells = 0;
+                       delay_cells = 0;
+               } else if (buf->lossy) {
+                       thres_cells = mlxsw_sp_pg_buf_threshold_get(mlxsw_sp, hdroom->mtu);
+                       delay_cells = 0;
+               } else {
+                       thres_cells = mlxsw_sp_pg_buf_threshold_get(mlxsw_sp, hdroom->mtu);
+                       delay_cells = mlxsw_sp_hdroom_buf_delay_get(mlxsw_sp, hdroom);
+               }
 
-               thres_cells = mlxsw_sp_pg_buf_threshold_get(mlxsw_sp, hdroom->mtu);
                thres_cells = mlxsw_sp_port_headroom_8x_adjust(mlxsw_sp_port, thres_cells);
-               delay_cells = mlxsw_sp_hdroom_buf_delay_get(mlxsw_sp, hdroom);
                delay_cells = mlxsw_sp_port_headroom_8x_adjust(mlxsw_sp_port, delay_cells);
+
+               buf->thres_cells = thres_cells;
+               buf->size_cells = thres_cells + delay_cells;
                total_cells = thres_cells + delay_cells;
 
                taken_headroom_cells += total_cells;
index 5245367d6fb23e6a9c864d4cf4d770547ac7b1c6..b3c9cdcc7a062d3705b0bd744821893b259cbc5a 100644 (file)
@@ -447,6 +447,8 @@ struct mlxsw_sp_hdroom_prio {
 };
 
 struct mlxsw_sp_hdroom_buf {
+       u32 thres_cells;
+       u32 size_cells;
        bool lossy;
 };