Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: move misc netdev_lock flavors to a separate header

Move the more esoteric helpers for netdev instance lock to
a dedicated header. This avoids growing netdevice.h to infinity
and makes rebuilding the kernel much faster (after touching
the header with the helpers).

The main netdev_lock() / netdev_unlock() functions are used
in static inlines in netdevice.h and will probably be used
most commonly, so keep them in netdevice.h.

Acked-by: Stanislav Fomichev <sdf@fomichev.me>
Link: https://patch.msgid.link/20250307183006.2312761-1-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+143 -80
+1
drivers/net/bonding/bond_main.c
··· 90 90 #include <net/tls.h> 91 91 #endif 92 92 #include <net/ip6_route.h> 93 + #include <net/netdev_lock.h> 93 94 #include <net/xdp.h> 94 95 95 96 #include "bonding_priv.h"
+1
drivers/net/dummy.c
··· 38 38 #include <linux/moduleparam.h> 39 39 #include <linux/rtnetlink.h> 40 40 #include <linux/net_tstamp.h> 41 + #include <net/netdev_lock.h> 41 42 #include <net/rtnetlink.h> 42 43 #include <linux/u64_stats_sync.h> 43 44
+1
drivers/net/ethernet/broadcom/bnxt/bnxt.c
··· 54 54 #include <net/pkt_cls.h> 55 55 #include <net/page_pool/helpers.h> 56 56 #include <linux/align.h> 57 + #include <net/netdev_lock.h> 57 58 #include <net/netdev_queues.h> 58 59 #include <net/netdev_rx_queue.h> 59 60 #include <linux/pci-tph.h>
+1
drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
··· 15 15 #include <linux/bpf.h> 16 16 #include <linux/bpf_trace.h> 17 17 #include <linux/filter.h> 18 + #include <net/netdev_lock.h> 18 19 #include <net/page_pool/helpers.h> 19 20 #include "bnxt_hsi.h" 20 21 #include "bnxt.h"
+1
drivers/net/ethernet/intel/iavf/iavf_main.c
··· 2 2 /* Copyright(c) 2013 - 2018 Intel Corporation. */ 3 3 4 4 #include <linux/net/intel/libie/rx.h> 5 + #include <net/netdev_lock.h> 5 6 6 7 #include "iavf.h" 7 8 #include "iavf_ptp.h"
+1
drivers/net/ethernet/microsoft/mana/mana_en.c
··· 13 13 14 14 #include <net/checksum.h> 15 15 #include <net/ip6_checksum.h> 16 + #include <net/netdev_lock.h> 16 17 #include <net/page_pool/helpers.h> 17 18 #include <net/xdp.h> 18 19
+1
drivers/net/geneve.c
··· 18 18 #include <net/rtnetlink.h> 19 19 #include <net/geneve.h> 20 20 #include <net/gro.h> 21 + #include <net/netdev_lock.h> 21 22 #include <net/protocol.h> 22 23 23 24 #define GENEVE_NETDEV_VER "0.6"
+1
drivers/net/hamradio/bpqether.c
··· 77 77 78 78 #include <net/ip.h> 79 79 #include <net/arp.h> 80 + #include <net/netdev_lock.h> 80 81 #include <net/net_namespace.h> 81 82 82 83 #include <linux/bpqether.h>
+1
drivers/net/hyperv/netvsc_drv.c
··· 29 29 #include <linux/bpf.h> 30 30 31 31 #include <net/arp.h> 32 + #include <net/netdev_lock.h> 32 33 #include <net/route.h> 33 34 #include <net/sock.h> 34 35 #include <net/pkt_sched.h>
+1
drivers/net/ipvlan/ipvlan_main.c
··· 3 3 */ 4 4 5 5 #include <linux/ethtool.h> 6 + #include <net/netdev_lock.h> 6 7 7 8 #include "ipvlan.h" 8 9
+1
drivers/net/loopback.c
··· 54 54 #include <linux/percpu.h> 55 55 #include <linux/net_tstamp.h> 56 56 #include <net/net_namespace.h> 57 + #include <net/netdev_lock.h> 57 58 #include <linux/u64_stats_sync.h> 58 59 59 60 /* blackhole_netdev - a device used for dsts that are marked expired!
+1
drivers/net/macsec.c
··· 19 19 #include <net/gro_cells.h> 20 20 #include <net/macsec.h> 21 21 #include <net/dst_metadata.h> 22 + #include <net/netdev_lock.h> 22 23 #include <linux/phy.h> 23 24 #include <linux/byteorder/generic.h> 24 25 #include <linux/if_arp.h>
+1
drivers/net/macvlan.c
··· 28 28 #include <linux/if_macvlan.h> 29 29 #include <linux/hash.h> 30 30 #include <linux/workqueue.h> 31 + #include <net/netdev_lock.h> 31 32 #include <net/rtnetlink.h> 32 33 #include <net/xfrm.h> 33 34 #include <linux/netpoll.h>
+1
drivers/net/netdevsim/netdev.c
··· 25 25 #include <net/page_pool/helpers.h> 26 26 #include <net/netlink.h> 27 27 #include <net/net_shaper.h> 28 + #include <net/netdev_lock.h> 28 29 #include <net/pkt_cls.h> 29 30 #include <net/rtnetlink.h> 30 31 #include <net/udp_tunnel.h>
+1
drivers/net/ppp/ppp_generic.c
··· 45 45 #include <linux/slab.h> 46 46 #include <linux/file.h> 47 47 #include <linux/unaligned.h> 48 + #include <net/netdev_lock.h> 48 49 #include <net/slhc_vj.h> 49 50 #include <linux/atomic.h> 50 51 #include <linux/refcount.h>
+1
drivers/net/team/team_core.c
··· 23 23 #include <linux/rtnetlink.h> 24 24 #include <net/rtnetlink.h> 25 25 #include <net/genetlink.h> 26 + #include <net/netdev_lock.h> 26 27 #include <net/netlink.h> 27 28 #include <net/sch_generic.h> 28 29 #include <linux/if_team.h>
+1
drivers/net/veth.c
··· 17 17 18 18 #include <net/rtnetlink.h> 19 19 #include <net/dst.h> 20 + #include <net/netdev_lock.h> 20 21 #include <net/xfrm.h> 21 22 #include <net/xdp.h> 22 23 #include <linux/veth.h>
+1
drivers/net/vrf.c
··· 34 34 #include <net/addrconf.h> 35 35 #include <net/l3mdev.h> 36 36 #include <net/fib_rules.h> 37 + #include <net/netdev_lock.h> 37 38 #include <net/sch_generic.h> 38 39 #include <net/netns/generic.h> 39 40 #include <net/netfilter/nf_conntrack.h>
+1
drivers/net/vxlan/vxlan_core.c
··· 25 25 #include <net/inet_ecn.h> 26 26 #include <net/net_namespace.h> 27 27 #include <net/netns/generic.h> 28 + #include <net/netdev_lock.h> 28 29 #include <net/tun_proto.h> 29 30 #include <net/vxlan.h> 30 31 #include <net/nexthop.h>
+1 -80
include/linux/netdevice.h
··· 2630 2630 f(dev, &dev->_tx[i], arg); 2631 2631 } 2632 2632 2633 - static inline int netdev_lock_cmp_fn(const struct lockdep_map *a, 2634 - const struct lockdep_map *b) 2635 - { 2636 - /* Only lower devices currently grab the instance lock, so no 2637 - * real ordering issues can occur. In the near future, only 2638 - * hardware devices will grab instance lock which also does not 2639 - * involve any ordering. Suppress lockdep ordering warnings 2640 - * until (if) we start grabbing instance lock on pure SW 2641 - * devices (bond/team/veth/etc). 2642 - */ 2643 - if (a == b) 2644 - return 0; 2645 - return -1; 2646 - } 2647 - 2648 - #define netdev_lockdep_set_classes(dev) \ 2649 - { \ 2650 - static struct lock_class_key qdisc_tx_busylock_key; \ 2651 - static struct lock_class_key qdisc_xmit_lock_key; \ 2652 - static struct lock_class_key dev_addr_list_lock_key; \ 2653 - static struct lock_class_key dev_instance_lock_key; \ 2654 - unsigned int i; \ 2655 - \ 2656 - (dev)->qdisc_tx_busylock = &qdisc_tx_busylock_key; \ 2657 - lockdep_set_class(&(dev)->addr_list_lock, \ 2658 - &dev_addr_list_lock_key); \ 2659 - lockdep_set_class(&(dev)->lock, \ 2660 - &dev_instance_lock_key); \ 2661 - lock_set_cmp_fn(&dev->lock, netdev_lock_cmp_fn, NULL); \ 2662 - for (i = 0; i < (dev)->num_tx_queues; i++) \ 2663 - lockdep_set_class(&(dev)->_tx[i]._xmit_lock, \ 2664 - &qdisc_xmit_lock_key); \ 2665 - } 2666 - 2667 2633 u16 netdev_pick_tx(struct net_device *dev, struct sk_buff *skb, 2668 2634 struct net_device *sb_dev); 2669 2635 struct netdev_queue *netdev_core_pick_tx(struct net_device *dev, ··· 2731 2765 mutex_lock(&dev->lock); 2732 2766 } 2733 2767 2734 - static inline bool netdev_trylock(struct net_device *dev) 2735 - { 2736 - return mutex_trylock(&dev->lock); 2737 - } 2738 - 2739 2768 static inline void netdev_unlock(struct net_device *dev) 2740 2769 { 2741 2770 mutex_unlock(&dev->lock); 2742 2771 } 2743 - 2744 - static inline void netdev_assert_locked(struct net_device *dev) 2745 - { 2746 - lockdep_assert_held(&dev->lock); 2747 - } 2748 - 2749 - static inline void netdev_assert_locked_or_invisible(struct net_device *dev) 2750 - { 2751 - if (dev->reg_state == NETREG_REGISTERED || 2752 - dev->reg_state == NETREG_UNREGISTERING) 2753 - netdev_assert_locked(dev); 2754 - } 2755 - 2756 - static inline bool netdev_need_ops_lock(struct net_device *dev) 2757 - { 2758 - bool ret = dev->request_ops_lock || !!dev->queue_mgmt_ops; 2759 - 2760 - #if IS_ENABLED(CONFIG_NET_SHAPER) 2761 - ret |= !!dev->netdev_ops->net_shaper_ops; 2762 - #endif 2763 - 2764 - return ret; 2765 - } 2766 - 2767 - static inline void netdev_lock_ops(struct net_device *dev) 2768 - { 2769 - if (netdev_need_ops_lock(dev)) 2770 - netdev_lock(dev); 2771 - } 2772 - 2773 - static inline void netdev_unlock_ops(struct net_device *dev) 2774 - { 2775 - if (netdev_need_ops_lock(dev)) 2776 - netdev_unlock(dev); 2777 - } 2778 - 2779 - static inline void netdev_ops_assert_locked(struct net_device *dev) 2780 - { 2781 - if (netdev_need_ops_lock(dev)) 2782 - lockdep_assert_held(&dev->lock); 2783 - } 2772 + /* Additional netdev_lock()-related helpers are in net/netdev_lock.h */ 2784 2773 2785 2774 void netif_napi_set_irq_locked(struct napi_struct *napi, int irq); 2786 2775
+89
include/net/netdev_lock.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 + 3 + #ifndef _NET_NETDEV_LOCK_H 4 + #define _NET_NETDEV_LOCK_H 5 + 6 + #include <linux/lockdep.h> 7 + #include <linux/netdevice.h> 8 + 9 + static inline bool netdev_trylock(struct net_device *dev) 10 + { 11 + return mutex_trylock(&dev->lock); 12 + } 13 + 14 + static inline void netdev_assert_locked(struct net_device *dev) 15 + { 16 + lockdep_assert_held(&dev->lock); 17 + } 18 + 19 + static inline void netdev_assert_locked_or_invisible(struct net_device *dev) 20 + { 21 + if (dev->reg_state == NETREG_REGISTERED || 22 + dev->reg_state == NETREG_UNREGISTERING) 23 + netdev_assert_locked(dev); 24 + } 25 + 26 + static inline bool netdev_need_ops_lock(struct net_device *dev) 27 + { 28 + bool ret = dev->request_ops_lock || !!dev->queue_mgmt_ops; 29 + 30 + #if IS_ENABLED(CONFIG_NET_SHAPER) 31 + ret |= !!dev->netdev_ops->net_shaper_ops; 32 + #endif 33 + 34 + return ret; 35 + } 36 + 37 + static inline void netdev_lock_ops(struct net_device *dev) 38 + { 39 + if (netdev_need_ops_lock(dev)) 40 + netdev_lock(dev); 41 + } 42 + 43 + static inline void netdev_unlock_ops(struct net_device *dev) 44 + { 45 + if (netdev_need_ops_lock(dev)) 46 + netdev_unlock(dev); 47 + } 48 + 49 + static inline void netdev_ops_assert_locked(struct net_device *dev) 50 + { 51 + if (netdev_need_ops_lock(dev)) 52 + lockdep_assert_held(&dev->lock); 53 + } 54 + 55 + static inline int netdev_lock_cmp_fn(const struct lockdep_map *a, 56 + const struct lockdep_map *b) 57 + { 58 + /* Only lower devices currently grab the instance lock, so no 59 + * real ordering issues can occur. In the near future, only 60 + * hardware devices will grab instance lock which also does not 61 + * involve any ordering. Suppress lockdep ordering warnings 62 + * until (if) we start grabbing instance lock on pure SW 63 + * devices (bond/team/veth/etc). 64 + */ 65 + if (a == b) 66 + return 0; 67 + return -1; 68 + } 69 + 70 + #define netdev_lockdep_set_classes(dev) \ 71 + { \ 72 + static struct lock_class_key qdisc_tx_busylock_key; \ 73 + static struct lock_class_key qdisc_xmit_lock_key; \ 74 + static struct lock_class_key dev_addr_list_lock_key; \ 75 + static struct lock_class_key dev_instance_lock_key; \ 76 + unsigned int i; \ 77 + \ 78 + (dev)->qdisc_tx_busylock = &qdisc_tx_busylock_key; \ 79 + lockdep_set_class(&(dev)->addr_list_lock, \ 80 + &dev_addr_list_lock_key); \ 81 + lockdep_set_class(&(dev)->lock, \ 82 + &dev_instance_lock_key); \ 83 + lock_set_cmp_fn(&dev->lock, netdev_lock_cmp_fn, NULL); \ 84 + for (i = 0; i < (dev)->num_tx_queues; i++) \ 85 + lockdep_set_class(&(dev)->_tx[i]._xmit_lock, \ 86 + &qdisc_xmit_lock_key); \ 87 + } 88 + 89 + #endif
+1
kernel/bpf/offload.c
··· 25 25 #include <linux/rhashtable.h> 26 26 #include <linux/rtnetlink.h> 27 27 #include <linux/rwsem.h> 28 + #include <net/netdev_lock.h> 28 29 #include <net/xdp.h> 29 30 30 31 /* Protects offdevs, members of bpf_offload_netdev and offload members
+1
net/8021q/vlan_dev.c
··· 27 27 #include <linux/phy.h> 28 28 #include <net/arp.h> 29 29 #include <net/macsec.h> 30 + #include <net/netdev_lock.h> 30 31 31 32 #include "vlan.h" 32 33 #include "vlanproc.h"
+1
net/bluetooth/6lowpan.c
··· 13 13 #include <net/ipv6.h> 14 14 #include <net/ip6_route.h> 15 15 #include <net/addrconf.h> 16 + #include <net/netdev_lock.h> 16 17 #include <net/pkt_sched.h> 17 18 18 19 #include <net/bluetooth/bluetooth.h>
+2
net/bridge/br_device.c
··· 16 16 #include <linux/netfilter_bridge.h> 17 17 18 18 #include <linux/uaccess.h> 19 + #include <net/netdev_lock.h> 20 + 19 21 #include "br_private.h" 20 22 21 23 #define COMMON_FEATURES (NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_HIGHDMA | \
+1
net/core/dev.c
··· 156 156 #include <linux/pm_runtime.h> 157 157 #include <linux/prandom.h> 158 158 #include <linux/once_lite.h> 159 + #include <net/netdev_lock.h> 159 160 #include <net/netdev_rx_queue.h> 160 161 #include <net/page_pool/types.h> 161 162 #include <net/page_pool/helpers.h>
+1
net/core/dev.h
··· 6 6 #include <linux/types.h> 7 7 #include <linux/rwsem.h> 8 8 #include <linux/netdevice.h> 9 + #include <net/netdev_lock.h> 9 10 10 11 struct net; 11 12 struct netlink_ext_ack;
+2
net/core/dev_api.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0-or-later 2 + 2 3 #include <linux/netdevice.h> 4 + #include <net/netdev_lock.h> 3 5 4 6 #include "dev.h" 5 7
+1
net/core/dev_ioctl.c
··· 10 10 #include <linux/wireless.h> 11 11 #include <linux/if_bridge.h> 12 12 #include <net/dsa_stubs.h> 13 + #include <net/netdev_lock.h> 13 14 #include <net/wext.h> 14 15 15 16 #include "dev.h"
+1
net/core/net-sysfs.c
··· 23 23 #include <linux/of.h> 24 24 #include <linux/of_net.h> 25 25 #include <linux/cpu.h> 26 + #include <net/netdev_lock.h> 26 27 #include <net/netdev_rx_queue.h> 27 28 #include <net/rps.h> 28 29
+1
net/core/rtnetlink.c
··· 53 53 #include <net/fib_rules.h> 54 54 #include <net/rtnetlink.h> 55 55 #include <net/net_namespace.h> 56 + #include <net/netdev_lock.h> 56 57 #include <net/devlink.h> 57 58 #if IS_ENABLED(CONFIG_IPV6) 58 59 #include <net/addrconf.h>
+1
net/dsa/conduit.c
··· 10 10 #include <linux/netdevice.h> 11 11 #include <linux/netlink.h> 12 12 #include <net/dsa.h> 13 + #include <net/netdev_lock.h> 13 14 14 15 #include "conduit.h" 15 16 #include "dsa.h"
+1
net/ethtool/cabletest.c
··· 2 2 3 3 #include <linux/phy.h> 4 4 #include <linux/ethtool_netlink.h> 5 + #include <net/netdev_lock.h> 5 6 #include "netlink.h" 6 7 #include "common.h" 7 8
+1
net/ethtool/cmis_fw_update.c
··· 2 2 3 3 #include <linux/ethtool.h> 4 4 #include <linux/firmware.h> 5 + #include <net/netdev_lock.h> 5 6 6 7 #include "common.h" 7 8 #include "module_fw.h"
+2
net/ethtool/features.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0-only 2 2 3 + #include <net/netdev_lock.h> 4 + 3 5 #include "netlink.h" 4 6 #include "common.h" 5 7 #include "bitset.h"
+1
net/ethtool/ioctl.c
··· 31 31 #include <net/ipv6.h> 32 32 #include <net/xdp_sock_drv.h> 33 33 #include <net/flow_offload.h> 34 + #include <net/netdev_lock.h> 34 35 #include <linux/ethtool_netlink.h> 35 36 #include "common.h" 36 37
+1
net/ethtool/module.c
··· 4 4 #include <linux/firmware.h> 5 5 #include <linux/sfp.h> 6 6 #include <net/devlink.h> 7 + #include <net/netdev_lock.h> 7 8 8 9 #include "netlink.h" 9 10 #include "common.h"
+1
net/ethtool/netlink.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0-only 2 2 3 + #include <net/netdev_lock.h> 3 4 #include <net/netdev_queues.h> 4 5 #include <net/sock.h> 5 6 #include <linux/ethtool_netlink.h>
+1
net/ethtool/phy.c
··· 9 9 #include <linux/phy.h> 10 10 #include <linux/phy_link_topology.h> 11 11 #include <linux/sfp.h> 12 + #include <net/netdev_lock.h> 12 13 13 14 struct phy_req_info { 14 15 struct ethnl_req_info base;
+2
net/ethtool/rss.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0-only 2 2 3 + #include <net/netdev_lock.h> 4 + 3 5 #include "netlink.h" 4 6 #include "common.h" 5 7
+1
net/ethtool/tsinfo.c
··· 4 4 #include <linux/phy.h> 5 5 #include <linux/phy_link_topology.h> 6 6 #include <linux/ptp_clock_kernel.h> 7 + #include <net/netdev_lock.h> 7 8 8 9 #include "netlink.h" 9 10 #include "common.h"
+1
net/ieee802154/6lowpan/core.c
··· 50 50 #include <linux/if_arp.h> 51 51 52 52 #include <net/ipv6.h> 53 + #include <net/netdev_lock.h> 53 54 54 55 #include "6lowpan_i.h" 55 56
+1
net/ipv4/ip_tunnel.c
··· 40 40 #include <net/xfrm.h> 41 41 #include <net/net_namespace.h> 42 42 #include <net/netns/generic.h> 43 + #include <net/netdev_lock.h> 43 44 #include <net/rtnetlink.h> 44 45 #include <net/udp.h> 45 46 #include <net/dst_metadata.h>
+1
net/ipv6/ip6_gre.c
··· 43 43 #include <net/xfrm.h> 44 44 #include <net/net_namespace.h> 45 45 #include <net/netns/generic.h> 46 + #include <net/netdev_lock.h> 46 47 #include <net/rtnetlink.h> 47 48 48 49 #include <net/ipv6.h>
+1
net/ipv6/ip6_tunnel.c
··· 52 52 #include <net/inet_ecn.h> 53 53 #include <net/net_namespace.h> 54 54 #include <net/netns/generic.h> 55 + #include <net/netdev_lock.h> 55 56 #include <net/dst_metadata.h> 56 57 #include <net/inet_dscp.h> 57 58
+1
net/ipv6/ip6_vti.c
··· 45 45 #include <net/xfrm.h> 46 46 #include <net/net_namespace.h> 47 47 #include <net/netns/generic.h> 48 + #include <net/netdev_lock.h> 48 49 #include <linux/etherdevice.h> 49 50 50 51 #define IP6_VTI_HASH_SIZE_SHIFT 5
+1
net/ipv6/sit.c
··· 51 51 #include <net/dsfield.h> 52 52 #include <net/net_namespace.h> 53 53 #include <net/netns/generic.h> 54 + #include <net/netdev_lock.h> 54 55 #include <net/inet_dscp.h> 55 56 56 57 /*
+1
net/l2tp/l2tp_eth.c
··· 25 25 #include <net/xfrm.h> 26 26 #include <net/net_namespace.h> 27 27 #include <net/netns/generic.h> 28 + #include <net/netdev_lock.h> 28 29 #include <linux/ip.h> 29 30 #include <linux/ipv6.h> 30 31 #include <linux/udp.h>
+1
net/sched/sch_api.c
··· 26 26 #include <linux/slab.h> 27 27 #include <linux/hashtable.h> 28 28 29 + #include <net/netdev_lock.h> 29 30 #include <net/net_namespace.h> 30 31 #include <net/sock.h> 31 32 #include <net/netlink.h>
+1
net/xdp/xsk.c
··· 25 25 #include <linux/vmalloc.h> 26 26 #include <net/xdp_sock_drv.h> 27 27 #include <net/busy_poll.h> 28 + #include <net/netdev_lock.h> 28 29 #include <net/netdev_rx_queue.h> 29 30 #include <net/xdp.h> 30 31
+1
net/xdp/xsk_buff_pool.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0 2 2 3 3 #include <linux/netdevice.h> 4 + #include <net/netdev_lock.h> 4 5 #include <net/xsk_buff_pool.h> 5 6 #include <net/xdp_sock.h> 6 7 #include <net/xdp_sock_drv.h>