Commit d17d9f5e authored by Petr Machata's avatar Petr Machata Committed by David S. Miller

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: default avatarPetr Machata <petrm@mellanox.com>
Reviewed-by: default avatarIdo Schimmel <idosch@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0e332c85
...@@ -1968,8 +1968,6 @@ static struct mlxsw_sp_port *mlxsw_sp_lag_rep_port(struct mlxsw_sp *mlxsw_sp, ...@@ -1968,8 +1968,6 @@ static struct mlxsw_sp_port *mlxsw_sp_lag_rep_port(struct mlxsw_sp *mlxsw_sp,
static const struct switchdev_ops mlxsw_sp_port_switchdev_ops = { static const struct switchdev_ops mlxsw_sp_port_switchdev_ops = {
.switchdev_port_attr_get = mlxsw_sp_port_attr_get, .switchdev_port_attr_get = mlxsw_sp_port_attr_get,
.switchdev_port_attr_set = mlxsw_sp_port_attr_set, .switchdev_port_attr_set = mlxsw_sp_port_attr_set,
.switchdev_port_obj_add = mlxsw_sp_port_obj_add,
.switchdev_port_obj_del = mlxsw_sp_port_obj_del,
}; };
static int static int
......
...@@ -1337,8 +1337,6 @@ static int ocelot_port_obj_del(struct net_device *dev, ...@@ -1337,8 +1337,6 @@ static int ocelot_port_obj_del(struct net_device *dev,
static const struct switchdev_ops ocelot_port_switchdev_ops = { static const struct switchdev_ops ocelot_port_switchdev_ops = {
.switchdev_port_attr_get = ocelot_port_attr_get, .switchdev_port_attr_get = ocelot_port_attr_get,
.switchdev_port_attr_set = ocelot_port_attr_set, .switchdev_port_attr_set = ocelot_port_attr_set,
.switchdev_port_obj_add = ocelot_port_obj_add,
.switchdev_port_obj_del = ocelot_port_obj_del,
}; };
static int ocelot_port_bridge_join(struct ocelot_port *ocelot_port, static int ocelot_port_bridge_join(struct ocelot_port *ocelot_port,
......
...@@ -2145,8 +2145,6 @@ static int rocker_port_obj_del(struct net_device *dev, ...@@ -2145,8 +2145,6 @@ static int rocker_port_obj_del(struct net_device *dev,
static const struct switchdev_ops rocker_port_switchdev_ops = { static const struct switchdev_ops rocker_port_switchdev_ops = {
.switchdev_port_attr_get = rocker_port_attr_get, .switchdev_port_attr_get = rocker_port_attr_get,
.switchdev_port_attr_set = rocker_port_attr_set, .switchdev_port_attr_set = rocker_port_attr_set,
.switchdev_port_obj_add = rocker_port_obj_add,
.switchdev_port_obj_del = rocker_port_obj_del,
}; };
struct rocker_fib_event_work { struct rocker_fib_event_work {
......
...@@ -930,8 +930,6 @@ static int swdev_port_obj_del(struct net_device *netdev, ...@@ -930,8 +930,6 @@ static int swdev_port_obj_del(struct net_device *netdev,
static const struct switchdev_ops ethsw_port_switchdev_ops = { static const struct switchdev_ops ethsw_port_switchdev_ops = {
.switchdev_port_attr_get = swdev_port_attr_get, .switchdev_port_attr_get = swdev_port_attr_get,
.switchdev_port_attr_set = swdev_port_attr_set, .switchdev_port_attr_set = swdev_port_attr_set,
.switchdev_port_obj_add = swdev_port_obj_add,
.switchdev_port_obj_del = swdev_port_obj_del,
}; };
/* For the moment, only flood setting needs to be updated */ /* For the moment, only flood setting needs to be updated */
......
...@@ -121,10 +121,6 @@ typedef int switchdev_obj_dump_cb_t(struct switchdev_obj *obj); ...@@ -121,10 +121,6 @@ typedef int switchdev_obj_dump_cb_t(struct switchdev_obj *obj);
* @switchdev_port_attr_get: Get a port attribute (see switchdev_attr). * @switchdev_port_attr_get: Get a port attribute (see switchdev_attr).
* *
* @switchdev_port_attr_set: Set a port attribute (see switchdev_attr). * @switchdev_port_attr_set: Set a port attribute (see switchdev_attr).
*
* @switchdev_port_obj_add: Add an object to port (see switchdev_obj_*).
*
* @switchdev_port_obj_del: Delete an object from port (see switchdev_obj_*).
*/ */
struct switchdev_ops { struct switchdev_ops {
int (*switchdev_port_attr_get)(struct net_device *dev, int (*switchdev_port_attr_get)(struct net_device *dev,
...@@ -132,11 +128,6 @@ struct switchdev_ops { ...@@ -132,11 +128,6 @@ struct switchdev_ops {
int (*switchdev_port_attr_set)(struct net_device *dev, int (*switchdev_port_attr_set)(struct net_device *dev,
const struct switchdev_attr *attr, const struct switchdev_attr *attr,
struct switchdev_trans *trans); struct switchdev_trans *trans);
int (*switchdev_port_obj_add)(struct net_device *dev,
const struct switchdev_obj *obj,
struct switchdev_trans *trans);
int (*switchdev_port_obj_del)(struct net_device *dev,
const struct switchdev_obj *obj);
}; };
enum switchdev_notifier_type { enum switchdev_notifier_type {
......
...@@ -1050,8 +1050,6 @@ static const struct net_device_ops dsa_slave_netdev_ops = { ...@@ -1050,8 +1050,6 @@ static const struct net_device_ops dsa_slave_netdev_ops = {
static const struct switchdev_ops dsa_slave_switchdev_ops = { static const struct switchdev_ops dsa_slave_switchdev_ops = {
.switchdev_port_attr_get = dsa_slave_port_attr_get, .switchdev_port_attr_get = dsa_slave_port_attr_get,
.switchdev_port_attr_set = dsa_slave_port_attr_set, .switchdev_port_attr_set = dsa_slave_port_attr_set,
.switchdev_port_obj_add = dsa_slave_port_obj_add,
.switchdev_port_obj_del = dsa_slave_port_obj_del,
}; };
static struct device_type dsa_type = { static struct device_type dsa_type = {
......
...@@ -353,30 +353,29 @@ static size_t switchdev_obj_size(const struct switchdev_obj *obj) ...@@ -353,30 +353,29 @@ static size_t switchdev_obj_size(const struct switchdev_obj *obj)
return 0; return 0;
} }
static int __switchdev_port_obj_add(struct net_device *dev, static int switchdev_port_obj_notify(enum switchdev_notifier_type nt,
struct net_device *dev,
const struct switchdev_obj *obj, const struct switchdev_obj *obj,
struct switchdev_trans *trans) struct switchdev_trans *trans)
{ {
const struct switchdev_ops *ops = dev->switchdev_ops; int rc;
struct net_device *lower_dev; int err;
struct list_head *iter;
int err = -EOPNOTSUPP;
if (ops && ops->switchdev_port_obj_add)
return ops->switchdev_port_obj_add(dev, obj, trans);
/* 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) { struct switchdev_notifier_port_obj_info obj_info = {
err = __switchdev_port_obj_add(lower_dev, obj, trans); .obj = obj,
if (err) .trans = trans,
break; .handled = false,
} };
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, 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, ...@@ -397,7 +396,8 @@ static int switchdev_port_obj_add_now(struct net_device *dev,
*/ */
trans.ph_prepare = true; 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) { if (err) {
/* Prepare phase failed: abort the transaction. Any /* Prepare phase failed: abort the transaction. Any
* resources reserved in the prepare phase are * resources reserved in the prepare phase are
...@@ -416,7 +416,8 @@ static int switchdev_port_obj_add_now(struct net_device *dev, ...@@ -416,7 +416,8 @@ static int switchdev_port_obj_add_now(struct net_device *dev,
*/ */
trans.ph_prepare = false; 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); WARN(err, "%s: Commit of object (id=%d) failed.\n", dev->name, obj->id);
switchdev_trans_items_warn_destroy(dev, &trans); switchdev_trans_items_warn_destroy(dev, &trans);
...@@ -471,26 +472,8 @@ EXPORT_SYMBOL_GPL(switchdev_port_obj_add); ...@@ -471,26 +472,8 @@ EXPORT_SYMBOL_GPL(switchdev_port_obj_add);
static int switchdev_port_obj_del_now(struct net_device *dev, static int switchdev_port_obj_del_now(struct net_device *dev,
const struct switchdev_obj *obj) const struct switchdev_obj *obj)
{ {
const struct switchdev_ops *ops = dev->switchdev_ops; return switchdev_port_obj_notify(SWITCHDEV_PORT_OBJ_DEL,
struct net_device *lower_dev; dev, obj, NULL);
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;
} }
static void switchdev_port_obj_del_deferred(struct net_device *dev, static void switchdev_port_obj_del_deferred(struct net_device *dev,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment