mirror of
https://gitee.com/bianbu-linux/linux-6.6
synced 2025-04-24 14:07:52 -04:00
switchdev: Replace port obj add/del SDO with a notification
Drop switchdev_ops.switchdev_port_obj_add and _del. 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_obj_notify() that sends the switchdev notifications SWITCHDEV_PORT_OBJ_ADD and _DEL. Update switchdev_port_obj_del_now() to dispatch to this new function. Drop __switchdev_port_obj_add() and update switchdev_port_obj_add() likewise. Signed-off-by: Petr Machata <petrm@mellanox.com> Reviewed-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
0e332c854f
commit
d17d9f5e51
7 changed files with 25 additions and 61 deletions
|
@ -353,30 +353,29 @@ static size_t switchdev_obj_size(const struct switchdev_obj *obj)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int __switchdev_port_obj_add(struct net_device *dev,
|
||||
const struct switchdev_obj *obj,
|
||||
struct switchdev_trans *trans)
|
||||
static int switchdev_port_obj_notify(enum switchdev_notifier_type nt,
|
||||
struct net_device *dev,
|
||||
const struct switchdev_obj *obj,
|
||||
struct switchdev_trans *trans)
|
||||
{
|
||||
const struct switchdev_ops *ops = dev->switchdev_ops;
|
||||
struct net_device *lower_dev;
|
||||
struct list_head *iter;
|
||||
int err = -EOPNOTSUPP;
|
||||
int rc;
|
||||
int err;
|
||||
|
||||
if (ops && ops->switchdev_port_obj_add)
|
||||
return ops->switchdev_port_obj_add(dev, obj, trans);
|
||||
struct switchdev_notifier_port_obj_info obj_info = {
|
||||
.obj = obj,
|
||||
.trans = trans,
|
||||
.handled = false,
|
||||
};
|
||||
|
||||
/* Switch device port(s) may be stacked under
|
||||
* bond/team/vlan dev, so recurse down to add object on
|
||||
* each port.
|
||||
*/
|
||||
|
||||
netdev_for_each_lower_dev(dev, lower_dev, iter) {
|
||||
err = __switchdev_port_obj_add(lower_dev, obj, trans);
|
||||
if (err)
|
||||
break;
|
||||
rc = call_switchdev_blocking_notifiers(nt, dev, &obj_info.info);
|
||||
err = notifier_to_errno(rc);
|
||||
if (err) {
|
||||
WARN_ON(!obj_info.handled);
|
||||
return err;
|
||||
}
|
||||
|
||||
return err;
|
||||
if (!obj_info.handled)
|
||||
return -EOPNOTSUPP;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int switchdev_port_obj_add_now(struct net_device *dev,
|
||||
|
@ -397,7 +396,8 @@ static int switchdev_port_obj_add_now(struct net_device *dev,
|
|||
*/
|
||||
|
||||
trans.ph_prepare = true;
|
||||
err = __switchdev_port_obj_add(dev, obj, &trans);
|
||||
err = switchdev_port_obj_notify(SWITCHDEV_PORT_OBJ_ADD,
|
||||
dev, obj, &trans);
|
||||
if (err) {
|
||||
/* Prepare phase failed: abort the transaction. Any
|
||||
* resources reserved in the prepare phase are
|
||||
|
@ -416,7 +416,8 @@ static int switchdev_port_obj_add_now(struct net_device *dev,
|
|||
*/
|
||||
|
||||
trans.ph_prepare = false;
|
||||
err = __switchdev_port_obj_add(dev, obj, &trans);
|
||||
err = switchdev_port_obj_notify(SWITCHDEV_PORT_OBJ_ADD,
|
||||
dev, obj, &trans);
|
||||
WARN(err, "%s: Commit of object (id=%d) failed.\n", dev->name, obj->id);
|
||||
switchdev_trans_items_warn_destroy(dev, &trans);
|
||||
|
||||
|
@ -471,26 +472,8 @@ EXPORT_SYMBOL_GPL(switchdev_port_obj_add);
|
|||
static int switchdev_port_obj_del_now(struct net_device *dev,
|
||||
const struct switchdev_obj *obj)
|
||||
{
|
||||
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_obj_del)
|
||||
return ops->switchdev_port_obj_del(dev, obj);
|
||||
|
||||
/* Switch device port(s) may be stacked under
|
||||
* bond/team/vlan dev, so recurse down to delete object on
|
||||
* each port.
|
||||
*/
|
||||
|
||||
netdev_for_each_lower_dev(dev, lower_dev, iter) {
|
||||
err = switchdev_port_obj_del_now(lower_dev, obj);
|
||||
if (err)
|
||||
break;
|
||||
}
|
||||
|
||||
return err;
|
||||
return switchdev_port_obj_notify(SWITCHDEV_PORT_OBJ_DEL,
|
||||
dev, obj, NULL);
|
||||
}
|
||||
|
||||
static void switchdev_port_obj_del_deferred(struct net_device *dev,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue