Lines Matching refs:devlink_rate

10 devlink_rate_is_leaf(struct devlink_rate *devlink_rate)
12 return devlink_rate->type == DEVLINK_RATE_TYPE_LEAF;
16 devlink_rate_is_node(struct devlink_rate *devlink_rate)
18 return devlink_rate->type == DEVLINK_RATE_TYPE_NODE;
21 static struct devlink_rate *
24 struct devlink_rate *devlink_rate;
30 devlink_rate = devlink_port->devlink_rate;
31 return devlink_rate ?: ERR_PTR(-ENODEV);
34 static struct devlink_rate *
37 static struct devlink_rate *devlink_rate;
39 list_for_each_entry(devlink_rate, &devlink->rate_list, list) {
40 if (devlink_rate_is_node(devlink_rate) &&
41 !strcmp(node_name, devlink_rate->name))
42 return devlink_rate;
47 static struct devlink_rate *
64 static struct devlink_rate *
70 static struct devlink_rate *
84 struct devlink_rate *devlink_rate,
88 struct devlink *devlink = devlink_rate->devlink;
98 if (nla_put_u16(msg, DEVLINK_ATTR_RATE_TYPE, devlink_rate->type))
101 if (devlink_rate_is_leaf(devlink_rate)) {
103 devlink_rate->devlink_port->index))
105 } else if (devlink_rate_is_node(devlink_rate)) {
107 devlink_rate->name))
112 devlink_rate->tx_share, DEVLINK_ATTR_PAD))
116 devlink_rate->tx_max, DEVLINK_ATTR_PAD))
120 devlink_rate->tx_priority))
124 devlink_rate->tx_weight))
127 if (devlink_rate->parent)
129 devlink_rate->parent->name))
140 static void devlink_rate_notify(struct devlink_rate *devlink_rate,
143 struct devlink *devlink = devlink_rate->devlink;
156 err = devlink_nl_rate_fill(msg, devlink_rate, cmd, 0, 0, 0, NULL);
168 struct devlink_rate *rate_node;
176 struct devlink_rate *rate_node;
187 struct devlink_rate *devlink_rate;
191 list_for_each_entry(devlink_rate, &devlink->rate_list, list) {
199 err = devlink_nl_rate_fill(msg, devlink_rate, cmd, id,
219 struct devlink_rate *devlink_rate;
223 devlink_rate = devlink_rate_get_from_info(devlink, info);
224 if (IS_ERR(devlink_rate))
225 return PTR_ERR(devlink_rate);
231 err = devlink_nl_rate_fill(msg, devlink_rate, DEVLINK_CMD_RATE_NEW,
243 devlink_rate_is_parent_node(struct devlink_rate *devlink_rate,
244 struct devlink_rate *parent)
247 if (parent == devlink_rate)
255 devlink_nl_rate_parent_node_set(struct devlink_rate *devlink_rate,
259 struct devlink *devlink = devlink_rate->devlink;
263 struct devlink_rate *parent;
266 parent = devlink_rate->parent;
269 if (devlink_rate_is_leaf(devlink_rate))
270 err = ops->rate_leaf_parent_set(devlink_rate, NULL,
271 devlink_rate->priv, NULL,
273 else if (devlink_rate_is_node(devlink_rate))
274 err = ops->rate_node_parent_set(devlink_rate, NULL,
275 devlink_rate->priv, NULL,
281 devlink_rate->parent = NULL;
287 if (parent == devlink_rate) {
292 if (devlink_rate_is_node(devlink_rate) &&
293 devlink_rate_is_parent_node(devlink_rate, parent->parent)) {
298 if (devlink_rate_is_leaf(devlink_rate))
299 err = ops->rate_leaf_parent_set(devlink_rate, parent,
300 devlink_rate->priv, parent->priv,
302 else if (devlink_rate_is_node(devlink_rate))
303 err = ops->rate_node_parent_set(devlink_rate, parent,
304 devlink_rate->priv, parent->priv,
309 if (devlink_rate->parent)
311 refcount_dec(&devlink_rate->parent->refcnt);
314 devlink_rate->parent = parent;
320 static int devlink_nl_rate_set(struct devlink_rate *devlink_rate,
332 if (devlink_rate_is_leaf(devlink_rate))
333 err = ops->rate_leaf_tx_share_set(devlink_rate, devlink_rate->priv,
335 else if (devlink_rate_is_node(devlink_rate))
336 err = ops->rate_node_tx_share_set(devlink_rate, devlink_rate->priv,
340 devlink_rate->tx_share = rate;
345 if (devlink_rate_is_leaf(devlink_rate))
346 err = ops->rate_leaf_tx_max_set(devlink_rate, devlink_rate->priv,
348 else if (devlink_rate_is_node(devlink_rate))
349 err = ops->rate_node_tx_max_set(devlink_rate, devlink_rate->priv,
353 devlink_rate->tx_max = rate;
358 if (devlink_rate_is_leaf(devlink_rate))
359 err = ops->rate_leaf_tx_priority_set(devlink_rate, devlink_rate->priv,
361 else if (devlink_rate_is_node(devlink_rate))
362 err = ops->rate_node_tx_priority_set(devlink_rate, devlink_rate->priv,
367 devlink_rate->tx_priority = priority;
372 if (devlink_rate_is_leaf(devlink_rate))
373 err = ops->rate_leaf_tx_weight_set(devlink_rate, devlink_rate->priv,
375 else if (devlink_rate_is_node(devlink_rate))
376 err = ops->rate_node_tx_weight_set(devlink_rate, devlink_rate->priv,
381 devlink_rate->tx_weight = weight;
386 err = devlink_nl_rate_parent_node_set(devlink_rate, info,
464 struct devlink_rate *devlink_rate;
468 devlink_rate = devlink_rate_get_from_info(devlink, info);
469 if (IS_ERR(devlink_rate))
470 return PTR_ERR(devlink_rate);
473 if (!ops || !devlink_rate_set_ops_supported(ops, info, devlink_rate->type))
476 err = devlink_nl_rate_set(devlink_rate, ops, info);
479 devlink_rate_notify(devlink_rate, DEVLINK_CMD_RATE_NEW);
486 struct devlink_rate *rate_node;
542 struct devlink_rate *rate_node;
568 struct devlink_rate *devlink_rate;
570 list_for_each_entry(devlink_rate, &devlink->rate_list, list)
571 if (devlink_rate_is_node(devlink_rate)) {
583 * @parent: parent devlink_rate struct
587 struct devlink_rate *
589 struct devlink_rate *parent)
591 struct devlink_rate *rate_node;
627 * @parent: parent devlink_rate struct
632 struct devlink_rate *parent)
635 struct devlink_rate *devlink_rate;
639 if (WARN_ON(devlink_port->devlink_rate))
642 devlink_rate = kzalloc(sizeof(*devlink_rate), GFP_KERNEL);
643 if (!devlink_rate)
647 devlink_rate->parent = parent;
648 refcount_inc(&devlink_rate->parent->refcnt);
651 devlink_rate->type = DEVLINK_RATE_TYPE_LEAF;
652 devlink_rate->devlink = devlink;
653 devlink_rate->devlink_port = devlink_port;
654 devlink_rate->priv = priv;
655 list_add_tail(&devlink_rate->list, &devlink->rate_list);
656 devlink_port->devlink_rate = devlink_rate;
657 devlink_rate_notify(devlink_rate, DEVLINK_CMD_RATE_NEW);
672 struct devlink_rate *devlink_rate = devlink_port->devlink_rate;
675 if (!devlink_rate)
678 devlink_rate_notify(devlink_rate, DEVLINK_CMD_RATE_DEL);
679 if (devlink_rate->parent)
680 refcount_dec(&devlink_rate->parent->refcnt);
681 list_del(&devlink_rate->list);
682 devlink_port->devlink_rate = NULL;
683 kfree(devlink_rate);
696 static struct devlink_rate *devlink_rate, *tmp;
701 list_for_each_entry(devlink_rate, &devlink->rate_list, list) {
702 if (!devlink_rate->parent)
705 refcount_dec(&devlink_rate->parent->refcnt);
706 if (devlink_rate_is_leaf(devlink_rate))
707 ops->rate_leaf_parent_set(devlink_rate, NULL, devlink_rate->priv,
709 else if (devlink_rate_is_node(devlink_rate))
710 ops->rate_node_parent_set(devlink_rate, NULL, devlink_rate->priv,
713 list_for_each_entry_safe(devlink_rate, tmp, &devlink->rate_list, list) {
714 if (devlink_rate_is_node(devlink_rate)) {
715 ops->rate_node_del(devlink_rate, devlink_rate->priv, NULL);
716 list_del(&devlink_rate->list);
717 kfree(devlink_rate->name);
718 kfree(devlink_rate);