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

netdev: Handle ->addr_list_lock just like ->_xmit_lock for lockdep.

The new address list lock needs to handle the same device layering
issues that the _xmit_lock one does.

This integrates work done by Patrick McHardy.

Signed-off-by: David S. Miller <davem@davemloft.net>

+40 -6
+3
drivers/net/bonding/bond_main.c
··· 5041 5041 } 5042 5042 5043 5043 static struct lock_class_key bonding_netdev_xmit_lock_key; 5044 + static struct lock_class_key bonding_netdev_addr_lock_key; 5044 5045 5045 5046 static void bond_set_lockdep_class_one(struct net_device *dev, 5046 5047 struct netdev_queue *txq, ··· 5053 5052 5054 5053 static void bond_set_lockdep_class(struct net_device *dev) 5055 5054 { 5055 + lockdep_set_class(&dev->addr_list_lock, 5056 + &bonding_netdev_addr_lock_key); 5056 5057 netdev_for_each_tx_queue(dev, bond_set_lockdep_class_one, NULL); 5057 5058 } 5058 5059
+2
drivers/net/hamradio/bpqether.c
··· 123 123 * off into a separate class since they always nest. 124 124 */ 125 125 static struct lock_class_key bpq_netdev_xmit_lock_key; 126 + static struct lock_class_key bpq_netdev_addr_lock_key; 126 127 127 128 static void bpq_set_lockdep_class_one(struct net_device *dev, 128 129 struct netdev_queue *txq, ··· 134 133 135 134 static void bpq_set_lockdep_class(struct net_device *dev) 136 135 { 136 + lockdep_set_class(&dev->addr_list_lock, &bpq_netdev_addr_lock_key); 137 137 netdev_for_each_tx_queue(dev, bpq_set_lockdep_class_one, NULL); 138 138 } 139 139
+3
drivers/net/macvlan.c
··· 276 276 * separate class since they always nest. 277 277 */ 278 278 static struct lock_class_key macvlan_netdev_xmit_lock_key; 279 + static struct lock_class_key macvlan_netdev_addr_lock_key; 279 280 280 281 #define MACVLAN_FEATURES \ 281 282 (NETIF_F_SG | NETIF_F_ALL_CSUM | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST | \ ··· 296 295 297 296 static void macvlan_set_lockdep_class(struct net_device *dev) 298 297 { 298 + lockdep_set_class(&dev->addr_list_lock, 299 + &macvlan_netdev_addr_lock_key); 299 300 netdev_for_each_tx_queue(dev, macvlan_set_lockdep_class_one, NULL); 300 301 } 301 302
+3
drivers/net/wireless/hostap/hostap_hw.c
··· 3101 3101 * This is a natural nesting, which needs a split lock type. 3102 3102 */ 3103 3103 static struct lock_class_key hostap_netdev_xmit_lock_key; 3104 + static struct lock_class_key hostap_netdev_addr_lock_key; 3104 3105 3105 3106 static void prism2_set_lockdep_class_one(struct net_device *dev, 3106 3107 struct netdev_queue *txq, ··· 3113 3112 3114 3113 static void prism2_set_lockdep_class(struct net_device *dev) 3115 3114 { 3115 + lockdep_set_class(&dev->addr_list_lock, 3116 + &hostap_netdev_addr_lock_key); 3116 3117 netdev_for_each_tx_queue(dev, prism2_set_lockdep_class_one, NULL); 3117 3118 } 3118 3119
+4
net/8021q/vlan_dev.c
··· 569 569 * separate class since they always nest. 570 570 */ 571 571 static struct lock_class_key vlan_netdev_xmit_lock_key; 572 + static struct lock_class_key vlan_netdev_addr_lock_key; 572 573 573 574 static void vlan_dev_set_lockdep_one(struct net_device *dev, 574 575 struct netdev_queue *txq, ··· 582 581 583 582 static void vlan_dev_set_lockdep_class(struct net_device *dev, int subclass) 584 583 { 584 + lockdep_set_class_and_subclass(&dev->addr_list_lock, 585 + &vlan_netdev_addr_lock_key, 586 + subclass); 585 587 netdev_for_each_tx_queue(dev, vlan_dev_set_lockdep_one, &subclass); 586 588 } 587 589
+21 -6
net/core/dev.c
··· 261 261 262 262 DEFINE_PER_CPU(struct softnet_data, softnet_data); 263 263 264 - #ifdef CONFIG_DEBUG_LOCK_ALLOC 264 + #ifdef CONFIG_LOCKDEP 265 265 /* 266 266 * register_netdevice() inits txq->_xmit_lock and sets lockdep class 267 267 * according to dev->type ··· 301 301 "_xmit_NONE"}; 302 302 303 303 static struct lock_class_key netdev_xmit_lock_key[ARRAY_SIZE(netdev_lock_type)]; 304 + static struct lock_class_key netdev_addr_lock_key[ARRAY_SIZE(netdev_lock_type)]; 304 305 305 306 static inline unsigned short netdev_lock_pos(unsigned short dev_type) 306 307 { ··· 314 313 return ARRAY_SIZE(netdev_lock_type) - 1; 315 314 } 316 315 317 - static inline void netdev_set_lockdep_class(spinlock_t *lock, 318 - unsigned short dev_type) 316 + static inline void netdev_set_xmit_lockdep_class(spinlock_t *lock, 317 + unsigned short dev_type) 319 318 { 320 319 int i; 321 320 ··· 323 322 lockdep_set_class_and_name(lock, &netdev_xmit_lock_key[i], 324 323 netdev_lock_name[i]); 325 324 } 325 + 326 + static inline void netdev_set_addr_lockdep_class(struct net_device *dev) 327 + { 328 + int i; 329 + 330 + i = netdev_lock_pos(dev->type); 331 + lockdep_set_class_and_name(&dev->addr_list_lock, 332 + &netdev_addr_lock_key[i], 333 + netdev_lock_name[i]); 334 + } 326 335 #else 327 - static inline void netdev_set_lockdep_class(spinlock_t *lock, 328 - unsigned short dev_type) 336 + static inline void netdev_set_xmit_lockdep_class(spinlock_t *lock, 337 + unsigned short dev_type) 338 + { 339 + } 340 + static inline void netdev_set_addr_lockdep_class(struct net_device *dev) 329 341 { 330 342 } 331 343 #endif ··· 3865 3851 void *_unused) 3866 3852 { 3867 3853 spin_lock_init(&dev_queue->_xmit_lock); 3868 - netdev_set_lockdep_class(&dev_queue->_xmit_lock, dev->type); 3854 + netdev_set_xmit_lockdep_class(&dev_queue->_xmit_lock, dev->type); 3869 3855 dev_queue->xmit_lock_owner = -1; 3870 3856 } 3871 3857 ··· 3910 3896 net = dev_net(dev); 3911 3897 3912 3898 spin_lock_init(&dev->addr_list_lock); 3899 + netdev_set_addr_lockdep_class(dev); 3913 3900 netdev_init_queue_locks(dev); 3914 3901 3915 3902 dev->iflink = -1;
+2
net/netrom/af_netrom.c
··· 73 73 * separate class since they always nest. 74 74 */ 75 75 static struct lock_class_key nr_netdev_xmit_lock_key; 76 + static struct lock_class_key nr_netdev_addr_lock_key; 76 77 77 78 static void nr_set_lockdep_one(struct net_device *dev, 78 79 struct netdev_queue *txq, ··· 84 83 85 84 static void nr_set_lockdep_key(struct net_device *dev) 86 85 { 86 + lockdep_set_class(&dev->addr_list_lock, &nr_netdev_addr_lock_key); 87 87 netdev_for_each_tx_queue(dev, nr_set_lockdep_one, NULL); 88 88 } 89 89
+2
net/rose/af_rose.c
··· 74 74 * separate class since they always nest. 75 75 */ 76 76 static struct lock_class_key rose_netdev_xmit_lock_key; 77 + static struct lock_class_key rose_netdev_addr_lock_key; 77 78 78 79 static void rose_set_lockdep_one(struct net_device *dev, 79 80 struct netdev_queue *txq, ··· 85 84 86 85 static void rose_set_lockdep_key(struct net_device *dev) 87 86 { 87 + lockdep_set_class(&dev->addr_list_lock, &rose_netdev_addr_lock_key); 88 88 netdev_for_each_tx_queue(dev, rose_set_lockdep_one, NULL); 89 89 } 90 90