aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2016-04-21 15:36:04 -0400
committerDavid S. Miller <davem@davemloft.net>2016-04-21 15:36:04 -0400
commit22d37b6b0058365a80378ee6198d21e7f6c86327 (patch)
treedfb1140e166ecf89f994f667e0cb9e73969845e8
parent7f348a60762afd4cd0e4e7fa14cfa66331b7c30e (diff)
parent681e683ff30ada19f73c17c38a528528dd8824f1 (diff)
Merge branch 'geneve-vxlan-deps'
Hannes Frederic Sowa says: ==================== net: network drivers should not depend on geneve/vxlan This patchset removes the dependency of network drivers on vxlan or geneve, so those don't get autoloaded when the nic driver is loaded. Also audited the code such that vxlan_get_rx_port and geneve_get_rx_port are not called without rtnl lock. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-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{