]> Gentwo Git Trees - linux/.git/commitdiff
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
authorJakub Kicinski <kuba@kernel.org>
Thu, 27 Nov 2025 20:16:40 +0000 (12:16 -0800)
committerJakub Kicinski <kuba@kernel.org>
Thu, 27 Nov 2025 20:19:08 +0000 (12:19 -0800)
Conflicts:

net/xdp/xsk.c
  0ebc27a4c67d ("xsk: avoid data corruption on cq descriptor number")
  8da7bea7db69 ("xsk: add indirect call for xsk_destruct_skb")
  30ed05adca4a ("xsk: use a smaller new lock for shared pool case")
https://lore.kernel.org/20251127105450.4a1665ec@canb.auug.org.au
https://lore.kernel.org/eb4eee14-7e24-4d1b-b312-e9ea738fefee@kernel.org

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
19 files changed:
1  2 
MAINTAINERS
drivers/net/can/rcar/rcar_canfd.c
drivers/net/can/sja1000/sja1000.c
drivers/net/can/sun4i_can.c
drivers/net/can/usb/gs_usb.c
drivers/net/ethernet/freescale/fec.h
drivers/net/ethernet/meta/fbnic/fbnic_fw.c
drivers/net/ethernet/realtek/r8169_main.c
drivers/net/phy/mxl-gpy.c
drivers/net/team/team_core.c
drivers/net/veth.c
drivers/net/virtio_net.c
fs/smb/client/connect.c
net/atm/common.c
net/bluetooth/hci_sock.c
net/bluetooth/iso.c
net/bluetooth/sco.c
net/mptcp/protocol.c
net/xdp/xsk.c

diff --cc MAINTAINERS
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc net/xdp/xsk.c
index bcfd400e9cf8bb07452f6b02017ef4c6d2eeb541,69bbcca8ac7533c56f13b1b1a305db53f20af281..f093c3453f64ce4071f4698da6adc7a05870e711
@@@ -560,50 -591,43 +590,42 @@@ static u32 xsk_get_num_desc(struct sk_b
  static void xsk_cq_submit_addr_locked(struct xsk_buff_pool *pool,
                                      struct sk_buff *skb)
  {
-       struct xsk_addr_node *pos, *tmp;
+       u32 num_descs = xsk_get_num_desc(skb);
+       struct xsk_addrs *xsk_addr;
        u32 descs_processed = 0;
        unsigned long flags;
-       u32 idx;
+       u32 idx, i;
  
 -      spin_lock_irqsave(&pool->cq_lock, flags);
 +      spin_lock_irqsave(&pool->cq_prod_lock, flags);
        idx = xskq_get_prod(pool->cq);
  
-       xskq_prod_write_addr(pool->cq, idx,
-                            (u64)(uintptr_t)skb_shinfo(skb)->destructor_arg);
-       descs_processed++;
+       if (unlikely(num_descs > 1)) {
+               xsk_addr = (struct xsk_addrs *)skb_shinfo(skb)->destructor_arg;
  
-       if (unlikely(XSKCB(skb)->num_descs > 1)) {
-               list_for_each_entry_safe(pos, tmp, &XSKCB(skb)->addrs_list, addr_node) {
+               for (i = 0; i < num_descs; i++) {
                        xskq_prod_write_addr(pool->cq, idx + descs_processed,
-                                            pos->addr);
+                                            xsk_addr->addrs[i]);
                        descs_processed++;
-                       list_del(&pos->addr_node);
-                       kmem_cache_free(xsk_tx_generic_cache, pos);
                }
+               kmem_cache_free(xsk_tx_generic_cache, xsk_addr);
+       } else {
+               xskq_prod_write_addr(pool->cq, idx,
+                                    xsk_skb_destructor_get_addr(skb));
+               descs_processed++;
        }
        xskq_prod_submit_n(pool->cq, descs_processed);
 -      spin_unlock_irqrestore(&pool->cq_lock, flags);
 +      spin_unlock_irqrestore(&pool->cq_prod_lock, flags);
  }
  
  static void xsk_cq_cancel_locked(struct xsk_buff_pool *pool, u32 n)
  {
 -      unsigned long flags;
 -
 -      spin_lock_irqsave(&pool->cq_lock, flags);
 +      spin_lock(&pool->cq_cached_prod_lock);
        xskq_prod_cancel_n(pool->cq, n);
 -      spin_unlock_irqrestore(&pool->cq_lock, flags);
 +      spin_unlock(&pool->cq_cached_prod_lock);
  }
  
- static void xsk_inc_num_desc(struct sk_buff *skb)
- {
-       XSKCB(skb)->num_descs++;
- }
- static u32 xsk_get_num_desc(struct sk_buff *skb)
- {
-       return XSKCB(skb)->num_descs;
- }
 -static void xsk_destruct_skb(struct sk_buff *skb)
 +INDIRECT_CALLABLE_SCOPE
 +void xsk_destruct_skb(struct sk_buff *skb)
  {
        struct xsk_tx_metadata_compl *compl = &skb_shinfo(skb)->xsk_meta;