mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-27 12:57:53 +00:00
37b61cda9c
Similarly to other recently fixed drivers make sure we don't
try to access XDP or page pool APIs when NAPI budget is 0.
NAPI budget of 0 may mean that we are in netpoll.
This may result in running software IRQs in hard IRQ context,
leading to deadlocks or crashes.
To make sure bnapi->tx_pkts don't get wiped without handling
the events, move clearing the field into the handler itself.
Remember to clear tx_pkts after reset (bnxt_enable_napi())
as it's technically possible that netpoll will accumulate
some tx_pkts and then a reset will happen, leaving tx_pkts
out of sync with reality.
Fixes: 322b87ca55
("bnxt_en: add page_pool support")
Reviewed-by: Andy Gospodarek <gospo@broadcom.com>
Reviewed-by: Michael Chan <michael.chan@broadcom.com>
Link: https://lore.kernel.org/r/20230728205020.2784844-1-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
38 lines
1.4 KiB
C
38 lines
1.4 KiB
C
/* Broadcom NetXtreme-C/E network driver.
|
|
*
|
|
* Copyright (c) 2016-2017 Broadcom Limited
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation.
|
|
*/
|
|
|
|
#ifndef BNXT_XDP_H
|
|
#define BNXT_XDP_H
|
|
|
|
DECLARE_STATIC_KEY_FALSE(bnxt_xdp_locking_key);
|
|
|
|
struct bnxt_sw_tx_bd *bnxt_xmit_bd(struct bnxt *bp,
|
|
struct bnxt_tx_ring_info *txr,
|
|
dma_addr_t mapping, u32 len,
|
|
struct xdp_buff *xdp);
|
|
void bnxt_tx_int_xdp(struct bnxt *bp, struct bnxt_napi *bnapi, int budget);
|
|
bool bnxt_rx_xdp(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, u16 cons,
|
|
struct xdp_buff xdp, struct page *page, u8 **data_ptr,
|
|
unsigned int *len, u8 *event);
|
|
int bnxt_xdp(struct net_device *dev, struct netdev_bpf *xdp);
|
|
int bnxt_xdp_xmit(struct net_device *dev, int num_frames,
|
|
struct xdp_frame **frames, u32 flags);
|
|
|
|
bool bnxt_xdp_attached(struct bnxt *bp, struct bnxt_rx_ring_info *rxr);
|
|
|
|
void bnxt_xdp_buff_init(struct bnxt *bp, struct bnxt_rx_ring_info *rxr,
|
|
u16 cons, u8 *data_ptr, unsigned int len,
|
|
struct xdp_buff *xdp);
|
|
void bnxt_xdp_buff_frags_free(struct bnxt_rx_ring_info *rxr,
|
|
struct xdp_buff *xdp);
|
|
struct sk_buff *bnxt_xdp_build_skb(struct bnxt *bp, struct sk_buff *skb,
|
|
u8 num_frags, struct page_pool *pool,
|
|
struct xdp_buff *xdp,
|
|
struct rx_cmp_ext *rxcmp1);
|
|
#endif
|