diff options
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 10 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/fm10k/fm10k_pci.c | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | 10 | ||||
-rw-r--r-- | drivers/net/geneve.c | 31 | ||||
-rw-r--r-- | drivers/net/vxlan.c | 14 | ||||
-rw-r--r-- | include/linux/netdevice.h | 2 | ||||
-rw-r--r-- | include/net/geneve.h | 6 | ||||
-rw-r--r-- | include/net/vxlan.h | 6 |
10 files changed, 63 insertions, 22 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index 536686476369..ed98ef1ecac3 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
@@ -4890,11 +4890,13 @@ static int be_resume(struct be_adapter *adapter) | |||
4890 | if (status) | 4890 | if (status) |
4891 | return status; | 4891 | return status; |
4892 | 4892 | ||
4893 | if (netif_running(netdev)) { | 4893 | rtnl_lock(); |
4894 | if (netif_running(netdev)) | ||
4894 | status = be_open(netdev); | 4895 | status = be_open(netdev); |
4895 | if (status) | 4896 | rtnl_unlock(); |
4896 | return status; | 4897 | |
4897 | } | 4898 | if (status) |
4899 | return status; | ||
4898 | 4900 | ||
4899 | netif_device_attach(netdev); | 4901 | netif_device_attach(netdev); |
4900 | 4902 | ||
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_pci.c b/drivers/net/ethernet/intel/fm10k/fm10k_pci.c index 404f47ae14b6..206a466999ed 100644 --- a/drivers/net/ethernet/intel/fm10k/fm10k_pci.c +++ b/drivers/net/ethernet/intel/fm10k/fm10k_pci.c | |||
@@ -2287,8 +2287,10 @@ static void fm10k_io_resume(struct pci_dev *pdev) | |||
2287 | /* reassociate interrupts */ | 2287 | /* reassociate interrupts */ |
2288 | fm10k_mbx_request_irq(interface); | 2288 | fm10k_mbx_request_irq(interface); |
2289 | 2289 | ||
2290 | rtnl_lock(); | ||
2290 | if (netif_running(netdev)) | 2291 | if (netif_running(netdev)) |
2291 | err = fm10k_open(netdev); | 2292 | err = fm10k_open(netdev); |
2293 | rtnl_unlock(); | ||
2292 | 2294 | ||
2293 | /* final check of hardware state before registering the interface */ | 2295 | /* final check of hardware state before registering the interface */ |
2294 | err = err ? : fm10k_hw_ready(interface); | 2296 | err = err ? : fm10k_hw_ready(interface); |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index 2976df77bf14..b2f2cf40f06a 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | |||
@@ -7192,10 +7192,12 @@ static void ixgbe_service_task(struct work_struct *work) | |||
7192 | return; | 7192 | return; |
7193 | } | 7193 | } |
7194 | #ifdef CONFIG_IXGBE_VXLAN | 7194 | #ifdef CONFIG_IXGBE_VXLAN |
7195 | rtnl_lock(); | ||
7195 | if (adapter->flags2 & IXGBE_FLAG2_VXLAN_REREG_NEEDED) { | 7196 | if (adapter->flags2 & IXGBE_FLAG2_VXLAN_REREG_NEEDED) { |
7196 | adapter->flags2 &= ~IXGBE_FLAG2_VXLAN_REREG_NEEDED; | 7197 | adapter->flags2 &= ~IXGBE_FLAG2_VXLAN_REREG_NEEDED; |
7197 | vxlan_get_rx_port(adapter->netdev); | 7198 | vxlan_get_rx_port(adapter->netdev); |
7198 | } | 7199 | } |
7200 | rtnl_unlock(); | ||
7199 | #endif /* CONFIG_IXGBE_VXLAN */ | 7201 | #endif /* CONFIG_IXGBE_VXLAN */ |
7200 | ixgbe_reset_subtask(adapter); | 7202 | ixgbe_reset_subtask(adapter); |
7201 | ixgbe_phy_interrupt_subtask(adapter); | 7203 | ixgbe_phy_interrupt_subtask(adapter); |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c index b4b258c8ca47..8bd143dda95d 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c | |||
@@ -1856,6 +1856,7 @@ static void mlx4_en_restart(struct work_struct *work) | |||
1856 | 1856 | ||
1857 | en_dbg(DRV, priv, "Watchdog task called for port %d\n", priv->port); | 1857 | en_dbg(DRV, priv, "Watchdog task called for port %d\n", priv->port); |
1858 | 1858 | ||
1859 | rtnl_lock(); | ||
1859 | mutex_lock(&mdev->state_lock); | 1860 | mutex_lock(&mdev->state_lock); |
1860 | if (priv->port_up) { | 1861 | if (priv->port_up) { |
1861 | mlx4_en_stop_port(dev, 1); | 1862 | mlx4_en_stop_port(dev, 1); |
@@ -1863,6 +1864,7 @@ static void mlx4_en_restart(struct work_struct *work) | |||
1863 | en_err(priv, "Failed restarting port %d\n", priv->port); | 1864 | en_err(priv, "Failed restarting port %d\n", priv->port); |
1864 | } | 1865 | } |
1865 | mutex_unlock(&mdev->state_lock); | 1866 | mutex_unlock(&mdev->state_lock); |
1867 | rtnl_unlock(); | ||
1866 | } | 1868 | } |
1867 | 1869 | ||
1868 | static void mlx4_en_clear_stats(struct net_device *dev) | 1870 | static void mlx4_en_clear_stats(struct net_device *dev) |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c index 1205f6f9c941..1c29105b6c36 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | |||
@@ -3952,8 +3952,14 @@ static pci_ers_result_t qlcnic_82xx_io_error_detected(struct pci_dev *pdev, | |||
3952 | 3952 | ||
3953 | static pci_ers_result_t qlcnic_82xx_io_slot_reset(struct pci_dev *pdev) | 3953 | static pci_ers_result_t qlcnic_82xx_io_slot_reset(struct pci_dev *pdev) |
3954 | { | 3954 | { |
3955 | return qlcnic_attach_func(pdev) ? PCI_ERS_RESULT_DISCONNECT : | 3955 | pci_ers_result_t res; |
3956 | PCI_ERS_RESULT_RECOVERED; | 3956 | |
3957 | rtnl_lock(); | ||
3958 | res = qlcnic_attach_func(pdev) ? PCI_ERS_RESULT_DISCONNECT : | ||
3959 | PCI_ERS_RESULT_RECOVERED; | ||
3960 | rtnl_unlock(); | ||
3961 | |||
3962 | return res; | ||
3957 | } | 3963 | } |
3958 | 3964 | ||
3959 | static void qlcnic_82xx_io_resume(struct pci_dev *pdev) | 3965 | static void qlcnic_82xx_io_resume(struct pci_dev *pdev) |
diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c index 512dbe013713..9c40b88fabd5 100644 --- a/drivers/net/geneve.c +++ b/drivers/net/geneve.c | |||
@@ -1172,7 +1172,7 @@ static struct device_type geneve_type = { | |||
1172 | * supply the listening GENEVE udp ports. Callers are expected | 1172 | * supply the listening GENEVE udp ports. Callers are expected |
1173 | * to implement the ndo_add_geneve_port. | 1173 | * to implement the ndo_add_geneve_port. |
1174 | */ | 1174 | */ |
1175 | void geneve_get_rx_port(struct net_device *dev) | 1175 | static void geneve_push_rx_ports(struct net_device *dev) |
1176 | { | 1176 | { |
1177 | struct net *net = dev_net(dev); | 1177 | struct net *net = dev_net(dev); |
1178 | struct geneve_net *gn = net_generic(net, geneve_net_id); | 1178 | struct geneve_net *gn = net_generic(net, geneve_net_id); |
@@ -1181,6 +1181,9 @@ void geneve_get_rx_port(struct net_device *dev) | |||
1181 | struct sock *sk; | 1181 | struct sock *sk; |
1182 | __be16 port; | 1182 | __be16 port; |
1183 | 1183 | ||
1184 | if (!dev->netdev_ops->ndo_add_geneve_port) | ||
1185 | return; | ||
1186 | |||
1184 | rcu_read_lock(); | 1187 | rcu_read_lock(); |
1185 | list_for_each_entry_rcu(gs, &gn->sock_list, list) { | 1188 | list_for_each_entry_rcu(gs, &gn->sock_list, list) { |
1186 | sk = gs->sock->sk; | 1189 | sk = gs->sock->sk; |
@@ -1190,7 +1193,6 @@ void geneve_get_rx_port(struct net_device *dev) | |||
1190 | } | 1193 | } |
1191 | rcu_read_unlock(); | 1194 | rcu_read_unlock(); |
1192 | } | 1195 | } |
1193 | EXPORT_SYMBOL_GPL(geneve_get_rx_port); | ||
1194 | 1196 | ||
1195 | /* Initialize the device structure. */ | 1197 | /* Initialize the device structure. */ |
1196 | static void geneve_setup(struct net_device *dev) | 1198 | static void geneve_setup(struct net_device *dev) |
@@ -1538,6 +1540,21 @@ struct net_device *geneve_dev_create_fb(struct net *net, const char *name, | |||
1538 | } | 1540 | } |
1539 | EXPORT_SYMBOL_GPL(geneve_dev_create_fb); | 1541 | EXPORT_SYMBOL_GPL(geneve_dev_create_fb); |
1540 | 1542 | ||
1543 | static int geneve_netdevice_event(struct notifier_block *unused, | ||
1544 | unsigned long event, void *ptr) | ||
1545 | { | ||
1546 | struct net_device *dev = netdev_notifier_info_to_dev(ptr); | ||
1547 | |||
1548 | if (event == NETDEV_OFFLOAD_PUSH_GENEVE) | ||
1549 | geneve_push_rx_ports(dev); | ||
1550 | |||
1551 | return NOTIFY_DONE; | ||
1552 | } | ||
1553 | |||
1554 | static struct notifier_block geneve_notifier_block __read_mostly = { | ||
1555 | .notifier_call = geneve_netdevice_event, | ||
1556 | }; | ||
1557 | |||
1541 | static __net_init int geneve_init_net(struct net *net) | 1558 | static __net_init int geneve_init_net(struct net *net) |
1542 | { | 1559 | { |
1543 | struct geneve_net *gn = net_generic(net, geneve_net_id); | 1560 | struct geneve_net *gn = net_generic(net, geneve_net_id); |
@@ -1590,11 +1607,18 @@ static int __init geneve_init_module(void) | |||
1590 | if (rc) | 1607 | if (rc) |
1591 | goto out1; | 1608 | goto out1; |
1592 | 1609 | ||
1593 | rc = rtnl_link_register(&geneve_link_ops); | 1610 | rc = register_netdevice_notifier(&geneve_notifier_block); |
1594 | if (rc) | 1611 | if (rc) |
1595 | goto out2; | 1612 | goto out2; |
1596 | 1613 | ||
1614 | rc = rtnl_link_register(&geneve_link_ops); | ||
1615 | if (rc) | ||
1616 | goto out3; | ||
1617 | |||
1597 | return 0; | 1618 | return 0; |
1619 | |||
1620 | out3: | ||
1621 | unregister_netdevice_notifier(&geneve_notifier_block); | ||
1598 | out2: | 1622 | out2: |
1599 | unregister_pernet_subsys(&geneve_net_ops); | 1623 | unregister_pernet_subsys(&geneve_net_ops); |
1600 | out1: | 1624 | out1: |
@@ -1605,6 +1629,7 @@ late_initcall(geneve_init_module); | |||
1605 | static void __exit geneve_cleanup_module(void) | 1629 | static void __exit geneve_cleanup_module(void) |
1606 | { | 1630 | { |
1607 | rtnl_link_unregister(&geneve_link_ops); | 1631 | rtnl_link_unregister(&geneve_link_ops); |
1632 | unregister_netdevice_notifier(&geneve_notifier_block); | ||
1608 | unregister_pernet_subsys(&geneve_net_ops); | 1633 | unregister_pernet_subsys(&geneve_net_ops); |
1609 | } | 1634 | } |
1610 | module_exit(geneve_cleanup_module); | 1635 | module_exit(geneve_cleanup_module); |
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index c2e22c2532a1..6fb93b57a724 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c | |||
@@ -2527,7 +2527,7 @@ static struct device_type vxlan_type = { | |||
2527 | * supply the listening VXLAN udp ports. Callers are expected | 2527 | * supply the listening VXLAN udp ports. Callers are expected |
2528 | * to implement the ndo_add_vxlan_port. | 2528 | * to implement the ndo_add_vxlan_port. |
2529 | */ | 2529 | */ |
2530 | void vxlan_get_rx_port(struct net_device *dev) | 2530 | static void vxlan_push_rx_ports(struct net_device *dev) |
2531 | { | 2531 | { |
2532 | struct vxlan_sock *vs; | 2532 | struct vxlan_sock *vs; |
2533 | struct net *net = dev_net(dev); | 2533 | struct net *net = dev_net(dev); |
@@ -2536,6 +2536,9 @@ void vxlan_get_rx_port(struct net_device *dev) | |||
2536 | __be16 port; | 2536 | __be16 port; |
2537 | unsigned int i; | 2537 | unsigned int i; |
2538 | 2538 | ||
2539 | if (!dev->netdev_ops->ndo_add_vxlan_port) | ||
2540 | return; | ||
2541 | |||
2539 | spin_lock(&vn->sock_lock); | 2542 | spin_lock(&vn->sock_lock); |
2540 | for (i = 0; i < PORT_HASH_SIZE; ++i) { | 2543 | for (i = 0; i < PORT_HASH_SIZE; ++i) { |
2541 | hlist_for_each_entry_rcu(vs, &vn->sock_list[i], hlist) { | 2544 | hlist_for_each_entry_rcu(vs, &vn->sock_list[i], hlist) { |
@@ -2547,7 +2550,6 @@ void vxlan_get_rx_port(struct net_device *dev) | |||
2547 | } | 2550 | } |
2548 | spin_unlock(&vn->sock_lock); | 2551 | spin_unlock(&vn->sock_lock); |
2549 | } | 2552 | } |
2550 | EXPORT_SYMBOL_GPL(vxlan_get_rx_port); | ||
2551 | 2553 | ||
2552 | /* Initialize the device structure. */ | 2554 | /* Initialize the device structure. */ |
2553 | static void vxlan_setup(struct net_device *dev) | 2555 | static void vxlan_setup(struct net_device *dev) |
@@ -3283,20 +3285,22 @@ static void vxlan_handle_lowerdev_unregister(struct vxlan_net *vn, | |||
3283 | unregister_netdevice_many(&list_kill); | 3285 | unregister_netdevice_many(&list_kill); |
3284 | } | 3286 | } |
3285 | 3287 | ||
3286 | static int vxlan_lowerdev_event(struct notifier_block *unused, | 3288 | static int vxlan_netdevice_event(struct notifier_block *unused, |
3287 | unsigned long event, void *ptr) | 3289 | unsigned long event, void *ptr) |
3288 | { | 3290 | { |
3289 | struct net_device *dev = netdev_notifier_info_to_dev(ptr); | 3291 | struct net_device *dev = netdev_notifier_info_to_dev(ptr); |
3290 | struct vxlan_net *vn = net_generic(dev_net(dev), vxlan_net_id); | 3292 | struct vxlan_net *vn = net_generic(dev_net(dev), vxlan_net_id); |
3291 | 3293 | ||
3292 | if (event == NETDEV_UNREGISTER) | 3294 | if (event == NETDEV_UNREGISTER) |
3293 | vxlan_handle_lowerdev_unregister(vn, dev); | 3295 | vxlan_handle_lowerdev_unregister(vn, dev); |
3296 | else if (event == NETDEV_OFFLOAD_PUSH_VXLAN) | ||
3297 | vxlan_push_rx_ports(dev); | ||
3294 | 3298 | ||
3295 | return NOTIFY_DONE; | 3299 | return NOTIFY_DONE; |
3296 | } | 3300 | } |
3297 | 3301 | ||
3298 | static struct notifier_block vxlan_notifier_block __read_mostly = { | 3302 | static struct notifier_block vxlan_notifier_block __read_mostly = { |
3299 | .notifier_call = vxlan_lowerdev_event, | 3303 | .notifier_call = vxlan_netdevice_event, |
3300 | }; | 3304 | }; |
3301 | 3305 | ||
3302 | static __net_init int vxlan_init_net(struct net *net) | 3306 | static __net_init int vxlan_init_net(struct net *net) |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index a3bb534576a3..1f6d5db471a2 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -2244,6 +2244,8 @@ struct netdev_lag_lower_state_info { | |||
2244 | #define NETDEV_BONDING_INFO 0x0019 | 2244 | #define NETDEV_BONDING_INFO 0x0019 |
2245 | #define NETDEV_PRECHANGEUPPER 0x001A | 2245 | #define NETDEV_PRECHANGEUPPER 0x001A |
2246 | #define NETDEV_CHANGELOWERSTATE 0x001B | 2246 | #define NETDEV_CHANGELOWERSTATE 0x001B |
2247 | #define NETDEV_OFFLOAD_PUSH_VXLAN 0x001C | ||
2248 | #define NETDEV_OFFLOAD_PUSH_GENEVE 0x001D | ||
2247 | 2249 | ||
2248 | int register_netdevice_notifier(struct notifier_block *nb); | 2250 | int register_netdevice_notifier(struct notifier_block *nb); |
2249 | int unregister_netdevice_notifier(struct notifier_block *nb); | 2251 | int unregister_netdevice_notifier(struct notifier_block *nb); |
diff --git a/include/net/geneve.h b/include/net/geneve.h index e6c23dc765f7..cb544a530146 100644 --- a/include/net/geneve.h +++ b/include/net/geneve.h | |||
@@ -62,13 +62,11 @@ struct genevehdr { | |||
62 | struct geneve_opt options[]; | 62 | struct geneve_opt options[]; |
63 | }; | 63 | }; |
64 | 64 | ||
65 | #if IS_ENABLED(CONFIG_GENEVE) | ||
66 | void geneve_get_rx_port(struct net_device *netdev); | ||
67 | #else | ||
68 | static inline void geneve_get_rx_port(struct net_device *netdev) | 65 | static inline void geneve_get_rx_port(struct net_device *netdev) |
69 | { | 66 | { |
67 | ASSERT_RTNL(); | ||
68 | call_netdevice_notifiers(NETDEV_OFFLOAD_PUSH_GENEVE, netdev); | ||
70 | } | 69 | } |
71 | #endif | ||
72 | 70 | ||
73 | #ifdef CONFIG_INET | 71 | #ifdef CONFIG_INET |
74 | struct net_device *geneve_dev_create_fb(struct net *net, const char *name, | 72 | struct net_device *geneve_dev_create_fb(struct net *net, const char *name, |
diff --git a/include/net/vxlan.h b/include/net/vxlan.h index d442eb3129cd..673e9f9e6da7 100644 --- a/include/net/vxlan.h +++ b/include/net/vxlan.h | |||
@@ -390,13 +390,11 @@ static inline __be32 vxlan_compute_rco(unsigned int start, unsigned int offset) | |||
390 | return vni_field; | 390 | return vni_field; |
391 | } | 391 | } |
392 | 392 | ||
393 | #if IS_ENABLED(CONFIG_VXLAN) | ||
394 | void vxlan_get_rx_port(struct net_device *netdev); | ||
395 | #else | ||
396 | static inline void vxlan_get_rx_port(struct net_device *netdev) | 393 | static inline void vxlan_get_rx_port(struct net_device *netdev) |
397 | { | 394 | { |
395 | ASSERT_RTNL(); | ||
396 | call_netdevice_notifiers(NETDEV_OFFLOAD_PUSH_VXLAN, netdev); | ||
398 | } | 397 | } |
399 | #endif | ||
400 | 398 | ||
401 | static inline unsigned short vxlan_get_sk_family(struct vxlan_sock *vs) | 399 | static inline unsigned short vxlan_get_sk_family(struct vxlan_sock *vs) |
402 | { | 400 | { |