| From b37870f0d513c3a1b173f54799b86526285b99e9 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 1 Apr 2022 20:21:12 -0400 |
| Subject: bnxt_en: Prevent XDP redirect from running when stopping TX queue |
| |
| From: Ray Jui <ray.jui@broadcom.com> |
| |
| [ Upstream commit 27d4073f8d9af0340362554414f4961643a4f4de ] |
| |
| Add checks in the XDP redirect callback to prevent XDP from running when |
| the TX ring is undergoing shutdown. |
| |
| Also remove redundant checks in the XDP redirect callback to validate the |
| txr and the flag that indicates the ring supports XDP. The modulo |
| arithmetic on 'tx_nr_rings_xdp' already guarantees the derived TX |
| ring is an XDP ring. txr is also guaranteed to be valid after checking |
| BNXT_STATE_OPEN and within RCU grace period. |
| |
| Fixes: f18c2b77b2e4 ("bnxt_en: optimized XDP_REDIRECT support") |
| Reviewed-by: Vladimir Olovyannikov <vladimir.olovyannikov@broadcom.com> |
| Signed-off-by: Ray Jui <ray.jui@broadcom.com> |
| Signed-off-by: Michael Chan <michael.chan@broadcom.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c |
| index c59e46c7a1ca..148b58f3468b 100644 |
| --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c |
| +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c |
| @@ -229,14 +229,16 @@ int bnxt_xdp_xmit(struct net_device *dev, int num_frames, |
| ring = smp_processor_id() % bp->tx_nr_rings_xdp; |
| txr = &bp->tx_ring[ring]; |
| |
| + if (READ_ONCE(txr->dev_state) == BNXT_DEV_STATE_CLOSING) |
| + return -EINVAL; |
| + |
| if (static_branch_unlikely(&bnxt_xdp_locking_key)) |
| spin_lock(&txr->xdp_tx_lock); |
| |
| for (i = 0; i < num_frames; i++) { |
| struct xdp_frame *xdp = frames[i]; |
| |
| - if (!txr || !bnxt_tx_avail(bp, txr) || |
| - !(bp->bnapi[ring]->flags & BNXT_NAPI_FLAG_XDP)) |
| + if (!bnxt_tx_avail(bp, txr)) |
| break; |
| |
| mapping = dma_map_single(&pdev->dev, xdp->data, xdp->len, |
| -- |
| 2.35.1 |
| |