aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/emulex/benet/be_main.c10
-rw-r--r--drivers/net/ethernet/intel/fm10k/fm10k_pci.c2
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe_main.c2
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_netdev.c2
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c10
-rw-r--r--drivers/net/geneve.c31
-rw-r--r--drivers/net/vxlan.c14
-rw-r--r--include/linux/netdevice.h2
-rw-r--r--include/net/geneve.h6
-rw-r--r--include/net/vxlan.h6
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
1868static void mlx4_en_clear_stats(struct net_device *dev) 1870static 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
3953static pci_ers_result_t qlcnic_82xx_io_slot_reset(struct pci_dev *pdev) 3953static 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
3959static void qlcnic_82xx_io_resume(struct pci_dev *pdev) 3965static 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 */
1175void geneve_get_rx_port(struct net_device *dev) 1175static 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}
1193EXPORT_SYMBOL_GPL(geneve_get_rx_port);
1194 1196
1195/* Initialize the device structure. */ 1197/* Initialize the device structure. */
1196static void geneve_setup(struct net_device *dev) 1198static 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}
1539EXPORT_SYMBOL_GPL(geneve_dev_create_fb); 1541EXPORT_SYMBOL_GPL(geneve_dev_create_fb);
1540 1542
1543static 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
1554static struct notifier_block geneve_notifier_block __read_mostly = {
1555 .notifier_call = geneve_netdevice_event,
1556};
1557
1541static __net_init int geneve_init_net(struct net *net) 1558static __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
1620out3:
1621 unregister_netdevice_notifier(&geneve_notifier_block);
1598out2: 1622out2:
1599 unregister_pernet_subsys(&geneve_net_ops); 1623 unregister_pernet_subsys(&geneve_net_ops);
1600out1: 1624out1:
@@ -1605,6 +1629,7 @@ late_initcall(geneve_init_module);
1605static void __exit geneve_cleanup_module(void) 1629static 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}
1610module_exit(geneve_cleanup_module); 1635module_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 */
2530void vxlan_get_rx_port(struct net_device *dev) 2530static 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}
2550EXPORT_SYMBOL_GPL(vxlan_get_rx_port);
2551 2553
2552/* Initialize the device structure. */ 2554/* Initialize the device structure. */
2553static void vxlan_setup(struct net_device *dev) 2555static 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
3286static int vxlan_lowerdev_event(struct notifier_block *unused, 3288static 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
3298static struct notifier_block vxlan_notifier_block __read_mostly = { 3302static struct notifier_block vxlan_notifier_block __read_mostly = {
3299 .notifier_call = vxlan_lowerdev_event, 3303 .notifier_call = vxlan_netdevice_event,
3300}; 3304};
3301 3305
3302static __net_init int vxlan_init_net(struct net *net) 3306static __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
2248int register_netdevice_notifier(struct notifier_block *nb); 2250int register_netdevice_notifier(struct notifier_block *nb);
2249int unregister_netdevice_notifier(struct notifier_block *nb); 2251int 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)
66void geneve_get_rx_port(struct net_device *netdev);
67#else
68static inline void geneve_get_rx_port(struct net_device *netdev) 65static 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
74struct net_device *geneve_dev_create_fb(struct net *net, const char *name, 72struct 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)
394void vxlan_get_rx_port(struct net_device *netdev);
395#else
396static inline void vxlan_get_rx_port(struct net_device *netdev) 393static 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
401static inline unsigned short vxlan_get_sk_family(struct vxlan_sock *vs) 399static inline unsigned short vxlan_get_sk_family(struct vxlan_sock *vs)
402{ 400{