All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net-next v5 00/10] net: break dependency of drivers on geneve and vxlan
@ 2016-01-11 12:17 Hannes Frederic Sowa
  2016-01-11 12:17 ` [PATCH net-next v5 01/10] qlcnic: protect qlcnic_82xx_io_slot_reset with rtnl lock Hannes Frederic Sowa
                   ` (10 more replies)
  0 siblings, 11 replies; 13+ messages in thread
From: Hannes Frederic Sowa @ 2016-01-11 12:17 UTC (permalink / raw)
  To: netdev; +Cc: jesse

Device drivers which support geneve or vxlan offloading have a dependency
on the correlating tunnel kernel modules. Thus those drivers automatically
load the geneve or vxlan modules. Break this dependency with this
small series.

Additionally this series features a review of the respective ->ndo_open
and other functions around vxlan_get_rx_port and geneve_get_rx_port.

* Result:
$ cd drivers/net/ethernet/
$ find . -name '*.ko' | xargs modinfo | egrep  '^depends:.*(vxlan|geneve)'  | wc -l
0

I also incorporated feedback from Jesse Gross to only use one new
netdevice notifiers type, namely NETDEV_REFRESH_OFFLOADS. Otherwise this
series is very much the same as v1.

This series (v4) incorperates further feedback from Jesse Gross:
* before calling down to the ndo_add_{vxlan,geneve}_port, check if the
  driver has actually installed the function
* provide only one callback function, namely netdev_refresh_offloads
* provide updates to the comments in netdevice.h how driver should handle
  those functions

This series (v5) only fixes a typo noticed by Florian Westphal:
* rtnl_lock -> rtnl_unlock

Furthermore, I know I send this after net-next closed. I just try to send
it again in the hope that DaveM just let it slip through as I already
posted some versions to netdev@. :)

Hannes Frederic Sowa (10):
  qlcnic: protect qlcnic_82xx_io_slot_reset with rtnl lock
  mlx4: add rtnl lock protection in mlx4_en_restart
  ixgbe: add rtnl locking in service task around vxlan_get_rx_port
  benet: add rtnl lock protection around be_open in be_resume
  fm10k: add rtnl lock protection in fm10k_io_resume
  netdev: add netdevice notifier type to trigger a reprogramming of
    offloads
  vxlan: break dependency to network drivers
  geneve: break dependency to network drivers
  net: harmonize vxlan_get_rx_port and geneve_get_rx_port to
    netdev_refresh_offloads
  netdev: update comments and explain idempotency and rtnl locking

 drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c   |  4 +-
 drivers/net/ethernet/broadcom/bnxt/bnxt.c          |  2 +-
 drivers/net/ethernet/emulex/benet/be_main.c        | 11 +++---
 drivers/net/ethernet/intel/fm10k/fm10k_netdev.c    |  2 +-
 drivers/net/ethernet/intel/fm10k/fm10k_pci.c       |  2 +
 drivers/net/ethernet/intel/i40e/i40e_main.c        |  7 +---
 drivers/net/ethernet/intel/ixgbe/ixgbe_main.c      |  6 ++-
 drivers/net/ethernet/mellanox/mlx4/en_netdev.c     |  4 +-
 .../net/ethernet/netronome/nfp/nfp_net_common.c    |  2 +-
 drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c   | 12 ++++--
 drivers/net/geneve.c                               | 37 ++++++++++++++----
 drivers/net/vxlan.c                                | 20 +++++++---
 include/linux/netdevice.h                          | 45 ++++++++++++++--------
 include/net/geneve.h                               | 10 +----
 include/net/vxlan.h                                |  8 ----
 15 files changed, 105 insertions(+), 67 deletions(-)

-- 
2.5.0

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH net-next v5 01/10] qlcnic: protect qlcnic_82xx_io_slot_reset with rtnl lock
  2016-01-11 12:17 [PATCH net-next v5 00/10] net: break dependency of drivers on geneve and vxlan Hannes Frederic Sowa
@ 2016-01-11 12:17 ` Hannes Frederic Sowa
  2016-01-11 12:17 ` [PATCH net-next v5 02/10] mlx4: add rtnl lock protection in mlx4_en_restart Hannes Frederic Sowa
                   ` (9 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Hannes Frederic Sowa @ 2016-01-11 12:17 UTC (permalink / raw)
  To: netdev; +Cc: jesse, Dept-GELinuxNICDev

Cc: Dept-GELinuxNICDev@qlogic.com
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
---
 drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index 1205f6f9c94173..1c29105b6c364f 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,
 
 static pci_ers_result_t qlcnic_82xx_io_slot_reset(struct pci_dev *pdev)
 {
-	return qlcnic_attach_func(pdev) ? PCI_ERS_RESULT_DISCONNECT :
-				PCI_ERS_RESULT_RECOVERED;
+	pci_ers_result_t res;
+
+	rtnl_lock();
+	res = qlcnic_attach_func(pdev) ? PCI_ERS_RESULT_DISCONNECT :
+					 PCI_ERS_RESULT_RECOVERED;
+	rtnl_unlock();
+
+	return res;
 }
 
 static void qlcnic_82xx_io_resume(struct pci_dev *pdev)
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH net-next v5 02/10] mlx4: add rtnl lock protection in mlx4_en_restart
  2016-01-11 12:17 [PATCH net-next v5 00/10] net: break dependency of drivers on geneve and vxlan Hannes Frederic Sowa
  2016-01-11 12:17 ` [PATCH net-next v5 01/10] qlcnic: protect qlcnic_82xx_io_slot_reset with rtnl lock Hannes Frederic Sowa
@ 2016-01-11 12:17 ` Hannes Frederic Sowa
  2016-01-11 12:17 ` [PATCH net-next v5 03/10] ixgbe: add rtnl locking in service task around vxlan_get_rx_port Hannes Frederic Sowa
                   ` (8 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Hannes Frederic Sowa @ 2016-01-11 12:17 UTC (permalink / raw)
  To: netdev; +Cc: jesse, Eugenia Emantayev

I don't really understand the use of the state_lock. Can't it be simply
replaced by rtnl_lock? It seems a lot of current users depend on
rtnl_lock anyway.

Anyway, fix this up for the moment.

Cc: Eugenia Emantayev <eugenia@mellanox.com>
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
---
 drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
index 0c7e3f69a73bb6..94abd0843901cf 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
@@ -1846,6 +1846,7 @@ static void mlx4_en_restart(struct work_struct *work)
 
 	en_dbg(DRV, priv, "Watchdog task called for port %d\n", priv->port);
 
+	rtnl_lock();
 	mutex_lock(&mdev->state_lock);
 	if (priv->port_up) {
 		mlx4_en_stop_port(dev, 1);
@@ -1853,6 +1854,7 @@ static void mlx4_en_restart(struct work_struct *work)
 			en_err(priv, "Failed restarting port %d\n", priv->port);
 	}
 	mutex_unlock(&mdev->state_lock);
+	rtnl_unlock();
 }
 
 static void mlx4_en_clear_stats(struct net_device *dev)
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH net-next v5 03/10] ixgbe: add rtnl locking in service task around vxlan_get_rx_port
  2016-01-11 12:17 [PATCH net-next v5 00/10] net: break dependency of drivers on geneve and vxlan Hannes Frederic Sowa
  2016-01-11 12:17 ` [PATCH net-next v5 01/10] qlcnic: protect qlcnic_82xx_io_slot_reset with rtnl lock Hannes Frederic Sowa
  2016-01-11 12:17 ` [PATCH net-next v5 02/10] mlx4: add rtnl lock protection in mlx4_en_restart Hannes Frederic Sowa
@ 2016-01-11 12:17 ` Hannes Frederic Sowa
  2016-01-11 12:17 ` [PATCH net-next v5 04/10] benet: add rtnl lock protection around be_open in be_resume Hannes Frederic Sowa
                   ` (7 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Hannes Frederic Sowa @ 2016-01-11 12:17 UTC (permalink / raw)
  To: netdev; +Cc: jesse, Jeff Kirsher

Protect IXGBE_FLAG2_VXLAN_REREG_NEEDED flag with rtnl_lock as it seems
it could be concurrently modified by ixgbe_set_features and
ixgbe_del_vxlan_port.

Cc: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
---
 drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index c4003a88bbf6ea..85ec389bd46560 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -7118,10 +7118,12 @@ static void ixgbe_service_task(struct work_struct *work)
 		return;
 	}
 #ifdef CONFIG_IXGBE_VXLAN
+	rtnl_lock();
 	if (adapter->flags2 & IXGBE_FLAG2_VXLAN_REREG_NEEDED) {
 		adapter->flags2 &= ~IXGBE_FLAG2_VXLAN_REREG_NEEDED;
 		vxlan_get_rx_port(adapter->netdev);
 	}
+	rtnl_unlock();
 #endif /* CONFIG_IXGBE_VXLAN */
 	ixgbe_reset_subtask(adapter);
 	ixgbe_phy_interrupt_subtask(adapter);
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH net-next v5 04/10] benet: add rtnl lock protection around be_open in be_resume
  2016-01-11 12:17 [PATCH net-next v5 00/10] net: break dependency of drivers on geneve and vxlan Hannes Frederic Sowa
                   ` (2 preceding siblings ...)
  2016-01-11 12:17 ` [PATCH net-next v5 03/10] ixgbe: add rtnl locking in service task around vxlan_get_rx_port Hannes Frederic Sowa
@ 2016-01-11 12:17 ` Hannes Frederic Sowa
  2016-01-11 12:17 ` [PATCH net-next v5 05/10] fm10k: add rtnl lock protection in fm10k_io_resume Hannes Frederic Sowa
                   ` (6 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Hannes Frederic Sowa @ 2016-01-11 12:17 UTC (permalink / raw)
  To: netdev
  Cc: jesse, Sathya Perla, Ajit Khaparde, Padmanabh Ratnakar,
	Sriharsha Basavapatna

Cc: Sathya Perla <sathya.perla@avagotech.com>
Cc: Ajit Khaparde <ajit.khaparde@avagotech.com>
Cc: Padmanabh Ratnakar <padmanabh.ratnakar@avagotech.com>
Cc: Sriharsha Basavapatna <sriharsha.basavapatna@avagotech.com>
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
---
 drivers/net/ethernet/emulex/benet/be_main.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index f99de3657ce3b5..3200f48ddd5a68 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -4846,11 +4846,12 @@ static int be_resume(struct be_adapter *adapter)
 	if (status)
 		return status;
 
-	if (netif_running(netdev)) {
+	rtnl_lock();
+	if (netif_running(netdev))
 		status = be_open(netdev);
-		if (status)
-			return status;
-	}
+	rtnl_unlock();
+	if (status)
+		return status;
 
 	netif_device_attach(netdev);
 
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH net-next v5 05/10] fm10k: add rtnl lock protection in fm10k_io_resume
  2016-01-11 12:17 [PATCH net-next v5 00/10] net: break dependency of drivers on geneve and vxlan Hannes Frederic Sowa
                   ` (3 preceding siblings ...)
  2016-01-11 12:17 ` [PATCH net-next v5 04/10] benet: add rtnl lock protection around be_open in be_resume Hannes Frederic Sowa
@ 2016-01-11 12:17 ` Hannes Frederic Sowa
  2016-01-11 12:17 ` [PATCH net-next v5 06/10] netdev: add netdevice notifier type to trigger a reprogramming of offloads Hannes Frederic Sowa
                   ` (5 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Hannes Frederic Sowa @ 2016-01-11 12:17 UTC (permalink / raw)
  To: netdev; +Cc: jesse, Jeff Kirsher

Cc: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
---
 drivers/net/ethernet/intel/fm10k/fm10k_pci.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_pci.c b/drivers/net/ethernet/intel/fm10k/fm10k_pci.c
index 4eb7a6fa6b0ddc..7dd55067d8912e 100644
--- a/drivers/net/ethernet/intel/fm10k/fm10k_pci.c
+++ b/drivers/net/ethernet/intel/fm10k/fm10k_pci.c
@@ -2350,8 +2350,10 @@ static void fm10k_io_resume(struct pci_dev *pdev)
 	/* reset clock */
 	fm10k_ts_reset(interface);
 
+	rtnl_lock();
 	if (netif_running(netdev))
 		err = fm10k_open(netdev);
+	rtnl_unlock();
 
 	/* final check of hardware state before registering the interface */
 	err = err ? : fm10k_hw_ready(interface);
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH net-next v5 06/10] netdev: add netdevice notifier type to trigger a reprogramming of offloads
  2016-01-11 12:17 [PATCH net-next v5 00/10] net: break dependency of drivers on geneve and vxlan Hannes Frederic Sowa
                   ` (4 preceding siblings ...)
  2016-01-11 12:17 ` [PATCH net-next v5 05/10] fm10k: add rtnl lock protection in fm10k_io_resume Hannes Frederic Sowa
@ 2016-01-11 12:17 ` Hannes Frederic Sowa
  2016-01-11 12:17 ` [PATCH net-next v5 07/10] vxlan: break dependency to network drivers Hannes Frederic Sowa
                   ` (4 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Hannes Frederic Sowa @ 2016-01-11 12:17 UTC (permalink / raw)
  To: netdev; +Cc: jesse

Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
---
 include/linux/netdevice.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 2285596e704589..0d4ee1315cb08a 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -2185,6 +2185,7 @@ struct netdev_lag_lower_state_info {
 #define NETDEV_BONDING_INFO	0x0019
 #define NETDEV_PRECHANGEUPPER	0x001A
 #define NETDEV_CHANGELOWERSTATE	0x001B
+#define NETDEV_REFRESH_OFFLOADS	0x001C
 
 int register_netdevice_notifier(struct notifier_block *nb);
 int unregister_netdevice_notifier(struct notifier_block *nb);
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH net-next v5 07/10] vxlan: break dependency to network drivers
  2016-01-11 12:17 [PATCH net-next v5 00/10] net: break dependency of drivers on geneve and vxlan Hannes Frederic Sowa
                   ` (5 preceding siblings ...)
  2016-01-11 12:17 ` [PATCH net-next v5 06/10] netdev: add netdevice notifier type to trigger a reprogramming of offloads Hannes Frederic Sowa
@ 2016-01-11 12:17 ` Hannes Frederic Sowa
  2016-01-11 12:17 ` [PATCH net-next v5 08/10] geneve: " Hannes Frederic Sowa
                   ` (3 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Hannes Frederic Sowa @ 2016-01-11 12:17 UTC (permalink / raw)
  To: netdev; +Cc: jesse

Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
---
 drivers/net/vxlan.c | 20 ++++++++++++++------
 include/net/vxlan.h |  5 +----
 2 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
index fecf7b6c732e96..ee45c796cb03cd 100644
--- a/drivers/net/vxlan.c
+++ b/drivers/net/vxlan.c
@@ -2468,7 +2468,7 @@ static struct device_type vxlan_type = {
  * supply the listening VXLAN udp ports. Callers are expected
  * to implement the ndo_add_vxlan_port.
  */
-void vxlan_get_rx_port(struct net_device *dev)
+static void vxlan_notify_refresh_netdev(struct net_device *dev)
 {
 	struct vxlan_sock *vs;
 	struct net *net = dev_net(dev);
@@ -2477,6 +2477,9 @@ void vxlan_get_rx_port(struct net_device *dev)
 	__be16 port;
 	unsigned int i;
 
+	if (!dev->netdev_ops->ndo_add_vxlan_port)
+		return;
+
 	spin_lock(&vn->sock_lock);
 	for (i = 0; i < PORT_HASH_SIZE; ++i) {
 		hlist_for_each_entry_rcu(vs, &vn->sock_list[i], hlist) {
@@ -2488,7 +2491,6 @@ void vxlan_get_rx_port(struct net_device *dev)
 	}
 	spin_unlock(&vn->sock_lock);
 }
-EXPORT_SYMBOL_GPL(vxlan_get_rx_port);
 
 /* Initialize the device structure. */
 static void vxlan_setup(struct net_device *dev)
@@ -3164,20 +3166,26 @@ static void vxlan_handle_lowerdev_unregister(struct vxlan_net *vn,
 	unregister_netdevice_many(&list_kill);
 }
 
-static int vxlan_lowerdev_event(struct notifier_block *unused,
-				unsigned long event, void *ptr)
+static int vxlan_notifier(struct notifier_block *unused,
+			  unsigned long event, void *ptr)
 {
 	struct net_device *dev = netdev_notifier_info_to_dev(ptr);
 	struct vxlan_net *vn = net_generic(dev_net(dev), vxlan_net_id);
 
-	if (event == NETDEV_UNREGISTER)
+	switch (event) {
+	case NETDEV_REFRESH_OFFLOADS:
+		vxlan_notify_refresh_netdev(dev);
+		break;
+	case NETDEV_UNREGISTER:
 		vxlan_handle_lowerdev_unregister(vn, dev);
+		break;
+	}
 
 	return NOTIFY_DONE;
 }
 
 static struct notifier_block vxlan_notifier_block __read_mostly = {
-	.notifier_call = vxlan_lowerdev_event,
+	.notifier_call = vxlan_notifier,
 };
 
 static __net_init int vxlan_init_net(struct net *net)
diff --git a/include/net/vxlan.h b/include/net/vxlan.h
index 0fb86442544b26..48d0450160c91f 100644
--- a/include/net/vxlan.h
+++ b/include/net/vxlan.h
@@ -242,13 +242,10 @@ static inline netdev_features_t vxlan_features_check(struct sk_buff *skb,
 /* IPv6 header + UDP + VXLAN + Ethernet header */
 #define VXLAN6_HEADROOM (40 + 8 + 8 + 14)
 
-#if IS_ENABLED(CONFIG_VXLAN)
-void vxlan_get_rx_port(struct net_device *netdev);
-#else
 static inline void vxlan_get_rx_port(struct net_device *netdev)
 {
+	call_netdevice_notifiers(NETDEV_REFRESH_OFFLOADS, netdev);
 }
-#endif
 
 static inline unsigned short vxlan_get_sk_family(struct vxlan_sock *vs)
 {
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH net-next v5 08/10] geneve: break dependency to network drivers
  2016-01-11 12:17 [PATCH net-next v5 00/10] net: break dependency of drivers on geneve and vxlan Hannes Frederic Sowa
                   ` (6 preceding siblings ...)
  2016-01-11 12:17 ` [PATCH net-next v5 07/10] vxlan: break dependency to network drivers Hannes Frederic Sowa
@ 2016-01-11 12:17 ` Hannes Frederic Sowa
  2016-01-11 12:17 ` [PATCH net-next v5 09/10] net: harmonize vxlan_get_rx_port and geneve_get_rx_port to netdev_refresh_offloads Hannes Frederic Sowa
                   ` (2 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Hannes Frederic Sowa @ 2016-01-11 12:17 UTC (permalink / raw)
  To: netdev; +Cc: jesse

Reviewed-by: Jesse Gross <jesse@kernel.org>
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
---
 drivers/net/geneve.c | 37 ++++++++++++++++++++++++++++++-------
 include/net/geneve.h |  7 +++----
 2 files changed, 33 insertions(+), 11 deletions(-)

diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c
index 24b077a32c1c9c..ebc1bba33f189c 100644
--- a/drivers/net/geneve.c
+++ b/drivers/net/geneve.c
@@ -1106,11 +1106,7 @@ static struct device_type geneve_type = {
 	.name = "geneve",
 };
 
-/* Calls the ndo_add_geneve_port of the caller in order to
- * supply the listening GENEVE udp ports. Callers are expected
- * to implement the ndo_add_geneve_port.
- */
-void geneve_get_rx_port(struct net_device *dev)
+static void geneve_notify_refresh_netdev(struct net_device *dev)
 {
 	struct net *net = dev_net(dev);
 	struct geneve_net *gn = net_generic(net, geneve_net_id);
@@ -1119,6 +1115,9 @@ void geneve_get_rx_port(struct net_device *dev)
 	struct sock *sk;
 	__be16 port;
 
+	if (!dev->netdev_ops->ndo_add_geneve_port)
+		return;
+
 	rcu_read_lock();
 	list_for_each_entry_rcu(gs, &gn->sock_list, list) {
 		sk = gs->sock->sk;
@@ -1128,7 +1127,6 @@ void geneve_get_rx_port(struct net_device *dev)
 	}
 	rcu_read_unlock();
 }
-EXPORT_SYMBOL_GPL(geneve_get_rx_port);
 
 /* Initialize the device structure. */
 static void geneve_setup(struct net_device *dev)
@@ -1450,6 +1448,24 @@ struct net_device *geneve_dev_create_fb(struct net *net, const char *name,
 }
 EXPORT_SYMBOL_GPL(geneve_dev_create_fb);
 
+static int geneve_notifier(struct notifier_block *unused,
+			   unsigned long event, void *ptr)
+{
+	struct net_device *dev = netdev_notifier_info_to_dev(ptr);
+
+	switch (event) {
+	case NETDEV_REFRESH_OFFLOADS:
+		geneve_notify_refresh_netdev(dev);
+		break;
+	}
+
+	return NOTIFY_DONE;
+}
+
+static struct notifier_block geneve_notifier_block __read_mostly = {
+	.notifier_call = geneve_notifier,
+};
+
 static __net_init int geneve_init_net(struct net *net)
 {
 	struct geneve_net *gn = net_generic(net, geneve_net_id);
@@ -1502,11 +1518,17 @@ static int __init geneve_init_module(void)
 	if (rc)
 		goto out1;
 
-	rc = rtnl_link_register(&geneve_link_ops);
+	rc = register_netdevice_notifier(&geneve_notifier_block);
 	if (rc)
 		goto out2;
 
+	rc = rtnl_link_register(&geneve_link_ops);
+	if (rc)
+		goto out3;
+
 	return 0;
+out3:
+	unregister_netdevice_notifier(&geneve_notifier_block);
 out2:
 	unregister_pernet_subsys(&geneve_net_ops);
 out1:
@@ -1517,6 +1539,7 @@ late_initcall(geneve_init_module);
 static void __exit geneve_cleanup_module(void)
 {
 	rtnl_link_unregister(&geneve_link_ops);
+	unregister_netdevice_notifier(&geneve_notifier_block);
 	unregister_pernet_subsys(&geneve_net_ops);
 }
 module_exit(geneve_cleanup_module);
diff --git a/include/net/geneve.h b/include/net/geneve.h
index e6c23dc765f7ec..7d52077b72faa3 100644
--- a/include/net/geneve.h
+++ b/include/net/geneve.h
@@ -1,6 +1,8 @@
 #ifndef __NET_GENEVE_H
 #define __NET_GENEVE_H  1
 
+#include <linux/netdevice.h>
+
 #ifdef CONFIG_INET
 #include <net/udp_tunnel.h>
 #endif
@@ -62,13 +64,10 @@ struct genevehdr {
 	struct geneve_opt options[];
 };
 
-#if IS_ENABLED(CONFIG_GENEVE)
-void geneve_get_rx_port(struct net_device *netdev);
-#else
 static inline void geneve_get_rx_port(struct net_device *netdev)
 {
+	call_netdevice_notifiers(NETDEV_REFRESH_OFFLOADS, netdev);
 }
-#endif
 
 #ifdef CONFIG_INET
 struct net_device *geneve_dev_create_fb(struct net *net, const char *name,
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH net-next v5 09/10] net: harmonize vxlan_get_rx_port and geneve_get_rx_port to netdev_refresh_offloads
  2016-01-11 12:17 [PATCH net-next v5 00/10] net: break dependency of drivers on geneve and vxlan Hannes Frederic Sowa
                   ` (7 preceding siblings ...)
  2016-01-11 12:17 ` [PATCH net-next v5 08/10] geneve: " Hannes Frederic Sowa
@ 2016-01-11 12:17 ` Hannes Frederic Sowa
  2016-01-11 12:17 ` [PATCH net-next v5 10/10] netdev: update comments and explain idempotency and rtnl locking Hannes Frederic Sowa
  2016-01-12 21:33 ` [PATCH net-next v5 00/10] net: break dependency of drivers on geneve and vxlan David Miller
  10 siblings, 0 replies; 13+ messages in thread
From: Hannes Frederic Sowa @ 2016-01-11 12:17 UTC (permalink / raw)
  To: netdev; +Cc: jesse

Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
---
 drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c    | 4 ++--
 drivers/net/ethernet/broadcom/bnxt/bnxt.c           | 2 +-
 drivers/net/ethernet/emulex/benet/be_main.c         | 2 +-
 drivers/net/ethernet/intel/fm10k/fm10k_netdev.c     | 2 +-
 drivers/net/ethernet/intel/i40e/i40e_main.c         | 7 ++-----
 drivers/net/ethernet/intel/ixgbe/ixgbe_main.c       | 4 ++--
 drivers/net/ethernet/mellanox/mlx4/en_netdev.c      | 2 +-
 drivers/net/ethernet/netronome/nfp/nfp_net_common.c | 2 +-
 drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c    | 2 +-
 include/linux/netdevice.h                           | 4 ++++
 include/net/geneve.h                                | 5 -----
 include/net/vxlan.h                                 | 5 -----
 12 files changed, 16 insertions(+), 25 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
index 6c4e3a69976fca..6204154f1f2fe2 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
@@ -10286,7 +10286,7 @@ sp_rtnl_not_reset:
 			netdev_info(bp->dev,
 				    "Deleted vxlan dest port %d", port);
 			bp->vxlan_dst_port = 0;
-			vxlan_get_rx_port(bp->dev);
+			netdev_refresh_offloads(bp->dev);
 		}
 	}
 #endif
@@ -12492,7 +12492,7 @@ static int bnx2x_open(struct net_device *dev)
 
 #ifdef CONFIG_BNX2X_VXLAN
 	if (IS_PF(bp))
-		vxlan_get_rx_port(dev);
+		netdev_refresh_offloads(dev);
 #endif
 
 	return 0;
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 287bfb79ea2dc0..a4350c987597b1 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -4640,7 +4640,7 @@ static int __bnxt_open_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init)
 
 	if (irq_re_init) {
 #if defined(CONFIG_VXLAN) || defined(CONFIG_VXLAN_MODULE)
-		vxlan_get_rx_port(bp->dev);
+		netdev_refresh_offloads(bp->dev);
 #endif
 		if (!bnxt_hwrm_tunnel_dst_port_alloc(
 				bp, htons(0x17c1),
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index 3200f48ddd5a68..16edce294bbb2b 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -3601,7 +3601,7 @@ static int be_open(struct net_device *netdev)
 	netif_tx_start_all_queues(netdev);
 #ifdef CONFIG_BE2NET_VXLAN
 	if (skyhawk_chip(adapter))
-		vxlan_get_rx_port(netdev);
+		netdev_refresh_offloads(netdev);
 #endif
 
 	return 0;
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c b/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c
index 662569d5b7c01a..a2f0775ddd5460 100644
--- a/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c
+++ b/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c
@@ -558,7 +558,7 @@ int fm10k_open(struct net_device *netdev)
 
 #ifdef CONFIG_FM10K_VXLAN
 	/* update VXLAN port configuration */
-	vxlan_get_rx_port(netdev);
+	netdev_refresh_offloads(netdev);
 #endif
 
 	fm10k_up(interface);
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index bb4612c159fd19..0a78cf046df608 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -5344,11 +5344,8 @@ int i40e_open(struct net_device *netdev)
 						       TCP_FLAG_CWR) >> 16);
 	wr32(&pf->hw, I40E_GLLAN_TSOMSK_L, be32_to_cpu(TCP_FLAG_CWR) >> 16);
 
-#ifdef CONFIG_I40E_VXLAN
-	vxlan_get_rx_port(netdev);
-#endif
-#ifdef CONFIG_I40E_GENEVE
-	geneve_get_rx_port(netdev);
+#if defined(CONFIG_I40E_VXLAN) || defined(CONFIG_I40E_GENEVE)
+	netdev_refresh_offloads(netdev);
 #endif
 
 	return 0;
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index 85ec389bd46560..b288b18fa0c6c0 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -6041,7 +6041,7 @@ static int ixgbe_open(struct net_device *netdev)
 
 	ixgbe_clear_vxlan_port(adapter);
 #ifdef CONFIG_IXGBE_VXLAN
-	vxlan_get_rx_port(netdev);
+	netdev_refresh_offloads(netdev);
 #endif
 
 	return 0;
@@ -7121,7 +7121,7 @@ static void ixgbe_service_task(struct work_struct *work)
 	rtnl_lock();
 	if (adapter->flags2 & IXGBE_FLAG2_VXLAN_REREG_NEEDED) {
 		adapter->flags2 &= ~IXGBE_FLAG2_VXLAN_REREG_NEEDED;
-		vxlan_get_rx_port(adapter->netdev);
+		netdev_refresh_offloads(adapter->netdev);
 	}
 	rtnl_unlock();
 #endif /* CONFIG_IXGBE_VXLAN */
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
index 94abd0843901cf..4b077d892cf193 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
@@ -1683,7 +1683,7 @@ int mlx4_en_start_port(struct net_device *dev)
 
 #ifdef CONFIG_MLX4_EN_VXLAN
 	if (priv->mdev->dev->caps.tunnel_offload_mode == MLX4_TUNNEL_OFFLOAD_MODE_VXLAN)
-		vxlan_get_rx_port(dev);
+		netdev_refresh_offloads(dev);
 #endif
 	priv->port_up = true;
 	netif_tx_start_all_queues(dev);
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
index 43c618bafdb641..70338327b47550 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
@@ -1795,7 +1795,7 @@ static int nfp_net_netdev_open(struct net_device *netdev)
 	if (nn->ctrl & NFP_NET_CFG_CTRL_VXLAN) {
 		memset(&nn->vxlan_ports, 0, sizeof(nn->vxlan_ports));
 		memset(&nn->vxlan_usecnt, 0, sizeof(nn->vxlan_usecnt));
-		vxlan_get_rx_port(netdev);
+		netdev_refresh_offloads(netdev);
 	}
 
 	/* Step 3: Enable for kernel
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index 1c29105b6c364f..22ba8b7c8db1b1 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
@@ -2017,7 +2017,7 @@ qlcnic_attach(struct qlcnic_adapter *adapter)
 
 #ifdef CONFIG_QLCNIC_VXLAN
 	if (qlcnic_encap_rx_offload(adapter))
-		vxlan_get_rx_port(netdev);
+		netdev_refresh_offloads(netdev);
 #endif
 
 	adapter->is_up = QLCNIC_ADAPTER_UP_MAGIC;
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 0d4ee1315cb08a..8a2456498a6c9f 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -2226,6 +2226,10 @@ netdev_notifier_info_to_dev(const struct netdev_notifier_info *info)
 
 int call_netdevice_notifiers(unsigned long val, struct net_device *dev);
 
+static inline void netdev_refresh_offloads(struct net_device *netdev)
+{
+	call_netdevice_notifiers(NETDEV_REFRESH_OFFLOADS, netdev);
+}
 
 extern rwlock_t				dev_base_lock;		/* Device list lock */
 
diff --git a/include/net/geneve.h b/include/net/geneve.h
index 7d52077b72faa3..9e27fc7027052d 100644
--- a/include/net/geneve.h
+++ b/include/net/geneve.h
@@ -64,11 +64,6 @@ struct genevehdr {
 	struct geneve_opt options[];
 };
 
-static inline void geneve_get_rx_port(struct net_device *netdev)
-{
-	call_netdevice_notifiers(NETDEV_REFRESH_OFFLOADS, netdev);
-}
-
 #ifdef CONFIG_INET
 struct net_device *geneve_dev_create_fb(struct net *net, const char *name,
 					u8 name_assign_type, u16 dst_port);
diff --git a/include/net/vxlan.h b/include/net/vxlan.h
index 48d0450160c91f..eb0a7e3368ca1c 100644
--- a/include/net/vxlan.h
+++ b/include/net/vxlan.h
@@ -242,11 +242,6 @@ static inline netdev_features_t vxlan_features_check(struct sk_buff *skb,
 /* IPv6 header + UDP + VXLAN + Ethernet header */
 #define VXLAN6_HEADROOM (40 + 8 + 8 + 14)
 
-static inline void vxlan_get_rx_port(struct net_device *netdev)
-{
-	call_netdevice_notifiers(NETDEV_REFRESH_OFFLOADS, netdev);
-}
-
 static inline unsigned short vxlan_get_sk_family(struct vxlan_sock *vs)
 {
 	return vs->sock->sk->sk_family;
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH net-next v5 10/10] netdev: update comments and explain idempotency and rtnl locking
  2016-01-11 12:17 [PATCH net-next v5 00/10] net: break dependency of drivers on geneve and vxlan Hannes Frederic Sowa
                   ` (8 preceding siblings ...)
  2016-01-11 12:17 ` [PATCH net-next v5 09/10] net: harmonize vxlan_get_rx_port and geneve_get_rx_port to netdev_refresh_offloads Hannes Frederic Sowa
@ 2016-01-11 12:17 ` Hannes Frederic Sowa
  2016-01-12 21:33 ` [PATCH net-next v5 00/10] net: break dependency of drivers on geneve and vxlan David Miller
  10 siblings, 0 replies; 13+ messages in thread
From: Hannes Frederic Sowa @ 2016-01-11 12:17 UTC (permalink / raw)
  To: netdev; +Cc: jesse

Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
---
 include/linux/netdevice.h | 40 +++++++++++++++++++++++-----------------
 1 file changed, 23 insertions(+), 17 deletions(-)

diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 8a2456498a6c9f..ff8b4795663d33 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -1006,31 +1006,36 @@ typedef u16 (*select_queue_fallback_t)(struct net_device *dev,
  *	not implement this, it is assumed that the hw is not able to have
  *	multiple net devices on single physical port.
  *
+ *	*** Offloading callbacks: ***
+ *
+ *	Notify drivers about a new type of offloading being requested
+ *	or removed from the driver. The type is based on the function
+ *	name, sa_family distinguishes between ipv4 and ipv6 and the
+ *	corresponding port number (for now only being UDP tunnel
+ *	protocol numbers) is signaled down to the driver.
+ *
+ *	Calls into the offloading callback functions are always done
+ *	with rtnl_lock held.
+ *
+ *	Further more, the callbacks can happen multiple times for the
+ *	same primitive to be installed, so it is forbidden to use
+ *	reference counting on the {offload_type, sa_family, port}
+ *	tuple because the driver might see multiple calls to those
+ *	functions for one installed primitive.
+ *
+ *	If the driver wants to get the current ports reprogrammed it
+ *	can simply call netdev_refresh_offloads with rtnl_lock held.
+ *
  * void (*ndo_add_vxlan_port)(struct  net_device *dev,
  *			      sa_family_t sa_family, __be16 port);
- *	Called by vxlan to notiy a driver about the UDP port and socket
- *	address family that vxlan is listnening to. It is called only when
- *	a new port starts listening. The operation is protected by the
- *	vxlan_net->sock_lock.
- *
  * void (*ndo_add_geneve_port)(struct net_device *dev,
  *			      sa_family_t sa_family, __be16 port);
- *	Called by geneve to notify a driver about the UDP port and socket
- *	address family that geneve is listnening to. It is called only when
- *	a new port starts listening. The operation is protected by the
- *	geneve_net->sock_lock.
- *
  * void (*ndo_del_geneve_port)(struct net_device *dev,
  *			      sa_family_t sa_family, __be16 port);
- *	Called by geneve to notify the driver about a UDP port and socket
- *	address family that geneve is not listening to anymore. The operation
- *	is protected by the geneve_net->sock_lock.
- *
  * void (*ndo_del_vxlan_port)(struct  net_device *dev,
  *			      sa_family_t sa_family, __be16 port);
- *	Called by vxlan to notify the driver about a UDP port and socket
- *	address family that vxlan is not listening to anymore. The operation
- *	is protected by the vxlan_net->sock_lock.
+ *
+ *
  *
  * void* (*ndo_dfwd_add_station)(struct net_device *pdev,
  *				 struct net_device *dev)
@@ -2226,6 +2231,7 @@ netdev_notifier_info_to_dev(const struct netdev_notifier_info *info)
 
 int call_netdevice_notifiers(unsigned long val, struct net_device *dev);
 
+/* Obviously the driver needs to hold rtnl_lock while calling this function. */
 static inline void netdev_refresh_offloads(struct net_device *netdev)
 {
 	call_netdevice_notifiers(NETDEV_REFRESH_OFFLOADS, netdev);
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH net-next v5 00/10] net: break dependency of drivers on geneve and vxlan
  2016-01-11 12:17 [PATCH net-next v5 00/10] net: break dependency of drivers on geneve and vxlan Hannes Frederic Sowa
                   ` (9 preceding siblings ...)
  2016-01-11 12:17 ` [PATCH net-next v5 10/10] netdev: update comments and explain idempotency and rtnl locking Hannes Frederic Sowa
@ 2016-01-12 21:33 ` David Miller
  2016-01-12 22:17   ` Hannes Frederic Sowa
  10 siblings, 1 reply; 13+ messages in thread
From: David Miller @ 2016-01-12 21:33 UTC (permalink / raw)
  To: hannes; +Cc: netdev, jesse


I think this needs to wait until the next merge window.

I frankly don't consider it such a serious issue, and even
if I thought it was an issue it is definitely not urgent
at all.

Thanks Hannes.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH net-next v5 00/10] net: break dependency of drivers on geneve and vxlan
  2016-01-12 21:33 ` [PATCH net-next v5 00/10] net: break dependency of drivers on geneve and vxlan David Miller
@ 2016-01-12 22:17   ` Hannes Frederic Sowa
  0 siblings, 0 replies; 13+ messages in thread
From: Hannes Frederic Sowa @ 2016-01-12 22:17 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, jesse

On 12.01.2016 22:33, David Miller wrote:
>
> I think this needs to wait until the next merge window.
>
> I frankly don't consider it such a serious issue, and even
> if I thought it was an issue it is definitely not urgent
> at all.

Hehe, I just wanted to branch -d the branch. :)

No problem, I keep it around and rebase and send it in time.

Thanks!

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2016-01-12 22:17 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-01-11 12:17 [PATCH net-next v5 00/10] net: break dependency of drivers on geneve and vxlan Hannes Frederic Sowa
2016-01-11 12:17 ` [PATCH net-next v5 01/10] qlcnic: protect qlcnic_82xx_io_slot_reset with rtnl lock Hannes Frederic Sowa
2016-01-11 12:17 ` [PATCH net-next v5 02/10] mlx4: add rtnl lock protection in mlx4_en_restart Hannes Frederic Sowa
2016-01-11 12:17 ` [PATCH net-next v5 03/10] ixgbe: add rtnl locking in service task around vxlan_get_rx_port Hannes Frederic Sowa
2016-01-11 12:17 ` [PATCH net-next v5 04/10] benet: add rtnl lock protection around be_open in be_resume Hannes Frederic Sowa
2016-01-11 12:17 ` [PATCH net-next v5 05/10] fm10k: add rtnl lock protection in fm10k_io_resume Hannes Frederic Sowa
2016-01-11 12:17 ` [PATCH net-next v5 06/10] netdev: add netdevice notifier type to trigger a reprogramming of offloads Hannes Frederic Sowa
2016-01-11 12:17 ` [PATCH net-next v5 07/10] vxlan: break dependency to network drivers Hannes Frederic Sowa
2016-01-11 12:17 ` [PATCH net-next v5 08/10] geneve: " Hannes Frederic Sowa
2016-01-11 12:17 ` [PATCH net-next v5 09/10] net: harmonize vxlan_get_rx_port and geneve_get_rx_port to netdev_refresh_offloads Hannes Frederic Sowa
2016-01-11 12:17 ` [PATCH net-next v5 10/10] netdev: update comments and explain idempotency and rtnl locking Hannes Frederic Sowa
2016-01-12 21:33 ` [PATCH net-next v5 00/10] net: break dependency of drivers on geneve and vxlan David Miller
2016-01-12 22:17   ` Hannes Frederic Sowa

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.