From: Florian Fainelli <f.fainelli@gmail.com> To: netdev@vger.kernel.org Cc: Florian Fainelli <f.fainelli@gmail.com>, idosch@mellanox.com, linux-kernel@vger.kernel.org, devel@driverdev.osuosl.org, bridge@lists.linux-foundation.org, jiri@mellanox.com, andrew@lunn.ch, vivien.didelot@gmail.com Subject: [PATCH net-next v2 15/16] net: switchdev: Replace port attr set SDO with a notification Date: Sun, 10 Feb 2019 09:51:04 -0800 [thread overview] Message-ID: <20190210175105.31629-16-f.fainelli@gmail.com> (raw) In-Reply-To: <20190210175105.31629-1-f.fainelli@gmail.com> Drop switchdev_ops.switchdev_port_attr_set. Drop the uses of this field from all clients, which were migrated to use switchdev notification in the previous patches. Add a new function switchdev_port_attr_notify() that sends the switchdev notifications SWITCHDEV_PORT_ATTR_SET. Drop __switchdev_port_attr_set() and update switchdev_port_attr_set() likewise. Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> --- net/switchdev/switchdev.c | 92 ++++++++++----------------------------- 1 file changed, 22 insertions(+), 70 deletions(-) diff --git a/net/switchdev/switchdev.c b/net/switchdev/switchdev.c index 7e1357db33d7..fab96d978924 100644 --- a/net/switchdev/switchdev.c +++ b/net/switchdev/switchdev.c @@ -174,81 +174,31 @@ static int switchdev_deferred_enqueue(struct net_device *dev, return 0; } -/** - * switchdev_port_attr_get - Get port attribute - * - * @dev: port device - * @attr: attribute to get - */ -int switchdev_port_attr_get(struct net_device *dev, struct switchdev_attr *attr) +static int switchdev_port_attr_notify(enum switchdev_notifier_type nt, + struct net_device *dev, + const struct switchdev_attr *attr, + struct switchdev_trans *trans) { - const struct switchdev_ops *ops = dev->switchdev_ops; - struct net_device *lower_dev; - struct list_head *iter; - struct switchdev_attr first = { - .id = SWITCHDEV_ATTR_ID_UNDEFINED - }; - int err = -EOPNOTSUPP; + int err; + int rc; - if (ops && ops->switchdev_port_attr_get) - return ops->switchdev_port_attr_get(dev, attr); + struct switchdev_notifier_port_attr_info attr_info = { + .attr = attr, + .trans = trans, + .handled = false, + }; - if (attr->flags & SWITCHDEV_F_NO_RECURSE) + rc = call_switchdev_blocking_notifiers(nt, dev, &attr_info.info, NULL); + err = notifier_to_errno(rc); + if (err) { + WARN_ON(!attr_info.handled); return err; - - /* Switch device port(s) may be stacked under - * bond/team/vlan dev, so recurse down to get attr on - * each port. Return -ENODATA if attr values don't - * compare across ports. - */ - - netdev_for_each_lower_dev(dev, lower_dev, iter) { - err = switchdev_port_attr_get(lower_dev, attr); - if (err) - break; - if (first.id == SWITCHDEV_ATTR_ID_UNDEFINED) - first = *attr; - else if (memcmp(&first, attr, sizeof(*attr))) - return -ENODATA; } - return err; -} -EXPORT_SYMBOL_GPL(switchdev_port_attr_get); - -static int __switchdev_port_attr_set(struct net_device *dev, - const struct switchdev_attr *attr, - struct switchdev_trans *trans) -{ - const struct switchdev_ops *ops = dev->switchdev_ops; - struct net_device *lower_dev; - struct list_head *iter; - int err = -EOPNOTSUPP; - - if (ops && ops->switchdev_port_attr_set) { - err = ops->switchdev_port_attr_set(dev, attr, trans); - goto done; - } - - if (attr->flags & SWITCHDEV_F_NO_RECURSE) - goto done; - - /* Switch device port(s) may be stacked under - * bond/team/vlan dev, so recurse down to set attr on - * each port. - */ - - netdev_for_each_lower_dev(dev, lower_dev, iter) { - err = __switchdev_port_attr_set(lower_dev, attr, trans); - if (err) - break; - } - -done: - if (err == -EOPNOTSUPP && attr->flags & SWITCHDEV_F_SKIP_EOPNOTSUPP) - err = 0; + if (!attr_info.handled) + return -EOPNOTSUPP; - return err; + return 0; } static int switchdev_port_attr_set_now(struct net_device *dev, @@ -267,7 +217,8 @@ static int switchdev_port_attr_set_now(struct net_device *dev, */ trans.ph_prepare = true; - err = __switchdev_port_attr_set(dev, attr, &trans); + err = switchdev_port_attr_notify(SWITCHDEV_PORT_ATTR_SET, dev, attr, + &trans); if (err) { /* Prepare phase failed: abort the transaction. Any * resources reserved in the prepare phase are @@ -286,7 +237,8 @@ static int switchdev_port_attr_set_now(struct net_device *dev, */ trans.ph_prepare = false; - err = __switchdev_port_attr_set(dev, attr, &trans); + err = switchdev_port_attr_notify(SWITCHDEV_PORT_ATTR_SET, dev, attr, + &trans); WARN(err, "%s: Commit of attribute (id=%d) failed.\n", dev->name, attr->id); switchdev_trans_items_warn_destroy(dev, &trans); -- 2.19.1
WARNING: multiple messages have this Message-ID (diff)
From: Florian Fainelli <f.fainelli@gmail.com> To: netdev@vger.kernel.org Cc: devel@driverdev.osuosl.org, andrew@lunn.ch, Florian Fainelli <f.fainelli@gmail.com>, bridge@lists.linux-foundation.org, linux-kernel@vger.kernel.org, idosch@mellanox.com, jiri@mellanox.com, vivien.didelot@gmail.com Subject: [Bridge] [PATCH net-next v2 15/16] net: switchdev: Replace port attr set SDO with a notification Date: Sun, 10 Feb 2019 09:51:04 -0800 [thread overview] Message-ID: <20190210175105.31629-16-f.fainelli@gmail.com> (raw) In-Reply-To: <20190210175105.31629-1-f.fainelli@gmail.com> Drop switchdev_ops.switchdev_port_attr_set. Drop the uses of this field from all clients, which were migrated to use switchdev notification in the previous patches. Add a new function switchdev_port_attr_notify() that sends the switchdev notifications SWITCHDEV_PORT_ATTR_SET. Drop __switchdev_port_attr_set() and update switchdev_port_attr_set() likewise. Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> --- net/switchdev/switchdev.c | 92 ++++++++++----------------------------- 1 file changed, 22 insertions(+), 70 deletions(-) diff --git a/net/switchdev/switchdev.c b/net/switchdev/switchdev.c index 7e1357db33d7..fab96d978924 100644 --- a/net/switchdev/switchdev.c +++ b/net/switchdev/switchdev.c @@ -174,81 +174,31 @@ static int switchdev_deferred_enqueue(struct net_device *dev, return 0; } -/** - * switchdev_port_attr_get - Get port attribute - * - * @dev: port device - * @attr: attribute to get - */ -int switchdev_port_attr_get(struct net_device *dev, struct switchdev_attr *attr) +static int switchdev_port_attr_notify(enum switchdev_notifier_type nt, + struct net_device *dev, + const struct switchdev_attr *attr, + struct switchdev_trans *trans) { - const struct switchdev_ops *ops = dev->switchdev_ops; - struct net_device *lower_dev; - struct list_head *iter; - struct switchdev_attr first = { - .id = SWITCHDEV_ATTR_ID_UNDEFINED - }; - int err = -EOPNOTSUPP; + int err; + int rc; - if (ops && ops->switchdev_port_attr_get) - return ops->switchdev_port_attr_get(dev, attr); + struct switchdev_notifier_port_attr_info attr_info = { + .attr = attr, + .trans = trans, + .handled = false, + }; - if (attr->flags & SWITCHDEV_F_NO_RECURSE) + rc = call_switchdev_blocking_notifiers(nt, dev, &attr_info.info, NULL); + err = notifier_to_errno(rc); + if (err) { + WARN_ON(!attr_info.handled); return err; - - /* Switch device port(s) may be stacked under - * bond/team/vlan dev, so recurse down to get attr on - * each port. Return -ENODATA if attr values don't - * compare across ports. - */ - - netdev_for_each_lower_dev(dev, lower_dev, iter) { - err = switchdev_port_attr_get(lower_dev, attr); - if (err) - break; - if (first.id == SWITCHDEV_ATTR_ID_UNDEFINED) - first = *attr; - else if (memcmp(&first, attr, sizeof(*attr))) - return -ENODATA; } - return err; -} -EXPORT_SYMBOL_GPL(switchdev_port_attr_get); - -static int __switchdev_port_attr_set(struct net_device *dev, - const struct switchdev_attr *attr, - struct switchdev_trans *trans) -{ - const struct switchdev_ops *ops = dev->switchdev_ops; - struct net_device *lower_dev; - struct list_head *iter; - int err = -EOPNOTSUPP; - - if (ops && ops->switchdev_port_attr_set) { - err = ops->switchdev_port_attr_set(dev, attr, trans); - goto done; - } - - if (attr->flags & SWITCHDEV_F_NO_RECURSE) - goto done; - - /* Switch device port(s) may be stacked under - * bond/team/vlan dev, so recurse down to set attr on - * each port. - */ - - netdev_for_each_lower_dev(dev, lower_dev, iter) { - err = __switchdev_port_attr_set(lower_dev, attr, trans); - if (err) - break; - } - -done: - if (err == -EOPNOTSUPP && attr->flags & SWITCHDEV_F_SKIP_EOPNOTSUPP) - err = 0; + if (!attr_info.handled) + return -EOPNOTSUPP; - return err; + return 0; } static int switchdev_port_attr_set_now(struct net_device *dev, @@ -267,7 +217,8 @@ static int switchdev_port_attr_set_now(struct net_device *dev, */ trans.ph_prepare = true; - err = __switchdev_port_attr_set(dev, attr, &trans); + err = switchdev_port_attr_notify(SWITCHDEV_PORT_ATTR_SET, dev, attr, + &trans); if (err) { /* Prepare phase failed: abort the transaction. Any * resources reserved in the prepare phase are @@ -286,7 +237,8 @@ static int switchdev_port_attr_set_now(struct net_device *dev, */ trans.ph_prepare = false; - err = __switchdev_port_attr_set(dev, attr, &trans); + err = switchdev_port_attr_notify(SWITCHDEV_PORT_ATTR_SET, dev, attr, + &trans); WARN(err, "%s: Commit of attribute (id=%d) failed.\n", dev->name, attr->id); switchdev_trans_items_warn_destroy(dev, &trans); -- 2.19.1
next prev parent reply other threads:[~2019-02-10 17:54 UTC|newest] Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-02-10 17:50 [PATCH net-next v2 00/16] net: Remove switchdev_ops Florian Fainelli 2019-02-10 17:50 ` [Bridge] " Florian Fainelli 2019-02-10 17:50 ` [PATCH net-next v2 01/16] Documentation: networking: switchdev: Update port parent ID section Florian Fainelli 2019-02-10 17:50 ` [Bridge] " Florian Fainelli 2019-02-10 17:50 ` [PATCH net-next v2 02/16] mlxsw: spectrum: Check bridge flags during prepare phase Florian Fainelli 2019-02-10 17:50 ` [Bridge] " Florian Fainelli 2019-02-10 17:50 ` [PATCH net-next v2 03/16] staging: fsl-dpaa2: ethsw: Check bridge port flags during set Florian Fainelli 2019-02-10 17:50 ` [Bridge] " Florian Fainelli 2019-02-10 17:50 ` [PATCH net-next v2 04/16] net: dsa: Add setter for SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS Florian Fainelli 2019-02-10 17:50 ` [Bridge] " Florian Fainelli 2019-02-10 17:50 ` [PATCH net-next v2 05/16] rocker: Check bridge flags during prepare phase Florian Fainelli 2019-02-10 17:50 ` [Bridge] " Florian Fainelli 2019-02-10 17:50 ` [PATCH net-next v2 06/16] net: bridge: Stop calling switchdev_port_attr_get() Florian Fainelli 2019-02-10 17:50 ` [Bridge] " Florian Fainelli 2019-02-10 19:05 ` Ido Schimmel 2019-02-10 19:05 ` [Bridge] " Ido Schimmel 2019-02-10 19:34 ` Florian Fainelli 2019-02-10 19:34 ` [Bridge] " Florian Fainelli 2019-02-12 14:20 ` Ido Schimmel 2019-02-12 14:20 ` [Bridge] " Ido Schimmel 2019-02-10 17:50 ` [PATCH net-next v2 07/16] net: Remove SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS_SUPPORT Florian Fainelli 2019-02-10 17:50 ` [Bridge] " Florian Fainelli 2019-02-10 17:50 ` [PATCH net-next v2 08/16] net: Get rid of switchdev_port_attr_get() Florian Fainelli 2019-02-10 17:50 ` [Bridge] " Florian Fainelli 2019-02-10 17:50 ` [PATCH net-next v2 09/16] switchdev: Add SWITCHDEV_PORT_ATTR_SET Florian Fainelli 2019-02-10 17:50 ` [Bridge] " Florian Fainelli 2019-02-10 17:50 ` [PATCH net-next v2 10/16] rocker: Handle SWITCHDEV_PORT_ATTR_SET Florian Fainelli 2019-02-10 17:50 ` [Bridge] " Florian Fainelli 2019-02-10 17:51 ` [PATCH net-next v2 11/16] net: dsa: " Florian Fainelli 2019-02-10 17:51 ` [Bridge] " Florian Fainelli 2019-02-10 17:51 ` [PATCH net-next v2 12/16] mlxsw: spectrum_switchdev: " Florian Fainelli 2019-02-10 17:51 ` [Bridge] " Florian Fainelli 2019-02-10 17:51 ` [PATCH net-next v2 13/16] net: mscc: ocelot: " Florian Fainelli 2019-02-10 17:51 ` [Bridge] " Florian Fainelli 2019-02-10 17:51 ` [PATCH net-next v2 14/16] staging: fsl-dpaa2: ethsw: " Florian Fainelli 2019-02-10 17:51 ` [Bridge] " Florian Fainelli 2019-02-10 17:51 ` Florian Fainelli [this message] 2019-02-10 17:51 ` [Bridge] [PATCH net-next v2 15/16] net: switchdev: Replace port attr set SDO with a notification Florian Fainelli 2019-02-10 17:51 ` [PATCH net-next v2 16/16] net: Remove switchdev_ops Florian Fainelli 2019-02-10 17:51 ` [Bridge] " Florian Fainelli 2019-02-10 20:44 ` [PATCH net-next v2 00/16] " Florian Fainelli 2019-02-10 20:44 ` [Bridge] " Florian Fainelli 2019-02-10 20:51 ` David Miller 2019-02-10 20:51 ` [Bridge] " David Miller
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20190210175105.31629-16-f.fainelli@gmail.com \ --to=f.fainelli@gmail.com \ --cc=andrew@lunn.ch \ --cc=bridge@lists.linux-foundation.org \ --cc=devel@driverdev.osuosl.org \ --cc=idosch@mellanox.com \ --cc=jiri@mellanox.com \ --cc=linux-kernel@vger.kernel.org \ --cc=netdev@vger.kernel.org \ --cc=vivien.didelot@gmail.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
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.