From a9347bdaea6788ca8687d678bfcd88398bdeaa03 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Mon, 27 Oct 2025 12:50:56 +0100 Subject: [PATCH] drop some 6.1 patches that needed too many "fix ups" to warrent them being here --- ...-fix-the-deadlock-of-enetc_mdio_lock.patch | 158 ------- ...tc-unlock-xdp_redirect-for-xdp-non-l.patch | 69 ---- .../net-fec-add-initial-xdp-support.patch | 390 ------------------ ...place-xdp_do_flush_map-with-xdp_do_f.patch | 285 ------------- queue-6.1/series | 4 - 5 files changed, 906 deletions(-) delete mode 100644 queue-6.1/net-enetc-fix-the-deadlock-of-enetc_mdio_lock.patch delete mode 100644 queue-6.1/net-ethernet-enetc-unlock-xdp_redirect-for-xdp-non-l.patch delete mode 100644 queue-6.1/net-fec-add-initial-xdp-support.patch delete mode 100644 queue-6.1/net-tree-wide-replace-xdp_do_flush_map-with-xdp_do_f.patch diff --git a/queue-6.1/net-enetc-fix-the-deadlock-of-enetc_mdio_lock.patch b/queue-6.1/net-enetc-fix-the-deadlock-of-enetc_mdio_lock.patch deleted file mode 100644 index f5a91cbe49..0000000000 --- a/queue-6.1/net-enetc-fix-the-deadlock-of-enetc_mdio_lock.patch +++ /dev/null @@ -1,158 +0,0 @@ -From 18c00ec29df3d353de5407578e2bfe84f63c76dc Mon Sep 17 00:00:00 2001 -From: Sasha Levin -Date: Wed, 15 Oct 2025 10:14:27 +0800 -Subject: net: enetc: fix the deadlock of enetc_mdio_lock - -From: Jianpeng Chang - -[ Upstream commit 50bd33f6b3922a6b760aa30d409cae891cec8fb5 ] - -After applying the workaround for err050089, the LS1028A platform -experiences RCU stalls on RT kernel. This issue is caused by the -recursive acquisition of the read lock enetc_mdio_lock. Here list some -of the call stacks identified under the enetc_poll path that may lead to -a deadlock: - -enetc_poll - -> enetc_lock_mdio - -> enetc_clean_rx_ring OR napi_complete_done - -> napi_gro_receive - -> enetc_start_xmit - -> enetc_lock_mdio - -> enetc_map_tx_buffs - -> enetc_unlock_mdio - -> enetc_unlock_mdio - -After enetc_poll acquires the read lock, a higher-priority writer attempts -to acquire the lock, causing preemption. The writer detects that a -read lock is already held and is scheduled out. However, readers under -enetc_poll cannot acquire the read lock again because a writer is already -waiting, leading to a thread hang. - -Currently, the deadlock is avoided by adjusting enetc_lock_mdio to prevent -recursive lock acquisition. - -Fixes: 6d36ecdbc441 ("net: enetc: take the MDIO lock only once per NAPI poll cycle") -Signed-off-by: Jianpeng Chang -Acked-by: Wei Fang -Link: https://patch.msgid.link/20251015021427.180757-1-jianpeng.chang.cn@windriver.com -Signed-off-by: Jakub Kicinski -Signed-off-by: Sasha Levin ---- - drivers/net/ethernet/freescale/enetc/enetc.c | 25 ++++++++++++++++---- - 1 file changed, 21 insertions(+), 4 deletions(-) - -diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c -index 44ae1d2c34fd6..ed1db7f056e66 100644 ---- a/drivers/net/ethernet/freescale/enetc/enetc.c -+++ b/drivers/net/ethernet/freescale/enetc/enetc.c -@@ -1225,6 +1225,8 @@ static int enetc_clean_rx_ring(struct enetc_bdr *rx_ring, - /* next descriptor to process */ - i = rx_ring->next_to_clean; - -+ enetc_lock_mdio(); -+ - while (likely(rx_frm_cnt < work_limit)) { - union enetc_rx_bd *rxbd; - struct sk_buff *skb; -@@ -1260,7 +1262,9 @@ static int enetc_clean_rx_ring(struct enetc_bdr *rx_ring, - rx_byte_cnt += skb->len + ETH_HLEN; - rx_frm_cnt++; - -+ enetc_unlock_mdio(); - napi_gro_receive(napi, skb); -+ enetc_lock_mdio(); - } - - rx_ring->next_to_clean = i; -@@ -1268,6 +1272,8 @@ static int enetc_clean_rx_ring(struct enetc_bdr *rx_ring, - rx_ring->stats.packets += rx_frm_cnt; - rx_ring->stats.bytes += rx_byte_cnt; - -+ enetc_unlock_mdio(); -+ - return rx_frm_cnt; - } - -@@ -1572,6 +1578,8 @@ static int enetc_clean_rx_ring_xdp(struct enetc_bdr *rx_ring, - /* next descriptor to process */ - i = rx_ring->next_to_clean; - -+ enetc_lock_mdio(); -+ - while (likely(rx_frm_cnt < work_limit)) { - union enetc_rx_bd *rxbd, *orig_rxbd; - int orig_i, orig_cleaned_cnt; -@@ -1631,7 +1639,9 @@ static int enetc_clean_rx_ring_xdp(struct enetc_bdr *rx_ring, - if (unlikely(!skb)) - goto out; - -+ enetc_unlock_mdio(); - napi_gro_receive(napi, skb); -+ enetc_lock_mdio(); - break; - case XDP_TX: - tx_ring = priv->xdp_tx_ring[rx_ring->index]; -@@ -1660,7 +1670,9 @@ static int enetc_clean_rx_ring_xdp(struct enetc_bdr *rx_ring, - } - break; - case XDP_REDIRECT: -+ enetc_unlock_mdio(); - err = xdp_do_redirect(rx_ring->ndev, &xdp_buff, prog); -+ enetc_lock_mdio(); - if (unlikely(err)) { - enetc_xdp_drop(rx_ring, orig_i, i); - rx_ring->stats.xdp_redirect_failures++; -@@ -1680,8 +1692,11 @@ static int enetc_clean_rx_ring_xdp(struct enetc_bdr *rx_ring, - rx_ring->stats.packets += rx_frm_cnt; - rx_ring->stats.bytes += rx_byte_cnt; - -- if (xdp_redirect_frm_cnt) -+ if (xdp_redirect_frm_cnt) { -+ enetc_unlock_mdio(); - xdp_do_flush(); -+ enetc_lock_mdio(); -+ } - - if (xdp_tx_frm_cnt) - enetc_update_tx_ring_tail(tx_ring); -@@ -1690,6 +1705,8 @@ static int enetc_clean_rx_ring_xdp(struct enetc_bdr *rx_ring, - enetc_refill_rx_ring(rx_ring, enetc_bd_unused(rx_ring) - - rx_ring->xdp.xdp_tx_in_flight); - -+ enetc_unlock_mdio(); -+ - return rx_frm_cnt; - } - -@@ -1708,6 +1725,7 @@ static int enetc_poll(struct napi_struct *napi, int budget) - for (i = 0; i < v->count_tx_rings; i++) - if (!enetc_clean_tx_ring(&v->tx_ring[i], budget)) - complete = false; -+ enetc_unlock_mdio(); - - prog = rx_ring->xdp.prog; - if (prog) -@@ -1719,10 +1737,8 @@ static int enetc_poll(struct napi_struct *napi, int budget) - if (work_done) - v->rx_napi_work = true; - -- if (!complete) { -- enetc_unlock_mdio(); -+ if (!complete) - return budget; -- } - - napi_complete_done(napi, work_done); - -@@ -1731,6 +1747,7 @@ static int enetc_poll(struct napi_struct *napi, int budget) - - v->rx_napi_work = false; - -+ enetc_lock_mdio(); - /* enable interrupts */ - enetc_wr_reg_hot(v->rbier, ENETC_RBIER_RXTIE); - --- -2.51.0 - diff --git a/queue-6.1/net-ethernet-enetc-unlock-xdp_redirect-for-xdp-non-l.patch b/queue-6.1/net-ethernet-enetc-unlock-xdp_redirect-for-xdp-non-l.patch deleted file mode 100644 index db5019d2a5..0000000000 --- a/queue-6.1/net-ethernet-enetc-unlock-xdp_redirect-for-xdp-non-l.patch +++ /dev/null @@ -1,69 +0,0 @@ -From ecf10ad02f186ebfcc966a9d82e6e3fc29e70f58 Mon Sep 17 00:00:00 2001 -From: Sasha Levin -Date: Wed, 4 Jan 2023 14:57:10 +0100 -Subject: net: ethernet: enetc: unlock XDP_REDIRECT for XDP non-linear buffers - -From: Lorenzo Bianconi - -[ Upstream commit 8feb020f92a559f5a73a55c7337a3e51f19a2dc9 ] - -Even if full XDP_REDIRECT is not supported yet for non-linear XDP buffers -since we allow redirecting just into CPUMAPs, unlock XDP_REDIRECT for -S/G XDP buffer and rely on XDP stack to properly take care of the -frames. - -Tested-by: Vladimir Oltean -Signed-off-by: Lorenzo Bianconi -Reviewed-by: Leon Romanovsky -Signed-off-by: Jakub Kicinski -Stable-dep-of: 50bd33f6b392 ("net: enetc: fix the deadlock of enetc_mdio_lock") -Signed-off-by: Sasha Levin ---- - drivers/net/ethernet/freescale/enetc/enetc.c | 24 ++++++++------------ - 1 file changed, 10 insertions(+), 14 deletions(-) - -diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c -index bf49c07c8b513..4b4cc64724932 100644 ---- a/drivers/net/ethernet/freescale/enetc/enetc.c -+++ b/drivers/net/ethernet/freescale/enetc/enetc.c -@@ -1460,6 +1460,16 @@ static void enetc_add_rx_buff_to_xdp(struct enetc_bdr *rx_ring, int i, - /* To be used for XDP_TX */ - rx_swbd->len = size; - -+ if (!xdp_buff_has_frags(xdp_buff)) { -+ xdp_buff_set_frags_flag(xdp_buff); -+ shinfo->xdp_frags_size = size; -+ } else { -+ shinfo->xdp_frags_size += size; -+ } -+ -+ if (page_is_pfmemalloc(rx_swbd->page)) -+ xdp_buff_set_frag_pfmemalloc(xdp_buff); -+ - skb_frag_off_set(frag, rx_swbd->page_offset); - skb_frag_size_set(frag, size); - __skb_frag_set_page(frag, rx_swbd->page); -@@ -1650,20 +1660,6 @@ static int enetc_clean_rx_ring_xdp(struct enetc_bdr *rx_ring, - } - break; - case XDP_REDIRECT: -- /* xdp_return_frame does not support S/G in the sense -- * that it leaks the fragments (__xdp_return should not -- * call page_frag_free only for the initial buffer). -- * Until XDP_REDIRECT gains support for S/G let's keep -- * the code structure in place, but dead. We drop the -- * S/G frames ourselves to avoid memory leaks which -- * would otherwise leave the kernel OOM. -- */ -- if (unlikely(cleaned_cnt - orig_cleaned_cnt != 1)) { -- enetc_xdp_drop(rx_ring, orig_i, i); -- rx_ring->stats.xdp_redirect_sg++; -- break; -- } -- - err = xdp_do_redirect(rx_ring->ndev, &xdp_buff, prog); - if (unlikely(err)) { - enetc_xdp_drop(rx_ring, orig_i, i); --- -2.51.0 - diff --git a/queue-6.1/net-fec-add-initial-xdp-support.patch b/queue-6.1/net-fec-add-initial-xdp-support.patch deleted file mode 100644 index ce8a89fa15..0000000000 --- a/queue-6.1/net-fec-add-initial-xdp-support.patch +++ /dev/null @@ -1,390 +0,0 @@ -From 47a3f48d7721f3132f9f1d0eae94edb0167b09ca Mon Sep 17 00:00:00 2001 -From: Sasha Levin -Date: Mon, 31 Oct 2022 13:53:50 -0500 -Subject: net: fec: add initial XDP support - -From: Shenwei Wang - -[ Upstream commit 6d6b39f180b83dfe1e938382b68dd1e6cb51363c ] - -This patch adds the initial XDP support to Freescale driver. It supports -XDP_PASS, XDP_DROP and XDP_REDIRECT actions. Upcoming patches will add -support for XDP_TX and Zero Copy features. - -As the patch is rather large, the part of codes to collect the -statistics is separated and will prepare a dedicated patch for that -part. - -I just tested with the application of xdpsock. - -- Native here means running command of "xdpsock -i eth0" - -- SKB-Mode means running command of "xdpsock -S -i eth0" - -The following are the testing result relating to XDP mode: - -root@imx8qxpc0mek:~/bpf# ./xdpsock -i eth0 - sock0@eth0:0 rxdrop xdp-drv - pps pkts 1.00 -rx 371347 2717794 -tx 0 0 - -root@imx8qxpc0mek:~/bpf# ./xdpsock -S -i eth0 - sock0@eth0:0 rxdrop xdp-skb - pps pkts 1.00 -rx 202229 404528 -tx 0 0 - -root@imx8qxpc0mek:~/bpf# ./xdp2 eth0 -proto 0: 496708 pkt/s -proto 0: 505469 pkt/s -proto 0: 505283 pkt/s -proto 0: 505443 pkt/s -proto 0: 505465 pkt/s - -root@imx8qxpc0mek:~/bpf# ./xdp2 -S eth0 -proto 0: 0 pkt/s -proto 17: 118778 pkt/s -proto 17: 118989 pkt/s -proto 0: 1 pkt/s -proto 17: 118987 pkt/s -proto 0: 0 pkt/s -proto 17: 118943 pkt/s -proto 17: 118976 pkt/s -proto 0: 1 pkt/s -proto 17: 119006 pkt/s -proto 0: 0 pkt/s -proto 17: 119071 pkt/s -proto 17: 119092 pkt/s - -Signed-off-by: Shenwei Wang -Reported-by: kernel test robot -Link: https://lore.kernel.org/r/20221031185350.2045675-1-shenwei.wang@nxp.com -Signed-off-by: Paolo Abeni -Stable-dep-of: 50bd33f6b392 ("net: enetc: fix the deadlock of enetc_mdio_lock") -Signed-off-by: Sasha Levin ---- - drivers/net/ethernet/freescale/fec.h | 4 +- - drivers/net/ethernet/freescale/fec_main.c | 224 +++++++++++++++++++++- - 2 files changed, 226 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h -index 33f84a30e1671..6bdf7c98c3651 100644 ---- a/drivers/net/ethernet/freescale/fec.h -+++ b/drivers/net/ethernet/freescale/fec.h -@@ -348,7 +348,6 @@ struct bufdesc_ex { - */ - - #define FEC_ENET_XDP_HEADROOM (XDP_PACKET_HEADROOM) -- - #define FEC_ENET_RX_PAGES 256 - #define FEC_ENET_RX_FRSIZE (PAGE_SIZE - FEC_ENET_XDP_HEADROOM \ - - SKB_DATA_ALIGN(sizeof(struct skb_shared_info))) -@@ -661,6 +660,9 @@ struct fec_enet_private { - - struct imx_sc_ipc *ipc_handle; - -+ /* XDP BPF Program */ -+ struct bpf_prog *xdp_prog; -+ - u64 ethtool_stats[]; - }; - -diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c -index ca271d7a388b4..5c72d229d3b6f 100644 ---- a/drivers/net/ethernet/freescale/fec_main.c -+++ b/drivers/net/ethernet/freescale/fec_main.c -@@ -89,6 +89,11 @@ static const u16 fec_enet_vlan_pri_to_queue[8] = {0, 0, 1, 1, 1, 2, 2, 2}; - #define FEC_ENET_OPD_V 0xFFF0 - #define FEC_MDIO_PM_TIMEOUT 100 /* ms */ - -+#define FEC_ENET_XDP_PASS 0 -+#define FEC_ENET_XDP_CONSUMED BIT(0) -+#define FEC_ENET_XDP_TX BIT(1) -+#define FEC_ENET_XDP_REDIR BIT(2) -+ - struct fec_devinfo { - u32 quirks; - }; -@@ -443,13 +448,14 @@ static int - fec_enet_create_page_pool(struct fec_enet_private *fep, - struct fec_enet_priv_rx_q *rxq, int size) - { -+ struct bpf_prog *xdp_prog = READ_ONCE(fep->xdp_prog); - struct page_pool_params pp_params = { - .order = 0, - .flags = PP_FLAG_DMA_MAP | PP_FLAG_DMA_SYNC_DEV, - .pool_size = size, - .nid = dev_to_node(&fep->pdev->dev), - .dev = &fep->pdev->dev, -- .dma_dir = DMA_FROM_DEVICE, -+ .dma_dir = xdp_prog ? DMA_BIDIRECTIONAL : DMA_FROM_DEVICE, - .offset = FEC_ENET_XDP_HEADROOM, - .max_len = FEC_ENET_RX_FRSIZE, - }; -@@ -1610,6 +1616,59 @@ static void fec_enet_update_cbd(struct fec_enet_priv_rx_q *rxq, - bdp->cbd_bufaddr = cpu_to_fec32(phys_addr); - } - -+static u32 -+fec_enet_run_xdp(struct fec_enet_private *fep, struct bpf_prog *prog, -+ struct xdp_buff *xdp, struct fec_enet_priv_rx_q *rxq, int index) -+{ -+ unsigned int sync, len = xdp->data_end - xdp->data; -+ u32 ret = FEC_ENET_XDP_PASS; -+ struct page *page; -+ int err; -+ u32 act; -+ -+ act = bpf_prog_run_xdp(prog, xdp); -+ -+ /* Due xdp_adjust_tail: DMA sync for_device cover max len CPU touch */ -+ sync = xdp->data_end - xdp->data_hard_start - FEC_ENET_XDP_HEADROOM; -+ sync = max(sync, len); -+ -+ switch (act) { -+ case XDP_PASS: -+ ret = FEC_ENET_XDP_PASS; -+ break; -+ -+ case XDP_REDIRECT: -+ err = xdp_do_redirect(fep->netdev, xdp, prog); -+ if (!err) { -+ ret = FEC_ENET_XDP_REDIR; -+ } else { -+ ret = FEC_ENET_XDP_CONSUMED; -+ page = virt_to_head_page(xdp->data); -+ page_pool_put_page(rxq->page_pool, page, sync, true); -+ } -+ break; -+ -+ default: -+ bpf_warn_invalid_xdp_action(fep->netdev, prog, act); -+ fallthrough; -+ -+ case XDP_TX: -+ bpf_warn_invalid_xdp_action(fep->netdev, prog, act); -+ fallthrough; -+ -+ case XDP_ABORTED: -+ fallthrough; /* handle aborts by dropping packet */ -+ -+ case XDP_DROP: -+ ret = FEC_ENET_XDP_CONSUMED; -+ page = virt_to_head_page(xdp->data); -+ page_pool_put_page(rxq->page_pool, page, sync, true); -+ break; -+ } -+ -+ return ret; -+} -+ - /* During a receive, the bd_rx.cur points to the current incoming buffer. - * When we update through the ring, if the next incoming buffer has - * not been given to the system, we just set the empty indicator, -@@ -1631,6 +1690,9 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id) - u16 vlan_tag; - int index = 0; - bool need_swap = fep->quirks & FEC_QUIRK_SWAP_FRAME; -+ struct bpf_prog *xdp_prog = READ_ONCE(fep->xdp_prog); -+ u32 ret, xdp_result = FEC_ENET_XDP_PASS; -+ struct xdp_buff xdp; - struct page *page; - - #ifdef CONFIG_M532x -@@ -1642,6 +1704,7 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id) - * These get messed up if we get called due to a busy condition. - */ - bdp = rxq->bd.cur; -+ xdp_init_buff(&xdp, PAGE_SIZE, &rxq->xdp_rxq); - - while (!((status = fec16_to_cpu(bdp->cbd_sc)) & BD_ENET_RX_EMPTY)) { - -@@ -1691,6 +1754,17 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id) - prefetch(page_address(page)); - fec_enet_update_cbd(rxq, bdp, index); - -+ if (xdp_prog) { -+ xdp_buff_clear_frags_flag(&xdp); -+ xdp_prepare_buff(&xdp, page_address(page), -+ FEC_ENET_XDP_HEADROOM, pkt_len, false); -+ -+ ret = fec_enet_run_xdp(fep, xdp_prog, &xdp, rxq, index); -+ xdp_result |= ret; -+ if (ret != FEC_ENET_XDP_PASS) -+ goto rx_processing_done; -+ } -+ - /* The packet length includes FCS, but we don't want to - * include that when passing upstream as it messes up - * bridging applications. -@@ -1794,6 +1868,10 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id) - writel(0, rxq->bd.reg_desc_active); - } - rxq->bd.cur = bdp; -+ -+ if (xdp_result & FEC_ENET_XDP_REDIR) -+ xdp_do_flush_map(); -+ - return pkt_received; - } - -@@ -3604,6 +3682,148 @@ static u16 fec_enet_select_queue(struct net_device *ndev, struct sk_buff *skb, - return fec_enet_vlan_pri_to_queue[vlan_tag >> 13]; - } - -+static int fec_enet_bpf(struct net_device *dev, struct netdev_bpf *bpf) -+{ -+ struct fec_enet_private *fep = netdev_priv(dev); -+ bool is_run = netif_running(dev); -+ struct bpf_prog *old_prog; -+ -+ switch (bpf->command) { -+ case XDP_SETUP_PROG: -+ if (is_run) { -+ napi_disable(&fep->napi); -+ netif_tx_disable(dev); -+ } -+ -+ old_prog = xchg(&fep->xdp_prog, bpf->prog); -+ fec_restart(dev); -+ -+ if (is_run) { -+ napi_enable(&fep->napi); -+ netif_tx_start_all_queues(dev); -+ } -+ -+ if (old_prog) -+ bpf_prog_put(old_prog); -+ -+ return 0; -+ -+ case XDP_SETUP_XSK_POOL: -+ return -EOPNOTSUPP; -+ -+ default: -+ return -EOPNOTSUPP; -+ } -+} -+ -+static int -+fec_enet_xdp_get_tx_queue(struct fec_enet_private *fep, int cpu) -+{ -+ int index = cpu; -+ -+ if (unlikely(index < 0)) -+ index = 0; -+ -+ while (index >= fep->num_tx_queues) -+ index -= fep->num_tx_queues; -+ -+ return index; -+} -+ -+static int fec_enet_txq_xmit_frame(struct fec_enet_private *fep, -+ struct fec_enet_priv_tx_q *txq, -+ struct xdp_frame *frame) -+{ -+ unsigned int index, status, estatus; -+ struct bufdesc *bdp, *last_bdp; -+ dma_addr_t dma_addr; -+ int entries_free; -+ -+ entries_free = fec_enet_get_free_txdesc_num(txq); -+ if (entries_free < MAX_SKB_FRAGS + 1) { -+ netdev_err(fep->netdev, "NOT enough BD for SG!\n"); -+ return NETDEV_TX_OK; -+ } -+ -+ /* Fill in a Tx ring entry */ -+ bdp = txq->bd.cur; -+ last_bdp = bdp; -+ status = fec16_to_cpu(bdp->cbd_sc); -+ status &= ~BD_ENET_TX_STATS; -+ -+ index = fec_enet_get_bd_index(bdp, &txq->bd); -+ -+ dma_addr = dma_map_single(&fep->pdev->dev, frame->data, -+ frame->len, DMA_TO_DEVICE); -+ if (dma_mapping_error(&fep->pdev->dev, dma_addr)) -+ return FEC_ENET_XDP_CONSUMED; -+ -+ status |= (BD_ENET_TX_INTR | BD_ENET_TX_LAST); -+ if (fep->bufdesc_ex) -+ estatus = BD_ENET_TX_INT; -+ -+ bdp->cbd_bufaddr = cpu_to_fec32(dma_addr); -+ bdp->cbd_datlen = cpu_to_fec16(frame->len); -+ -+ if (fep->bufdesc_ex) { -+ struct bufdesc_ex *ebdp = (struct bufdesc_ex *)bdp; -+ -+ if (fep->quirks & FEC_QUIRK_HAS_AVB) -+ estatus |= FEC_TX_BD_FTYPE(txq->bd.qid); -+ -+ ebdp->cbd_bdu = 0; -+ ebdp->cbd_esc = cpu_to_fec32(estatus); -+ } -+ -+ index = fec_enet_get_bd_index(last_bdp, &txq->bd); -+ txq->tx_skbuff[index] = NULL; -+ -+ /* Send it on its way. Tell FEC it's ready, interrupt when done, -+ * it's the last BD of the frame, and to put the CRC on the end. -+ */ -+ status |= (BD_ENET_TX_READY | BD_ENET_TX_TC); -+ bdp->cbd_sc = cpu_to_fec16(status); -+ -+ /* If this was the last BD in the ring, start at the beginning again. */ -+ bdp = fec_enet_get_nextdesc(last_bdp, &txq->bd); -+ -+ txq->bd.cur = bdp; -+ -+ return 0; -+} -+ -+static int fec_enet_xdp_xmit(struct net_device *dev, -+ int num_frames, -+ struct xdp_frame **frames, -+ u32 flags) -+{ -+ struct fec_enet_private *fep = netdev_priv(dev); -+ struct fec_enet_priv_tx_q *txq; -+ int cpu = smp_processor_id(); -+ struct netdev_queue *nq; -+ unsigned int queue; -+ int i; -+ -+ queue = fec_enet_xdp_get_tx_queue(fep, cpu); -+ txq = fep->tx_queue[queue]; -+ nq = netdev_get_tx_queue(fep->netdev, queue); -+ -+ __netif_tx_lock(nq, cpu); -+ -+ for (i = 0; i < num_frames; i++) -+ fec_enet_txq_xmit_frame(fep, txq, frames[i]); -+ -+ /* Make sure the update to bdp and tx_skbuff are performed. */ -+ wmb(); -+ -+ /* Trigger transmission start */ -+ writel(0, txq->bd.reg_desc_active); -+ -+ __netif_tx_unlock(nq); -+ -+ return num_frames; -+} -+ - static const struct net_device_ops fec_netdev_ops = { - .ndo_open = fec_enet_open, - .ndo_stop = fec_enet_close, -@@ -3615,6 +3835,8 @@ static const struct net_device_ops fec_netdev_ops = { - .ndo_set_mac_address = fec_set_mac_address, - .ndo_eth_ioctl = fec_enet_ioctl, - .ndo_set_features = fec_set_features, -+ .ndo_bpf = fec_enet_bpf, -+ .ndo_xdp_xmit = fec_enet_xdp_xmit, - }; - - static const unsigned short offset_des_active_rxq[] = { --- -2.51.0 - diff --git a/queue-6.1/net-tree-wide-replace-xdp_do_flush_map-with-xdp_do_f.patch b/queue-6.1/net-tree-wide-replace-xdp_do_flush_map-with-xdp_do_f.patch deleted file mode 100644 index 37b14da037..0000000000 --- a/queue-6.1/net-tree-wide-replace-xdp_do_flush_map-with-xdp_do_f.patch +++ /dev/null @@ -1,285 +0,0 @@ -From 20abbd7880cfc00ffcf960a25d3d7cd5ac0fb978 Mon Sep 17 00:00:00 2001 -From: Sasha Levin -Date: Fri, 8 Sep 2023 16:32:14 +0200 -Subject: net: Tree wide: Replace xdp_do_flush_map() with xdp_do_flush(). -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -From: Sebastian Andrzej Siewior - -[ Upstream commit 7f04bd109d4c358a12b125bc79a6f0eac2e915ec ] - -xdp_do_flush_map() is deprecated and new code should use xdp_do_flush() -instead. - -Replace xdp_do_flush_map() with xdp_do_flush(). - -Cc: AngeloGioacchino Del Regno -Cc: Clark Wang -Cc: Claudiu Manoil -Cc: David Arinzon -Cc: Edward Cree -Cc: Felix Fietkau -Cc: Grygorii Strashko -Cc: Jassi Brar -Cc: Jesse Brandeburg -Cc: John Crispin -Cc: Leon Romanovsky -Cc: Lorenzo Bianconi -Cc: Louis Peens -Cc: Marcin Wojtas -Cc: Mark Lee -Cc: Matthias Brugger -Cc: NXP Linux Team -Cc: Noam Dagan -Cc: Russell King -Cc: Saeed Bishara -Cc: Saeed Mahameed -Cc: Sean Wang -Cc: Shay Agroskin -Cc: Shenwei Wang -Cc: Thomas Petazzoni -Cc: Tony Nguyen -Cc: Vladimir Oltean -Cc: Wei Fang -Signed-off-by: Sebastian Andrzej Siewior -Acked-by: Arthur Kiyanovski -Acked-by: Toke Høiland-Jørgensen -Acked-by: Ilias Apalodimas -Acked-by: Martin Habets -Acked-by: Jesper Dangaard Brouer -Link: https://lore.kernel.org/r/20230908143215.869913-2-bigeasy@linutronix.de -Signed-off-by: Jakub Kicinski -Stable-dep-of: 50bd33f6b392 ("net: enetc: fix the deadlock of enetc_mdio_lock") -Signed-off-by: Sasha Levin ---- - drivers/net/ethernet/amazon/ena/ena_netdev.c | 2 +- - drivers/net/ethernet/freescale/enetc/enetc.c | 2 +- - drivers/net/ethernet/freescale/fec_main.c | 2 +- - drivers/net/ethernet/intel/i40e/i40e_txrx.c | 2 +- - drivers/net/ethernet/intel/ice/ice_txrx_lib.c | 2 +- - drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 2 +- - drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c | 2 +- - drivers/net/ethernet/marvell/mvneta.c | 2 +- - drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c | 2 +- - drivers/net/ethernet/mediatek/mtk_eth_soc.c | 2 +- - drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c | 2 +- - drivers/net/ethernet/netronome/nfp/nfd3/xsk.c | 2 +- - drivers/net/ethernet/sfc/efx_channels.c | 2 +- - drivers/net/ethernet/sfc/siena/efx_channels.c | 2 +- - drivers/net/ethernet/socionext/netsec.c | 2 +- - drivers/net/ethernet/ti/cpsw_priv.c | 2 +- - 16 files changed, 16 insertions(+), 16 deletions(-) - -diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c -index 77fa4c35f2331..af03e307451c2 100644 ---- a/drivers/net/ethernet/amazon/ena/ena_netdev.c -+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c -@@ -1828,7 +1828,7 @@ static int ena_clean_rx_irq(struct ena_ring *rx_ring, struct napi_struct *napi, - } - - if (xdp_flags & ENA_XDP_REDIRECT) -- xdp_do_flush_map(); -+ xdp_do_flush(); - - return work_done; - -diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c -index 4b4cc64724932..44ae1d2c34fd6 100644 ---- a/drivers/net/ethernet/freescale/enetc/enetc.c -+++ b/drivers/net/ethernet/freescale/enetc/enetc.c -@@ -1681,7 +1681,7 @@ static int enetc_clean_rx_ring_xdp(struct enetc_bdr *rx_ring, - rx_ring->stats.bytes += rx_byte_cnt; - - if (xdp_redirect_frm_cnt) -- xdp_do_flush_map(); -+ xdp_do_flush(); - - if (xdp_tx_frm_cnt) - enetc_update_tx_ring_tail(tx_ring); -diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c -index 5c72d229d3b6f..b352b89d096bf 100644 ---- a/drivers/net/ethernet/freescale/fec_main.c -+++ b/drivers/net/ethernet/freescale/fec_main.c -@@ -1870,7 +1870,7 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id) - rxq->bd.cur = bdp; - - if (xdp_result & FEC_ENET_XDP_REDIR) -- xdp_do_flush_map(); -+ xdp_do_flush(); - - return pkt_received; - } -diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c -index 2ede35ba3919b..a428d57c1da52 100644 ---- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c -+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c -@@ -2392,7 +2392,7 @@ void i40e_update_rx_stats(struct i40e_ring *rx_ring, - void i40e_finalize_xdp_rx(struct i40e_ring *rx_ring, unsigned int xdp_res) - { - if (xdp_res & I40E_XDP_REDIR) -- xdp_do_flush_map(); -+ xdp_do_flush(); - - if (xdp_res & I40E_XDP_TX) { - struct i40e_ring *xdp_ring = -diff --git a/drivers/net/ethernet/intel/ice/ice_txrx_lib.c b/drivers/net/ethernet/intel/ice/ice_txrx_lib.c -index d137b98d78eb6..48eac14fe991a 100644 ---- a/drivers/net/ethernet/intel/ice/ice_txrx_lib.c -+++ b/drivers/net/ethernet/intel/ice/ice_txrx_lib.c -@@ -358,7 +358,7 @@ int ice_xmit_xdp_buff(struct xdp_buff *xdp, struct ice_tx_ring *xdp_ring) - void ice_finalize_xdp_rx(struct ice_tx_ring *xdp_ring, unsigned int xdp_res) - { - if (xdp_res & ICE_XDP_REDIR) -- xdp_do_flush_map(); -+ xdp_do_flush(); - - if (xdp_res & ICE_XDP_TX) { - if (static_branch_unlikely(&ice_xdp_locking_key)) -diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c -index 086cc25730338..d036dc190396c 100644 ---- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c -+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c -@@ -2429,7 +2429,7 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector, - } - - if (xdp_xmit & IXGBE_XDP_REDIR) -- xdp_do_flush_map(); -+ xdp_do_flush(); - - if (xdp_xmit & IXGBE_XDP_TX) { - struct ixgbe_ring *ring = ixgbe_determine_xdp_ring(adapter); -diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c -index 7ef82c30e8571..9fdd19acf2242 100644 ---- a/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c -+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c -@@ -351,7 +351,7 @@ int ixgbe_clean_rx_irq_zc(struct ixgbe_q_vector *q_vector, - } - - if (xdp_xmit & IXGBE_XDP_REDIR) -- xdp_do_flush_map(); -+ xdp_do_flush(); - - if (xdp_xmit & IXGBE_XDP_TX) { - struct ixgbe_ring *ring = ixgbe_determine_xdp_ring(adapter); -diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c -index eb4ebaa1c92ff..0cc277fe33f5b 100644 ---- a/drivers/net/ethernet/marvell/mvneta.c -+++ b/drivers/net/ethernet/marvell/mvneta.c -@@ -2514,7 +2514,7 @@ static int mvneta_rx_swbm(struct napi_struct *napi, - mvneta_xdp_put_buff(pp, rxq, &xdp_buf, -1); - - if (ps.xdp_redirect) -- xdp_do_flush_map(); -+ xdp_do_flush(); - - if (ps.rx_packets) - mvneta_update_stats(pp, &ps); -diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c -index ec69bb90f5740..79516673811bd 100644 ---- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c -+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c -@@ -4052,7 +4052,7 @@ static int mvpp2_rx(struct mvpp2_port *port, struct napi_struct *napi, - } - - if (xdp_ret & MVPP2_XDP_REDIR) -- xdp_do_flush_map(); -+ xdp_do_flush(); - - if (ps.rx_packets) { - struct mvpp2_pcpu_stats *stats = this_cpu_ptr(port->stats); -diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -index 3f2f725ccceb3..b2ec1f183271d 100644 ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -1989,7 +1989,7 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget, - net_dim(ð->rx_dim, dim_sample); - - if (xdp_flush) -- xdp_do_flush_map(); -+ xdp_do_flush(); - - return done; - } -diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c -index 20507ef2f9569..e6612d1c3749c 100644 ---- a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c -+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c -@@ -677,7 +677,7 @@ void mlx5e_xdp_rx_poll_complete(struct mlx5e_rq *rq) - mlx5e_xmit_xdp_doorbell(xdpsq); - - if (test_bit(MLX5E_RQ_FLAG_XDP_REDIRECT, rq->flags)) { -- xdp_do_flush_map(); -+ xdp_do_flush(); - __clear_bit(MLX5E_RQ_FLAG_XDP_REDIRECT, rq->flags); - } - } -diff --git a/drivers/net/ethernet/netronome/nfp/nfd3/xsk.c b/drivers/net/ethernet/netronome/nfp/nfd3/xsk.c -index 5d9db8c2a5b43..45be6954d5aae 100644 ---- a/drivers/net/ethernet/netronome/nfp/nfd3/xsk.c -+++ b/drivers/net/ethernet/netronome/nfp/nfd3/xsk.c -@@ -256,7 +256,7 @@ nfp_nfd3_xsk_rx(struct nfp_net_rx_ring *rx_ring, int budget, - nfp_net_xsk_rx_ring_fill_freelist(r_vec->rx_ring); - - if (xdp_redir) -- xdp_do_flush_map(); -+ xdp_do_flush(); - - if (tx_ring->wr_ptr_add) - nfp_net_tx_xmit_more_flush(tx_ring); -diff --git a/drivers/net/ethernet/sfc/efx_channels.c b/drivers/net/ethernet/sfc/efx_channels.c -index 27d00ffac68f4..506163c977fa0 100644 ---- a/drivers/net/ethernet/sfc/efx_channels.c -+++ b/drivers/net/ethernet/sfc/efx_channels.c -@@ -1281,7 +1281,7 @@ static int efx_poll(struct napi_struct *napi, int budget) - - spent = efx_process_channel(channel, budget); - -- xdp_do_flush_map(); -+ xdp_do_flush(); - - if (spent < budget) { - if (efx_channel_has_rx_queue(channel) && -diff --git a/drivers/net/ethernet/sfc/siena/efx_channels.c b/drivers/net/ethernet/sfc/siena/efx_channels.c -index 1776f7f8a7a90..a7346e965bfe7 100644 ---- a/drivers/net/ethernet/sfc/siena/efx_channels.c -+++ b/drivers/net/ethernet/sfc/siena/efx_channels.c -@@ -1285,7 +1285,7 @@ static int efx_poll(struct napi_struct *napi, int budget) - - spent = efx_process_channel(channel, budget); - -- xdp_do_flush_map(); -+ xdp_do_flush(); - - if (spent < budget) { - if (efx_channel_has_rx_queue(channel) && -diff --git a/drivers/net/ethernet/socionext/netsec.c b/drivers/net/ethernet/socionext/netsec.c -index b130e978366c1..f4b516906abdb 100644 ---- a/drivers/net/ethernet/socionext/netsec.c -+++ b/drivers/net/ethernet/socionext/netsec.c -@@ -780,7 +780,7 @@ static void netsec_finalize_xdp_rx(struct netsec_priv *priv, u32 xdp_res, - u16 pkts) - { - if (xdp_res & NETSEC_XDP_REDIR) -- xdp_do_flush_map(); -+ xdp_do_flush(); - - if (xdp_res & NETSEC_XDP_TX) - netsec_xdp_ring_tx_db(priv, pkts); -diff --git a/drivers/net/ethernet/ti/cpsw_priv.c b/drivers/net/ethernet/ti/cpsw_priv.c -index 758295c898ac9..7b861e1027b9b 100644 ---- a/drivers/net/ethernet/ti/cpsw_priv.c -+++ b/drivers/net/ethernet/ti/cpsw_priv.c -@@ -1359,7 +1359,7 @@ int cpsw_run_xdp(struct cpsw_priv *priv, int ch, struct xdp_buff *xdp, - * particular hardware is sharing a common queue, so the - * incoming device might change per packet. - */ -- xdp_do_flush_map(); -+ xdp_do_flush(); - break; - default: - bpf_warn_invalid_xdp_action(ndev, prog, act); --- -2.51.0 - diff --git a/queue-6.1/series b/queue-6.1/series index 081c5544e1..021a218cde 100644 --- a/queue-6.1/series +++ b/queue-6.1/series @@ -80,10 +80,6 @@ powerpc-32-remove-page_kernel_text-to-fix-startup-fa.patch smb-server-let-smb_direct_flush_send_list-invalidate.patch net-mlx5e-return-1-instead-of-0-in-invalid-case-in-m.patch rtnetlink-allow-deleting-fdb-entries-in-user-namespa.patch -net-fec-add-initial-xdp-support.patch -net-ethernet-enetc-unlock-xdp_redirect-for-xdp-non-l.patch -net-tree-wide-replace-xdp_do_flush_map-with-xdp_do_f.patch -net-enetc-fix-the-deadlock-of-enetc_mdio_lock.patch net-enetc-correct-the-value-of-enetc_rxb_truesize.patch dpaa2-eth-fix-the-pointer-passed-to-ptr_align-on-tx-.patch arm64-mm-avoid-always-making-pte-dirty-in-pte_mkwrit.patch -- 2.47.3