Lines Matching refs:devlink

42 struct devlink {  struct
82 struct devlink *devlink; argument
92 struct devlink *nested_devlink;
124 void *devlink_priv(struct devlink *devlink) in devlink_priv() argument
126 return &devlink->priv; in devlink_priv()
130 struct devlink *priv_to_devlink(void *priv) in priv_to_devlink()
132 return container_of(priv, struct devlink, priv); in priv_to_devlink()
136 struct device *devlink_to_dev(const struct devlink *devlink) in devlink_to_dev() argument
138 return devlink->dev; in devlink_to_dev()
228 struct net *devlink_net(const struct devlink *devlink) in devlink_net() argument
230 return read_pnet(&devlink->_net); in devlink_net()
236 struct devlink *devlink = container_of(head, struct devlink, rcu); in __devlink_put_rcu() local
238 complete(&devlink->comp); in __devlink_put_rcu()
241 void devlink_put(struct devlink *devlink) in devlink_put() argument
243 if (refcount_dec_and_test(&devlink->refcount)) in devlink_put()
248 call_rcu(&devlink->rcu, __devlink_put_rcu); in devlink_put()
251 struct devlink *__must_check devlink_try_get(struct devlink *devlink) in devlink_try_get() argument
253 if (refcount_inc_not_zero(&devlink->refcount)) in devlink_try_get()
254 return devlink; in devlink_try_get()
258 void devl_assert_locked(struct devlink *devlink) in devl_assert_locked() argument
260 lockdep_assert_held(&devlink->lock); in devl_assert_locked()
266 bool devl_lock_is_held(struct devlink *devlink) in devl_lock_is_held() argument
268 return lockdep_is_held(&devlink->lock); in devl_lock_is_held()
273 void devl_lock(struct devlink *devlink) in devl_lock() argument
275 mutex_lock(&devlink->lock); in devl_lock()
279 int devl_trylock(struct devlink *devlink) in devl_trylock() argument
281 return mutex_trylock(&devlink->lock); in devl_trylock()
285 void devl_unlock(struct devlink *devlink) in devl_unlock() argument
287 mutex_unlock(&devlink->lock); in devl_unlock()
291 static struct devlink *
296 struct devlink *devlink; in devlinks_xa_find_get() local
300 devlink = xa_find_fn(&devlinks, indexp, ULONG_MAX, DEVLINK_REGISTERED); in devlinks_xa_find_get()
301 if (!devlink) in devlinks_xa_find_get()
313 if (!devlink_try_get(devlink)) in devlinks_xa_find_get()
315 if (!net_eq(devlink_net(devlink), net)) { in devlinks_xa_find_get()
316 devlink_put(devlink); in devlinks_xa_find_get()
321 return devlink; in devlinks_xa_find_get()
324 static struct devlink *devlinks_xa_find_get_first(struct net *net, in devlinks_xa_find_get_first()
331 static struct devlink *devlinks_xa_find_get_next(struct net *net, in devlinks_xa_find_get_next()
342 #define devlinks_xa_for_each_get(net, index, devlink, filter) \ argument
344 devlink = devlinks_xa_find_get_first(net, &index, filter); \
345 devlink; devlink = devlinks_xa_find_get_next(net, &index, filter))
347 #define devlinks_xa_for_each_registered_get(net, index, devlink) \ argument
348 devlinks_xa_for_each_get(net, index, devlink, DEVLINK_REGISTERED)
350 static struct devlink *devlink_get_from_attrs(struct net *net, in devlink_get_from_attrs()
353 struct devlink *devlink; in devlink_get_from_attrs() local
364 devlinks_xa_for_each_registered_get(net, index, devlink) { in devlink_get_from_attrs()
365 if (strcmp(devlink->dev->bus->name, busname) == 0 && in devlink_get_from_attrs()
366 strcmp(dev_name(devlink->dev), devname) == 0) in devlink_get_from_attrs()
367 return devlink; in devlink_get_from_attrs()
368 devlink_put(devlink); in devlink_get_from_attrs()
381 static struct devlink_port *devlink_port_get_by_index(struct devlink *devlink, in devlink_port_get_by_index() argument
386 list_for_each_entry(devlink_port, &devlink->port_list, list) { in devlink_port_get_by_index()
393 static bool devlink_port_index_exists(struct devlink *devlink, in devlink_port_index_exists() argument
396 return devlink_port_get_by_index(devlink, port_index); in devlink_port_index_exists()
399 static struct devlink_port *devlink_port_get_from_attrs(struct devlink *devlink, in devlink_port_get_from_attrs() argument
406 devlink_port = devlink_port_get_by_index(devlink, port_index); in devlink_port_get_from_attrs()
414 static struct devlink_port *devlink_port_get_from_info(struct devlink *devlink, in devlink_port_get_from_info() argument
417 return devlink_port_get_from_attrs(devlink, info->attrs); in devlink_port_get_from_info()
433 devlink_rate_leaf_get_from_info(struct devlink *devlink, struct genl_info *info) in devlink_rate_leaf_get_from_info() argument
438 devlink_port = devlink_port_get_from_attrs(devlink, info->attrs); in devlink_rate_leaf_get_from_info()
446 devlink_rate_node_get_by_name(struct devlink *devlink, const char *node_name) in devlink_rate_node_get_by_name() argument
450 list_for_each_entry(devlink_rate, &devlink->rate_list, list) { in devlink_rate_node_get_by_name()
459 devlink_rate_node_get_from_attrs(struct devlink *devlink, struct nlattr **attrs) in devlink_rate_node_get_from_attrs() argument
472 return devlink_rate_node_get_by_name(devlink, rate_node_name); in devlink_rate_node_get_from_attrs()
476 devlink_rate_node_get_from_info(struct devlink *devlink, struct genl_info *info) in devlink_rate_node_get_from_info() argument
478 return devlink_rate_node_get_from_attrs(devlink, info->attrs); in devlink_rate_node_get_from_info()
482 devlink_rate_get_from_info(struct devlink *devlink, struct genl_info *info) in devlink_rate_get_from_info() argument
487 return devlink_rate_leaf_get_from_info(devlink, info); in devlink_rate_get_from_info()
489 return devlink_rate_node_get_from_info(devlink, info); in devlink_rate_get_from_info()
495 devlink_linecard_get_by_index(struct devlink *devlink, in devlink_linecard_get_by_index() argument
500 list_for_each_entry(devlink_linecard, &devlink->linecard_list, list) { in devlink_linecard_get_by_index()
507 static bool devlink_linecard_index_exists(struct devlink *devlink, in devlink_linecard_index_exists() argument
510 return devlink_linecard_get_by_index(devlink, linecard_index); in devlink_linecard_index_exists()
514 devlink_linecard_get_from_attrs(struct devlink *devlink, struct nlattr **attrs) in devlink_linecard_get_from_attrs() argument
520 mutex_lock(&devlink->linecards_lock); in devlink_linecard_get_from_attrs()
521 linecard = devlink_linecard_get_by_index(devlink, linecard_index); in devlink_linecard_get_from_attrs()
524 mutex_unlock(&devlink->linecards_lock); in devlink_linecard_get_from_attrs()
533 devlink_linecard_get_from_info(struct devlink *devlink, struct genl_info *info) in devlink_linecard_get_from_info() argument
535 return devlink_linecard_get_from_attrs(devlink, info->attrs); in devlink_linecard_get_from_info()
561 static struct devlink_sb *devlink_sb_get_by_index(struct devlink *devlink, in devlink_sb_get_by_index() argument
566 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_sb_get_by_index()
573 static bool devlink_sb_index_exists(struct devlink *devlink, in devlink_sb_index_exists() argument
576 return devlink_sb_get_by_index(devlink, sb_index); in devlink_sb_index_exists()
579 static struct devlink_sb *devlink_sb_get_from_attrs(struct devlink *devlink, in devlink_sb_get_from_attrs() argument
586 devlink_sb = devlink_sb_get_by_index(devlink, sb_index); in devlink_sb_get_from_attrs()
594 static struct devlink_sb *devlink_sb_get_from_info(struct devlink *devlink, in devlink_sb_get_from_info() argument
597 return devlink_sb_get_from_attrs(devlink, info->attrs); in devlink_sb_get_from_info()
705 struct devlink *devlink; member
730 devlink_region_get_by_name(struct devlink *devlink, const char *region_name) in devlink_region_get_by_name() argument
734 list_for_each_entry(region, &devlink->region_list, list) in devlink_region_get_by_name()
777 struct devlink *devlink; in devlink_nl_pre_doit() local
780 devlink = devlink_get_from_attrs(genl_info_net(info), info->attrs); in devlink_nl_pre_doit()
781 if (IS_ERR(devlink)) in devlink_nl_pre_doit()
782 return PTR_ERR(devlink); in devlink_nl_pre_doit()
783 devl_lock(devlink); in devlink_nl_pre_doit()
784 info->user_ptr[0] = devlink; in devlink_nl_pre_doit()
786 devlink_port = devlink_port_get_from_info(devlink, info); in devlink_nl_pre_doit()
793 devlink_port = devlink_port_get_from_info(devlink, info); in devlink_nl_pre_doit()
799 devlink_rate = devlink_rate_get_from_info(devlink, info); in devlink_nl_pre_doit()
808 rate_node = devlink_rate_node_get_from_info(devlink, info); in devlink_nl_pre_doit()
815 linecard = devlink_linecard_get_from_info(devlink, info); in devlink_nl_pre_doit()
825 devl_unlock(devlink); in devlink_nl_pre_doit()
826 devlink_put(devlink); in devlink_nl_pre_doit()
834 struct devlink *devlink; in devlink_nl_post_doit() local
836 devlink = info->user_ptr[0]; in devlink_nl_post_doit()
841 devl_unlock(devlink); in devlink_nl_post_doit()
842 devlink_put(devlink); in devlink_nl_post_doit()
855 static int devlink_nl_put_handle(struct sk_buff *msg, struct devlink *devlink) in devlink_nl_put_handle() argument
857 if (nla_put_string(msg, DEVLINK_ATTR_BUS_NAME, devlink->dev->bus->name)) in devlink_nl_put_handle()
859 if (nla_put_string(msg, DEVLINK_ATTR_DEV_NAME, dev_name(devlink->dev))) in devlink_nl_put_handle()
864 static int devlink_nl_put_nested_handle(struct sk_buff *msg, struct devlink *devlink) in devlink_nl_put_nested_handle() argument
871 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_put_nested_handle()
909 devlink_reload_action_is_supported(struct devlink *devlink, enum devlink_reload_action action) in devlink_reload_action_is_supported() argument
911 return test_bit(action, &devlink->ops->reload_actions); in devlink_reload_action_is_supported()
915 devlink_reload_limit_is_supported(struct devlink *devlink, enum devlink_reload_limit limit) in devlink_reload_limit_is_supported() argument
917 return test_bit(limit, &devlink->ops->reload_limits); in devlink_reload_limit_is_supported()
940 static int devlink_reload_stats_put(struct sk_buff *msg, struct devlink *devlink, bool is_remote) in devlink_reload_stats_put() argument
956 !devlink_reload_action_is_supported(devlink, i)) || in devlink_reload_stats_put()
976 !devlink_reload_limit_is_supported(devlink, j)) || in devlink_reload_stats_put()
982 value = devlink->stats.reload_stats[stat_idx]; in devlink_reload_stats_put()
984 value = devlink->stats.remote_reload_stats[stat_idx]; in devlink_reload_stats_put()
1003 static int devlink_nl_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_fill() argument
1014 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_fill()
1016 if (nla_put_u8(msg, DEVLINK_ATTR_RELOAD_FAILED, devlink->reload_failed)) in devlink_nl_fill()
1023 if (devlink_reload_stats_put(msg, devlink, false)) in devlink_nl_fill()
1025 if (devlink_reload_stats_put(msg, devlink, true)) in devlink_nl_fill()
1039 static void devlink_notify(struct devlink *devlink, enum devlink_command cmd) in devlink_notify() argument
1045 WARN_ON(!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)); in devlink_notify()
1051 err = devlink_nl_fill(msg, devlink, cmd, 0, 0, 0); in devlink_notify()
1057 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_notify()
1156 struct devlink *devlink = devlink_rate->devlink; in devlink_nl_rate_fill() local
1163 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_rate_fill()
1264 ops = port->devlink->ops; in devlink_nl_port_function_attrs_put()
1283 struct devlink *devlink = devlink_port->devlink; in devlink_nl_port_fill() local
1290 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_port_fill()
1305 struct net *net = devlink_net(devlink_port->devlink); in devlink_nl_port_fill()
1348 struct devlink *devlink = devlink_port->devlink; in devlink_port_notify() local
1354 if (!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)) in devlink_port_notify()
1367 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), msg, in devlink_port_notify()
1374 struct devlink *devlink = devlink_rate->devlink; in devlink_rate_notify() local
1380 if (!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)) in devlink_rate_notify()
1393 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), msg, in devlink_rate_notify()
1401 struct devlink *devlink; in devlink_nl_cmd_rate_get_dumpit() local
1407 devlinks_xa_for_each_registered_get(sock_net(msg->sk), index, devlink) { in devlink_nl_cmd_rate_get_dumpit()
1408 devl_lock(devlink); in devlink_nl_cmd_rate_get_dumpit()
1409 list_for_each_entry(devlink_rate, &devlink->rate_list, list) { in devlink_nl_cmd_rate_get_dumpit()
1421 devl_unlock(devlink); in devlink_nl_cmd_rate_get_dumpit()
1422 devlink_put(devlink); in devlink_nl_cmd_rate_get_dumpit()
1427 devl_unlock(devlink); in devlink_nl_cmd_rate_get_dumpit()
1428 devlink_put(devlink); in devlink_nl_cmd_rate_get_dumpit()
1474 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_get_doit() local
1482 err = devlink_nl_fill(msg, devlink, DEVLINK_CMD_NEW, in devlink_nl_cmd_get_doit()
1495 struct devlink *devlink; in devlink_nl_cmd_get_dumpit() local
1501 devlinks_xa_for_each_registered_get(sock_net(msg->sk), index, devlink) { in devlink_nl_cmd_get_dumpit()
1504 devlink_put(devlink); in devlink_nl_cmd_get_dumpit()
1508 err = devlink_nl_fill(msg, devlink, DEVLINK_CMD_NEW, in devlink_nl_cmd_get_dumpit()
1511 devlink_put(devlink); in devlink_nl_cmd_get_dumpit()
1546 struct devlink *devlink; in devlink_nl_cmd_port_get_dumpit() local
1553 devlinks_xa_for_each_registered_get(sock_net(msg->sk), index, devlink) { in devlink_nl_cmd_port_get_dumpit()
1554 devl_lock(devlink); in devlink_nl_cmd_port_get_dumpit()
1555 list_for_each_entry(devlink_port, &devlink->port_list, list) { in devlink_nl_cmd_port_get_dumpit()
1566 devl_unlock(devlink); in devlink_nl_cmd_port_get_dumpit()
1567 devlink_put(devlink); in devlink_nl_cmd_port_get_dumpit()
1572 devl_unlock(devlink); in devlink_nl_cmd_port_get_dumpit()
1573 devlink_put(devlink); in devlink_nl_cmd_port_get_dumpit()
1586 if (!devlink_port->devlink->ops->port_type_set) in devlink_port_type_set()
1592 err = devlink_port->devlink->ops->port_type_set(devlink_port, in devlink_port_type_set()
1606 const struct devlink_ops *ops = port->devlink->ops; in devlink_port_function_hw_addr_set()
1644 ops = port->devlink->ops; in devlink_port_fn_state_set()
1717 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_port_split_doit() local
1722 if (!devlink->ops->port_split) in devlink_nl_cmd_port_split_doit()
1741 return devlink->ops->port_split(devlink, devlink_port, count, in devlink_nl_cmd_port_split_doit()
1749 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_port_unsplit_doit() local
1751 if (!devlink->ops->port_unsplit) in devlink_nl_cmd_port_unsplit_doit()
1753 return devlink->ops->port_unsplit(devlink, devlink_port, info->extack); in devlink_nl_cmd_port_unsplit_doit()
1756 static int devlink_port_new_notify(struct devlink *devlink, in devlink_port_new_notify() argument
1768 lockdep_assert_held(&devlink->lock); in devlink_port_new_notify()
1769 devlink_port = devlink_port_get_by_index(devlink, port_index); in devlink_port_new_notify()
1792 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_port_new_doit() local
1796 if (!devlink->ops->port_new || !devlink->ops->port_del) in devlink_nl_cmd_port_new_doit()
1825 err = devlink->ops->port_new(devlink, &new_attrs, extack, in devlink_nl_cmd_port_new_doit()
1830 err = devlink_port_new_notify(devlink, new_port_index, info); in devlink_nl_cmd_port_new_doit()
1833 devlink->ops->port_del(devlink, new_port_index, extack); in devlink_nl_cmd_port_new_doit()
1842 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_port_del_doit() local
1845 if (!devlink->ops->port_del) in devlink_nl_cmd_port_del_doit()
1854 return devlink->ops->port_del(devlink, port_index, extack); in devlink_nl_cmd_port_del_doit()
1862 struct devlink *devlink = devlink_rate->devlink; in devlink_nl_rate_parent_node_set() local
1864 const struct devlink_ops *ops = devlink->ops; in devlink_nl_rate_parent_node_set()
1888 parent = devlink_rate_node_get_by_name(devlink, parent_name); in devlink_nl_rate_parent_node_set()
2012 struct devlink *devlink = devlink_rate->devlink; in devlink_nl_cmd_rate_set_doit() local
2013 const struct devlink_ops *ops = devlink->ops; in devlink_nl_cmd_rate_set_doit()
2029 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_rate_new_doit() local
2034 ops = devlink->ops; in devlink_nl_cmd_rate_new_doit()
2043 rate_node = devlink_rate_node_get_from_attrs(devlink, info->attrs); in devlink_nl_cmd_rate_new_doit()
2053 rate_node->devlink = devlink; in devlink_nl_cmd_rate_new_doit()
2070 list_add(&rate_node->list, &devlink->rate_list); in devlink_nl_cmd_rate_new_doit()
2087 struct devlink *devlink = rate_node->devlink; in devlink_nl_cmd_rate_del_doit() local
2088 const struct devlink_ops *ops = devlink->ops; in devlink_nl_cmd_rate_del_doit()
2112 struct devlink *devlink, in devlink_nl_linecard_fill() argument
2127 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_linecard_fill()
2168 struct devlink *devlink = linecard->devlink; in devlink_linecard_notify() local
2175 if (!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)) in devlink_linecard_notify()
2182 err = devlink_nl_linecard_fill(msg, devlink, linecard, cmd, 0, 0, 0, in devlink_linecard_notify()
2189 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_linecard_notify()
2197 struct devlink *devlink = linecard->devlink; in devlink_nl_cmd_linecard_get_doit() local
2206 err = devlink_nl_linecard_fill(msg, devlink, linecard, in devlink_nl_cmd_linecard_get_doit()
2223 struct devlink *devlink; in devlink_nl_cmd_linecard_get_dumpit() local
2229 devlinks_xa_for_each_registered_get(sock_net(msg->sk), index, devlink) { in devlink_nl_cmd_linecard_get_dumpit()
2230 mutex_lock(&devlink->linecards_lock); in devlink_nl_cmd_linecard_get_dumpit()
2231 list_for_each_entry(linecard, &devlink->linecard_list, list) { in devlink_nl_cmd_linecard_get_dumpit()
2237 err = devlink_nl_linecard_fill(msg, devlink, linecard, in devlink_nl_cmd_linecard_get_dumpit()
2245 mutex_unlock(&devlink->linecards_lock); in devlink_nl_cmd_linecard_get_dumpit()
2246 devlink_put(devlink); in devlink_nl_cmd_linecard_get_dumpit()
2251 mutex_unlock(&devlink->linecards_lock); in devlink_nl_cmd_linecard_get_dumpit()
2252 devlink_put(devlink); in devlink_nl_cmd_linecard_get_dumpit()
2416 static int devlink_nl_sb_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_sb_fill() argument
2427 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_sb_fill()
2457 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_get_doit() local
2462 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_get_doit()
2470 err = devlink_nl_sb_fill(msg, devlink, devlink_sb, in devlink_nl_cmd_sb_get_doit()
2484 struct devlink *devlink; in devlink_nl_cmd_sb_get_dumpit() local
2491 devlinks_xa_for_each_registered_get(sock_net(msg->sk), index, devlink) { in devlink_nl_cmd_sb_get_dumpit()
2492 devl_lock(devlink); in devlink_nl_cmd_sb_get_dumpit()
2493 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_nl_cmd_sb_get_dumpit()
2498 err = devlink_nl_sb_fill(msg, devlink, devlink_sb, in devlink_nl_cmd_sb_get_dumpit()
2504 devl_unlock(devlink); in devlink_nl_cmd_sb_get_dumpit()
2505 devlink_put(devlink); in devlink_nl_cmd_sb_get_dumpit()
2510 devl_unlock(devlink); in devlink_nl_cmd_sb_get_dumpit()
2511 devlink_put(devlink); in devlink_nl_cmd_sb_get_dumpit()
2518 static int devlink_nl_sb_pool_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_sb_pool_fill() argument
2527 err = devlink->ops->sb_pool_get(devlink, devlink_sb->index, in devlink_nl_sb_pool_fill()
2536 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_sb_pool_fill()
2564 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_pool_get_doit() local
2570 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_pool_get_doit()
2579 if (!devlink->ops->sb_pool_get) in devlink_nl_cmd_sb_pool_get_doit()
2586 err = devlink_nl_sb_pool_fill(msg, devlink, devlink_sb, pool_index, in devlink_nl_cmd_sb_pool_get_doit()
2598 struct devlink *devlink, in __sb_pool_get_dumpit() argument
2611 err = devlink_nl_sb_pool_fill(msg, devlink, in __sb_pool_get_dumpit()
2626 struct devlink *devlink; in devlink_nl_cmd_sb_pool_get_dumpit() local
2633 devlinks_xa_for_each_registered_get(sock_net(msg->sk), index, devlink) { in devlink_nl_cmd_sb_pool_get_dumpit()
2634 if (!devlink->ops->sb_pool_get) in devlink_nl_cmd_sb_pool_get_dumpit()
2637 devl_lock(devlink); in devlink_nl_cmd_sb_pool_get_dumpit()
2638 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_nl_cmd_sb_pool_get_dumpit()
2639 err = __sb_pool_get_dumpit(msg, start, &idx, devlink, in devlink_nl_cmd_sb_pool_get_dumpit()
2646 devl_unlock(devlink); in devlink_nl_cmd_sb_pool_get_dumpit()
2647 devlink_put(devlink); in devlink_nl_cmd_sb_pool_get_dumpit()
2651 devl_unlock(devlink); in devlink_nl_cmd_sb_pool_get_dumpit()
2653 devlink_put(devlink); in devlink_nl_cmd_sb_pool_get_dumpit()
2663 static int devlink_sb_pool_set(struct devlink *devlink, unsigned int sb_index, in devlink_sb_pool_set() argument
2669 const struct devlink_ops *ops = devlink->ops; in devlink_sb_pool_set()
2672 return ops->sb_pool_set(devlink, sb_index, pool_index, in devlink_sb_pool_set()
2680 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_pool_set_doit() local
2687 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_pool_set_doit()
2704 return devlink_sb_pool_set(devlink, devlink_sb->index, in devlink_nl_cmd_sb_pool_set_doit()
2710 struct devlink *devlink, in devlink_nl_sb_port_pool_fill() argument
2717 const struct devlink_ops *ops = devlink->ops; in devlink_nl_sb_port_pool_fill()
2731 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_sb_port_pool_fill()
2772 struct devlink *devlink = devlink_port->devlink; in devlink_nl_cmd_sb_port_pool_get_doit() local
2778 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_port_pool_get_doit()
2787 if (!devlink->ops->sb_port_pool_get) in devlink_nl_cmd_sb_port_pool_get_doit()
2794 err = devlink_nl_sb_port_pool_fill(msg, devlink, devlink_port, in devlink_nl_cmd_sb_port_pool_get_doit()
2807 struct devlink *devlink, in __sb_port_pool_get_dumpit() argument
2816 list_for_each_entry(devlink_port, &devlink->port_list, list) { in __sb_port_pool_get_dumpit()
2822 err = devlink_nl_sb_port_pool_fill(msg, devlink, in __sb_port_pool_get_dumpit()
2840 struct devlink *devlink; in devlink_nl_cmd_sb_port_pool_get_dumpit() local
2847 devlinks_xa_for_each_registered_get(sock_net(msg->sk), index, devlink) { in devlink_nl_cmd_sb_port_pool_get_dumpit()
2848 if (!devlink->ops->sb_port_pool_get) in devlink_nl_cmd_sb_port_pool_get_dumpit()
2851 devl_lock(devlink); in devlink_nl_cmd_sb_port_pool_get_dumpit()
2852 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_nl_cmd_sb_port_pool_get_dumpit()
2854 devlink, devlink_sb, in devlink_nl_cmd_sb_port_pool_get_dumpit()
2860 devl_unlock(devlink); in devlink_nl_cmd_sb_port_pool_get_dumpit()
2861 devlink_put(devlink); in devlink_nl_cmd_sb_port_pool_get_dumpit()
2865 devl_unlock(devlink); in devlink_nl_cmd_sb_port_pool_get_dumpit()
2867 devlink_put(devlink); in devlink_nl_cmd_sb_port_pool_get_dumpit()
2883 const struct devlink_ops *ops = devlink_port->devlink->ops; in devlink_sb_port_pool_set()
2895 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_port_pool_set_doit() local
2901 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_port_pool_set_doit()
2919 devlink_nl_sb_tc_pool_bind_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_sb_tc_pool_bind_fill() argument
2926 const struct devlink_ops *ops = devlink->ops; in devlink_nl_sb_tc_pool_bind_fill()
2942 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_sb_tc_pool_bind_fill()
2987 struct devlink *devlink = devlink_port->devlink; in devlink_nl_cmd_sb_tc_pool_bind_get_doit() local
2994 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_tc_pool_bind_get_doit()
3007 if (!devlink->ops->sb_tc_pool_bind_get) in devlink_nl_cmd_sb_tc_pool_bind_get_doit()
3014 err = devlink_nl_sb_tc_pool_bind_fill(msg, devlink, devlink_port, in devlink_nl_cmd_sb_tc_pool_bind_get_doit()
3029 struct devlink *devlink, in __sb_tc_pool_bind_get_dumpit() argument
3037 list_for_each_entry(devlink_port, &devlink->port_list, list) { in __sb_tc_pool_bind_get_dumpit()
3044 err = devlink_nl_sb_tc_pool_bind_fill(msg, devlink, in __sb_tc_pool_bind_get_dumpit()
3062 err = devlink_nl_sb_tc_pool_bind_fill(msg, devlink, in __sb_tc_pool_bind_get_dumpit()
3082 struct devlink *devlink; in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit() local
3089 devlinks_xa_for_each_registered_get(sock_net(msg->sk), index, devlink) { in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
3090 if (!devlink->ops->sb_tc_pool_bind_get) in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
3093 devl_lock(devlink); in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
3094 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
3096 devlink, in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
3103 devl_unlock(devlink); in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
3104 devlink_put(devlink); in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
3108 devl_unlock(devlink); in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
3110 devlink_put(devlink); in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
3127 const struct devlink_ops *ops = devlink_port->devlink->ops; in devlink_sb_tc_pool_bind_set()
3140 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_tc_pool_bind_set_doit() local
3148 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_tc_pool_bind_set_doit()
3178 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_occ_snapshot_doit() local
3179 const struct devlink_ops *ops = devlink->ops; in devlink_nl_cmd_sb_occ_snapshot_doit()
3182 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_occ_snapshot_doit()
3187 return ops->sb_occ_snapshot(devlink, devlink_sb->index); in devlink_nl_cmd_sb_occ_snapshot_doit()
3194 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_occ_max_clear_doit() local
3195 const struct devlink_ops *ops = devlink->ops; in devlink_nl_cmd_sb_occ_max_clear_doit()
3198 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_occ_max_clear_doit()
3203 return ops->sb_occ_max_clear(devlink, devlink_sb->index); in devlink_nl_cmd_sb_occ_max_clear_doit()
3207 static int devlink_nl_eswitch_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_eswitch_fill() argument
3211 const struct devlink_ops *ops = devlink->ops; in devlink_nl_eswitch_fill()
3222 err = devlink_nl_put_handle(msg, devlink); in devlink_nl_eswitch_fill()
3227 err = ops->eswitch_mode_get(devlink, &mode); in devlink_nl_eswitch_fill()
3236 err = ops->eswitch_inline_mode_get(devlink, &inline_mode); in devlink_nl_eswitch_fill()
3246 err = ops->eswitch_encap_mode_get(devlink, &encap_mode); in devlink_nl_eswitch_fill()
3265 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_eswitch_get_doit() local
3273 err = devlink_nl_eswitch_fill(msg, devlink, DEVLINK_CMD_ESWITCH_GET, in devlink_nl_cmd_eswitch_get_doit()
3284 static int devlink_rate_nodes_check(struct devlink *devlink, u16 mode, in devlink_rate_nodes_check() argument
3289 list_for_each_entry(devlink_rate, &devlink->rate_list, list) in devlink_rate_nodes_check()
3300 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_eswitch_set_doit() local
3301 const struct devlink_ops *ops = devlink->ops; in devlink_nl_cmd_eswitch_set_doit()
3311 err = devlink_rate_nodes_check(devlink, mode, info->extack); in devlink_nl_cmd_eswitch_set_doit()
3314 err = ops->eswitch_mode_set(devlink, mode, info->extack); in devlink_nl_cmd_eswitch_set_doit()
3324 err = ops->eswitch_inline_mode_set(devlink, inline_mode, in devlink_nl_cmd_eswitch_set_doit()
3334 err = ops->eswitch_encap_mode_set(devlink, encap_mode, in devlink_nl_cmd_eswitch_set_doit()
3500 struct devlink *devlink = info->user_ptr[0]; in devlink_dpipe_tables_fill() local
3524 if (devlink_nl_put_handle(skb, devlink)) in devlink_dpipe_tables_fill()
3578 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_dpipe_table_get() local
3585 &devlink->dpipe_table_list, in devlink_nl_cmd_dpipe_table_get()
3737 const char *table_name, struct devlink *devlink) in devlink_dpipe_table_find() argument
3741 lockdep_is_held(&devlink->lock)) { in devlink_dpipe_table_find()
3750 struct devlink *devlink; in devlink_dpipe_entry_ctx_prepare() local
3766 devlink = dump_ctx->info->user_ptr[0]; in devlink_dpipe_entry_ctx_prepare()
3767 if (devlink_nl_put_handle(dump_ctx->skb, devlink)) in devlink_dpipe_entry_ctx_prepare()
3851 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_dpipe_entries_get() local
3859 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, in devlink_nl_cmd_dpipe_entries_get()
3860 table_name, devlink); in devlink_nl_cmd_dpipe_entries_get()
3938 struct devlink *devlink = info->user_ptr[0]; in devlink_dpipe_headers_fill() local
3959 if (devlink_nl_put_handle(skb, devlink)) in devlink_dpipe_headers_fill()
4001 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_dpipe_headers_get() local
4003 if (!devlink->dpipe_headers) in devlink_nl_cmd_dpipe_headers_get()
4006 0, devlink->dpipe_headers); in devlink_nl_cmd_dpipe_headers_get()
4009 static int devlink_dpipe_table_counters_set(struct devlink *devlink, in devlink_dpipe_table_counters_set() argument
4015 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, in devlink_dpipe_table_counters_set()
4016 table_name, devlink); in devlink_dpipe_table_counters_set()
4035 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_dpipe_table_counters_set() local
4047 return devlink_dpipe_table_counters_set(devlink, table_name, in devlink_nl_cmd_dpipe_table_counters_set()
4052 devlink_resource_find(struct devlink *devlink, in devlink_resource_find() argument
4060 resource_list = &devlink->resource_list; in devlink_resource_find()
4068 child_resource = devlink_resource_find(devlink, resource, in devlink_resource_find()
4124 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_resource_set() local
4135 resource = devlink_resource_find(devlink, NULL, resource_id); in devlink_nl_cmd_resource_set()
4179 static int devlink_resource_put(struct devlink *devlink, struct sk_buff *skb, in devlink_resource_put() argument
4216 if (devlink_resource_put(devlink, skb, child_resource)) in devlink_resource_put()
4235 struct devlink *devlink = info->user_ptr[0]; in devlink_resource_fill() local
4245 resource = list_first_entry(&devlink->resource_list, in devlink_resource_fill()
4259 if (devlink_nl_put_handle(skb, devlink)) in devlink_resource_fill()
4269 list_for_each_entry_from(resource, &devlink->resource_list, list) { in devlink_resource_fill()
4270 err = devlink_resource_put(devlink, skb, resource); in devlink_resource_fill()
4304 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_resource_dump() local
4306 if (list_empty(&devlink->resource_list)) in devlink_nl_cmd_resource_dump()
4313 devlink_resources_validate(struct devlink *devlink, in devlink_resources_validate() argument
4323 resource_list = &devlink->resource_list; in devlink_resources_validate()
4328 err = devlink_resources_validate(devlink, resource, info); in devlink_resources_validate()
4372 static void devlink_param_notify(struct devlink *devlink,
4377 static void devlink_ns_change_notify(struct devlink *devlink, in devlink_ns_change_notify() argument
4394 devlink_notify(devlink, DEVLINK_CMD_NEW); in devlink_ns_change_notify()
4397 list_for_each_entry(param_item, &devlink->param_list, list) in devlink_ns_change_notify()
4398 devlink_param_notify(devlink, 0, param_item, cmd); in devlink_ns_change_notify()
4401 devlink_notify(devlink, DEVLINK_CMD_DEL); in devlink_ns_change_notify()
4409 static void devlink_reload_failed_set(struct devlink *devlink, in devlink_reload_failed_set() argument
4412 if (devlink->reload_failed == reload_failed) in devlink_reload_failed_set()
4414 devlink->reload_failed = reload_failed; in devlink_reload_failed_set()
4415 devlink_notify(devlink, DEVLINK_CMD_NEW); in devlink_reload_failed_set()
4418 bool devlink_is_reload_failed(const struct devlink *devlink) in devlink_is_reload_failed() argument
4420 return devlink->reload_failed; in devlink_is_reload_failed()
4425 __devlink_reload_stats_update(struct devlink *devlink, u32 *reload_stats, in __devlink_reload_stats_update() argument
4436 devlink_notify(devlink, DEVLINK_CMD_NEW); in __devlink_reload_stats_update()
4440 devlink_reload_stats_update(struct devlink *devlink, enum devlink_reload_limit limit, in devlink_reload_stats_update() argument
4443 __devlink_reload_stats_update(devlink, devlink->stats.reload_stats, limit, in devlink_reload_stats_update()
4461 void devlink_remote_reload_actions_performed(struct devlink *devlink, in devlink_remote_reload_actions_performed() argument
4471 __devlink_reload_stats_update(devlink, devlink->stats.remote_reload_stats, limit, in devlink_remote_reload_actions_performed()
4476 static int devlink_reload(struct devlink *devlink, struct net *dest_net, in devlink_reload() argument
4484 memcpy(remote_reload_stats, devlink->stats.remote_reload_stats, in devlink_reload()
4487 curr_net = devlink_net(devlink); in devlink_reload()
4488 devlink_ns_change_notify(devlink, dest_net, curr_net, false); in devlink_reload()
4489 err = devlink->ops->reload_down(devlink, !!dest_net, action, limit, extack); in devlink_reload()
4494 write_pnet(&devlink->_net, dest_net); in devlink_reload()
4496 err = devlink->ops->reload_up(devlink, action, limit, actions_performed, extack); in devlink_reload()
4497 devlink_reload_failed_set(devlink, !!err); in devlink_reload()
4501 devlink_ns_change_notify(devlink, dest_net, curr_net, true); in devlink_reload()
4504 WARN_ON(memcmp(remote_reload_stats, devlink->stats.remote_reload_stats, in devlink_reload()
4506 devlink_reload_stats_update(devlink, limit, *actions_performed); in devlink_reload()
4511 devlink_nl_reload_actions_performed_snd(struct devlink *devlink, u32 actions_performed, in devlink_nl_reload_actions_performed_snd() argument
4525 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_reload_actions_performed_snd()
4544 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_reload() local
4551 if (!(devlink->features & DEVLINK_F_RELOAD)) in devlink_nl_cmd_reload()
4554 err = devlink_resources_validate(devlink, NULL, info); in devlink_nl_cmd_reload()
4565 if (!devlink_reload_action_is_supported(devlink, action)) { in devlink_nl_cmd_reload()
4591 if (!devlink_reload_limit_is_supported(devlink, limit)) { in devlink_nl_cmd_reload()
4610 err = devlink_reload(devlink, dest_net, action, limit, &actions_performed, info->extack); in devlink_nl_cmd_reload()
4621 return devlink_nl_reload_actions_performed_snd(devlink, actions_performed, in devlink_nl_cmd_reload()
4626 struct devlink *devlink, in devlink_nl_flash_update_fill() argument
4636 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_flash_update_fill()
4669 static void __devlink_flash_update_notify(struct devlink *devlink, in __devlink_flash_update_notify() argument
4680 if (!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)) in __devlink_flash_update_notify()
4687 err = devlink_nl_flash_update_fill(msg, devlink, cmd, params); in __devlink_flash_update_notify()
4691 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in __devlink_flash_update_notify()
4699 static void devlink_flash_update_begin_notify(struct devlink *devlink) in devlink_flash_update_begin_notify() argument
4703 __devlink_flash_update_notify(devlink, in devlink_flash_update_begin_notify()
4708 static void devlink_flash_update_end_notify(struct devlink *devlink) in devlink_flash_update_end_notify() argument
4712 __devlink_flash_update_notify(devlink, in devlink_flash_update_end_notify()
4717 void devlink_flash_update_status_notify(struct devlink *devlink, in devlink_flash_update_status_notify() argument
4730 __devlink_flash_update_notify(devlink, in devlink_flash_update_status_notify()
4736 void devlink_flash_update_timeout_notify(struct devlink *devlink, in devlink_flash_update_timeout_notify() argument
4747 __devlink_flash_update_notify(devlink, in devlink_flash_update_timeout_notify()
4781 static int devlink_flash_component_get(struct devlink *devlink, in devlink_flash_component_get() argument
4796 if (!devlink->ops->info_get) { in devlink_flash_component_get()
4806 ret = devlink->ops->info_get(devlink, &req, NULL); in devlink_flash_component_get()
4824 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_flash_update() local
4829 if (!devlink->ops->flash_update) in devlink_nl_cmd_flash_update()
4835 ret = devlink_flash_component_get(devlink, in devlink_nl_cmd_flash_update()
4841 supported_params = devlink->ops->supported_flash_update_params; in devlink_nl_cmd_flash_update()
4858 ret = request_firmware(&params.fw, file_name, devlink->dev); in devlink_nl_cmd_flash_update()
4864 devlink_flash_update_begin_notify(devlink); in devlink_nl_cmd_flash_update()
4865 ret = devlink->ops->flash_update(devlink, &params, info->extack); in devlink_nl_cmd_flash_update()
4866 devlink_flash_update_end_notify(devlink); in devlink_nl_cmd_flash_update()
4874 devlink_nl_selftests_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_selftests_fill() argument
4889 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_selftests_fill()
4898 if (devlink->ops->selftest_check(devlink, i, extack)) { in devlink_nl_selftests_fill()
4917 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_selftests_get_doit() local
4921 if (!devlink->ops->selftest_check) in devlink_nl_cmd_selftests_get_doit()
4928 err = devlink_nl_selftests_fill(msg, devlink, info->snd_portid, in devlink_nl_cmd_selftests_get_doit()
4941 struct devlink *devlink; in devlink_nl_cmd_selftests_get_dumpit() local
4947 devlinks_xa_for_each_registered_get(sock_net(msg->sk), index, devlink) { in devlink_nl_cmd_selftests_get_dumpit()
4948 if (idx < start || !devlink->ops->selftest_check) in devlink_nl_cmd_selftests_get_dumpit()
4951 devl_lock(devlink); in devlink_nl_cmd_selftests_get_dumpit()
4952 err = devlink_nl_selftests_fill(msg, devlink, in devlink_nl_cmd_selftests_get_dumpit()
4956 devl_unlock(devlink); in devlink_nl_cmd_selftests_get_dumpit()
4958 devlink_put(devlink); in devlink_nl_cmd_selftests_get_dumpit()
4963 devlink_put(devlink); in devlink_nl_cmd_selftests_get_dumpit()
4999 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_selftests_run() local
5006 if (!devlink->ops->selftest_run || !devlink->ops->selftest_check) in devlink_nl_cmd_selftests_run()
5029 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_cmd_selftests_run()
5041 if (!devlink->ops->selftest_check(devlink, i, in devlink_nl_cmd_selftests_run()
5049 test_status = devlink->ops->selftest_run(devlink, i, in devlink_nl_cmd_selftests_run()
5214 static int devlink_param_get(struct devlink *devlink, in devlink_param_get() argument
5218 if (!param->get || devlink->reload_failed) in devlink_param_get()
5220 return param->get(devlink, param->id, ctx); in devlink_param_get()
5223 static int devlink_param_set(struct devlink *devlink, in devlink_param_set() argument
5227 if (!param->set || devlink->reload_failed) in devlink_param_set()
5229 return param->set(devlink, param->id, ctx); in devlink_param_set()
5301 static int devlink_nl_param_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_param_fill() argument
5328 err = devlink_param_get(devlink, param, &ctx); in devlink_nl_param_fill()
5340 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_param_fill()
5391 static void devlink_param_notify(struct devlink *devlink, in devlink_param_notify() argument
5402 ASSERT_DEVLINK_REGISTERED(devlink); in devlink_param_notify()
5407 err = devlink_nl_param_fill(msg, devlink, port_index, param_item, cmd, in devlink_param_notify()
5414 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_param_notify()
5422 struct devlink *devlink; in devlink_nl_cmd_param_get_dumpit() local
5428 devlinks_xa_for_each_registered_get(sock_net(msg->sk), index, devlink) { in devlink_nl_cmd_param_get_dumpit()
5429 devl_lock(devlink); in devlink_nl_cmd_param_get_dumpit()
5430 list_for_each_entry(param_item, &devlink->param_list, list) { in devlink_nl_cmd_param_get_dumpit()
5435 err = devlink_nl_param_fill(msg, devlink, 0, param_item, in devlink_nl_cmd_param_get_dumpit()
5443 devl_unlock(devlink); in devlink_nl_cmd_param_get_dumpit()
5444 devlink_put(devlink); in devlink_nl_cmd_param_get_dumpit()
5449 devl_unlock(devlink); in devlink_nl_cmd_param_get_dumpit()
5450 devlink_put(devlink); in devlink_nl_cmd_param_get_dumpit()
5551 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_param_get_doit() local
5556 param_item = devlink_param_get_from_info(&devlink->param_list, info); in devlink_nl_cmd_param_get_doit()
5564 err = devlink_nl_param_fill(msg, devlink, 0, param_item, in devlink_nl_cmd_param_get_doit()
5575 static int __devlink_nl_cmd_param_set_doit(struct devlink *devlink, in __devlink_nl_cmd_param_set_doit() argument
5602 err = param->validate(devlink, param->id, value, info->extack); in __devlink_nl_cmd_param_set_doit()
5624 err = devlink_param_set(devlink, param, &ctx); in __devlink_nl_cmd_param_set_doit()
5629 devlink_param_notify(devlink, port_index, param_item, cmd); in __devlink_nl_cmd_param_set_doit()
5636 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_param_set_doit() local
5638 return __devlink_nl_cmd_param_set_doit(devlink, 0, &devlink->param_list, in devlink_nl_cmd_param_set_doit()
5664 struct devlink *devlink, in devlink_nl_region_snapshot_id_put() argument
5687 struct devlink *devlink, in devlink_nl_region_snapshots_id_put() argument
5700 err = devlink_nl_region_snapshot_id_put(msg, devlink, snapshot); in devlink_nl_region_snapshots_id_put()
5713 static int devlink_nl_region_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_region_fill() argument
5725 err = devlink_nl_put_handle(msg, devlink); in devlink_nl_region_fill()
5751 err = devlink_nl_region_snapshots_id_put(msg, devlink, region); in devlink_nl_region_fill()
5768 struct devlink *devlink = region->devlink; in devlink_nl_region_notify_build() local
5784 err = devlink_nl_put_handle(msg, devlink); in devlink_nl_region_notify_build()
5826 struct devlink *devlink = region->devlink; in devlink_nl_region_notify() local
5830 if (!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)) in devlink_nl_region_notify()
5837 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), msg, in devlink_nl_region_notify()
5856 static int __devlink_snapshot_id_increment(struct devlink *devlink, u32 id) in __devlink_snapshot_id_increment() argument
5862 xa_lock(&devlink->snapshot_ids); in __devlink_snapshot_id_increment()
5863 p = xa_load(&devlink->snapshot_ids, id); in __devlink_snapshot_id_increment()
5877 err = xa_err(__xa_store(&devlink->snapshot_ids, id, xa_mk_value(count), in __devlink_snapshot_id_increment()
5880 xa_unlock(&devlink->snapshot_ids); in __devlink_snapshot_id_increment()
5899 static void __devlink_snapshot_id_decrement(struct devlink *devlink, u32 id) in __devlink_snapshot_id_decrement() argument
5904 xa_lock(&devlink->snapshot_ids); in __devlink_snapshot_id_decrement()
5905 p = xa_load(&devlink->snapshot_ids, id); in __devlink_snapshot_id_decrement()
5916 __xa_store(&devlink->snapshot_ids, id, xa_mk_value(count), in __devlink_snapshot_id_decrement()
5920 __xa_erase(&devlink->snapshot_ids, id); in __devlink_snapshot_id_decrement()
5923 xa_unlock(&devlink->snapshot_ids); in __devlink_snapshot_id_decrement()
5942 static int __devlink_snapshot_id_insert(struct devlink *devlink, u32 id) in __devlink_snapshot_id_insert() argument
5946 xa_lock(&devlink->snapshot_ids); in __devlink_snapshot_id_insert()
5947 if (xa_load(&devlink->snapshot_ids, id)) { in __devlink_snapshot_id_insert()
5948 xa_unlock(&devlink->snapshot_ids); in __devlink_snapshot_id_insert()
5951 err = xa_err(__xa_store(&devlink->snapshot_ids, id, xa_mk_value(0), in __devlink_snapshot_id_insert()
5953 xa_unlock(&devlink->snapshot_ids); in __devlink_snapshot_id_insert()
5973 static int __devlink_region_snapshot_id_get(struct devlink *devlink, u32 *id) in __devlink_region_snapshot_id_get() argument
5975 return xa_alloc(&devlink->snapshot_ids, id, xa_mk_value(1), in __devlink_region_snapshot_id_get()
5997 struct devlink *devlink = region->devlink; in __devlink_region_snapshot_create() local
6014 err = __devlink_snapshot_id_increment(devlink, snapshot_id); in __devlink_region_snapshot_create()
6037 struct devlink *devlink = region->devlink; in devlink_region_snapshot_del() local
6045 __devlink_snapshot_id_decrement(devlink, snapshot->id); in devlink_region_snapshot_del()
6052 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_region_get_doit() local
6066 port = devlink_port_get_by_index(devlink, index); in devlink_nl_cmd_region_get_doit()
6075 region = devlink_region_get_by_name(devlink, region_name); in devlink_nl_cmd_region_get_doit()
6084 err = devlink_nl_region_fill(msg, devlink, DEVLINK_CMD_REGION_GET, in devlink_nl_cmd_region_get_doit()
6109 err = devlink_nl_region_fill(msg, port->devlink, in devlink_nl_cmd_region_get_port_dumpit()
6125 struct devlink *devlink, in devlink_nl_cmd_region_get_devlink_dumpit() argument
6133 devl_lock(devlink); in devlink_nl_cmd_region_get_devlink_dumpit()
6134 list_for_each_entry(region, &devlink->region_list, list) { in devlink_nl_cmd_region_get_devlink_dumpit()
6139 err = devlink_nl_region_fill(msg, devlink, in devlink_nl_cmd_region_get_devlink_dumpit()
6149 list_for_each_entry(port, &devlink->port_list, list) { in devlink_nl_cmd_region_get_devlink_dumpit()
6157 devl_unlock(devlink); in devlink_nl_cmd_region_get_devlink_dumpit()
6164 struct devlink *devlink; in devlink_nl_cmd_region_get_dumpit() local
6170 devlinks_xa_for_each_registered_get(sock_net(msg->sk), index, devlink) { in devlink_nl_cmd_region_get_dumpit()
6171 err = devlink_nl_cmd_region_get_devlink_dumpit(msg, cb, devlink, in devlink_nl_cmd_region_get_dumpit()
6173 devlink_put(devlink); in devlink_nl_cmd_region_get_dumpit()
6185 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_region_del() local
6203 port = devlink_port_get_by_index(devlink, index); in devlink_nl_cmd_region_del()
6211 region = devlink_region_get_by_name(devlink, region_name); in devlink_nl_cmd_region_del()
6231 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_region_new() local
6252 port = devlink_port_get_by_index(devlink, index); in devlink_nl_cmd_region_new()
6260 region = devlink_region_get_by_name(devlink, region_name); in devlink_nl_cmd_region_new()
6290 err = __devlink_snapshot_id_insert(devlink, snapshot_id); in devlink_nl_cmd_region_new()
6294 err = __devlink_region_snapshot_id_get(devlink, &snapshot_id); in devlink_nl_cmd_region_new()
6305 err = region->ops->snapshot(devlink, region->ops, in devlink_nl_cmd_region_new()
6343 __devlink_snapshot_id_decrement(devlink, snapshot_id); in devlink_nl_cmd_region_new()
6355 struct devlink *devlink, in devlink_nl_cmd_region_read_chunk_fill() argument
6386 struct devlink *devlink, in devlink_nl_region_read_snapshot_fill() argument
6415 err = devlink_nl_cmd_region_read_chunk_fill(skb, devlink, in devlink_nl_region_read_snapshot_fill()
6438 struct devlink *devlink; in devlink_nl_cmd_region_read_dumpit() local
6445 devlink = devlink_get_from_attrs(sock_net(cb->skb->sk), attrs); in devlink_nl_cmd_region_read_dumpit()
6446 if (IS_ERR(devlink)) in devlink_nl_cmd_region_read_dumpit()
6447 return PTR_ERR(devlink); in devlink_nl_cmd_region_read_dumpit()
6449 devl_lock(devlink); in devlink_nl_cmd_region_read_dumpit()
6460 port = devlink_port_get_by_index(devlink, index); in devlink_nl_cmd_region_read_dumpit()
6472 region = devlink_region_get_by_name(devlink, region_name); in devlink_nl_cmd_region_read_dumpit()
6506 err = devlink_nl_put_handle(skb, devlink); in devlink_nl_cmd_region_read_dumpit()
6527 err = devlink_nl_region_read_snapshot_fill(skb, devlink, in devlink_nl_cmd_region_read_dumpit()
6545 devl_unlock(devlink); in devlink_nl_cmd_region_read_dumpit()
6546 devlink_put(devlink); in devlink_nl_cmd_region_read_dumpit()
6552 devl_unlock(devlink); in devlink_nl_cmd_region_read_dumpit()
6553 devlink_put(devlink); in devlink_nl_cmd_region_read_dumpit()
6674 devlink_nl_info_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_info_fill() argument
6687 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_info_fill()
6691 err = devlink->ops->info_get(devlink, &req, extack); in devlink_nl_info_fill()
6706 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_info_get_doit() local
6710 if (!devlink->ops->info_get) in devlink_nl_cmd_info_get_doit()
6717 err = devlink_nl_info_fill(msg, devlink, DEVLINK_CMD_INFO_GET, in devlink_nl_cmd_info_get_doit()
6731 struct devlink *devlink; in devlink_nl_cmd_info_get_dumpit() local
6737 devlinks_xa_for_each_registered_get(sock_net(msg->sk), index, devlink) { in devlink_nl_cmd_info_get_dumpit()
6738 if (idx < start || !devlink->ops->info_get) in devlink_nl_cmd_info_get_dumpit()
6741 devl_lock(devlink); in devlink_nl_cmd_info_get_dumpit()
6742 err = devlink_nl_info_fill(msg, devlink, DEVLINK_CMD_INFO_GET, in devlink_nl_cmd_info_get_dumpit()
6746 devl_unlock(devlink); in devlink_nl_cmd_info_get_dumpit()
6750 devlink_put(devlink); in devlink_nl_cmd_info_get_dumpit()
6755 devlink_put(devlink); in devlink_nl_cmd_info_get_dumpit()
7359 struct devlink *devlink; member
7397 devlink_health_reporter_find_by_name(struct devlink *devlink, in devlink_health_reporter_find_by_name() argument
7400 return __devlink_health_reporter_find_by_name(&devlink->reporter_list, in devlink_health_reporter_find_by_name()
7401 &devlink->reporters_lock, in devlink_health_reporter_find_by_name()
7415 __devlink_health_reporter_create(struct devlink *devlink, in __devlink_health_reporter_create() argument
7430 reporter->devlink = devlink; in __devlink_health_reporter_create()
7462 reporter = __devlink_health_reporter_create(port->devlink, ops, in devlink_port_health_reporter_create()
7484 devlink_health_reporter_create(struct devlink *devlink, in devlink_health_reporter_create() argument
7490 mutex_lock(&devlink->reporters_lock); in devlink_health_reporter_create()
7491 if (devlink_health_reporter_find_by_name(devlink, ops->name)) { in devlink_health_reporter_create()
7496 reporter = __devlink_health_reporter_create(devlink, ops, in devlink_health_reporter_create()
7501 list_add_tail(&reporter->list, &devlink->reporter_list); in devlink_health_reporter_create()
7503 mutex_unlock(&devlink->reporters_lock); in devlink_health_reporter_create()
7539 struct mutex *lock = &reporter->devlink->reporters_lock; in devlink_health_reporter_destroy()
7569 struct devlink *devlink = reporter->devlink; in devlink_nl_health_reporter_fill() local
7577 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_health_reporter_fill()
7637 struct devlink *devlink = reporter->devlink; in devlink_recover_notify() local
7642 WARN_ON(!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)); in devlink_recover_notify()
7654 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), msg, in devlink_recover_notify()
7743 struct devlink *devlink = reporter->devlink; in devlink_health_report() local
7749 trace_devlink_health_report(devlink, reporter->ops->name, msg); in devlink_health_report()
7762 trace_devlink_health_recover_aborted(devlink, in devlink_health_report()
7782 devl_lock(devlink); in devlink_health_report()
7784 devl_unlock(devlink); in devlink_health_report()
7791 devlink_health_reporter_get_from_attrs(struct devlink *devlink, in devlink_health_reporter_get_from_attrs() argument
7802 devlink_port = devlink_port_get_from_attrs(devlink, attrs); in devlink_health_reporter_get_from_attrs()
7804 mutex_lock(&devlink->reporters_lock); in devlink_health_reporter_get_from_attrs()
7805 reporter = devlink_health_reporter_find_by_name(devlink, reporter_name); in devlink_health_reporter_get_from_attrs()
7808 mutex_unlock(&devlink->reporters_lock); in devlink_health_reporter_get_from_attrs()
7821 devlink_health_reporter_get_from_info(struct devlink *devlink, in devlink_health_reporter_get_from_info() argument
7824 return devlink_health_reporter_get_from_attrs(devlink, info->attrs); in devlink_health_reporter_get_from_info()
7833 struct devlink *devlink; in devlink_health_reporter_get_from_cb() local
7835 devlink = devlink_get_from_attrs(sock_net(cb->skb->sk), attrs); in devlink_health_reporter_get_from_cb()
7836 if (IS_ERR(devlink)) in devlink_health_reporter_get_from_cb()
7839 reporter = devlink_health_reporter_get_from_attrs(devlink, attrs); in devlink_health_reporter_get_from_cb()
7840 devlink_put(devlink); in devlink_health_reporter_get_from_cb()
7856 trace_devlink_health_reporter_state_update(reporter->devlink, in devlink_health_reporter_state_update()
7865 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_get_doit() local
7870 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_get_doit()
7901 struct devlink *devlink; in devlink_nl_cmd_health_reporter_get_dumpit() local
7907 devlinks_xa_for_each_registered_get(sock_net(msg->sk), index, devlink) { in devlink_nl_cmd_health_reporter_get_dumpit()
7908 mutex_lock(&devlink->reporters_lock); in devlink_nl_cmd_health_reporter_get_dumpit()
7909 list_for_each_entry(reporter, &devlink->reporter_list, in devlink_nl_cmd_health_reporter_get_dumpit()
7920 mutex_unlock(&devlink->reporters_lock); in devlink_nl_cmd_health_reporter_get_dumpit()
7921 devlink_put(devlink); in devlink_nl_cmd_health_reporter_get_dumpit()
7926 mutex_unlock(&devlink->reporters_lock); in devlink_nl_cmd_health_reporter_get_dumpit()
7927 devlink_put(devlink); in devlink_nl_cmd_health_reporter_get_dumpit()
7930 devlinks_xa_for_each_registered_get(sock_net(msg->sk), index, devlink) { in devlink_nl_cmd_health_reporter_get_dumpit()
7931 devl_lock(devlink); in devlink_nl_cmd_health_reporter_get_dumpit()
7932 list_for_each_entry(port, &devlink->port_list, list) { in devlink_nl_cmd_health_reporter_get_dumpit()
7946 devl_unlock(devlink); in devlink_nl_cmd_health_reporter_get_dumpit()
7947 devlink_put(devlink); in devlink_nl_cmd_health_reporter_get_dumpit()
7954 devl_unlock(devlink); in devlink_nl_cmd_health_reporter_get_dumpit()
7955 devlink_put(devlink); in devlink_nl_cmd_health_reporter_get_dumpit()
7966 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_set_doit() local
7970 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_set_doit()
8008 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_recover_doit() local
8012 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_recover_doit()
8025 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_diagnose_doit() local
8030 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_diagnose_doit()
8108 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_dump_clear_doit() local
8111 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_dump_clear_doit()
8130 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_test_doit() local
8134 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_test_doit()
8211 devlink_trap_policer_item_lookup(struct devlink *devlink, u32 id) in devlink_trap_policer_item_lookup() argument
8215 list_for_each_entry(policer_item, &devlink->trap_policer_list, list) { in devlink_trap_policer_item_lookup()
8224 devlink_trap_item_lookup(struct devlink *devlink, const char *name) in devlink_trap_item_lookup() argument
8228 list_for_each_entry(trap_item, &devlink->trap_list, list) { in devlink_trap_item_lookup()
8237 devlink_trap_item_get_from_info(struct devlink *devlink, in devlink_trap_item_get_from_info() argument
8246 return devlink_trap_item_lookup(devlink, nla_data(attr)); in devlink_trap_item_get_from_info()
8349 static int devlink_trap_stats_put(struct sk_buff *msg, struct devlink *devlink, in devlink_trap_stats_put() argument
8357 if (devlink->ops->trap_drop_counter_get) { in devlink_trap_stats_put()
8358 err = devlink->ops->trap_drop_counter_get(devlink, in devlink_trap_stats_put()
8371 if (devlink->ops->trap_drop_counter_get && in devlink_trap_stats_put()
8395 static int devlink_nl_trap_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_trap_fill() argument
8408 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_trap_fill()
8432 err = devlink_trap_stats_put(msg, devlink, trap_item); in devlink_nl_trap_fill()
8449 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_get_doit() local
8454 if (list_empty(&devlink->trap_list)) in devlink_nl_cmd_trap_get_doit()
8457 trap_item = devlink_trap_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_get_doit()
8467 err = devlink_nl_trap_fill(msg, devlink, trap_item, in devlink_nl_cmd_trap_get_doit()
8484 struct devlink *devlink; in devlink_nl_cmd_trap_get_dumpit() local
8490 devlinks_xa_for_each_registered_get(sock_net(msg->sk), index, devlink) { in devlink_nl_cmd_trap_get_dumpit()
8491 devl_lock(devlink); in devlink_nl_cmd_trap_get_dumpit()
8492 list_for_each_entry(trap_item, &devlink->trap_list, list) { in devlink_nl_cmd_trap_get_dumpit()
8497 err = devlink_nl_trap_fill(msg, devlink, trap_item, in devlink_nl_cmd_trap_get_dumpit()
8503 devl_unlock(devlink); in devlink_nl_cmd_trap_get_dumpit()
8504 devlink_put(devlink); in devlink_nl_cmd_trap_get_dumpit()
8509 devl_unlock(devlink); in devlink_nl_cmd_trap_get_dumpit()
8510 devlink_put(devlink); in devlink_nl_cmd_trap_get_dumpit()
8517 static int __devlink_trap_action_set(struct devlink *devlink, in __devlink_trap_action_set() argument
8530 err = devlink->ops->trap_action_set(devlink, trap_item->trap, in __devlink_trap_action_set()
8540 static int devlink_trap_action_set(struct devlink *devlink, in devlink_trap_action_set() argument
8556 return __devlink_trap_action_set(devlink, trap_item, trap_action, in devlink_trap_action_set()
8564 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_set_doit() local
8567 if (list_empty(&devlink->trap_list)) in devlink_nl_cmd_trap_set_doit()
8570 trap_item = devlink_trap_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_set_doit()
8576 return devlink_trap_action_set(devlink, trap_item, info); in devlink_nl_cmd_trap_set_doit()
8580 devlink_trap_group_item_lookup(struct devlink *devlink, const char *name) in devlink_trap_group_item_lookup() argument
8584 list_for_each_entry(group_item, &devlink->trap_group_list, list) { in devlink_trap_group_item_lookup()
8593 devlink_trap_group_item_lookup_by_id(struct devlink *devlink, u16 id) in devlink_trap_group_item_lookup_by_id() argument
8597 list_for_each_entry(group_item, &devlink->trap_group_list, list) { in devlink_trap_group_item_lookup_by_id()
8606 devlink_trap_group_item_get_from_info(struct devlink *devlink, in devlink_trap_group_item_get_from_info() argument
8615 return devlink_trap_group_item_lookup(devlink, name); in devlink_trap_group_item_get_from_info()
8619 devlink_nl_trap_group_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_trap_group_fill() argument
8631 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_trap_group_fill()
8664 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_group_get_doit() local
8669 if (list_empty(&devlink->trap_group_list)) in devlink_nl_cmd_trap_group_get_doit()
8672 group_item = devlink_trap_group_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_group_get_doit()
8682 err = devlink_nl_trap_group_fill(msg, devlink, group_item, in devlink_nl_cmd_trap_group_get_doit()
8701 struct devlink *devlink; in devlink_nl_cmd_trap_group_get_dumpit() local
8707 devlinks_xa_for_each_registered_get(sock_net(msg->sk), index, devlink) { in devlink_nl_cmd_trap_group_get_dumpit()
8708 devl_lock(devlink); in devlink_nl_cmd_trap_group_get_dumpit()
8709 list_for_each_entry(group_item, &devlink->trap_group_list, in devlink_nl_cmd_trap_group_get_dumpit()
8715 err = devlink_nl_trap_group_fill(msg, devlink, in devlink_nl_cmd_trap_group_get_dumpit()
8721 devl_unlock(devlink); in devlink_nl_cmd_trap_group_get_dumpit()
8722 devlink_put(devlink); in devlink_nl_cmd_trap_group_get_dumpit()
8727 devl_unlock(devlink); in devlink_nl_cmd_trap_group_get_dumpit()
8728 devlink_put(devlink); in devlink_nl_cmd_trap_group_get_dumpit()
8736 __devlink_trap_group_action_set(struct devlink *devlink, in __devlink_trap_group_action_set() argument
8745 if (devlink->ops->trap_group_action_set) { in __devlink_trap_group_action_set()
8746 err = devlink->ops->trap_group_action_set(devlink, group_item->group, in __devlink_trap_group_action_set()
8751 list_for_each_entry(trap_item, &devlink->trap_list, list) { in __devlink_trap_group_action_set()
8763 list_for_each_entry(trap_item, &devlink->trap_list, list) { in __devlink_trap_group_action_set()
8766 err = __devlink_trap_action_set(devlink, trap_item, in __devlink_trap_group_action_set()
8776 devlink_trap_group_action_set(struct devlink *devlink, in devlink_trap_group_action_set() argument
8792 err = __devlink_trap_group_action_set(devlink, group_item, trap_action, in devlink_trap_group_action_set()
8802 static int devlink_trap_group_set(struct devlink *devlink, in devlink_trap_group_set() argument
8815 if (!devlink->ops->trap_group_set) in devlink_trap_group_set()
8823 policer_item = devlink_trap_policer_item_lookup(devlink, in devlink_trap_group_set()
8832 err = devlink->ops->trap_group_set(devlink, group_item->group, policer, in devlink_trap_group_set()
8846 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_group_set_doit() local
8851 if (list_empty(&devlink->trap_group_list)) in devlink_nl_cmd_trap_group_set_doit()
8854 group_item = devlink_trap_group_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_group_set_doit()
8860 err = devlink_trap_group_action_set(devlink, group_item, info, in devlink_nl_cmd_trap_group_set_doit()
8865 err = devlink_trap_group_set(devlink, group_item, info); in devlink_nl_cmd_trap_group_set_doit()
8878 devlink_trap_policer_item_get_from_info(struct devlink *devlink, in devlink_trap_policer_item_get_from_info() argument
8887 return devlink_trap_policer_item_lookup(devlink, id); in devlink_trap_policer_item_get_from_info()
8891 devlink_trap_policer_stats_put(struct sk_buff *msg, struct devlink *devlink, in devlink_trap_policer_stats_put() argument
8898 if (!devlink->ops->trap_policer_counter_get) in devlink_trap_policer_stats_put()
8901 err = devlink->ops->trap_policer_counter_get(devlink, policer, &drops); in devlink_trap_policer_stats_put()
8923 devlink_nl_trap_policer_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_trap_policer_fill() argument
8935 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_trap_policer_fill()
8950 err = devlink_trap_policer_stats_put(msg, devlink, in devlink_nl_trap_policer_fill()
8969 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_policer_get_doit() local
8973 if (list_empty(&devlink->trap_policer_list)) in devlink_nl_cmd_trap_policer_get_doit()
8976 policer_item = devlink_trap_policer_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_policer_get_doit()
8986 err = devlink_nl_trap_policer_fill(msg, devlink, policer_item, in devlink_nl_cmd_trap_policer_get_doit()
9005 struct devlink *devlink; in devlink_nl_cmd_trap_policer_get_dumpit() local
9011 devlinks_xa_for_each_registered_get(sock_net(msg->sk), index, devlink) { in devlink_nl_cmd_trap_policer_get_dumpit()
9012 devl_lock(devlink); in devlink_nl_cmd_trap_policer_get_dumpit()
9013 list_for_each_entry(policer_item, &devlink->trap_policer_list, in devlink_nl_cmd_trap_policer_get_dumpit()
9019 err = devlink_nl_trap_policer_fill(msg, devlink, in devlink_nl_cmd_trap_policer_get_dumpit()
9025 devl_unlock(devlink); in devlink_nl_cmd_trap_policer_get_dumpit()
9026 devlink_put(devlink); in devlink_nl_cmd_trap_policer_get_dumpit()
9031 devl_unlock(devlink); in devlink_nl_cmd_trap_policer_get_dumpit()
9032 devlink_put(devlink); in devlink_nl_cmd_trap_policer_get_dumpit()
9040 devlink_trap_policer_set(struct devlink *devlink, in devlink_trap_policer_set() argument
9078 err = devlink->ops->trap_policer_set(devlink, policer_item->policer, in devlink_trap_policer_set()
9094 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_policer_set_doit() local
9096 if (list_empty(&devlink->trap_policer_list)) in devlink_nl_cmd_trap_policer_set_doit()
9099 if (!devlink->ops->trap_policer_set) in devlink_nl_cmd_trap_policer_set_doit()
9102 policer_item = devlink_trap_policer_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_policer_set_doit()
9108 return devlink_trap_policer_set(devlink, policer_item, info); in devlink_nl_cmd_trap_policer_set_doit()
9595 void devlink_set_features(struct devlink *devlink, u64 features) in devlink_set_features() argument
9597 ASSERT_DEVLINK_NOT_REGISTERED(devlink); in devlink_set_features()
9600 !devlink_reload_supported(devlink->ops)); in devlink_set_features()
9601 devlink->features = features; in devlink_set_features()
9617 struct devlink *devlink_alloc_ns(const struct devlink_ops *ops, in devlink_alloc_ns()
9621 struct devlink *devlink; in devlink_alloc_ns() local
9629 devlink = kzalloc(sizeof(*devlink) + priv_size, GFP_KERNEL); in devlink_alloc_ns()
9630 if (!devlink) in devlink_alloc_ns()
9633 ret = xa_alloc_cyclic(&devlinks, &devlink->index, devlink, xa_limit_31b, in devlink_alloc_ns()
9636 kfree(devlink); in devlink_alloc_ns()
9640 devlink->dev = dev; in devlink_alloc_ns()
9641 devlink->ops = ops; in devlink_alloc_ns()
9642 xa_init_flags(&devlink->snapshot_ids, XA_FLAGS_ALLOC); in devlink_alloc_ns()
9643 write_pnet(&devlink->_net, net); in devlink_alloc_ns()
9644 INIT_LIST_HEAD(&devlink->port_list); in devlink_alloc_ns()
9645 INIT_LIST_HEAD(&devlink->rate_list); in devlink_alloc_ns()
9646 INIT_LIST_HEAD(&devlink->linecard_list); in devlink_alloc_ns()
9647 INIT_LIST_HEAD(&devlink->sb_list); in devlink_alloc_ns()
9648 INIT_LIST_HEAD_RCU(&devlink->dpipe_table_list); in devlink_alloc_ns()
9649 INIT_LIST_HEAD(&devlink->resource_list); in devlink_alloc_ns()
9650 INIT_LIST_HEAD(&devlink->param_list); in devlink_alloc_ns()
9651 INIT_LIST_HEAD(&devlink->region_list); in devlink_alloc_ns()
9652 INIT_LIST_HEAD(&devlink->reporter_list); in devlink_alloc_ns()
9653 INIT_LIST_HEAD(&devlink->trap_list); in devlink_alloc_ns()
9654 INIT_LIST_HEAD(&devlink->trap_group_list); in devlink_alloc_ns()
9655 INIT_LIST_HEAD(&devlink->trap_policer_list); in devlink_alloc_ns()
9656 lockdep_register_key(&devlink->lock_key); in devlink_alloc_ns()
9657 mutex_init(&devlink->lock); in devlink_alloc_ns()
9658 lockdep_set_class(&devlink->lock, &devlink->lock_key); in devlink_alloc_ns()
9659 mutex_init(&devlink->reporters_lock); in devlink_alloc_ns()
9660 mutex_init(&devlink->linecards_lock); in devlink_alloc_ns()
9661 refcount_set(&devlink->refcount, 1); in devlink_alloc_ns()
9662 init_completion(&devlink->comp); in devlink_alloc_ns()
9664 return devlink; in devlink_alloc_ns()
9669 devlink_trap_policer_notify(struct devlink *devlink,
9673 devlink_trap_group_notify(struct devlink *devlink,
9676 static void devlink_trap_notify(struct devlink *devlink,
9680 static void devlink_notify_register(struct devlink *devlink) in devlink_notify_register() argument
9691 devlink_notify(devlink, DEVLINK_CMD_NEW); in devlink_notify_register()
9692 list_for_each_entry(linecard, &devlink->linecard_list, list) in devlink_notify_register()
9695 list_for_each_entry(devlink_port, &devlink->port_list, list) in devlink_notify_register()
9698 list_for_each_entry(policer_item, &devlink->trap_policer_list, list) in devlink_notify_register()
9699 devlink_trap_policer_notify(devlink, policer_item, in devlink_notify_register()
9702 list_for_each_entry(group_item, &devlink->trap_group_list, list) in devlink_notify_register()
9703 devlink_trap_group_notify(devlink, group_item, in devlink_notify_register()
9706 list_for_each_entry(trap_item, &devlink->trap_list, list) in devlink_notify_register()
9707 devlink_trap_notify(devlink, trap_item, DEVLINK_CMD_TRAP_NEW); in devlink_notify_register()
9709 list_for_each_entry(rate_node, &devlink->rate_list, list) in devlink_notify_register()
9712 list_for_each_entry(region, &devlink->region_list, list) in devlink_notify_register()
9715 list_for_each_entry(param_item, &devlink->param_list, list) in devlink_notify_register()
9716 devlink_param_notify(devlink, 0, param_item, in devlink_notify_register()
9720 static void devlink_notify_unregister(struct devlink *devlink) in devlink_notify_unregister() argument
9730 list_for_each_entry_reverse(param_item, &devlink->param_list, list) in devlink_notify_unregister()
9731 devlink_param_notify(devlink, 0, param_item, in devlink_notify_unregister()
9734 list_for_each_entry_reverse(region, &devlink->region_list, list) in devlink_notify_unregister()
9737 list_for_each_entry_reverse(rate_node, &devlink->rate_list, list) in devlink_notify_unregister()
9740 list_for_each_entry_reverse(trap_item, &devlink->trap_list, list) in devlink_notify_unregister()
9741 devlink_trap_notify(devlink, trap_item, DEVLINK_CMD_TRAP_DEL); in devlink_notify_unregister()
9743 list_for_each_entry_reverse(group_item, &devlink->trap_group_list, list) in devlink_notify_unregister()
9744 devlink_trap_group_notify(devlink, group_item, in devlink_notify_unregister()
9746 list_for_each_entry_reverse(policer_item, &devlink->trap_policer_list, in devlink_notify_unregister()
9748 devlink_trap_policer_notify(devlink, policer_item, in devlink_notify_unregister()
9751 list_for_each_entry_reverse(devlink_port, &devlink->port_list, list) in devlink_notify_unregister()
9753 devlink_notify(devlink, DEVLINK_CMD_DEL); in devlink_notify_unregister()
9761 void devlink_register(struct devlink *devlink) in devlink_register() argument
9763 ASSERT_DEVLINK_NOT_REGISTERED(devlink); in devlink_register()
9766 xa_set_mark(&devlinks, devlink->index, DEVLINK_REGISTERED); in devlink_register()
9767 devlink_notify_register(devlink); in devlink_register()
9776 void devlink_unregister(struct devlink *devlink) in devlink_unregister() argument
9778 ASSERT_DEVLINK_REGISTERED(devlink); in devlink_unregister()
9781 xa_set_mark(&devlinks, devlink->index, DEVLINK_UNREGISTERING); in devlink_unregister()
9782 devlink_put(devlink); in devlink_unregister()
9783 wait_for_completion(&devlink->comp); in devlink_unregister()
9785 devlink_notify_unregister(devlink); in devlink_unregister()
9786 xa_clear_mark(&devlinks, devlink->index, DEVLINK_REGISTERED); in devlink_unregister()
9787 xa_clear_mark(&devlinks, devlink->index, DEVLINK_UNREGISTERING); in devlink_unregister()
9796 void devlink_free(struct devlink *devlink) in devlink_free() argument
9798 ASSERT_DEVLINK_NOT_REGISTERED(devlink); in devlink_free()
9800 mutex_destroy(&devlink->linecards_lock); in devlink_free()
9801 mutex_destroy(&devlink->reporters_lock); in devlink_free()
9802 mutex_destroy(&devlink->lock); in devlink_free()
9803 lockdep_unregister_key(&devlink->lock_key); in devlink_free()
9804 WARN_ON(!list_empty(&devlink->trap_policer_list)); in devlink_free()
9805 WARN_ON(!list_empty(&devlink->trap_group_list)); in devlink_free()
9806 WARN_ON(!list_empty(&devlink->trap_list)); in devlink_free()
9807 WARN_ON(!list_empty(&devlink->reporter_list)); in devlink_free()
9808 WARN_ON(!list_empty(&devlink->region_list)); in devlink_free()
9809 WARN_ON(!list_empty(&devlink->param_list)); in devlink_free()
9810 WARN_ON(!list_empty(&devlink->resource_list)); in devlink_free()
9811 WARN_ON(!list_empty(&devlink->dpipe_table_list)); in devlink_free()
9812 WARN_ON(!list_empty(&devlink->sb_list)); in devlink_free()
9813 WARN_ON(!list_empty(&devlink->rate_list)); in devlink_free()
9814 WARN_ON(!list_empty(&devlink->linecard_list)); in devlink_free()
9815 WARN_ON(!list_empty(&devlink->port_list)); in devlink_free()
9817 xa_destroy(&devlink->snapshot_ids); in devlink_free()
9818 xa_erase(&devlinks, devlink->index); in devlink_free()
9820 kfree(devlink); in devlink_free()
9868 void devlink_port_init(struct devlink *devlink, in devlink_port_init() argument
9873 devlink_port->devlink = devlink; in devlink_port_init()
9908 int devl_port_register(struct devlink *devlink, in devl_port_register() argument
9912 devl_assert_locked(devlink); in devl_port_register()
9914 if (devlink_port_index_exists(devlink, port_index)) in devl_port_register()
9919 devlink_port_init(devlink, devlink_port); in devl_port_register()
9925 list_add_tail(&devlink_port->list, &devlink->port_list); in devl_port_register()
9949 int devlink_port_register(struct devlink *devlink, in devlink_port_register() argument
9955 devl_lock(devlink); in devlink_port_register()
9956 err = devl_port_register(devlink, devlink_port, port_index); in devlink_port_register()
9957 devl_unlock(devlink); in devlink_port_register()
9969 lockdep_assert_held(&devlink_port->devlink->lock); in devl_port_unregister()
9989 struct devlink *devlink = devlink_port->devlink; in devlink_port_unregister() local
9991 devl_lock(devlink); in devlink_port_unregister()
9993 devl_unlock(devlink); in devlink_port_unregister()
10060 dev_warn(devlink_port->devlink->dev, in devlink_port_type_eth_set()
10222 struct devlink *devlink = devlink_port->devlink; in devl_rate_leaf_create() local
10225 devl_assert_locked(devlink_port->devlink); in devl_rate_leaf_create()
10235 devlink_rate->devlink = devlink; in devl_rate_leaf_create()
10238 list_add_tail(&devlink_rate->list, &devlink->rate_list); in devl_rate_leaf_create()
10257 devl_assert_locked(devlink_port->devlink); in devl_rate_leaf_destroy()
10277 void devl_rate_nodes_destroy(struct devlink *devlink) in devl_rate_nodes_destroy() argument
10280 const struct devlink_ops *ops = devlink->ops; in devl_rate_nodes_destroy()
10282 devl_assert_locked(devlink); in devl_rate_nodes_destroy()
10284 list_for_each_entry(devlink_rate, &devlink->rate_list, list) { in devl_rate_nodes_destroy()
10296 list_for_each_entry_safe(devlink_rate, tmp, &devlink->rate_list, list) { in devl_rate_nodes_destroy()
10434 devlink_linecard_create(struct devlink *devlink, unsigned int linecard_index, in devlink_linecard_create() argument
10444 mutex_lock(&devlink->linecards_lock); in devlink_linecard_create()
10445 if (devlink_linecard_index_exists(devlink, linecard_index)) { in devlink_linecard_create()
10446 mutex_unlock(&devlink->linecards_lock); in devlink_linecard_create()
10452 mutex_unlock(&devlink->linecards_lock); in devlink_linecard_create()
10456 linecard->devlink = devlink; in devlink_linecard_create()
10467 mutex_unlock(&devlink->linecards_lock); in devlink_linecard_create()
10471 list_add_tail(&linecard->list, &devlink->linecard_list); in devlink_linecard_create()
10473 mutex_unlock(&devlink->linecards_lock); in devlink_linecard_create()
10486 struct devlink *devlink = linecard->devlink; in devlink_linecard_destroy() local
10489 mutex_lock(&devlink->linecards_lock); in devlink_linecard_destroy()
10492 mutex_unlock(&devlink->linecards_lock); in devlink_linecard_destroy()
10604 struct devlink *nested_devlink) in devlink_linecard_nested_dl_set()
10613 int devl_sb_register(struct devlink *devlink, unsigned int sb_index, in devl_sb_register() argument
10620 lockdep_assert_held(&devlink->lock); in devl_sb_register()
10622 if (devlink_sb_index_exists(devlink, sb_index)) in devl_sb_register()
10634 list_add_tail(&devlink_sb->list, &devlink->sb_list); in devl_sb_register()
10639 int devlink_sb_register(struct devlink *devlink, unsigned int sb_index, in devlink_sb_register() argument
10646 devl_lock(devlink); in devlink_sb_register()
10647 err = devl_sb_register(devlink, sb_index, size, ingress_pools_count, in devlink_sb_register()
10650 devl_unlock(devlink); in devlink_sb_register()
10655 void devl_sb_unregister(struct devlink *devlink, unsigned int sb_index) in devl_sb_unregister() argument
10659 lockdep_assert_held(&devlink->lock); in devl_sb_unregister()
10661 devlink_sb = devlink_sb_get_by_index(devlink, sb_index); in devl_sb_unregister()
10668 void devlink_sb_unregister(struct devlink *devlink, unsigned int sb_index) in devlink_sb_unregister() argument
10670 devl_lock(devlink); in devlink_sb_unregister()
10671 devl_sb_unregister(devlink, sb_index); in devlink_sb_unregister()
10672 devl_unlock(devlink); in devlink_sb_unregister()
10684 void devl_dpipe_headers_register(struct devlink *devlink, in devl_dpipe_headers_register() argument
10687 lockdep_assert_held(&devlink->lock); in devl_dpipe_headers_register()
10689 devlink->dpipe_headers = dpipe_headers; in devl_dpipe_headers_register()
10700 void devl_dpipe_headers_unregister(struct devlink *devlink) in devl_dpipe_headers_unregister() argument
10702 lockdep_assert_held(&devlink->lock); in devl_dpipe_headers_unregister()
10704 devlink->dpipe_headers = NULL; in devl_dpipe_headers_unregister()
10722 bool devlink_dpipe_table_counter_enabled(struct devlink *devlink, in devlink_dpipe_table_counter_enabled() argument
10729 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, in devlink_dpipe_table_counter_enabled()
10730 table_name, devlink); in devlink_dpipe_table_counter_enabled()
10748 int devl_dpipe_table_register(struct devlink *devlink, in devl_dpipe_table_register() argument
10755 lockdep_assert_held(&devlink->lock); in devl_dpipe_table_register()
10760 if (devlink_dpipe_table_find(&devlink->dpipe_table_list, table_name, in devl_dpipe_table_register()
10761 devlink)) in devl_dpipe_table_register()
10773 list_add_tail_rcu(&table->list, &devlink->dpipe_table_list); in devl_dpipe_table_register()
10785 void devl_dpipe_table_unregister(struct devlink *devlink, in devl_dpipe_table_unregister() argument
10790 lockdep_assert_held(&devlink->lock); in devl_dpipe_table_unregister()
10792 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, in devl_dpipe_table_unregister()
10793 table_name, devlink); in devl_dpipe_table_unregister()
10815 int devl_resource_register(struct devlink *devlink, in devl_resource_register() argument
10826 lockdep_assert_held(&devlink->lock); in devl_resource_register()
10830 resource = devlink_resource_find(devlink, NULL, resource_id); in devl_resource_register()
10839 resource_list = &devlink->resource_list; in devl_resource_register()
10843 parent_resource = devlink_resource_find(devlink, NULL, in devl_resource_register()
10884 int devlink_resource_register(struct devlink *devlink, in devlink_resource_register() argument
10893 devl_lock(devlink); in devlink_resource_register()
10894 err = devl_resource_register(devlink, resource_name, resource_size, in devlink_resource_register()
10896 devl_unlock(devlink); in devlink_resource_register()
10901 static void devlink_resource_unregister(struct devlink *devlink, in devlink_resource_unregister() argument
10908 devlink_resource_unregister(devlink, child_resource); in devlink_resource_unregister()
10919 void devl_resources_unregister(struct devlink *devlink) in devl_resources_unregister() argument
10923 lockdep_assert_held(&devlink->lock); in devl_resources_unregister()
10925 list_for_each_entry_safe(child_resource, tmp, &devlink->resource_list, in devl_resources_unregister()
10927 devlink_resource_unregister(devlink, child_resource); in devl_resources_unregister()
10941 void devlink_resources_unregister(struct devlink *devlink) in devlink_resources_unregister() argument
10943 devl_lock(devlink); in devlink_resources_unregister()
10944 devl_resources_unregister(devlink); in devlink_resources_unregister()
10945 devl_unlock(devlink); in devlink_resources_unregister()
10956 int devl_resource_size_get(struct devlink *devlink, in devl_resource_size_get() argument
10962 lockdep_assert_held(&devlink->lock); in devl_resource_size_get()
10964 resource = devlink_resource_find(devlink, NULL, resource_id); in devl_resource_size_get()
10981 int devl_dpipe_table_resource_set(struct devlink *devlink, in devl_dpipe_table_resource_set() argument
10987 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, in devl_dpipe_table_resource_set()
10988 table_name, devlink); in devl_dpipe_table_resource_set()
11007 void devl_resource_occ_get_register(struct devlink *devlink, in devl_resource_occ_get_register() argument
11014 lockdep_assert_held(&devlink->lock); in devl_resource_occ_get_register()
11016 resource = devlink_resource_find(devlink, NULL, resource_id); in devl_resource_occ_get_register()
11036 void devlink_resource_occ_get_register(struct devlink *devlink, in devlink_resource_occ_get_register() argument
11041 devl_lock(devlink); in devlink_resource_occ_get_register()
11042 devl_resource_occ_get_register(devlink, resource_id, in devlink_resource_occ_get_register()
11044 devl_unlock(devlink); in devlink_resource_occ_get_register()
11054 void devl_resource_occ_get_unregister(struct devlink *devlink, in devl_resource_occ_get_unregister() argument
11059 lockdep_assert_held(&devlink->lock); in devl_resource_occ_get_unregister()
11061 resource = devlink_resource_find(devlink, NULL, resource_id); in devl_resource_occ_get_unregister()
11079 void devlink_resource_occ_get_unregister(struct devlink *devlink, in devlink_resource_occ_get_unregister() argument
11082 devl_lock(devlink); in devlink_resource_occ_get_unregister()
11083 devl_resource_occ_get_unregister(devlink, resource_id); in devlink_resource_occ_get_unregister()
11084 devl_unlock(devlink); in devlink_resource_occ_get_unregister()
11107 int devlink_params_register(struct devlink *devlink, in devlink_params_register() argument
11114 ASSERT_DEVLINK_NOT_REGISTERED(devlink); in devlink_params_register()
11117 err = devlink_param_register(devlink, param); in devlink_params_register()
11128 devlink_param_unregister(devlink, param); in devlink_params_register()
11139 void devlink_params_unregister(struct devlink *devlink, in devlink_params_unregister() argument
11146 ASSERT_DEVLINK_NOT_REGISTERED(devlink); in devlink_params_unregister()
11149 devlink_param_unregister(devlink, param); in devlink_params_unregister()
11162 int devlink_param_register(struct devlink *devlink, in devlink_param_register() argument
11167 ASSERT_DEVLINK_NOT_REGISTERED(devlink); in devlink_param_register()
11170 WARN_ON(devlink_param_find_by_name(&devlink->param_list, param->name)); in devlink_param_register()
11183 list_add_tail(&param_item->list, &devlink->param_list); in devlink_param_register()
11193 void devlink_param_unregister(struct devlink *devlink, in devlink_param_unregister() argument
11198 ASSERT_DEVLINK_NOT_REGISTERED(devlink); in devlink_param_unregister()
11201 devlink_param_find_by_name(&devlink->param_list, param->name); in devlink_param_unregister()
11219 int devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id, in devlink_param_driverinit_value_get() argument
11224 if (!devlink_reload_supported(devlink->ops)) in devlink_param_driverinit_value_get()
11227 param_item = devlink_param_find_by_id(&devlink->param_list, param_id); in devlink_param_driverinit_value_get()
11257 int devlink_param_driverinit_value_set(struct devlink *devlink, u32 param_id, in devlink_param_driverinit_value_set() argument
11262 ASSERT_DEVLINK_NOT_REGISTERED(devlink); in devlink_param_driverinit_value_set()
11264 param_item = devlink_param_find_by_id(&devlink->param_list, param_id); in devlink_param_driverinit_value_set()
11293 void devlink_param_value_changed(struct devlink *devlink, u32 param_id) in devlink_param_value_changed() argument
11297 param_item = devlink_param_find_by_id(&devlink->param_list, param_id); in devlink_param_value_changed()
11300 devlink_param_notify(devlink, 0, param_item, DEVLINK_CMD_PARAM_NEW); in devlink_param_value_changed()
11312 struct devlink_region *devl_region_create(struct devlink *devlink, in devl_region_create() argument
11319 devl_assert_locked(devlink); in devl_region_create()
11324 if (devlink_region_get_by_name(devlink, ops->name)) in devl_region_create()
11331 region->devlink = devlink; in devl_region_create()
11337 list_add_tail(&region->list, &devlink->region_list); in devl_region_create()
11355 devlink_region_create(struct devlink *devlink, in devlink_region_create() argument
11361 devl_lock(devlink); in devlink_region_create()
11362 region = devl_region_create(devlink, ops, region_max_snapshots, in devlink_region_create()
11364 devl_unlock(devlink); in devlink_region_create()
11384 struct devlink *devlink = port->devlink; in devlink_port_region_create() local
11393 devl_lock(devlink); in devlink_port_region_create()
11406 region->devlink = devlink; in devlink_port_region_create()
11416 devl_unlock(devlink); in devlink_port_region_create()
11420 devl_unlock(devlink); in devlink_port_region_create()
11432 struct devlink *devlink = region->devlink; in devl_region_destroy() local
11435 devl_assert_locked(devlink); in devl_region_destroy()
11458 struct devlink *devlink = region->devlink; in devlink_region_destroy() local
11460 devl_lock(devlink); in devlink_region_destroy()
11462 devl_unlock(devlink); in devlink_region_destroy()
11481 int devlink_region_snapshot_id_get(struct devlink *devlink, u32 *id) in devlink_region_snapshot_id_get() argument
11483 return __devlink_region_snapshot_id_get(devlink, id); in devlink_region_snapshot_id_get()
11497 void devlink_region_snapshot_id_put(struct devlink *devlink, u32 id) in devlink_region_snapshot_id_put() argument
11499 __devlink_snapshot_id_decrement(devlink, id); in devlink_region_snapshot_id_put()
11741 devlink_trap_group_notify(struct devlink *devlink, in devlink_trap_group_notify() argument
11750 if (!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)) in devlink_trap_group_notify()
11757 err = devlink_nl_trap_group_fill(msg, devlink, group_item, cmd, 0, 0, in devlink_trap_group_notify()
11764 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_trap_group_notify()
11769 devlink_trap_item_group_link(struct devlink *devlink, in devlink_trap_item_group_link() argument
11775 group_item = devlink_trap_group_item_lookup_by_id(devlink, group_id); in devlink_trap_item_group_link()
11784 static void devlink_trap_notify(struct devlink *devlink, in devlink_trap_notify() argument
11793 if (!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)) in devlink_trap_notify()
11800 err = devlink_nl_trap_fill(msg, devlink, trap_item, cmd, 0, 0, 0); in devlink_trap_notify()
11806 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_trap_notify()
11811 devlink_trap_register(struct devlink *devlink, in devlink_trap_register() argument
11817 if (devlink_trap_item_lookup(devlink, trap->name)) in devlink_trap_register()
11834 err = devlink_trap_item_group_link(devlink, trap_item); in devlink_trap_register()
11838 err = devlink->ops->trap_init(devlink, trap, trap_item); in devlink_trap_register()
11842 list_add_tail(&trap_item->list, &devlink->trap_list); in devlink_trap_register()
11843 devlink_trap_notify(devlink, trap_item, DEVLINK_CMD_TRAP_NEW); in devlink_trap_register()
11855 static void devlink_trap_unregister(struct devlink *devlink, in devlink_trap_unregister() argument
11860 trap_item = devlink_trap_item_lookup(devlink, trap->name); in devlink_trap_unregister()
11864 devlink_trap_notify(devlink, trap_item, DEVLINK_CMD_TRAP_DEL); in devlink_trap_unregister()
11866 if (devlink->ops->trap_fini) in devlink_trap_unregister()
11867 devlink->ops->trap_fini(devlink, trap, trap_item); in devlink_trap_unregister()
11872 static void devlink_trap_disable(struct devlink *devlink, in devlink_trap_disable() argument
11877 trap_item = devlink_trap_item_lookup(devlink, trap->name); in devlink_trap_disable()
11881 devlink->ops->trap_action_set(devlink, trap, DEVLINK_TRAP_ACTION_DROP, in devlink_trap_disable()
11895 int devl_traps_register(struct devlink *devlink, in devl_traps_register() argument
11901 if (!devlink->ops->trap_init || !devlink->ops->trap_action_set) in devl_traps_register()
11904 devl_assert_locked(devlink); in devl_traps_register()
11912 err = devlink_trap_register(devlink, trap, priv); in devl_traps_register()
11922 devlink_trap_unregister(devlink, &traps[i]); in devl_traps_register()
11938 int devlink_traps_register(struct devlink *devlink, in devlink_traps_register() argument
11944 devl_lock(devlink); in devlink_traps_register()
11945 err = devl_traps_register(devlink, traps, traps_count, priv); in devlink_traps_register()
11946 devl_unlock(devlink); in devlink_traps_register()
11957 void devl_traps_unregister(struct devlink *devlink, in devl_traps_unregister() argument
11963 devl_assert_locked(devlink); in devl_traps_unregister()
11968 devlink_trap_disable(devlink, &traps[i]); in devl_traps_unregister()
11971 devlink_trap_unregister(devlink, &traps[i]); in devl_traps_unregister()
11983 void devlink_traps_unregister(struct devlink *devlink, in devlink_traps_unregister() argument
11987 devl_lock(devlink); in devlink_traps_unregister()
11988 devl_traps_unregister(devlink, traps, traps_count); in devlink_traps_unregister()
11989 devl_unlock(devlink); in devlink_traps_unregister()
12031 void devlink_trap_report(struct devlink *devlink, struct sk_buff *skb, in devlink_trap_report() argument
12046 trace_devlink_trap_report(devlink, skb, &metadata); in devlink_trap_report()
12066 devlink_trap_group_item_policer_link(struct devlink *devlink, in devlink_trap_group_item_policer_link() argument
12075 policer_item = devlink_trap_policer_item_lookup(devlink, policer_id); in devlink_trap_group_item_policer_link()
12085 devlink_trap_group_register(struct devlink *devlink, in devlink_trap_group_register() argument
12091 if (devlink_trap_group_item_lookup(devlink, group->name)) in devlink_trap_group_register()
12106 err = devlink_trap_group_item_policer_link(devlink, group_item); in devlink_trap_group_register()
12110 if (devlink->ops->trap_group_init) { in devlink_trap_group_register()
12111 err = devlink->ops->trap_group_init(devlink, group); in devlink_trap_group_register()
12116 list_add_tail(&group_item->list, &devlink->trap_group_list); in devlink_trap_group_register()
12117 devlink_trap_group_notify(devlink, group_item, in devlink_trap_group_register()
12131 devlink_trap_group_unregister(struct devlink *devlink, in devlink_trap_group_unregister() argument
12136 group_item = devlink_trap_group_item_lookup(devlink, group->name); in devlink_trap_group_unregister()
12140 devlink_trap_group_notify(devlink, group_item, in devlink_trap_group_unregister()
12155 int devl_trap_groups_register(struct devlink *devlink, in devl_trap_groups_register() argument
12161 devl_assert_locked(devlink); in devl_trap_groups_register()
12169 err = devlink_trap_group_register(devlink, group); in devl_trap_groups_register()
12179 devlink_trap_group_unregister(devlink, &groups[i]); in devl_trap_groups_register()
12194 int devlink_trap_groups_register(struct devlink *devlink, in devlink_trap_groups_register() argument
12200 devl_lock(devlink); in devlink_trap_groups_register()
12201 err = devl_trap_groups_register(devlink, groups, groups_count); in devlink_trap_groups_register()
12202 devl_unlock(devlink); in devlink_trap_groups_register()
12213 void devl_trap_groups_unregister(struct devlink *devlink, in devl_trap_groups_unregister() argument
12219 devl_assert_locked(devlink); in devl_trap_groups_unregister()
12221 devlink_trap_group_unregister(devlink, &groups[i]); in devl_trap_groups_unregister()
12233 void devlink_trap_groups_unregister(struct devlink *devlink, in devlink_trap_groups_unregister() argument
12237 devl_lock(devlink); in devlink_trap_groups_unregister()
12238 devl_trap_groups_unregister(devlink, groups, groups_count); in devlink_trap_groups_unregister()
12239 devl_unlock(devlink); in devlink_trap_groups_unregister()
12244 devlink_trap_policer_notify(struct devlink *devlink, in devlink_trap_policer_notify() argument
12253 if (!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)) in devlink_trap_policer_notify()
12260 err = devlink_nl_trap_policer_fill(msg, devlink, policer_item, cmd, 0, in devlink_trap_policer_notify()
12267 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_trap_policer_notify()
12272 devlink_trap_policer_register(struct devlink *devlink, in devlink_trap_policer_register() argument
12278 if (devlink_trap_policer_item_lookup(devlink, policer->id)) in devlink_trap_policer_register()
12289 if (devlink->ops->trap_policer_init) { in devlink_trap_policer_register()
12290 err = devlink->ops->trap_policer_init(devlink, policer); in devlink_trap_policer_register()
12295 list_add_tail(&policer_item->list, &devlink->trap_policer_list); in devlink_trap_policer_register()
12296 devlink_trap_policer_notify(devlink, policer_item, in devlink_trap_policer_register()
12307 devlink_trap_policer_unregister(struct devlink *devlink, in devlink_trap_policer_unregister() argument
12312 policer_item = devlink_trap_policer_item_lookup(devlink, policer->id); in devlink_trap_policer_unregister()
12316 devlink_trap_policer_notify(devlink, policer_item, in devlink_trap_policer_unregister()
12319 if (devlink->ops->trap_policer_fini) in devlink_trap_policer_unregister()
12320 devlink->ops->trap_policer_fini(devlink, policer); in devlink_trap_policer_unregister()
12333 devl_trap_policers_register(struct devlink *devlink, in devl_trap_policers_register() argument
12339 devl_assert_locked(devlink); in devl_trap_policers_register()
12350 err = devlink_trap_policer_register(devlink, policer); in devl_trap_policers_register()
12359 devlink_trap_policer_unregister(devlink, &policers[i]); in devl_trap_policers_register()
12371 devl_trap_policers_unregister(struct devlink *devlink, in devl_trap_policers_unregister() argument
12377 devl_assert_locked(devlink); in devl_trap_policers_unregister()
12379 devlink_trap_policer_unregister(devlink, &policers[i]); in devl_trap_policers_unregister()
12383 static void __devlink_compat_running_version(struct devlink *devlink, in __devlink_compat_running_version() argument
12396 err = devlink->ops->info_get(devlink, &req, NULL); in __devlink_compat_running_version()
12427 void devlink_compat_running_version(struct devlink *devlink, in devlink_compat_running_version() argument
12430 if (!devlink->ops->info_get) in devlink_compat_running_version()
12433 devl_lock(devlink); in devlink_compat_running_version()
12434 __devlink_compat_running_version(devlink, buf, len); in devlink_compat_running_version()
12435 devl_unlock(devlink); in devlink_compat_running_version()
12438 int devlink_compat_flash_update(struct devlink *devlink, const char *file_name) in devlink_compat_flash_update() argument
12443 if (!devlink->ops->flash_update) in devlink_compat_flash_update()
12446 ret = request_firmware(&params.fw, file_name, devlink->dev); in devlink_compat_flash_update()
12450 devl_lock(devlink); in devlink_compat_flash_update()
12451 devlink_flash_update_begin_notify(devlink); in devlink_compat_flash_update()
12452 ret = devlink->ops->flash_update(devlink, &params, NULL); in devlink_compat_flash_update()
12453 devlink_flash_update_end_notify(devlink); in devlink_compat_flash_update()
12454 devl_unlock(devlink); in devlink_compat_flash_update()
12499 struct devlink *devlink; in devlink_pernet_pre_exit() local
12507 devlinks_xa_for_each_registered_get(net, index, devlink) { in devlink_pernet_pre_exit()
12508 WARN_ON(!(devlink->features & DEVLINK_F_RELOAD)); in devlink_pernet_pre_exit()
12509 mutex_lock(&devlink->lock); in devlink_pernet_pre_exit()
12510 err = devlink_reload(devlink, &init_net, in devlink_pernet_pre_exit()
12514 mutex_unlock(&devlink->lock); in devlink_pernet_pre_exit()
12517 devlink_put(devlink); in devlink_pernet_pre_exit()