Lines Matching refs:devlink_rate
10 devlink_rate_is_leaf(struct devlink_rate *devlink_rate) in devlink_rate_is_leaf() argument
12 return devlink_rate->type == DEVLINK_RATE_TYPE_LEAF; in devlink_rate_is_leaf()
16 devlink_rate_is_node(struct devlink_rate *devlink_rate) in devlink_rate_is_node() argument
18 return devlink_rate->type == DEVLINK_RATE_TYPE_NODE; in devlink_rate_is_node()
21 static struct devlink_rate *
24 struct devlink_rate *devlink_rate; in devlink_rate_leaf_get_from_info() local
30 devlink_rate = devlink_port->devlink_rate; in devlink_rate_leaf_get_from_info()
31 return devlink_rate ?: ERR_PTR(-ENODEV); in devlink_rate_leaf_get_from_info()
34 static struct devlink_rate *
37 static struct devlink_rate *devlink_rate; in devlink_rate_node_get_by_name() local
39 list_for_each_entry(devlink_rate, &devlink->rate_list, list) { in devlink_rate_node_get_by_name()
40 if (devlink_rate_is_node(devlink_rate) && in devlink_rate_node_get_by_name()
41 !strcmp(node_name, devlink_rate->name)) in devlink_rate_node_get_by_name()
42 return devlink_rate; in devlink_rate_node_get_by_name()
47 static struct devlink_rate *
64 static struct devlink_rate *
70 static struct devlink_rate *
84 struct devlink_rate *devlink_rate, in devlink_nl_rate_fill() argument
88 struct devlink *devlink = devlink_rate->devlink; in devlink_nl_rate_fill()
98 if (nla_put_u16(msg, DEVLINK_ATTR_RATE_TYPE, devlink_rate->type)) in devlink_nl_rate_fill()
101 if (devlink_rate_is_leaf(devlink_rate)) { in devlink_nl_rate_fill()
103 devlink_rate->devlink_port->index)) in devlink_nl_rate_fill()
105 } else if (devlink_rate_is_node(devlink_rate)) { in devlink_nl_rate_fill()
107 devlink_rate->name)) in devlink_nl_rate_fill()
112 devlink_rate->tx_share, DEVLINK_ATTR_PAD)) in devlink_nl_rate_fill()
116 devlink_rate->tx_max, DEVLINK_ATTR_PAD)) in devlink_nl_rate_fill()
120 devlink_rate->tx_priority)) in devlink_nl_rate_fill()
124 devlink_rate->tx_weight)) in devlink_nl_rate_fill()
127 if (devlink_rate->parent) in devlink_nl_rate_fill()
129 devlink_rate->parent->name)) in devlink_nl_rate_fill()
140 static void devlink_rate_notify(struct devlink_rate *devlink_rate, in devlink_rate_notify() argument
143 struct devlink *devlink = devlink_rate->devlink; in devlink_rate_notify()
156 err = devlink_nl_rate_fill(msg, devlink_rate, cmd, 0, 0, 0, NULL); in devlink_rate_notify()
167 struct devlink_rate *rate_node; in devlink_rates_notify_register()
175 struct devlink_rate *rate_node; in devlink_rates_notify_unregister()
186 struct devlink_rate *devlink_rate; in devlink_nl_rate_get_dump_one() local
190 list_for_each_entry(devlink_rate, &devlink->rate_list, list) { in devlink_nl_rate_get_dump_one()
198 err = devlink_nl_rate_fill(msg, devlink_rate, cmd, id, in devlink_nl_rate_get_dump_one()
218 struct devlink_rate *devlink_rate; in devlink_nl_rate_get_doit() local
222 devlink_rate = devlink_rate_get_from_info(devlink, info); in devlink_nl_rate_get_doit()
223 if (IS_ERR(devlink_rate)) in devlink_nl_rate_get_doit()
224 return PTR_ERR(devlink_rate); in devlink_nl_rate_get_doit()
230 err = devlink_nl_rate_fill(msg, devlink_rate, DEVLINK_CMD_RATE_NEW, in devlink_nl_rate_get_doit()
242 devlink_rate_is_parent_node(struct devlink_rate *devlink_rate, in devlink_rate_is_parent_node() argument
243 struct devlink_rate *parent) in devlink_rate_is_parent_node()
246 if (parent == devlink_rate) in devlink_rate_is_parent_node()
254 devlink_nl_rate_parent_node_set(struct devlink_rate *devlink_rate, in devlink_nl_rate_parent_node_set() argument
258 struct devlink *devlink = devlink_rate->devlink; in devlink_nl_rate_parent_node_set()
262 struct devlink_rate *parent; in devlink_nl_rate_parent_node_set()
265 parent = devlink_rate->parent; in devlink_nl_rate_parent_node_set()
268 if (devlink_rate_is_leaf(devlink_rate)) in devlink_nl_rate_parent_node_set()
269 err = ops->rate_leaf_parent_set(devlink_rate, NULL, in devlink_nl_rate_parent_node_set()
270 devlink_rate->priv, NULL, in devlink_nl_rate_parent_node_set()
272 else if (devlink_rate_is_node(devlink_rate)) in devlink_nl_rate_parent_node_set()
273 err = ops->rate_node_parent_set(devlink_rate, NULL, in devlink_nl_rate_parent_node_set()
274 devlink_rate->priv, NULL, in devlink_nl_rate_parent_node_set()
280 devlink_rate->parent = NULL; in devlink_nl_rate_parent_node_set()
286 if (parent == devlink_rate) { in devlink_nl_rate_parent_node_set()
291 if (devlink_rate_is_node(devlink_rate) && in devlink_nl_rate_parent_node_set()
292 devlink_rate_is_parent_node(devlink_rate, parent->parent)) { in devlink_nl_rate_parent_node_set()
297 if (devlink_rate_is_leaf(devlink_rate)) in devlink_nl_rate_parent_node_set()
298 err = ops->rate_leaf_parent_set(devlink_rate, parent, in devlink_nl_rate_parent_node_set()
299 devlink_rate->priv, parent->priv, in devlink_nl_rate_parent_node_set()
301 else if (devlink_rate_is_node(devlink_rate)) in devlink_nl_rate_parent_node_set()
302 err = ops->rate_node_parent_set(devlink_rate, parent, in devlink_nl_rate_parent_node_set()
303 devlink_rate->priv, parent->priv, in devlink_nl_rate_parent_node_set()
308 if (devlink_rate->parent) in devlink_nl_rate_parent_node_set()
310 refcount_dec(&devlink_rate->parent->refcnt); in devlink_nl_rate_parent_node_set()
313 devlink_rate->parent = parent; in devlink_nl_rate_parent_node_set()
319 static int devlink_nl_rate_set(struct devlink_rate *devlink_rate, in devlink_nl_rate_set() argument
331 if (devlink_rate_is_leaf(devlink_rate)) in devlink_nl_rate_set()
332 err = ops->rate_leaf_tx_share_set(devlink_rate, devlink_rate->priv, in devlink_nl_rate_set()
334 else if (devlink_rate_is_node(devlink_rate)) in devlink_nl_rate_set()
335 err = ops->rate_node_tx_share_set(devlink_rate, devlink_rate->priv, in devlink_nl_rate_set()
339 devlink_rate->tx_share = rate; in devlink_nl_rate_set()
344 if (devlink_rate_is_leaf(devlink_rate)) in devlink_nl_rate_set()
345 err = ops->rate_leaf_tx_max_set(devlink_rate, devlink_rate->priv, in devlink_nl_rate_set()
347 else if (devlink_rate_is_node(devlink_rate)) in devlink_nl_rate_set()
348 err = ops->rate_node_tx_max_set(devlink_rate, devlink_rate->priv, in devlink_nl_rate_set()
352 devlink_rate->tx_max = rate; in devlink_nl_rate_set()
357 if (devlink_rate_is_leaf(devlink_rate)) in devlink_nl_rate_set()
358 err = ops->rate_leaf_tx_priority_set(devlink_rate, devlink_rate->priv, in devlink_nl_rate_set()
360 else if (devlink_rate_is_node(devlink_rate)) in devlink_nl_rate_set()
361 err = ops->rate_node_tx_priority_set(devlink_rate, devlink_rate->priv, in devlink_nl_rate_set()
366 devlink_rate->tx_priority = priority; in devlink_nl_rate_set()
371 if (devlink_rate_is_leaf(devlink_rate)) in devlink_nl_rate_set()
372 err = ops->rate_leaf_tx_weight_set(devlink_rate, devlink_rate->priv, in devlink_nl_rate_set()
374 else if (devlink_rate_is_node(devlink_rate)) in devlink_nl_rate_set()
375 err = ops->rate_node_tx_weight_set(devlink_rate, devlink_rate->priv, in devlink_nl_rate_set()
380 devlink_rate->tx_weight = weight; in devlink_nl_rate_set()
385 err = devlink_nl_rate_parent_node_set(devlink_rate, info, in devlink_nl_rate_set()
463 struct devlink_rate *devlink_rate; in devlink_nl_rate_set_doit() local
467 devlink_rate = devlink_rate_get_from_info(devlink, info); in devlink_nl_rate_set_doit()
468 if (IS_ERR(devlink_rate)) in devlink_nl_rate_set_doit()
469 return PTR_ERR(devlink_rate); in devlink_nl_rate_set_doit()
472 if (!ops || !devlink_rate_set_ops_supported(ops, info, devlink_rate->type)) in devlink_nl_rate_set_doit()
475 err = devlink_nl_rate_set(devlink_rate, ops, info); in devlink_nl_rate_set_doit()
478 devlink_rate_notify(devlink_rate, DEVLINK_CMD_RATE_NEW); in devlink_nl_rate_set_doit()
485 struct devlink_rate *rate_node; in devlink_nl_rate_new_doit()
541 struct devlink_rate *rate_node; in devlink_nl_rate_del_doit()
567 struct devlink_rate *devlink_rate; in devlink_rate_nodes_check() local
569 list_for_each_entry(devlink_rate, &devlink->rate_list, list) in devlink_rate_nodes_check()
570 if (devlink_rate_is_node(devlink_rate)) { in devlink_rate_nodes_check()
586 struct devlink_rate *
588 struct devlink_rate *parent) in devl_rate_node_create()
590 struct devlink_rate *rate_node; in devl_rate_node_create()
631 struct devlink_rate *parent) in devl_rate_leaf_create()
634 struct devlink_rate *devlink_rate; in devl_rate_leaf_create() local
638 if (WARN_ON(devlink_port->devlink_rate)) in devl_rate_leaf_create()
641 devlink_rate = kzalloc(sizeof(*devlink_rate), GFP_KERNEL); in devl_rate_leaf_create()
642 if (!devlink_rate) in devl_rate_leaf_create()
646 devlink_rate->parent = parent; in devl_rate_leaf_create()
647 refcount_inc(&devlink_rate->parent->refcnt); in devl_rate_leaf_create()
650 devlink_rate->type = DEVLINK_RATE_TYPE_LEAF; in devl_rate_leaf_create()
651 devlink_rate->devlink = devlink; in devl_rate_leaf_create()
652 devlink_rate->devlink_port = devlink_port; in devl_rate_leaf_create()
653 devlink_rate->priv = priv; in devl_rate_leaf_create()
654 list_add_tail(&devlink_rate->list, &devlink->rate_list); in devl_rate_leaf_create()
655 devlink_port->devlink_rate = devlink_rate; in devl_rate_leaf_create()
656 devlink_rate_notify(devlink_rate, DEVLINK_CMD_RATE_NEW); in devl_rate_leaf_create()
671 struct devlink_rate *devlink_rate = devlink_port->devlink_rate; in devl_rate_leaf_destroy() local
674 if (!devlink_rate) in devl_rate_leaf_destroy()
677 devlink_rate_notify(devlink_rate, DEVLINK_CMD_RATE_DEL); in devl_rate_leaf_destroy()
678 if (devlink_rate->parent) in devl_rate_leaf_destroy()
679 refcount_dec(&devlink_rate->parent->refcnt); in devl_rate_leaf_destroy()
680 list_del(&devlink_rate->list); in devl_rate_leaf_destroy()
681 devlink_port->devlink_rate = NULL; in devl_rate_leaf_destroy()
682 kfree(devlink_rate); in devl_rate_leaf_destroy()
695 static struct devlink_rate *devlink_rate, *tmp; in devl_rate_nodes_destroy() local
700 list_for_each_entry(devlink_rate, &devlink->rate_list, list) { in devl_rate_nodes_destroy()
701 if (!devlink_rate->parent) in devl_rate_nodes_destroy()
704 refcount_dec(&devlink_rate->parent->refcnt); in devl_rate_nodes_destroy()
705 if (devlink_rate_is_leaf(devlink_rate)) in devl_rate_nodes_destroy()
706 ops->rate_leaf_parent_set(devlink_rate, NULL, devlink_rate->priv, in devl_rate_nodes_destroy()
708 else if (devlink_rate_is_node(devlink_rate)) in devl_rate_nodes_destroy()
709 ops->rate_node_parent_set(devlink_rate, NULL, devlink_rate->priv, in devl_rate_nodes_destroy()
712 list_for_each_entry_safe(devlink_rate, tmp, &devlink->rate_list, list) { in devl_rate_nodes_destroy()
713 if (devlink_rate_is_node(devlink_rate)) { in devl_rate_nodes_destroy()
714 ops->rate_node_del(devlink_rate, devlink_rate->priv, NULL); in devl_rate_nodes_destroy()
715 list_del(&devlink_rate->list); in devl_rate_nodes_destroy()
716 kfree(devlink_rate->name); in devl_rate_nodes_destroy()
717 kfree(devlink_rate); in devl_rate_nodes_destroy()