devlink_rate
static int ice_devlink_rate_leaf_tx_max_set(struct devlink_rate *rate_leaf, void *priv,
static int ice_devlink_rate_leaf_tx_share_set(struct devlink_rate *rate_leaf, void *priv,
static int ice_devlink_rate_leaf_tx_priority_set(struct devlink_rate *rate_leaf, void *priv,
static int ice_devlink_rate_leaf_tx_weight_set(struct devlink_rate *rate_leaf, void *priv,
static int ice_devlink_rate_node_tx_max_set(struct devlink_rate *rate_node, void *priv,
static int ice_devlink_rate_node_tx_share_set(struct devlink_rate *rate_node, void *priv,
static int ice_devlink_rate_node_tx_priority_set(struct devlink_rate *rate_node, void *priv,
static int ice_devlink_rate_node_tx_weight_set(struct devlink_rate *rate_node, void *priv,
static int ice_devlink_set_parent(struct devlink_rate *devlink_rate,
struct devlink_rate *parent,
struct ice_port_info *pi = ice_get_pi_from_dev_rate(devlink_rate);
if (!ice_enable_custom_tx(devlink_priv(devlink_rate->devlink)))
if (devlink_rate->tx_share)
ice_set_object_tx_share(pi, node, devlink_rate->tx_share, extack);
if (devlink_rate->tx_max)
ice_set_object_tx_max(pi, node, devlink_rate->tx_max, extack);
if (devlink_rate->tx_priority)
ice_set_object_tx_priority(pi, node, devlink_rate->tx_priority, extack);
if (devlink_rate->tx_weight)
ice_set_object_tx_weight(pi, node, devlink_rate->tx_weight, extack);
if (vf->devlink_port.devlink_rate)
struct devlink_rate *rate_node = NULL;
if (!vf->devlink_port.devlink_rate)
if (!sf->devlink_port.devlink_rate)
static struct ice_port_info *ice_get_pi_from_dev_rate(struct devlink_rate *rate_node)
static int ice_devlink_rate_node_new(struct devlink_rate *rate_node, void **priv,
static int ice_devlink_rate_node_del(struct devlink_rate *rate_node, void *priv,
struct devlink_rate *rate_node;
int mlx5_esw_devlink_rate_leaf_tx_share_set(struct devlink_rate *rate_leaf, void *priv,
int mlx5_esw_devlink_rate_leaf_tx_max_set(struct devlink_rate *rate_leaf, void *priv,
int mlx5_esw_devlink_rate_leaf_tc_bw_set(struct devlink_rate *rate_leaf,
int mlx5_esw_devlink_rate_node_tc_bw_set(struct devlink_rate *rate_node,
int mlx5_esw_devlink_rate_node_tx_share_set(struct devlink_rate *rate_node, void *priv,
int mlx5_esw_devlink_rate_node_tx_max_set(struct devlink_rate *rate_node, void *priv,
int mlx5_esw_devlink_rate_node_new(struct devlink_rate *rate_node, void **priv,
int mlx5_esw_devlink_rate_node_del(struct devlink_rate *rate_node, void *priv,
int mlx5_esw_devlink_rate_leaf_parent_set(struct devlink_rate *devlink_rate,
struct devlink_rate *parent,
int mlx5_esw_devlink_rate_node_parent_set(struct devlink_rate *devlink_rate,
struct devlink_rate *parent,
int mlx5_esw_devlink_rate_leaf_tx_share_set(struct devlink_rate *rate_leaf, void *priv,
int mlx5_esw_devlink_rate_leaf_tx_max_set(struct devlink_rate *rate_leaf, void *priv,
int mlx5_esw_devlink_rate_leaf_tc_bw_set(struct devlink_rate *rate_node,
int mlx5_esw_devlink_rate_node_tc_bw_set(struct devlink_rate *rate_node,
int mlx5_esw_devlink_rate_node_tx_share_set(struct devlink_rate *rate_node, void *priv,
int mlx5_esw_devlink_rate_node_tx_max_set(struct devlink_rate *rate_node, void *priv,
int mlx5_esw_devlink_rate_node_new(struct devlink_rate *rate_node, void **priv,
int mlx5_esw_devlink_rate_node_del(struct devlink_rate *rate_node, void *priv,
int mlx5_esw_devlink_rate_leaf_parent_set(struct devlink_rate *devlink_rate,
struct devlink_rate *parent,
int mlx5_esw_devlink_rate_node_parent_set(struct devlink_rate *devlink_rate,
struct devlink_rate *parent,
static int nsim_leaf_tc_bw_set(struct devlink_rate *devlink_rate,
static int nsim_leaf_tx_share_set(struct devlink_rate *devlink_rate, void *priv,
static int nsim_leaf_tx_max_set(struct devlink_rate *devlink_rate, void *priv,
static int nsim_node_tc_bw_set(struct devlink_rate *devlink_rate, void *priv,
static int nsim_node_tx_share_set(struct devlink_rate *devlink_rate, void *priv,
static int nsim_node_tx_max_set(struct devlink_rate *devlink_rate, void *priv,
static int nsim_rate_node_new(struct devlink_rate *node, void **priv,
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,
static int nsim_rate_node_parent_set(struct devlink_rate *child,
struct devlink_rate *parent,
struct devlink_rate *parent;
int (*rate_leaf_tx_share_set)(struct devlink_rate *devlink_rate, void *priv,
int (*rate_leaf_tx_max_set)(struct devlink_rate *devlink_rate, void *priv,
int (*rate_leaf_tx_priority_set)(struct devlink_rate *devlink_rate, void *priv,
int (*rate_leaf_tx_weight_set)(struct devlink_rate *devlink_rate, void *priv,
int (*rate_leaf_tc_bw_set)(struct devlink_rate *devlink_rate,
int (*rate_node_tx_share_set)(struct devlink_rate *devlink_rate, void *priv,
int (*rate_node_tx_max_set)(struct devlink_rate *devlink_rate, void *priv,
int (*rate_node_tx_priority_set)(struct devlink_rate *devlink_rate, void *priv,
int (*rate_node_tx_weight_set)(struct devlink_rate *devlink_rate, void *priv,
int (*rate_node_tc_bw_set)(struct devlink_rate *devlink_rate,
int (*rate_node_new)(struct devlink_rate *rate_node, void **priv,
int (*rate_node_del)(struct devlink_rate *rate_node, void *priv,
struct devlink_rate *devlink_rate;
int (*rate_leaf_parent_set)(struct devlink_rate *child,
struct devlink_rate *parent,
int (*rate_node_parent_set)(struct devlink_rate *child,
struct devlink_rate *parent,
struct devlink_rate *
struct devlink_rate *parent);
struct devlink_rate *parent);
bool devlink_rate_is_node(const struct devlink_rate *devlink_rate);
bool (*rate_filter)(const struct devlink_rate *),
devlink_rate_is_leaf(struct devlink_rate *devlink_rate)
struct devlink_rate *devlink_rate,
struct devlink *devlink = devlink_rate->devlink;
return devlink_rate->type == DEVLINK_RATE_TYPE_LEAF;
if (nla_put_u16(msg, DEVLINK_ATTR_RATE_TYPE, devlink_rate->type))
if (devlink_rate_is_leaf(devlink_rate)) {
devlink_rate->devlink_port->index))
} else if (devlink_rate_is_node(devlink_rate)) {
devlink_rate->name))
devlink_rate->tx_share))
devlink_rate->tx_max))
devlink_rate->tx_priority))
devlink_rate->tx_weight))
if (devlink_rate->parent)
bool devlink_rate_is_node(const struct devlink_rate *devlink_rate)
devlink_rate->parent->name))
if (devlink_rate_put_tc_bws(msg, devlink_rate->tc_bw))
static void devlink_rate_notify(struct devlink_rate *devlink_rate,
struct devlink *devlink = devlink_rate->devlink;
return devlink_rate->type == DEVLINK_RATE_TYPE_NODE;
err = devlink_nl_rate_fill(msg, devlink_rate, cmd, 0, 0, 0, NULL);
struct devlink_rate *rate_node;
static struct devlink_rate *
struct devlink_rate *rate_node;
struct devlink_rate *devlink_rate;
list_for_each_entry(devlink_rate, &devlink->rate_list, list) {
err = devlink_nl_rate_fill(msg, devlink_rate, cmd, id,
struct devlink_rate *devlink_rate;
struct devlink_rate *devlink_rate;
devlink_rate = devlink_rate_get_from_info(devlink, info);
if (IS_ERR(devlink_rate))
return PTR_ERR(devlink_rate);
err = devlink_nl_rate_fill(msg, devlink_rate, DEVLINK_CMD_RATE_NEW,
devlink_rate_is_parent_node(struct devlink_rate *devlink_rate,
struct devlink_rate *parent)
if (parent == devlink_rate)
devlink_nl_rate_parent_node_set(struct devlink_rate *devlink_rate,
struct devlink *devlink = devlink_rate->devlink;
struct devlink_rate *parent;
devlink_rate = devlink_port->devlink_rate;
parent = devlink_rate->parent;
if (devlink_rate_is_leaf(devlink_rate))
err = ops->rate_leaf_parent_set(devlink_rate, NULL,
devlink_rate->priv, NULL,
else if (devlink_rate_is_node(devlink_rate))
err = ops->rate_node_parent_set(devlink_rate, NULL,
devlink_rate->priv, NULL,
return devlink_rate ?: ERR_PTR(-ENODEV);
devlink_rate->parent = NULL;
if (parent == devlink_rate) {
if (devlink_rate_is_node(devlink_rate) &&
devlink_rate_is_parent_node(devlink_rate, parent->parent)) {
if (devlink_rate_is_leaf(devlink_rate))
err = ops->rate_leaf_parent_set(devlink_rate, parent,
devlink_rate->priv, parent->priv,
else if (devlink_rate_is_node(devlink_rate))
err = ops->rate_node_parent_set(devlink_rate, parent,
devlink_rate->priv, parent->priv,
static struct devlink_rate *
if (devlink_rate->parent)
refcount_dec(&devlink_rate->parent->refcnt);
devlink_rate->parent = parent;
struct devlink_rate *devlink_rate;
list_for_each_entry(devlink_rate, &devlink->rate_list, list) {
static int devlink_nl_rate_tc_bw_set(struct devlink_rate *devlink_rate,
struct devlink *devlink = devlink_rate->devlink;
if (devlink_rate_is_node(devlink_rate) &&
!strcmp(node_name, devlink_rate->name))
return devlink_rate;
if (devlink_rate_is_leaf(devlink_rate))
err = ops->rate_leaf_tc_bw_set(devlink_rate, devlink_rate->priv,
else if (devlink_rate_is_node(devlink_rate))
err = ops->rate_node_tc_bw_set(devlink_rate, devlink_rate->priv,
memcpy(devlink_rate->tc_bw, tc_bw, sizeof(tc_bw));
static int devlink_nl_rate_set(struct devlink_rate *devlink_rate,
if (devlink_rate_is_leaf(devlink_rate))
err = ops->rate_leaf_tx_share_set(devlink_rate, devlink_rate->priv,
else if (devlink_rate_is_node(devlink_rate))
err = ops->rate_node_tx_share_set(devlink_rate, devlink_rate->priv,
devlink_rate->tx_share = rate;
if (devlink_rate_is_leaf(devlink_rate))
err = ops->rate_leaf_tx_max_set(devlink_rate, devlink_rate->priv,
else if (devlink_rate_is_node(devlink_rate))
err = ops->rate_node_tx_max_set(devlink_rate, devlink_rate->priv,
devlink_rate->tx_max = rate;
static struct devlink_rate *
if (devlink_rate_is_leaf(devlink_rate))
err = ops->rate_leaf_tx_priority_set(devlink_rate, devlink_rate->priv,
else if (devlink_rate_is_node(devlink_rate))
err = ops->rate_node_tx_priority_set(devlink_rate, devlink_rate->priv,
devlink_rate->tx_priority = priority;
if (devlink_rate_is_leaf(devlink_rate))
err = ops->rate_leaf_tx_weight_set(devlink_rate, devlink_rate->priv,
else if (devlink_rate_is_node(devlink_rate))
err = ops->rate_node_tx_weight_set(devlink_rate, devlink_rate->priv,
devlink_rate->tx_weight = weight;
err = devlink_nl_rate_parent_node_set(devlink_rate, info,
err = devlink_nl_rate_tc_bw_set(devlink_rate, info);
struct devlink_rate *devlink_rate;
devlink_rate = devlink_rate_get_from_info(devlink, info);
if (IS_ERR(devlink_rate))
return PTR_ERR(devlink_rate);
if (!ops || !devlink_rate_set_ops_supported(ops, info, devlink_rate->type))
err = devlink_nl_rate_set(devlink_rate, ops, info);
devlink_rate_notify(devlink_rate, DEVLINK_CMD_RATE_NEW);
struct devlink_rate *rate_node;
static struct devlink_rate *
struct devlink_rate *rate_node;
static struct devlink_rate *
bool (*rate_filter)(const struct devlink_rate *),
struct devlink_rate *devlink_rate;
list_for_each_entry(devlink_rate, &devlink->rate_list, list)
if (!rate_filter || rate_filter(devlink_rate)) {
struct devlink_rate *
struct devlink_rate *parent)
struct devlink_rate *rate_node;
struct devlink_rate *parent)
struct devlink_rate *devlink_rate;
if (WARN_ON(devlink_port->devlink_rate))
devlink_rate = kzalloc_obj(*devlink_rate);
if (!devlink_rate)
devlink_rate->parent = parent;
refcount_inc(&devlink_rate->parent->refcnt);
devlink_rate->type = DEVLINK_RATE_TYPE_LEAF;
devlink_rate->devlink = devlink;
devlink_rate->devlink_port = devlink_port;
devlink_rate->priv = priv;
list_add_tail(&devlink_rate->list, &devlink->rate_list);
devlink_port->devlink_rate = devlink_rate;
devlink_rate_notify(devlink_rate, DEVLINK_CMD_RATE_NEW);
struct devlink_rate *devlink_rate = devlink_port->devlink_rate;
if (!devlink_rate)
devlink_rate_notify(devlink_rate, DEVLINK_CMD_RATE_DEL);
if (devlink_rate->parent)
refcount_dec(&devlink_rate->parent->refcnt);
list_del(&devlink_rate->list);
devlink_port->devlink_rate = NULL;
kfree(devlink_rate);
struct devlink_rate *devlink_rate, *tmp;
list_for_each_entry(devlink_rate, &devlink->rate_list, list) {
if (!devlink_rate->parent)
if (devlink_rate_is_leaf(devlink_rate))
ops->rate_leaf_parent_set(devlink_rate, NULL, devlink_rate->priv,
else if (devlink_rate_is_node(devlink_rate))
ops->rate_node_parent_set(devlink_rate, NULL, devlink_rate->priv,
refcount_dec(&devlink_rate->parent->refcnt);
devlink_rate->parent = NULL;
list_for_each_entry_safe(devlink_rate, tmp, &devlink->rate_list, list) {
if (devlink_rate_is_node(devlink_rate)) {
ops->rate_node_del(devlink_rate, devlink_rate->priv, NULL);
list_del(&devlink_rate->list);
kfree(devlink_rate->name);
kfree(devlink_rate);