[PATCH net-next v7 6/9] devlink: Allow to change priv in devlink-rate from parent_set callbacks
From: Michal Wilczynski <hidden>
Date: 2022-10-27 13:04:17
Subsystem:
devlink, mellanox mlx5 core vpi driver, netdevsim, networking drivers, networking [general], the rest · Maintainers:
Jiri Pirko, Saeed Mahameed, Leon Romanovsky, Tariq Toukan, Mark Bloch, Jakub Kicinski, Andrew Lunn, "David S. Miller", Eric Dumazet, Paolo Abeni, Linus Torvalds
From driver perspective it doesn't make any sense to make any changes to the internal HQoS tree if the created node doesn't have a parent. So a node created without any parent doesn't have to be initialized in the driver. Allow for such scenario by allowing to modify priv in parent_set callbacks. Change priv_child and priv_parent parameters to double pointers, to allow for setting priv during the parent set phase. Signed-off-by: Michal Wilczynski <redacted> --- drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c | 4 ++-- drivers/net/ethernet/mellanox/mlx5/core/esw/qos.h | 2 +- drivers/net/netdevsim/dev.c | 8 ++++---- include/net/devlink.h | 4 ++-- net/core/devlink.c | 12 ++++++------ 5 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c b/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c
index 4f8a24d84a86..0b55a1e477f3 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c@@ -940,11 +940,11 @@ int mlx5_esw_qos_vport_update_group(struct mlx5_eswitch *esw, int mlx5_esw_devlink_rate_parent_set(struct devlink_rate *devlink_rate, struct devlink_rate *parent, - void *priv, void *parent_priv, + void **priv, void *parent_priv, struct netlink_ext_ack *extack) { struct mlx5_esw_rate_group *group; - struct mlx5_vport *vport = priv; + struct mlx5_vport *vport = *priv; if (!parent) return mlx5_esw_qos_vport_update_group(vport->dev->priv.eswitch,
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.h b/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.h
index 0141e9d52037..d3b3ce26883b 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.h@@ -24,7 +24,7 @@ int mlx5_esw_devlink_rate_node_del(struct devlink_rate *rate_node, void *priv, struct netlink_ext_ack *extack); int mlx5_esw_devlink_rate_parent_set(struct devlink_rate *devlink_rate, struct devlink_rate *parent, - void *priv, void *parent_priv, + void **priv, void *parent_priv, struct netlink_ext_ack *extack); #endif
diff --git a/drivers/net/netdevsim/dev.c b/drivers/net/netdevsim/dev.c
index 10e5c4de6b02..f5ae4aed8679 100644
--- a/drivers/net/netdevsim/dev.c
+++ b/drivers/net/netdevsim/dev.c@@ -1275,10 +1275,10 @@ static int nsim_rate_node_del(struct devlink_rate *node, void *priv, static int nsim_rate_leaf_parent_set(struct devlink_rate *child, struct devlink_rate *parent, - void *priv_child, void *priv_parent, + void **priv_child, void *priv_parent, struct netlink_ext_ack *extack) { - struct nsim_dev_port *nsim_dev_port = priv_child; + struct nsim_dev_port *nsim_dev_port = *priv_child; if (parent) nsim_dev_port->parent_name = parent->name;
@@ -1289,10 +1289,10 @@ static int nsim_rate_leaf_parent_set(struct devlink_rate *child, static int nsim_rate_node_parent_set(struct devlink_rate *child, struct devlink_rate *parent, - void *priv_child, void *priv_parent, + void **priv_child, void *priv_parent, struct netlink_ext_ack *extack) { - struct nsim_rate_node *nsim_node = priv_child; + struct nsim_rate_node *nsim_node = *priv_child; if (parent) nsim_node->parent_name = parent->name;
diff --git a/include/net/devlink.h b/include/net/devlink.h
index 2159643d7718..37e73dcf2210 100644
--- a/include/net/devlink.h
+++ b/include/net/devlink.h@@ -1516,11 +1516,11 @@ struct devlink_ops { struct netlink_ext_ack *extack); int (*rate_leaf_parent_set)(struct devlink_rate *child, struct devlink_rate *parent, - void *priv_child, void *priv_parent, + void **priv_child, void *priv_parent, struct netlink_ext_ack *extack); int (*rate_node_parent_set)(struct devlink_rate *child, struct devlink_rate *parent, - void *priv_child, void *priv_parent, + void **priv_child, void *priv_parent, struct netlink_ext_ack *extack); /** * selftests_check() - queries if selftest is supported
diff --git a/net/core/devlink.c b/net/core/devlink.c
index d53da9f9b467..3b51e64a25eb 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c@@ -1880,11 +1880,11 @@ devlink_nl_rate_parent_node_set(struct devlink_rate *devlink_rate, if (parent && !len) { if (devlink_rate_is_leaf(devlink_rate)) err = ops->rate_leaf_parent_set(devlink_rate, NULL, - devlink_rate->priv, NULL, + &devlink_rate->priv, NULL, info->extack); else if (devlink_rate_is_node(devlink_rate)) err = ops->rate_node_parent_set(devlink_rate, NULL, - devlink_rate->priv, NULL, + &devlink_rate->priv, NULL, info->extack); if (err) return err;
@@ -1909,11 +1909,11 @@ devlink_nl_rate_parent_node_set(struct devlink_rate *devlink_rate, if (devlink_rate_is_leaf(devlink_rate)) err = ops->rate_leaf_parent_set(devlink_rate, parent, - devlink_rate->priv, parent->priv, + &devlink_rate->priv, parent->priv, info->extack); else if (devlink_rate_is_node(devlink_rate)) err = ops->rate_node_parent_set(devlink_rate, parent, - devlink_rate->priv, parent->priv, + &devlink_rate->priv, parent->priv, info->extack); if (err) return err;
@@ -10408,10 +10408,10 @@ void devl_rate_nodes_destroy(struct devlink *devlink) refcount_dec(&devlink_rate->parent->refcnt); if (devlink_rate_is_leaf(devlink_rate)) - ops->rate_leaf_parent_set(devlink_rate, NULL, devlink_rate->priv, + ops->rate_leaf_parent_set(devlink_rate, NULL, &devlink_rate->priv, NULL, NULL); else if (devlink_rate_is_node(devlink_rate)) - ops->rate_node_parent_set(devlink_rate, NULL, devlink_rate->priv, + ops->rate_node_parent_set(devlink_rate, NULL, &devlink_rate->priv, NULL, NULL); } list_for_each_entry_safe(devlink_rate, tmp, &devlink->rate_list, list) {
--
2.37.2