mlxsw: spectrum_qdisc: Offload RED qevent mark
authorPetr Machata <petrm@nvidia.com>
Sun, 10 Oct 2021 11:40:16 +0000 (14:40 +0300)
committerDavid S. Miller <davem@davemloft.net>
Tue, 12 Oct 2021 10:19:35 +0000 (11:19 +0100)
The RED "mark" qevent can be offloaded under similar conditions as the RED
"early_drop" qevent. Therefore recognize its binding type in the
TC_SETUP_BLOCK handler and translate to the right SPAN trigger, with the
right set of supported actions.

Signed-off-by: Petr Machata <petrm@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
drivers/net/ethernet/mellanox/mlxsw/spectrum_qdisc.c

index d366786ce0f89983284ae58c41df6e0f83728b4f..3c9844f2aa1db8a8ff5929811b9b8d054fba797a 100644 (file)
@@ -1035,6 +1035,8 @@ static int mlxsw_sp_setup_tc_block(struct mlxsw_sp_port *mlxsw_sp_port,
                return mlxsw_sp_setup_tc_block_clsact(mlxsw_sp_port, f, false);
        case FLOW_BLOCK_BINDER_TYPE_RED_EARLY_DROP:
                return mlxsw_sp_setup_tc_block_qevent_early_drop(mlxsw_sp_port, f);
+       case FLOW_BLOCK_BINDER_TYPE_RED_MARK:
+               return mlxsw_sp_setup_tc_block_qevent_mark(mlxsw_sp_port, f);
        default:
                return -EOPNOTSUPP;
        }
index 0ebbd9b04b891d60be23677b3b1622c0ac821576..aae1aed5345b04d623e854240253fef0787d3c77 100644 (file)
@@ -1195,6 +1195,8 @@ int mlxsw_sp_setup_tc_fifo(struct mlxsw_sp_port *mlxsw_sp_port,
                           struct tc_fifo_qopt_offload *p);
 int mlxsw_sp_setup_tc_block_qevent_early_drop(struct mlxsw_sp_port *mlxsw_sp_port,
                                              struct flow_block_offload *f);
+int mlxsw_sp_setup_tc_block_qevent_mark(struct mlxsw_sp_port *mlxsw_sp_port,
+                                       struct flow_block_offload *f);
 
 /* spectrum_fid.c */
 bool mlxsw_sp_fid_is_dummy(struct mlxsw_sp *mlxsw_sp, u16 fid_index);
index 2dfc9e38307da0f05497da62a72dae58769fcbef..e367c63e72bfb95c732d9302e59c2da094463059 100644 (file)
@@ -2024,6 +2024,16 @@ int mlxsw_sp_setup_tc_block_qevent_early_drop(struct mlxsw_sp_port *mlxsw_sp_por
                                              action_mask);
 }
 
+int mlxsw_sp_setup_tc_block_qevent_mark(struct mlxsw_sp_port *mlxsw_sp_port,
+                                       struct flow_block_offload *f)
+{
+       unsigned int action_mask = BIT(MLXSW_SP_MALL_ACTION_TYPE_MIRROR);
+
+       return mlxsw_sp_setup_tc_block_qevent(mlxsw_sp_port, f,
+                                             MLXSW_SP_SPAN_TRIGGER_ECN,
+                                             action_mask);
+}
+
 int mlxsw_sp_tc_qdisc_init(struct mlxsw_sp_port *mlxsw_sp_port)
 {
        struct mlxsw_sp_qdisc_state *qdisc_state;