Skip to content

Commit 9c7bbf4

Browse files
cjubranPaolo Abeni
authored andcommitted
net/mlx5: Add support for setting parent of nodes
Introduce `mlx5_esw_devlink_rate_node_parent_set()` to allow assigning a parent to scheduling nodes. Implement `mlx5_esw_qos_node_update_parent()` and `mlx5_esw_qos_node_validate_set_parent()` to enforce constraints on node reassignment. Don't allow reassignment of nodes with active rate objects. Update `esw_qos_node_set_parent()` to handle cases where the parent is NULL. A NULL parent indicates that the scheduling element is attached to the root scheduling element, and since only rate nodes can be connected to the root, this update is now necessary. Signed-off-by: Carolina Jubran <cjubran@nvidia.com> Reviewed-by: Cosmin Ratiu <cratiu@nvidia.com> Reviewed-by: Dragos Tatulea <dtatulea@nvidia.com> Signed-off-by: Tariq Toukan <tariqt@nvidia.com> Link: https://patch.msgid.link/1741642016-44918-5-git-send-email-tariqt@nvidia.com Reviewed-by: Jacob Keller <jacob.e.keller@intel.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
1 parent f88c349 commit 9c7bbf4

File tree

3 files changed

+110
-3
lines changed

3 files changed

+110
-3
lines changed

drivers/net/ethernet/mellanox/mlx5/core/devlink.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,7 @@ static const struct devlink_ops mlx5_devlink_ops = {
328328
.rate_node_new = mlx5_esw_devlink_rate_node_new,
329329
.rate_node_del = mlx5_esw_devlink_rate_node_del,
330330
.rate_leaf_parent_set = mlx5_esw_devlink_rate_leaf_parent_set,
331+
.rate_node_parent_set = mlx5_esw_devlink_rate_node_parent_set,
331332
#endif
332333
#ifdef CONFIG_MLX5_SF_MANAGER
333334
.port_new = mlx5_devlink_sf_port_new,

drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c

Lines changed: 105 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,9 @@ esw_qos_node_set_parent(struct mlx5_esw_sched_node *node, struct mlx5_esw_sched_
111111
{
112112
list_del_init(&node->entry);
113113
node->parent = parent;
114-
list_add_tail(&node->entry, &parent->children);
115-
node->esw = parent->esw;
116-
node->level = parent->level + 1;
114+
if (parent)
115+
node->esw = parent->esw;
116+
esw_qos_node_attach_to_parent(node);
117117
}
118118

119119
void mlx5_esw_qos_vport_qos_free(struct mlx5_vport *vport)
@@ -1018,3 +1018,105 @@ int mlx5_esw_devlink_rate_leaf_parent_set(struct devlink_rate *devlink_rate,
10181018
node = parent_priv;
10191019
return mlx5_esw_qos_vport_update_parent(vport, node, extack);
10201020
}
1021+
1022+
static int
1023+
mlx5_esw_qos_node_validate_set_parent(struct mlx5_esw_sched_node *node,
1024+
struct mlx5_esw_sched_node *parent,
1025+
struct netlink_ext_ack *extack)
1026+
{
1027+
u8 new_level, max_level;
1028+
1029+
if (parent && parent->esw != node->esw) {
1030+
NL_SET_ERR_MSG_MOD(extack,
1031+
"Cannot assign node to another E-Switch");
1032+
return -EOPNOTSUPP;
1033+
}
1034+
1035+
if (!list_empty(&node->children)) {
1036+
NL_SET_ERR_MSG_MOD(extack,
1037+
"Cannot reassign a node that contains rate objects");
1038+
return -EOPNOTSUPP;
1039+
}
1040+
1041+
new_level = parent ? parent->level + 1 : 2;
1042+
max_level = 1 << MLX5_CAP_QOS(node->esw->dev, log_esw_max_sched_depth);
1043+
if (new_level > max_level) {
1044+
NL_SET_ERR_MSG_MOD(extack,
1045+
"Node hierarchy depth exceeds the maximum supported level");
1046+
return -EOPNOTSUPP;
1047+
}
1048+
1049+
return 0;
1050+
}
1051+
1052+
static int esw_qos_vports_node_update_parent(struct mlx5_esw_sched_node *node,
1053+
struct mlx5_esw_sched_node *parent,
1054+
struct netlink_ext_ack *extack)
1055+
{
1056+
struct mlx5_esw_sched_node *curr_parent = node->parent;
1057+
struct mlx5_eswitch *esw = node->esw;
1058+
u32 parent_ix;
1059+
int err;
1060+
1061+
parent_ix = parent ? parent->ix : node->esw->qos.root_tsar_ix;
1062+
mlx5_destroy_scheduling_element_cmd(esw->dev,
1063+
SCHEDULING_HIERARCHY_E_SWITCH,
1064+
node->ix);
1065+
err = esw_qos_create_node_sched_elem(esw->dev, parent_ix,
1066+
node->max_rate, 0, &node->ix);
1067+
if (err) {
1068+
NL_SET_ERR_MSG_MOD(extack,
1069+
"Failed to create a node under the new hierarchy.");
1070+
if (esw_qos_create_node_sched_elem(esw->dev, curr_parent->ix,
1071+
node->max_rate,
1072+
node->bw_share,
1073+
&node->ix))
1074+
esw_warn(esw->dev, "Node restore QoS failed\n");
1075+
1076+
return err;
1077+
}
1078+
esw_qos_node_set_parent(node, parent);
1079+
1080+
return 0;
1081+
}
1082+
1083+
static int mlx5_esw_qos_node_update_parent(struct mlx5_esw_sched_node *node,
1084+
struct mlx5_esw_sched_node *parent,
1085+
struct netlink_ext_ack *extack)
1086+
{
1087+
struct mlx5_esw_sched_node *curr_parent;
1088+
struct mlx5_eswitch *esw = node->esw;
1089+
int err;
1090+
1091+
err = mlx5_esw_qos_node_validate_set_parent(node, parent, extack);
1092+
if (err)
1093+
return err;
1094+
1095+
esw_qos_lock(esw);
1096+
curr_parent = node->parent;
1097+
err = esw_qos_vports_node_update_parent(node, parent, extack);
1098+
if (err)
1099+
goto out;
1100+
1101+
esw_qos_normalize_min_rate(esw, curr_parent, extack);
1102+
esw_qos_normalize_min_rate(esw, parent, extack);
1103+
1104+
out:
1105+
esw_qos_unlock(esw);
1106+
1107+
return err;
1108+
}
1109+
1110+
int mlx5_esw_devlink_rate_node_parent_set(struct devlink_rate *devlink_rate,
1111+
struct devlink_rate *parent,
1112+
void *priv, void *parent_priv,
1113+
struct netlink_ext_ack *extack)
1114+
{
1115+
struct mlx5_esw_sched_node *node = priv, *parent_node;
1116+
1117+
if (!parent)
1118+
return mlx5_esw_qos_node_update_parent(node, NULL, extack);
1119+
1120+
parent_node = parent_priv;
1121+
return mlx5_esw_qos_node_update_parent(node, parent_node, extack);
1122+
}

drivers/net/ethernet/mellanox/mlx5/core/esw/qos.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ int mlx5_esw_devlink_rate_leaf_parent_set(struct devlink_rate *devlink_rate,
3333
struct devlink_rate *parent,
3434
void *priv, void *parent_priv,
3535
struct netlink_ext_ack *extack);
36+
int mlx5_esw_devlink_rate_node_parent_set(struct devlink_rate *devlink_rate,
37+
struct devlink_rate *parent,
38+
void *priv, void *parent_priv,
39+
struct netlink_ext_ack *extack);
3640
#endif
3741

3842
#endif

0 commit comments

Comments
 (0)