From c9f801deb73d69cb815199861d1f433ea476f4a2 Mon Sep 17 00:00:00 2001 From: Thomas Bogendoerfer Date: Mar 22 2023 15:35:49 +0000 Subject: bnxt_en: Fix first buffer size calculations for XDP multi-buffer (bsc#1209079). --- diff --git a/patches.suse/bnxt_en-Fix-first-buffer-size-calculations-for-XDP-m.patch b/patches.suse/bnxt_en-Fix-first-buffer-size-calculations-for-XDP-m.patch new file mode 100644 index 0000000..649df82 --- /dev/null +++ b/patches.suse/bnxt_en-Fix-first-buffer-size-calculations-for-XDP-m.patch @@ -0,0 +1,118 @@ +From: Michael Chan +Date: Mon, 26 Dec 2022 22:19:39 -0500 +Subject: bnxt_en: Fix first buffer size calculations for XDP multi-buffer +Patch-mainline: v6.2-rc3 +Git-commit: 1abeacc1979fa4a756695f5030791d8f0fa934b9 +References: bsc#1209079 + +The size of the first buffer is always page size, and the useable +space is the page size minus the offset and the skb_shared_info size. +Make sure SKB and XDP buf sizes match so that the skb_shared_info +is at the same offset seen from the SKB and XDP_BUF. + +build_skb() should be passed PAGE_SIZE. xdp_init_buff() should +be passed PAGE_SIZE as well. xdp_get_shared_info_from_buff() will +automatically deduct the skb_shared_info size if the XDP buffer +has frags. There is no need to keep bp->xdp_has_frags. + +Change BNXT_PAGE_MODE_BUF_SIZE to BNXT_MAX_PAGE_MODE_MTU_SBUF +since this constant is really the MTU with ethernet header size +subtracted. + +Also fix the BNXT_MAX_PAGE_MODE_MTU macro with proper parentheses. + +Fixes: 32861236190b ("bnxt: change receive ring space parameters") +Reviewed-by: Somnath Kotur +Reviewed-by: Andy Gospodarek +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +Acked-by: Thomas Bogendoerfer +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 9 +++++---- + drivers/net/ethernet/broadcom/bnxt/bnxt.h | 15 +++++++++++---- + drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c | 7 +------ + 3 files changed, 17 insertions(+), 14 deletions(-) + +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c +@@ -988,8 +988,7 @@ static struct sk_buff *bnxt_rx_multi_pag + dma_addr -= bp->rx_dma_offset; + dma_unmap_page_attrs(&bp->pdev->dev, dma_addr, PAGE_SIZE, bp->rx_dir, + DMA_ATTR_WEAK_ORDERING); +- skb = build_skb(page_address(page), BNXT_PAGE_MODE_BUF_SIZE + +- bp->rx_dma_offset); ++ skb = build_skb(page_address(page), PAGE_SIZE); + if (!skb) { + __free_page(page); + return NULL; +@@ -3966,8 +3965,10 @@ void bnxt_set_ring_params(struct bnxt *b + bp->rx_agg_ring_mask = (bp->rx_agg_nr_pages * RX_DESC_CNT) - 1; + + if (BNXT_RX_PAGE_MODE(bp)) { +- rx_space = BNXT_PAGE_MODE_BUF_SIZE; +- rx_size = BNXT_MAX_PAGE_MODE_MTU; ++ rx_space = PAGE_SIZE; ++ rx_size = PAGE_SIZE - ++ ALIGN(max(NET_SKB_PAD, XDP_PACKET_HEADROOM), 8) - ++ SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); + } else { + rx_size = SKB_DATA_ALIGN(BNXT_RX_COPY_THRESH + NET_IP_ALIGN); + rx_space = rx_size + NET_SKB_PAD + +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h +@@ -591,12 +591,20 @@ struct nqe_cn { + #define BNXT_RX_PAGE_SIZE (1 << BNXT_RX_PAGE_SHIFT) + + #define BNXT_MAX_MTU 9500 +-#define BNXT_PAGE_MODE_BUF_SIZE \ ++ ++/* First RX buffer page in XDP multi-buf mode ++ * ++ * +-------------------------------------------------------------------------+ ++ * | XDP_PACKET_HEADROOM | bp->rx_buf_use_size | skb_shared_info| ++ * | (bp->rx_dma_offset) | | | ++ * +-------------------------------------------------------------------------+ ++ */ ++#define BNXT_MAX_PAGE_MODE_MTU_SBUF \ + ((unsigned int)PAGE_SIZE - VLAN_ETH_HLEN - NET_IP_ALIGN - \ + XDP_PACKET_HEADROOM) + #define BNXT_MAX_PAGE_MODE_MTU \ +- BNXT_PAGE_MODE_BUF_SIZE - \ +- SKB_DATA_ALIGN((unsigned int)sizeof(struct skb_shared_info)) ++ (BNXT_MAX_PAGE_MODE_MTU_SBUF - \ ++ SKB_DATA_ALIGN((unsigned int)sizeof(struct skb_shared_info))) + + #define BNXT_MIN_PKT_SIZE 52 + +@@ -2131,7 +2139,6 @@ struct bnxt { + #define BNXT_DUMP_CRASH 1 + + struct bpf_prog *xdp_prog; +- u8 xdp_has_frags; + + struct bnxt_ptp_cfg *ptp_cfg; + u8 ptp_all_rx_tstamp; +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c +@@ -193,9 +193,6 @@ void bnxt_xdp_buff_init(struct bnxt *bp, + mapping = rx_buf->mapping - bp->rx_dma_offset; + dma_sync_single_for_cpu(&pdev->dev, mapping + offset, len, bp->rx_dir); + +- if (bp->xdp_has_frags) +- buflen = BNXT_PAGE_MODE_BUF_SIZE + offset; +- + xdp_init_buff(xdp, buflen, &rxr->xdp_rxq); + xdp_prepare_buff(xdp, data_ptr - offset, offset, len, false); + } +@@ -404,10 +401,8 @@ static int bnxt_xdp_set(struct bnxt *bp, + netdev_warn(dev, "ethtool rx/tx channels must be combined to support XDP.\n"); + return -EOPNOTSUPP; + } +- if (prog) { ++ if (prog) + tx_xdp = bp->rx_nr_rings; +- bp->xdp_has_frags = prog->aux->xdp_has_frags; +- } + + tc = netdev_get_num_tc(dev); + if (!tc) diff --git a/series.conf b/series.conf index 4d3089a..61c1f38 100644 --- a/series.conf +++ b/series.conf @@ -36716,6 +36716,7 @@ 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/bnxt_en-Fix-first-buffer-size-calculations-for-XDP-m.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