Message ID | 1443128370-27353-3-git-send-email-sfeldma@gmail.com |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
Acked-by: Premkumar Jonnala > -----Original Message----- > From: sfeldma@gmail.com [mailto:sfeldma@gmail.com] > Sent: Friday, September 25, 2015 2:29 AM > To: netdev@vger.kernel.org > Cc: jiri@resnulli.us; siva.mannem.lnx@gmail.com; Premkumar Jonnala; > stephen@networkplumber.org; roopa@cumulusnetworks.com; > andrew@lunn.ch; f.fainelli@gmail.com; vivien.didelot@savoirfairelinux.com > Subject: [PATCH net-next 2/4] switchdev: skip over ports returning - > EOPNOTSUPP when recursing ports > > From: Scott Feldman <sfeldma@gmail.com> > > This allows us to recurse over all the ports, skipping over unsupporting > ports. Without the change, the recursion would stop at first unsupported > port. > > Signed-off-by: Scott Feldman <sfeldma@gmail.com> > --- > include/net/switchdev.h | 1 + > net/switchdev/switchdev.c | 9 ++++++++- > 2 files changed, 9 insertions(+), 1 deletion(-) > > diff --git a/include/net/switchdev.h b/include/net/switchdev.h > index 54b2faa..22a6dbe 100644 > --- a/include/net/switchdev.h > +++ b/include/net/switchdev.h > @@ -15,6 +15,7 @@ > #include <linux/notifier.h> > > #define SWITCHDEV_F_NO_RECURSE BIT(0) > +#define SWITCHDEV_F_SKIP_EOPNOTSUPP BIT(1) > > enum switchdev_trans { > SWITCHDEV_TRANS_NONE, > diff --git a/net/switchdev/switchdev.c b/net/switchdev/switchdev.c > index fda38f8..5c30da0 100644 > --- a/net/switchdev/switchdev.c > +++ b/net/switchdev/switchdev.c > @@ -73,7 +73,7 @@ static int __switchdev_port_attr_set(struct net_device > *dev, > return ops->switchdev_port_attr_set(dev, attr); > > if (attr->flags & SWITCHDEV_F_NO_RECURSE) > - return err; > + goto done; > > /* Switch device port(s) may be stacked under > * bond/team/vlan dev, so recurse down to set attr on > @@ -82,10 +82,17 @@ static int __switchdev_port_attr_set(struct net_device > *dev, > > netdev_for_each_lower_dev(dev, lower_dev, iter) { > err = __switchdev_port_attr_set(lower_dev, attr); > + if (err == -EOPNOTSUPP && > + attr->flags & SWITCHDEV_F_SKIP_EOPNOTSUPP) > + continue; > if (err) > break; > } > > +done: > + if (err == -EOPNOTSUPP && attr->flags & > SWITCHDEV_F_SKIP_EOPNOTSUPP) > + err = 0; > + > return err; > } > > -- > 1.7.10.4 -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/include/net/switchdev.h b/include/net/switchdev.h index 54b2faa..22a6dbe 100644 --- a/include/net/switchdev.h +++ b/include/net/switchdev.h @@ -15,6 +15,7 @@ #include <linux/notifier.h> #define SWITCHDEV_F_NO_RECURSE BIT(0) +#define SWITCHDEV_F_SKIP_EOPNOTSUPP BIT(1) enum switchdev_trans { SWITCHDEV_TRANS_NONE, diff --git a/net/switchdev/switchdev.c b/net/switchdev/switchdev.c index fda38f8..5c30da0 100644 --- a/net/switchdev/switchdev.c +++ b/net/switchdev/switchdev.c @@ -73,7 +73,7 @@ static int __switchdev_port_attr_set(struct net_device *dev, return ops->switchdev_port_attr_set(dev, attr); if (attr->flags & SWITCHDEV_F_NO_RECURSE) - return err; + goto done; /* Switch device port(s) may be stacked under * bond/team/vlan dev, so recurse down to set attr on @@ -82,10 +82,17 @@ static int __switchdev_port_attr_set(struct net_device *dev, netdev_for_each_lower_dev(dev, lower_dev, iter) { err = __switchdev_port_attr_set(lower_dev, attr); + if (err == -EOPNOTSUPP && + attr->flags & SWITCHDEV_F_SKIP_EOPNOTSUPP) + continue; if (err) break; } +done: + if (err == -EOPNOTSUPP && attr->flags & SWITCHDEV_F_SKIP_EOPNOTSUPP) + err = 0; + return err; }