Chas Williams <3ch...@gmail.com> wrote:

>netif_is_lag_port should be used to identify link aggregation ports.
>For this to work, we need to reorganize the bonding and team drivers
>so that the necessary flags are set before dev_open is called.
>
>commit 31e77c93e432 ("sched/fair: Update blocked load when newly idle")
>made this decision originally based on the IFF_SLAVE flag which isn't
>used by the team driver.  Note, we do need to retain the IFF_SLAVE
>check for the eql driver.

        Is 31e77c93e432 the correct commit reference?  I don't see
anything in there about IFF_SLAVE or bonding; it's a patch to the
process scheduler.

        And, as Jiri said, the subject doesn't mention bonding.

>Signed-off-by: Chas Williams <3ch...@gmail.com>
>---
> drivers/net/bonding/bond_main.c | 4 ++--
> drivers/net/team/team.c         | 7 +++++--
> net/ipv6/addrconf.c             | 2 +-
> 3 files changed, 8 insertions(+), 5 deletions(-)
>
>diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
>index ffa37adb7681..5cdad164332b 100644
>--- a/drivers/net/bonding/bond_main.c
>+++ b/drivers/net/bonding/bond_main.c
>@@ -1536,6 +1536,7 @@ int bond_enslave(struct net_device *bond_dev, struct 
>net_device *slave_dev,
> 
>       /* set slave flag before open to prevent IPv6 addrconf */
>       slave_dev->flags |= IFF_SLAVE;
>+      slave_dev->priv_flags |= IFF_BONDING;
> 
>       /* open the slave since the application closed it */
>       res = dev_open(slave_dev);
>@@ -1544,7 +1545,6 @@ int bond_enslave(struct net_device *bond_dev, struct 
>net_device *slave_dev,
>               goto err_restore_mac;
>       }
> 
>-      slave_dev->priv_flags |= IFF_BONDING;
>       /* initialize slave stats */
>       dev_get_stats(new_slave->dev, &new_slave->slave_stats);
> 
>@@ -1804,10 +1804,10 @@ int bond_enslave(struct net_device *bond_dev, struct 
>net_device *slave_dev,
>       slave_disable_netpoll(new_slave);
> 
> err_close:
>-      slave_dev->priv_flags &= ~IFF_BONDING;
>       dev_close(slave_dev);
> 
> err_restore_mac:
>+      slave_dev->priv_flags &= ~IFF_BONDING;
>       slave_dev->flags &= ~IFF_SLAVE;
>       if (!bond->params.fail_over_mac ||
>           BOND_MODE(bond) != BOND_MODE_ACTIVEBACKUP) {
>diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c
>index db633ae9f784..8fc7d57e9f6d 100644
>--- a/drivers/net/team/team.c
>+++ b/drivers/net/team/team.c
>@@ -1128,14 +1128,12 @@ static int team_upper_dev_link(struct team *team, 
>struct team_port *port,
>                                          &lag_upper_info, extack);
>       if (err)
>               return err;
>-      port->dev->priv_flags |= IFF_TEAM_PORT;
>       return 0;
> }
> 
> static void team_upper_dev_unlink(struct team *team, struct team_port *port)
> {
>       netdev_upper_dev_unlink(port->dev, team->dev);
>-      port->dev->priv_flags &= ~IFF_TEAM_PORT;
> }
> 
> static void __team_port_change_port_added(struct team_port *port, bool 
> linkup);
>@@ -1214,6 +1212,9 @@ static int team_port_add(struct team *team, struct 
>net_device *port_dev,
>               goto err_port_enter;
>       }
> 
>+      /* set slave flag before open to prevent IPv6 addrconf */
>+      port->dev->priv_flags |= IFF_TEAM_PORT;
>+
>       err = dev_open(port_dev);
>       if (err) {
>               netdev_dbg(dev, "Device %s opening failed\n",
>@@ -1292,6 +1293,7 @@ static int team_port_add(struct team *team, struct 
>net_device *port_dev,
>       dev_close(port_dev);
> 
> err_dev_open:
>+      port->dev->priv_flags &= ~IFF_TEAM_PORT;
>       team_port_leave(team, port);
>       team_port_set_orig_dev_addr(port);
> 
>@@ -1328,6 +1330,7 @@ static int team_port_del(struct team *team, struct 
>net_device *port_dev)
>       dev_uc_unsync(port_dev, dev);
>       dev_mc_unsync(port_dev, dev);
>       dev_close(port_dev);
>+      port->dev->priv_flags &= ~IFF_TEAM_PORT;
>       team_port_leave(team, port);
> 
>       __team_option_inst_mark_removed_port(team, port);
>diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
>index 45b84dd5c4eb..121f863022ed 100644
>--- a/net/ipv6/addrconf.c
>+++ b/net/ipv6/addrconf.c
>@@ -3482,7 +3482,7 @@ static int addrconf_notify(struct notifier_block *this, 
>unsigned long event,
> 
>       case NETDEV_UP:
>       case NETDEV_CHANGE:
>-              if (dev->flags & IFF_SLAVE)
>+              if (netif_is_lag_port(dev) || dev->flags & IFF_SLAVE)

        Note that netvsc_vf_join() also uses IFF_SLAVE in order skip
IPv6 addrconf for netvsc devices; I don't believe its usage will pass
netif_is_lag_port().  It looks like the above will work, but your commit
message mentions eql as the reason for retaining the IFF_SLAVE test, and
eql isn't the only user of IFF_SLAVE in this manner.

        -J

>                       break;
> 
>               if (idev && idev->cnf.disable_ipv6)
>-- 
>2.14.4
>

---
        -Jay Vosburgh, jay.vosbu...@canonical.com

Reply via email to