Message ID | 20250226211003.2790916-3-kuba@kernel.org (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | eth: bnxt: maintain basic pkt/byte counters in SW | expand |
On Wed, Feb 26, 2025 at 1:10 PM Jakub Kicinski <kuba@kernel.org> wrote: > @@ -2159,6 +2159,10 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, > len = flags >> RX_CMP_LEN_SHIFT; > dma_addr = rx_buf->mapping; > > + dev = bp->dev; > + if (cmp_type == CMP_TYPE_RX_L2_CMP) > + dev = bnxt_get_pkt_dev(bp, RX_CMP_CFA_CODE(rxcmp1)); > + > if (bnxt_xdp_attached(bp, rxr)) { > bnxt_xdp_buff_init(bp, rxr, cons, data_ptr, len, &xdp); > if (agg_bufs) { > @@ -2171,7 +2175,7 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, > xdp_active = true; > } > > - if (xdp_active) { > + if (xdp_active && dev == bp->dev) { If we skip the XDP program, we still need to do this check in bnxt_rx_xdp() because we may be using the XDP TX ring: tx_avail = bnxt_tx_avail(bp, txr); /* If the tx ring is not full, we must not update the rx producer yet * because we may still be transmitting on some BDs. */ if (tx_avail != bp->tx_ring_size) *event &= ~BNXT_RX_EVENT; > if (bnxt_rx_xdp(bp, rxr, cons, &xdp, data, &data_ptr, &len, event)) { > rc = 1; > goto next_rx;
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index f6a26f6f85bb..53b689800e1c 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -2036,7 +2036,7 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, { struct bnxt_napi *bnapi = cpr->bnapi; struct bnxt_rx_ring_info *rxr = bnapi->rx_ring; - struct net_device *dev = bp->dev; + struct net_device *dev; struct rx_cmp *rxcmp; struct rx_cmp_ext *rxcmp1; u32 tmp_raw_cons = *raw_cons; @@ -2159,6 +2159,10 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, len = flags >> RX_CMP_LEN_SHIFT; dma_addr = rx_buf->mapping; + dev = bp->dev; + if (cmp_type == CMP_TYPE_RX_L2_CMP) + dev = bnxt_get_pkt_dev(bp, RX_CMP_CFA_CODE(rxcmp1)); + if (bnxt_xdp_attached(bp, rxr)) { bnxt_xdp_buff_init(bp, rxr, cons, data_ptr, len, &xdp); if (agg_bufs) { @@ -2171,7 +2175,7 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, xdp_active = true; } - if (xdp_active) { + if (xdp_active && dev == bp->dev) { if (bnxt_rx_xdp(bp, rxr, cons, &xdp, data, &data_ptr, &len, event)) { rc = 1; goto next_rx; @@ -2239,8 +2243,6 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, skb_set_hash(skb, le32_to_cpu(rxcmp->rx_cmp_rss_hash), type); } - if (cmp_type == CMP_TYPE_RX_L2_CMP) - dev = bnxt_get_pkt_dev(bp, RX_CMP_CFA_CODE(rxcmp1)); skb->protocol = eth_type_trans(skb, dev); if (skb->dev->features & BNXT_HW_FEATURE_VLAN_ALL_RX) {
The XDP program attached to the PF should not be executed on the fallback traffic. Compile tested only. Well behaved drivers (nfp) do not execute XDP on fallback traffic, but perhaps this is a matter of opinion rather than a hard rule, therefore I'm not considering this a fix. Signed-off-by: Jakub Kicinski <kuba@kernel.org> --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)