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()
168 struct devlink_rate *rate_node; in devlink_rates_notify_register()
176 struct devlink_rate *rate_node; in devlink_rates_notify_unregister()
187 struct devlink_rate *devlink_rate; in devlink_nl_rate_get_dump_one() local
191 list_for_each_entry(devlink_rate, &devlink->rate_list, list) { in devlink_nl_rate_get_dump_one()
199 err = devlink_nl_rate_fill(msg, devlink_rate, cmd, id, in devlink_nl_rate_get_dump_one()
219 struct devlink_rate *devlink_rate; in devlink_nl_rate_get_doit() local
223 devlink_rate = devlink_rate_get_from_info(devlink, info); in devlink_nl_rate_get_doit()
224 if (IS_ERR(devlink_rate)) in devlink_nl_rate_get_doit()
225 return PTR_ERR(devlink_rate); in devlink_nl_rate_get_doit()
231 err = devlink_nl_rate_fill(msg, devlink_rate, DEVLINK_CMD_RATE_NEW, in devlink_nl_rate_get_doit()
243 devlink_rate_is_parent_node(struct devlink_rate *devlink_rate, in devlink_rate_is_parent_node() argument
244 struct devlink_rate *parent) in devlink_rate_is_parent_node()
247 if (parent == devlink_rate) in devlink_rate_is_parent_node()
255 devlink_nl_rate_parent_node_set(struct devlink_rate *devlink_rate, in devlink_nl_rate_parent_node_set() argument
259 struct devlink *devlink = devlink_rate->devlink; in devlink_nl_rate_parent_node_set()
263 struct devlink_rate *parent; in devlink_nl_rate_parent_node_set()
266 parent = devlink_rate->parent; in devlink_nl_rate_parent_node_set()
269 if (devlink_rate_is_leaf(devlink_rate)) in devlink_nl_rate_parent_node_set()
270 err = ops->rate_leaf_parent_set(devlink_rate, NULL, in devlink_nl_rate_parent_node_set()
271 devlink_rate->priv, NULL, in devlink_nl_rate_parent_node_set()
273 else if (devlink_rate_is_node(devlink_rate)) in devlink_nl_rate_parent_node_set()
274 err = ops->rate_node_parent_set(devlink_rate, NULL, in devlink_nl_rate_parent_node_set()
275 devlink_rate->priv, NULL, in devlink_nl_rate_parent_node_set()
281 devlink_rate->parent = NULL; in devlink_nl_rate_parent_node_set()
287 if (parent == devlink_rate) { in devlink_nl_rate_parent_node_set()
292 if (devlink_rate_is_node(devlink_rate) && in devlink_nl_rate_parent_node_set()
293 devlink_rate_is_parent_node(devlink_rate, parent->parent)) { in devlink_nl_rate_parent_node_set()
298 if (devlink_rate_is_leaf(devlink_rate)) in devlink_nl_rate_parent_node_set()
299 err = ops->rate_leaf_parent_set(devlink_rate, parent, in devlink_nl_rate_parent_node_set()
300 devlink_rate->priv, parent->priv, in devlink_nl_rate_parent_node_set()
302 else if (devlink_rate_is_node(devlink_rate)) in devlink_nl_rate_parent_node_set()
303 err = ops->rate_node_parent_set(devlink_rate, parent, in devlink_nl_rate_parent_node_set()
304 devlink_rate->priv, parent->priv, in devlink_nl_rate_parent_node_set()
309 if (devlink_rate->parent) in devlink_nl_rate_parent_node_set()
311 refcount_dec(&devlink_rate->parent->refcnt); in devlink_nl_rate_parent_node_set()
314 devlink_rate->parent = parent; in devlink_nl_rate_parent_node_set()
320 static int devlink_nl_rate_set(struct devlink_rate *devlink_rate, in devlink_nl_rate_set() argument
332 if (devlink_rate_is_leaf(devlink_rate)) in devlink_nl_rate_set()
333 err = ops->rate_leaf_tx_share_set(devlink_rate, devlink_rate->priv, in devlink_nl_rate_set()
335 else if (devlink_rate_is_node(devlink_rate)) in devlink_nl_rate_set()
336 err = ops->rate_node_tx_share_set(devlink_rate, devlink_rate->priv, in devlink_nl_rate_set()
340 devlink_rate->tx_share = rate; in devlink_nl_rate_set()
345 if (devlink_rate_is_leaf(devlink_rate)) in devlink_nl_rate_set()
346 err = ops->rate_leaf_tx_max_set(devlink_rate, devlink_rate->priv, in devlink_nl_rate_set()
348 else if (devlink_rate_is_node(devlink_rate)) in devlink_nl_rate_set()
349 err = ops->rate_node_tx_max_set(devlink_rate, devlink_rate->priv, in devlink_nl_rate_set()
353 devlink_rate->tx_max = rate; in devlink_nl_rate_set()
358 if (devlink_rate_is_leaf(devlink_rate)) in devlink_nl_rate_set()
359 err = ops->rate_leaf_tx_priority_set(devlink_rate, devlink_rate->priv, in devlink_nl_rate_set()
361 else if (devlink_rate_is_node(devlink_rate)) in devlink_nl_rate_set()
362 err = ops->rate_node_tx_priority_set(devlink_rate, devlink_rate->priv, in devlink_nl_rate_set()
367 devlink_rate->tx_priority = priority; in devlink_nl_rate_set()
372 if (devlink_rate_is_leaf(devlink_rate)) in devlink_nl_rate_set()
373 err = ops->rate_leaf_tx_weight_set(devlink_rate, devlink_rate->priv, in devlink_nl_rate_set()
375 else if (devlink_rate_is_node(devlink_rate)) in devlink_nl_rate_set()
376 err = ops->rate_node_tx_weight_set(devlink_rate, devlink_rate->priv, in devlink_nl_rate_set()
381 devlink_rate->tx_weight = weight; in devlink_nl_rate_set()
386 err = devlink_nl_rate_parent_node_set(devlink_rate, info, in devlink_nl_rate_set()
464 struct devlink_rate *devlink_rate; in devlink_nl_cmd_rate_set_doit() local
468 devlink_rate = devlink_rate_get_from_info(devlink, info); in devlink_nl_cmd_rate_set_doit()
469 if (IS_ERR(devlink_rate)) in devlink_nl_cmd_rate_set_doit()
470 return PTR_ERR(devlink_rate); in devlink_nl_cmd_rate_set_doit()
473 if (!ops || !devlink_rate_set_ops_supported(ops, info, devlink_rate->type)) in devlink_nl_cmd_rate_set_doit()
476 err = devlink_nl_rate_set(devlink_rate, ops, info); in devlink_nl_cmd_rate_set_doit()
479 devlink_rate_notify(devlink_rate, DEVLINK_CMD_RATE_NEW); in devlink_nl_cmd_rate_set_doit()
486 struct devlink_rate *rate_node; in devlink_nl_cmd_rate_new_doit()
542 struct devlink_rate *rate_node; in devlink_nl_cmd_rate_del_doit()
568 struct devlink_rate *devlink_rate; in devlink_rate_nodes_check() local
570 list_for_each_entry(devlink_rate, &devlink->rate_list, list) in devlink_rate_nodes_check()
571 if (devlink_rate_is_node(devlink_rate)) { in devlink_rate_nodes_check()
587 struct devlink_rate *
589 struct devlink_rate *parent) in devl_rate_node_create()
591 struct devlink_rate *rate_node; in devl_rate_node_create()
632 struct devlink_rate *parent) in devl_rate_leaf_create()
635 struct devlink_rate *devlink_rate; in devl_rate_leaf_create() local
639 if (WARN_ON(devlink_port->devlink_rate)) in devl_rate_leaf_create()
642 devlink_rate = kzalloc(sizeof(*devlink_rate), GFP_KERNEL); in devl_rate_leaf_create()
643 if (!devlink_rate) in devl_rate_leaf_create()
647 devlink_rate->parent = parent; in devl_rate_leaf_create()
648 refcount_inc(&devlink_rate->parent->refcnt); in devl_rate_leaf_create()
651 devlink_rate->type = DEVLINK_RATE_TYPE_LEAF; in devl_rate_leaf_create()
652 devlink_rate->devlink = devlink; in devl_rate_leaf_create()
653 devlink_rate->devlink_port = devlink_port; in devl_rate_leaf_create()
654 devlink_rate->priv = priv; in devl_rate_leaf_create()
655 list_add_tail(&devlink_rate->list, &devlink->rate_list); in devl_rate_leaf_create()
656 devlink_port->devlink_rate = devlink_rate; in devl_rate_leaf_create()
657 devlink_rate_notify(devlink_rate, DEVLINK_CMD_RATE_NEW); in devl_rate_leaf_create()
672 struct devlink_rate *devlink_rate = devlink_port->devlink_rate; in devl_rate_leaf_destroy() local
675 if (!devlink_rate) in devl_rate_leaf_destroy()
678 devlink_rate_notify(devlink_rate, DEVLINK_CMD_RATE_DEL); in devl_rate_leaf_destroy()
679 if (devlink_rate->parent) in devl_rate_leaf_destroy()
680 refcount_dec(&devlink_rate->parent->refcnt); in devl_rate_leaf_destroy()
681 list_del(&devlink_rate->list); in devl_rate_leaf_destroy()
682 devlink_port->devlink_rate = NULL; in devl_rate_leaf_destroy()
683 kfree(devlink_rate); in devl_rate_leaf_destroy()
696 static struct devlink_rate *devlink_rate, *tmp; in devl_rate_nodes_destroy() local
701 list_for_each_entry(devlink_rate, &devlink->rate_list, list) { in devl_rate_nodes_destroy()
702 if (!devlink_rate->parent) in devl_rate_nodes_destroy()
705 refcount_dec(&devlink_rate->parent->refcnt); in devl_rate_nodes_destroy()
706 if (devlink_rate_is_leaf(devlink_rate)) in devl_rate_nodes_destroy()
707 ops->rate_leaf_parent_set(devlink_rate, NULL, devlink_rate->priv, in devl_rate_nodes_destroy()
709 else if (devlink_rate_is_node(devlink_rate)) in devl_rate_nodes_destroy()
710 ops->rate_node_parent_set(devlink_rate, NULL, devlink_rate->priv, in devl_rate_nodes_destroy()
713 list_for_each_entry_safe(devlink_rate, tmp, &devlink->rate_list, list) { in devl_rate_nodes_destroy()
714 if (devlink_rate_is_node(devlink_rate)) { in devl_rate_nodes_destroy()
715 ops->rate_node_del(devlink_rate, devlink_rate->priv, NULL); in devl_rate_nodes_destroy()
716 list_del(&devlink_rate->list); in devl_rate_nodes_destroy()
717 kfree(devlink_rate->name); in devl_rate_nodes_destroy()
718 kfree(devlink_rate); in devl_rate_nodes_destroy()