netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [patch net-next v2 0/6] rocker: make master change handling nicer
@ 2015-08-27  7:31 Jiri Pirko
  2015-08-27  7:31 ` [patch net-next v2 1/6] net: introduce change upper device notifier change info Jiri Pirko
                   ` (6 more replies)
  0 siblings, 7 replies; 8+ messages in thread
From: Jiri Pirko @ 2015-08-27  7:31 UTC (permalink / raw)
  To: netdev; +Cc: davem, idosch, eladr, sfeldma, simon.horman, f.fainelli

From: Jiri Pirko <jiri@mellanox.com>

Jiri Pirko (6):
  net: introduce change upper device notifier change info
  net: add netif_is_bridge_master helper
  net: add netif_is_ovs_master helper with IFF_OPENVSWITCH private flag
  net: kill long time unused bonding private flags
  rocker: use new helper to figure out master kind
  rocker: use change upper info

 drivers/net/ethernet/rocker/rocker.c | 74 ++++++++++++++++++++---------------
 include/linux/netdevice.h            | 75 +++++++++++++++++++-----------------
 net/core/dev.c                       | 16 +++++++-
 net/openvswitch/vport-internal_dev.c |  2 +-
 4 files changed, 97 insertions(+), 70 deletions(-)

-- 
1.9.3

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

* [patch net-next v2 1/6] net: introduce change upper device notifier change info
  2015-08-27  7:31 [patch net-next v2 0/6] rocker: make master change handling nicer Jiri Pirko
@ 2015-08-27  7:31 ` Jiri Pirko
  2015-08-27  7:31 ` [patch net-next v2 2/6] net: add netif_is_bridge_master helper Jiri Pirko
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Jiri Pirko @ 2015-08-27  7:31 UTC (permalink / raw)
  To: netdev; +Cc: davem, idosch, eladr, sfeldma, simon.horman, f.fainelli,
	Jiri Pirko

From: Jiri Pirko <jiri@mellanox.com>

Add info that is passed along with NETDEV_CHANGEUPPER event.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
v1->v2:
- no change
---
 include/linux/netdevice.h |  7 +++++++
 net/core/dev.c            | 16 ++++++++++++++--
 2 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 6abe0d6..39f30da 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -2127,6 +2127,13 @@ struct netdev_notifier_change_info {
 	unsigned int flags_changed;
 };
 
+struct netdev_notifier_changeupper_info {
+	struct netdev_notifier_info info; /* must be first */
+	struct net_device *upper_dev; /* new upper dev */
+	bool master; /* is upper dev master */
+	bool linking; /* is the nofication for link or unlink */
+};
+
 static inline void netdev_notifier_info_init(struct netdev_notifier_info *info,
 					     struct net_device *dev)
 {
diff --git a/net/core/dev.c b/net/core/dev.c
index b1f3f48..e7ef971 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -5311,6 +5311,7 @@ static int __netdev_upper_dev_link(struct net_device *dev,
 				   struct net_device *upper_dev, bool master,
 				   void *private)
 {
+	struct netdev_notifier_changeupper_info changeupper_info;
 	struct netdev_adjacent *i, *j, *to_i, *to_j;
 	int ret = 0;
 
@@ -5329,6 +5330,10 @@ static int __netdev_upper_dev_link(struct net_device *dev,
 	if (master && netdev_master_upper_dev_get(dev))
 		return -EBUSY;
 
+	changeupper_info.upper_dev = upper_dev;
+	changeupper_info.master = master;
+	changeupper_info.linking = true;
+
 	ret = __netdev_adjacent_dev_link_neighbour(dev, upper_dev, private,
 						   master);
 	if (ret)
@@ -5367,7 +5372,8 @@ static int __netdev_upper_dev_link(struct net_device *dev,
 			goto rollback_lower_mesh;
 	}
 
-	call_netdevice_notifiers(NETDEV_CHANGEUPPER, dev);
+	call_netdevice_notifiers_info(NETDEV_CHANGEUPPER, dev,
+				      &changeupper_info.info);
 	return 0;
 
 rollback_lower_mesh:
@@ -5462,9 +5468,14 @@ EXPORT_SYMBOL(netdev_master_upper_dev_link_private);
 void netdev_upper_dev_unlink(struct net_device *dev,
 			     struct net_device *upper_dev)
 {
+	struct netdev_notifier_changeupper_info changeupper_info;
 	struct netdev_adjacent *i, *j;
 	ASSERT_RTNL();
 
+	changeupper_info.upper_dev = upper_dev;
+	changeupper_info.master = netdev_master_upper_dev_get(dev) == upper_dev;
+	changeupper_info.linking = false;
+
 	__netdev_adjacent_dev_unlink_neighbour(dev, upper_dev);
 
 	/* Here is the tricky part. We must remove all dev's lower
@@ -5484,7 +5495,8 @@ void netdev_upper_dev_unlink(struct net_device *dev,
 	list_for_each_entry(i, &upper_dev->all_adj_list.upper, list)
 		__netdev_adjacent_dev_unlink(dev, i->dev);
 
-	call_netdevice_notifiers(NETDEV_CHANGEUPPER, dev);
+	call_netdevice_notifiers_info(NETDEV_CHANGEUPPER, dev,
+				      &changeupper_info.info);
 }
 EXPORT_SYMBOL(netdev_upper_dev_unlink);
 
-- 
1.9.3

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

* [patch net-next v2 2/6] net: add netif_is_bridge_master helper
  2015-08-27  7:31 [patch net-next v2 0/6] rocker: make master change handling nicer Jiri Pirko
  2015-08-27  7:31 ` [patch net-next v2 1/6] net: introduce change upper device notifier change info Jiri Pirko
@ 2015-08-27  7:31 ` Jiri Pirko
  2015-08-27  7:31 ` [patch net-next v2 3/6] net: add netif_is_ovs_master helper with IFF_OPENVSWITCH private flag Jiri Pirko
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Jiri Pirko @ 2015-08-27  7:31 UTC (permalink / raw)
  To: netdev; +Cc: davem, idosch, eladr, sfeldma, simon.horman, f.fainelli,
	Jiri Pirko

From: Jiri Pirko <jiri@mellanox.com>

Add this helper so code can easily figure out if netdev is a bridge.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
v1->v2:
- no change
---
 include/linux/netdevice.h | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 39f30da..be625f4 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -3848,6 +3848,11 @@ static inline bool netif_is_vrf(const struct net_device *dev)
 	return dev->priv_flags & IFF_VRF_MASTER;
 }
 
+static inline bool netif_is_bridge_master(const struct net_device *dev)
+{
+	return dev->priv_flags & IFF_EBRIDGE;
+}
+
 static inline bool netif_index_is_vrf(struct net *net, int ifindex)
 {
 	bool rc = false;
-- 
1.9.3

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

* [patch net-next v2 3/6] net: add netif_is_ovs_master helper with IFF_OPENVSWITCH private flag
  2015-08-27  7:31 [patch net-next v2 0/6] rocker: make master change handling nicer Jiri Pirko
  2015-08-27  7:31 ` [patch net-next v2 1/6] net: introduce change upper device notifier change info Jiri Pirko
  2015-08-27  7:31 ` [patch net-next v2 2/6] net: add netif_is_bridge_master helper Jiri Pirko
@ 2015-08-27  7:31 ` Jiri Pirko
  2015-08-27  7:31 ` [patch net-next v2 4/6] net: kill long time unused bonding private flags Jiri Pirko
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Jiri Pirko @ 2015-08-27  7:31 UTC (permalink / raw)
  To: netdev; +Cc: davem, idosch, eladr, sfeldma, simon.horman, f.fainelli,
	Jiri Pirko

From: Jiri Pirko <jiri@mellanox.com>

Add this helper so code can easily figure out if netdev is openswitch.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
v1->v2:
- fixed typo in comment pointed out by Florian
---
 include/linux/netdevice.h            | 8 ++++++++
 net/openvswitch/vport-internal_dev.c | 2 +-
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index be625f4..6656a43 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -1264,6 +1264,7 @@ struct net_device_ops {
  * @IFF_MACVLAN: Macvlan device
  * @IFF_VRF_MASTER: device is a VRF master
  * @IFF_NO_QUEUE: device can run without qdisc attached
+ * @IFF_OPENVSWITCH: device is a Open vSwitch master
  */
 enum netdev_priv_flags {
 	IFF_802_1Q_VLAN			= 1<<0,
@@ -1293,6 +1294,7 @@ enum netdev_priv_flags {
 	IFF_IPVLAN_SLAVE		= 1<<24,
 	IFF_VRF_MASTER			= 1<<25,
 	IFF_NO_QUEUE			= 1<<26,
+	IFF_OPENVSWITCH			= 1<<27,
 };
 
 #define IFF_802_1Q_VLAN			IFF_802_1Q_VLAN
@@ -1322,6 +1324,7 @@ enum netdev_priv_flags {
 #define IFF_IPVLAN_SLAVE		IFF_IPVLAN_SLAVE
 #define IFF_VRF_MASTER			IFF_VRF_MASTER
 #define IFF_NO_QUEUE			IFF_NO_QUEUE
+#define IFF_OPENVSWITCH			IFF_OPENVSWITCH
 
 /**
  *	struct net_device - The DEVICE structure.
@@ -3853,6 +3856,11 @@ static inline bool netif_is_bridge_master(const struct net_device *dev)
 	return dev->priv_flags & IFF_EBRIDGE;
 }
 
+static inline bool netif_is_ovs_master(const struct net_device *dev)
+{
+	return dev->priv_flags & IFF_OPENVSWITCH;
+}
+
 static inline bool netif_index_is_vrf(struct net *net, int ifindex)
 {
 	bool rc = false;
diff --git a/net/openvswitch/vport-internal_dev.c b/net/openvswitch/vport-internal_dev.c
index c058bbf..80b3e12 100644
--- a/net/openvswitch/vport-internal_dev.c
+++ b/net/openvswitch/vport-internal_dev.c
@@ -135,7 +135,7 @@ static void do_setup(struct net_device *netdev)
 	netdev->netdev_ops = &internal_dev_netdev_ops;
 
 	netdev->priv_flags &= ~IFF_TX_SKB_SHARING;
-	netdev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
+	netdev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_OPENVSWITCH;
 	netdev->destructor = internal_dev_destructor;
 	netdev->ethtool_ops = &internal_dev_ethtool_ops;
 	netdev->rtnl_link_ops = &internal_dev_link_ops;
-- 
1.9.3

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

* [patch net-next v2 4/6] net: kill long time unused bonding private flags
  2015-08-27  7:31 [patch net-next v2 0/6] rocker: make master change handling nicer Jiri Pirko
                   ` (2 preceding siblings ...)
  2015-08-27  7:31 ` [patch net-next v2 3/6] net: add netif_is_ovs_master helper with IFF_OPENVSWITCH private flag Jiri Pirko
@ 2015-08-27  7:31 ` Jiri Pirko
  2015-08-27  7:31 ` [patch net-next v2 5/6] rocker: use new helper to figure out master kind Jiri Pirko
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Jiri Pirko @ 2015-08-27  7:31 UTC (permalink / raw)
  To: netdev; +Cc: davem, idosch, eladr, sfeldma, simon.horman, f.fainelli,
	Jiri Pirko

From: Jiri Pirko <jiri@mellanox.com>

We don't use them for years, just kill them now.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
v1->v2:
- no change
---
 include/linux/netdevice.h | 57 +++++++++++++++++------------------------------
 1 file changed, 21 insertions(+), 36 deletions(-)

diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 6656a43..88a0069 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -1240,13 +1240,8 @@ struct net_device_ops {
  *
  * @IFF_802_1Q_VLAN: 802.1Q VLAN device
  * @IFF_EBRIDGE: Ethernet bridging device
- * @IFF_SLAVE_INACTIVE: bonding slave not the curr. active
- * @IFF_MASTER_8023AD: bonding master, 802.3ad
- * @IFF_MASTER_ALB: bonding master, balance-alb
  * @IFF_BONDING: bonding master or slave
- * @IFF_SLAVE_NEEDARP: need ARPs for validation
  * @IFF_ISATAP: ISATAP interface (RFC4214)
- * @IFF_MASTER_ARPMON: bonding master, ARP mon in use
  * @IFF_WAN_HDLC: WAN HDLC device
  * @IFF_XMIT_DST_RELEASE: dev_hard_start_xmit() is allowed to
  *	release skb->dst
@@ -1269,43 +1264,33 @@ struct net_device_ops {
 enum netdev_priv_flags {
 	IFF_802_1Q_VLAN			= 1<<0,
 	IFF_EBRIDGE			= 1<<1,
-	IFF_SLAVE_INACTIVE		= 1<<2,
-	IFF_MASTER_8023AD		= 1<<3,
-	IFF_MASTER_ALB			= 1<<4,
-	IFF_BONDING			= 1<<5,
-	IFF_SLAVE_NEEDARP		= 1<<6,
-	IFF_ISATAP			= 1<<7,
-	IFF_MASTER_ARPMON		= 1<<8,
-	IFF_WAN_HDLC			= 1<<9,
-	IFF_XMIT_DST_RELEASE		= 1<<10,
-	IFF_DONT_BRIDGE			= 1<<11,
-	IFF_DISABLE_NETPOLL		= 1<<12,
-	IFF_MACVLAN_PORT		= 1<<13,
-	IFF_BRIDGE_PORT			= 1<<14,
-	IFF_OVS_DATAPATH		= 1<<15,
-	IFF_TX_SKB_SHARING		= 1<<16,
-	IFF_UNICAST_FLT			= 1<<17,
-	IFF_TEAM_PORT			= 1<<18,
-	IFF_SUPP_NOFCS			= 1<<19,
-	IFF_LIVE_ADDR_CHANGE		= 1<<20,
-	IFF_MACVLAN			= 1<<21,
-	IFF_XMIT_DST_RELEASE_PERM	= 1<<22,
-	IFF_IPVLAN_MASTER		= 1<<23,
-	IFF_IPVLAN_SLAVE		= 1<<24,
-	IFF_VRF_MASTER			= 1<<25,
-	IFF_NO_QUEUE			= 1<<26,
-	IFF_OPENVSWITCH			= 1<<27,
+	IFF_BONDING			= 1<<2,
+	IFF_ISATAP			= 1<<3,
+	IFF_WAN_HDLC			= 1<<4,
+	IFF_XMIT_DST_RELEASE		= 1<<5,
+	IFF_DONT_BRIDGE			= 1<<6,
+	IFF_DISABLE_NETPOLL		= 1<<7,
+	IFF_MACVLAN_PORT		= 1<<8,
+	IFF_BRIDGE_PORT			= 1<<9,
+	IFF_OVS_DATAPATH		= 1<<10,
+	IFF_TX_SKB_SHARING		= 1<<11,
+	IFF_UNICAST_FLT			= 1<<12,
+	IFF_TEAM_PORT			= 1<<13,
+	IFF_SUPP_NOFCS			= 1<<14,
+	IFF_LIVE_ADDR_CHANGE		= 1<<15,
+	IFF_MACVLAN			= 1<<16,
+	IFF_XMIT_DST_RELEASE_PERM	= 1<<17,
+	IFF_IPVLAN_MASTER		= 1<<18,
+	IFF_IPVLAN_SLAVE		= 1<<19,
+	IFF_VRF_MASTER			= 1<<20,
+	IFF_NO_QUEUE			= 1<<21,
+	IFF_OPENVSWITCH			= 1<<22,
 };
 
 #define IFF_802_1Q_VLAN			IFF_802_1Q_VLAN
 #define IFF_EBRIDGE			IFF_EBRIDGE
-#define IFF_SLAVE_INACTIVE		IFF_SLAVE_INACTIVE
-#define IFF_MASTER_8023AD		IFF_MASTER_8023AD
-#define IFF_MASTER_ALB			IFF_MASTER_ALB
 #define IFF_BONDING			IFF_BONDING
-#define IFF_SLAVE_NEEDARP		IFF_SLAVE_NEEDARP
 #define IFF_ISATAP			IFF_ISATAP
-#define IFF_MASTER_ARPMON		IFF_MASTER_ARPMON
 #define IFF_WAN_HDLC			IFF_WAN_HDLC
 #define IFF_XMIT_DST_RELEASE		IFF_XMIT_DST_RELEASE
 #define IFF_DONT_BRIDGE			IFF_DONT_BRIDGE
-- 
1.9.3

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

* [patch net-next v2 5/6] rocker: use new helper to figure out master kind
  2015-08-27  7:31 [patch net-next v2 0/6] rocker: make master change handling nicer Jiri Pirko
                   ` (3 preceding siblings ...)
  2015-08-27  7:31 ` [patch net-next v2 4/6] net: kill long time unused bonding private flags Jiri Pirko
@ 2015-08-27  7:31 ` Jiri Pirko
  2015-08-27  7:31 ` [patch net-next v2 6/6] rocker: use change upper info Jiri Pirko
  2015-08-27 23:28 ` [patch net-next v2 0/6] rocker: make master change handling nicer David Miller
  6 siblings, 0 replies; 8+ messages in thread
From: Jiri Pirko @ 2015-08-27  7:31 UTC (permalink / raw)
  To: netdev; +Cc: davem, idosch, eladr, sfeldma, simon.horman, f.fainelli,
	Jiri Pirko

From: Jiri Pirko <jiri@mellanox.com>

Looking at rtnl kind string is kind of ugly. So use new helpers to do
this in nicer way.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Acked-by: Scott Feldman <sfeldma@gmail.com
---
v1->v2:
- no change
---
 drivers/net/ethernet/rocker/rocker.c | 19 +++++++------------
 1 file changed, 7 insertions(+), 12 deletions(-)

diff --git a/drivers/net/ethernet/rocker/rocker.c b/drivers/net/ethernet/rocker/rocker.c
index a7cb74a..62f383c 100644
--- a/drivers/net/ethernet/rocker/rocker.c
+++ b/drivers/net/ethernet/rocker/rocker.c
@@ -322,21 +322,16 @@ static u16 rocker_port_vlan_to_vid(const struct rocker_port *rocker_port,
 	return ntohs(vlan_id);
 }
 
-static bool rocker_port_is_slave(const struct rocker_port *rocker_port,
-				   const char *kind)
-{
-	return rocker_port->bridge_dev &&
-		!strcmp(rocker_port->bridge_dev->rtnl_link_ops->kind, kind);
-}
-
 static bool rocker_port_is_bridged(const struct rocker_port *rocker_port)
 {
-	return rocker_port_is_slave(rocker_port, "bridge");
+	return rocker_port->bridge_dev &&
+	       netif_is_bridge_master(rocker_port->bridge_dev);
 }
 
 static bool rocker_port_is_ovsed(const struct rocker_port *rocker_port)
 {
-	return rocker_port_is_slave(rocker_port, "openvswitch");
+	return rocker_port->bridge_dev &&
+	       netif_is_ovs_master(rocker_port->bridge_dev);
 }
 
 #define ROCKER_OP_FLAG_REMOVE		BIT(0)
@@ -5338,10 +5333,10 @@ static int rocker_port_master_changed(struct net_device *dev)
 	int err = 0;
 
 	/* N.B: Do nothing if the type of master is not supported */
-	if (master && master->rtnl_link_ops) {
-		if (!strcmp(master->rtnl_link_ops->kind, "bridge"))
+	if (master) {
+		if (netif_is_bridge_master(master))
 			err = rocker_port_bridge_join(rocker_port, master);
-		else if (!strcmp(master->rtnl_link_ops->kind, "openvswitch"))
+		else if (netif_is_ovs_master(master))
 			err = rocker_port_ovs_changed(rocker_port, master);
 	} else if (rocker_port_is_bridged(rocker_port)) {
 		err = rocker_port_bridge_leave(rocker_port);
-- 
1.9.3

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

* [patch net-next v2 6/6] rocker: use change upper info
  2015-08-27  7:31 [patch net-next v2 0/6] rocker: make master change handling nicer Jiri Pirko
                   ` (4 preceding siblings ...)
  2015-08-27  7:31 ` [patch net-next v2 5/6] rocker: use new helper to figure out master kind Jiri Pirko
@ 2015-08-27  7:31 ` Jiri Pirko
  2015-08-27 23:28 ` [patch net-next v2 0/6] rocker: make master change handling nicer David Miller
  6 siblings, 0 replies; 8+ messages in thread
From: Jiri Pirko @ 2015-08-27  7:31 UTC (permalink / raw)
  To: netdev; +Cc: davem, idosch, eladr, sfeldma, simon.horman, f.fainelli,
	Jiri Pirko

From: Jiri Pirko <jiri@mellanox.com>

Since now information about changed upper is passed along, benefit from
that and use this info directly.

This also fixes possible issues that could happen when non-master device
is added (current code does not distinguish between master and non-master
upper device).

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Acked-by: Scott Feldman <sfeldma@gmail.com
---
v1->v2:
- no change
---
 drivers/net/ethernet/rocker/rocker.c | 61 ++++++++++++++++++++++--------------
 1 file changed, 38 insertions(+), 23 deletions(-)

diff --git a/drivers/net/ethernet/rocker/rocker.c b/drivers/net/ethernet/rocker/rocker.c
index 62f383c..34ac41a 100644
--- a/drivers/net/ethernet/rocker/rocker.c
+++ b/drivers/net/ethernet/rocker/rocker.c
@@ -5326,46 +5326,61 @@ static int rocker_port_ovs_changed(struct rocker_port *rocker_port,
 	return err;
 }
 
-static int rocker_port_master_changed(struct net_device *dev)
+static int rocker_port_master_linked(struct rocker_port *rocker_port,
+				     struct net_device *master)
+{
+	int err = 0;
+
+	if (netif_is_bridge_master(master))
+		err = rocker_port_bridge_join(rocker_port, master);
+	else if (netif_is_ovs_master(master))
+		err = rocker_port_ovs_changed(rocker_port, master);
+	return err;
+}
+
+static int rocker_port_master_unlinked(struct rocker_port *rocker_port)
 {
-	struct rocker_port *rocker_port = netdev_priv(dev);
-	struct net_device *master = netdev_master_upper_dev_get(dev);
 	int err = 0;
 
-	/* N.B: Do nothing if the type of master is not supported */
-	if (master) {
-		if (netif_is_bridge_master(master))
-			err = rocker_port_bridge_join(rocker_port, master);
-		else if (netif_is_ovs_master(master))
-			err = rocker_port_ovs_changed(rocker_port, master);
-	} else if (rocker_port_is_bridged(rocker_port)) {
+	if (rocker_port_is_bridged(rocker_port))
 		err = rocker_port_bridge_leave(rocker_port);
-	} else if (rocker_port_is_ovsed(rocker_port)) {
+	else if (rocker_port_is_ovsed(rocker_port))
 		err = rocker_port_ovs_changed(rocker_port, NULL);
-	}
-
 	return err;
 }
 
 static int rocker_netdevice_event(struct notifier_block *unused,
 				  unsigned long event, void *ptr)
 {
-	struct net_device *dev;
+	struct net_device *dev = netdev_notifier_info_to_dev(ptr);
+	struct netdev_notifier_changeupper_info *info;
+	struct rocker_port *rocker_port;
 	int err;
 
+	if (!rocker_port_dev_check(dev))
+		return NOTIFY_DONE;
+
 	switch (event) {
 	case NETDEV_CHANGEUPPER:
-		dev = netdev_notifier_info_to_dev(ptr);
-		if (!rocker_port_dev_check(dev))
-			return NOTIFY_DONE;
-		err = rocker_port_master_changed(dev);
-		if (err)
-			netdev_warn(dev,
-				    "failed to reflect master change (err %d)\n",
-				    err);
+		info = ptr;
+		if (!info->master)
+			goto out;
+		rocker_port = netdev_priv(dev);
+		if (info->linking) {
+			err = rocker_port_master_linked(rocker_port,
+							info->upper_dev);
+			if (err)
+				netdev_warn(dev, "failed to reflect master linked (err %d)\n",
+					    err);
+		} else {
+			err = rocker_port_master_unlinked(rocker_port);
+			if (err)
+				netdev_warn(dev, "failed to reflect master unlinked (err %d)\n",
+					    err);
+		}
 		break;
 	}
-
+out:
 	return NOTIFY_DONE;
 }
 
-- 
1.9.3

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

* Re: [patch net-next v2 0/6] rocker: make master change handling nicer
  2015-08-27  7:31 [patch net-next v2 0/6] rocker: make master change handling nicer Jiri Pirko
                   ` (5 preceding siblings ...)
  2015-08-27  7:31 ` [patch net-next v2 6/6] rocker: use change upper info Jiri Pirko
@ 2015-08-27 23:28 ` David Miller
  6 siblings, 0 replies; 8+ messages in thread
From: David Miller @ 2015-08-27 23:28 UTC (permalink / raw)
  To: jiri; +Cc: netdev, idosch, eladr, sfeldma, simon.horman, f.fainelli

From: Jiri Pirko <jiri@resnulli.us>
Date: Thu, 27 Aug 2015 09:31:17 +0200

> From: Jiri Pirko <jiri@mellanox.com>
> 
> Jiri Pirko (6):
>   net: introduce change upper device notifier change info
>   net: add netif_is_bridge_master helper
>   net: add netif_is_ovs_master helper with IFF_OPENVSWITCH private flag
>   net: kill long time unused bonding private flags
>   rocker: use new helper to figure out master kind
>   rocker: use change upper info

Series applied, thanks Jiri.

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

end of thread, other threads:[~2015-08-27 23:28 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-08-27  7:31 [patch net-next v2 0/6] rocker: make master change handling nicer Jiri Pirko
2015-08-27  7:31 ` [patch net-next v2 1/6] net: introduce change upper device notifier change info Jiri Pirko
2015-08-27  7:31 ` [patch net-next v2 2/6] net: add netif_is_bridge_master helper Jiri Pirko
2015-08-27  7:31 ` [patch net-next v2 3/6] net: add netif_is_ovs_master helper with IFF_OPENVSWITCH private flag Jiri Pirko
2015-08-27  7:31 ` [patch net-next v2 4/6] net: kill long time unused bonding private flags Jiri Pirko
2015-08-27  7:31 ` [patch net-next v2 5/6] rocker: use new helper to figure out master kind Jiri Pirko
2015-08-27  7:31 ` [patch net-next v2 6/6] rocker: use change upper info Jiri Pirko
2015-08-27 23:28 ` [patch net-next v2 0/6] rocker: make master change handling nicer David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).