diff --git a/patches.suse/bnxt_en-Fix-XDP-RX-path.patch b/patches.suse/bnxt_en-Fix-XDP-RX-path.patch new file mode 100644 index 0000000..07c80a0 --- /dev/null +++ b/patches.suse/bnxt_en-Fix-XDP-RX-path.patch @@ -0,0 +1,73 @@ +From: Michael Chan +Date: Mon, 26 Dec 2022 22:19:38 -0500 +Subject: bnxt_en: Fix XDP RX path +Patch-mainline: v6.2-rc3 +Git-commit: 9b3e607871ea5ee90f10f5be3965fc07f2aa3ef7 +References: bsc#1209079 + +The XDP program can change the starting address of the RX data buffer and +this information needs to be passed back from bnxt_rx_xdp() to +bnxt_rx_pkt() for the XDP_PASS case so that the SKB can point correctly +to the modified buffer address. Add back the data_ptr parameter to +bnxt_rx_xdp() to make this work. + +Fixes: b231c3f3414c ("bnxt: refactor bnxt_rx_xdp to separate xdp_init_buff/xdp_prepare_buff") +Reviewed-by: Andy Gospodarek +Reviewed-by: Pavan Chebbi +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +Acked-by: Thomas Bogendoerfer +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 +- + drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c | 7 +++++-- + drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h | 4 ++-- + 3 files changed, 8 insertions(+), 5 deletions(-) + +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c +@@ -1937,7 +1937,7 @@ static int bnxt_rx_pkt(struct bnxt *bp, + } + + if (xdp_active) { +- if (bnxt_rx_xdp(bp, rxr, cons, xdp, data, &len, event)) { ++ if (bnxt_rx_xdp(bp, rxr, cons, xdp, data, &data_ptr, &len, event)) { + rc = 1; + goto next_rx; + } +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c +@@ -222,7 +222,8 @@ void bnxt_xdp_buff_frags_free(struct bnx + * false - packet should be passed to the stack. + */ + bool bnxt_rx_xdp(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, u16 cons, +- struct xdp_buff xdp, struct page *page, unsigned int *len, u8 *event) ++ struct xdp_buff xdp, struct page *page, u8 **data_ptr, ++ unsigned int *len, u8 *event) + { + struct bpf_prog *xdp_prog = READ_ONCE(rxr->xdp_prog); + struct bnxt_tx_ring_info *txr; +@@ -255,8 +256,10 @@ bool bnxt_rx_xdp(struct bnxt *bp, struct + *event &= ~BNXT_RX_EVENT; + + *len = xdp.data_end - xdp.data; +- if (orig_data != xdp.data) ++ if (orig_data != xdp.data) { + offset = xdp.data - xdp.data_hard_start; ++ *data_ptr = xdp.data_hard_start + offset; ++ } + + switch (act) { + case XDP_PASS: +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h +@@ -18,8 +18,8 @@ struct bnxt_sw_tx_bd *bnxt_xmit_bd(struc + struct xdp_buff *xdp); + void bnxt_tx_int_xdp(struct bnxt *bp, struct bnxt_napi *bnapi, int nr_pkts); + bool bnxt_rx_xdp(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, u16 cons, +- struct xdp_buff xdp, struct page *page, unsigned int *len, +- u8 *event); ++ 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); diff --git a/series.conf b/series.conf index aee2aeb..4d3089a 100644 --- a/series.conf +++ b/series.conf @@ -36715,6 +36715,7 @@ patches.suse/qlcnic-prevent-dcb-use-after-free-on-qlcnic_dcb_enab.patch patches.suse/nfc-Fix-potential-resource-leaks.patch patches.suse/bnxt_en-Simplify-bnxt_xdp_buff_init.patch + patches.suse/bnxt_en-Fix-XDP-RX-path.patch patches.suse/net-phy-xgmiitorgmii-Fix-refcount-leak-in-xgmiitorgm.patch patches.suse/dt-bindings-net-sun8i-emac-Add-phy-supply-property.patch patches.suse/net-sched-atm-dont-intepret-cls-results-when-asked-t.patch