Currently STMMAC_DOWN flag is only set/cleared by stmmac_reset_subtask(), to notify driver to stop processing of TX/RX frames. One of these processing paths is for XDP, but it is only ever checked in stmmac_xdp_xmit(), which leaves all other XDP paths vulnerable to processing data while interface is restarting. Make verification of STMMAC_DOWN flag consistent by applying check to all XDP RX paths. Co-developed-by: Chang-Sub Lee Signed-off-by: Chang-Sub Lee Signed-off-by: Jakub Raczynski --- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 3591755ea30b..3a66f2842527 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -5267,6 +5267,9 @@ static int stmmac_xdp_xmit_back(struct stmmac_priv *priv, if (unlikely(!xdpf)) return STMMAC_XDP_CONSUMED; + if (unlikely(test_bit(STMMAC_DOWN, &priv->state))) + return STMMAC_XDP_CONSUMED; + queue = stmmac_xdp_get_tx_queue(priv, cpu); nq = netdev_get_tx_queue(priv->dev, queue); @@ -5308,7 +5311,9 @@ static int __stmmac_xdp_run_prog(struct stmmac_priv *priv, res = stmmac_xdp_xmit_back(priv, xdp); break; case XDP_REDIRECT: - if (xdp_do_redirect(priv->dev, xdp, prog) < 0) + if (unlikely(test_bit(STMMAC_DOWN, &priv->state))) + res = STMMAC_XDP_CONSUMED; + else if (xdp_do_redirect(priv->dev, xdp, prog) < 0) res = STMMAC_XDP_CONSUMED; else res = STMMAC_XDP_REDIRECT; -- 2.34.1