Lines Matching refs:devlink

106 struct net *devlink_net(const struct devlink *devlink)  in devlink_net()  argument
108 return read_pnet(&devlink->_net); in devlink_net()
112 static void devlink_put(struct devlink *devlink) in devlink_put() argument
114 if (refcount_dec_and_test(&devlink->refcount)) in devlink_put()
115 complete(&devlink->comp); in devlink_put()
118 static bool __must_check devlink_try_get(struct devlink *devlink) in devlink_try_get() argument
120 return refcount_inc_not_zero(&devlink->refcount); in devlink_try_get()
123 static struct devlink *devlink_get_from_attrs(struct net *net, in devlink_get_from_attrs()
126 struct devlink *devlink; in devlink_get_from_attrs() local
140 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_get_from_attrs()
141 if (strcmp(devlink->dev->bus->name, busname) == 0 && in devlink_get_from_attrs()
142 strcmp(dev_name(devlink->dev), devname) == 0 && in devlink_get_from_attrs()
143 net_eq(devlink_net(devlink), net)) { in devlink_get_from_attrs()
149 if (!found || !devlink_try_get(devlink)) in devlink_get_from_attrs()
150 devlink = ERR_PTR(-ENODEV); in devlink_get_from_attrs()
152 return devlink; in devlink_get_from_attrs()
155 static struct devlink_port *devlink_port_get_by_index(struct devlink *devlink, in devlink_port_get_by_index() argument
160 list_for_each_entry(devlink_port, &devlink->port_list, list) { in devlink_port_get_by_index()
167 static bool devlink_port_index_exists(struct devlink *devlink, in devlink_port_index_exists() argument
170 return devlink_port_get_by_index(devlink, port_index); in devlink_port_index_exists()
173 static struct devlink_port *devlink_port_get_from_attrs(struct devlink *devlink, in devlink_port_get_from_attrs() argument
180 devlink_port = devlink_port_get_by_index(devlink, port_index); in devlink_port_get_from_attrs()
188 static struct devlink_port *devlink_port_get_from_info(struct devlink *devlink, in devlink_port_get_from_info() argument
191 return devlink_port_get_from_attrs(devlink, info->attrs); in devlink_port_get_from_info()
207 devlink_rate_leaf_get_from_info(struct devlink *devlink, struct genl_info *info) in devlink_rate_leaf_get_from_info() argument
212 devlink_port = devlink_port_get_from_attrs(devlink, info->attrs); in devlink_rate_leaf_get_from_info()
220 devlink_rate_node_get_by_name(struct devlink *devlink, const char *node_name) in devlink_rate_node_get_by_name() argument
224 list_for_each_entry(devlink_rate, &devlink->rate_list, list) { in devlink_rate_node_get_by_name()
233 devlink_rate_node_get_from_attrs(struct devlink *devlink, struct nlattr **attrs) in devlink_rate_node_get_from_attrs() argument
246 return devlink_rate_node_get_by_name(devlink, rate_node_name); in devlink_rate_node_get_from_attrs()
250 devlink_rate_node_get_from_info(struct devlink *devlink, struct genl_info *info) in devlink_rate_node_get_from_info() argument
252 return devlink_rate_node_get_from_attrs(devlink, info->attrs); in devlink_rate_node_get_from_info()
256 devlink_rate_get_from_info(struct devlink *devlink, struct genl_info *info) in devlink_rate_get_from_info() argument
261 return devlink_rate_leaf_get_from_info(devlink, info); in devlink_rate_get_from_info()
263 return devlink_rate_node_get_from_info(devlink, info); in devlink_rate_get_from_info()
283 static struct devlink_sb *devlink_sb_get_by_index(struct devlink *devlink, in devlink_sb_get_by_index() argument
288 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_sb_get_by_index()
295 static bool devlink_sb_index_exists(struct devlink *devlink, in devlink_sb_index_exists() argument
298 return devlink_sb_get_by_index(devlink, sb_index); in devlink_sb_index_exists()
301 static struct devlink_sb *devlink_sb_get_from_attrs(struct devlink *devlink, in devlink_sb_get_from_attrs() argument
308 devlink_sb = devlink_sb_get_by_index(devlink, sb_index); in devlink_sb_get_from_attrs()
316 static struct devlink_sb *devlink_sb_get_from_info(struct devlink *devlink, in devlink_sb_get_from_info() argument
319 return devlink_sb_get_from_attrs(devlink, info->attrs); in devlink_sb_get_from_info()
427 struct devlink *devlink; member
448 devlink_region_get_by_name(struct devlink *devlink, const char *region_name) in devlink_region_get_by_name() argument
452 list_for_each_entry(region, &devlink->region_list, list) in devlink_region_get_by_name()
499 struct devlink *devlink; in devlink_nl_pre_doit() local
503 devlink = devlink_get_from_attrs(genl_info_net(info), info->attrs); in devlink_nl_pre_doit()
504 if (IS_ERR(devlink)) { in devlink_nl_pre_doit()
506 return PTR_ERR(devlink); in devlink_nl_pre_doit()
509 mutex_lock(&devlink->lock); in devlink_nl_pre_doit()
510 info->user_ptr[0] = devlink; in devlink_nl_pre_doit()
512 devlink_port = devlink_port_get_from_info(devlink, info); in devlink_nl_pre_doit()
519 devlink_port = devlink_port_get_from_info(devlink, info); in devlink_nl_pre_doit()
525 devlink_rate = devlink_rate_get_from_info(devlink, info); in devlink_nl_pre_doit()
534 rate_node = devlink_rate_node_get_from_info(devlink, info); in devlink_nl_pre_doit()
545 mutex_unlock(&devlink->lock); in devlink_nl_pre_doit()
546 devlink_put(devlink); in devlink_nl_pre_doit()
554 struct devlink *devlink; in devlink_nl_post_doit() local
556 devlink = info->user_ptr[0]; in devlink_nl_post_doit()
558 mutex_unlock(&devlink->lock); in devlink_nl_post_doit()
559 devlink_put(devlink); in devlink_nl_post_doit()
573 static int devlink_nl_put_handle(struct sk_buff *msg, struct devlink *devlink) in devlink_nl_put_handle() argument
575 if (nla_put_string(msg, DEVLINK_ATTR_BUS_NAME, devlink->dev->bus->name)) in devlink_nl_put_handle()
577 if (nla_put_string(msg, DEVLINK_ATTR_DEV_NAME, dev_name(devlink->dev))) in devlink_nl_put_handle()
609 devlink_reload_action_is_supported(struct devlink *devlink, enum devlink_reload_action action) in devlink_reload_action_is_supported() argument
611 return test_bit(action, &devlink->ops->reload_actions); in devlink_reload_action_is_supported()
615 devlink_reload_limit_is_supported(struct devlink *devlink, enum devlink_reload_limit limit) in devlink_reload_limit_is_supported() argument
617 return test_bit(limit, &devlink->ops->reload_limits); in devlink_reload_limit_is_supported()
640 static int devlink_reload_stats_put(struct sk_buff *msg, struct devlink *devlink, bool is_remote) in devlink_reload_stats_put() argument
656 !devlink_reload_action_is_supported(devlink, i)) || in devlink_reload_stats_put()
676 !devlink_reload_limit_is_supported(devlink, j)) || in devlink_reload_stats_put()
682 value = devlink->stats.reload_stats[stat_idx]; in devlink_reload_stats_put()
684 value = devlink->stats.remote_reload_stats[stat_idx]; in devlink_reload_stats_put()
703 static int devlink_nl_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_fill() argument
714 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_fill()
716 if (nla_put_u8(msg, DEVLINK_ATTR_RELOAD_FAILED, devlink->reload_failed)) in devlink_nl_fill()
723 if (devlink_reload_stats_put(msg, devlink, false)) in devlink_nl_fill()
725 if (devlink_reload_stats_put(msg, devlink, true)) in devlink_nl_fill()
739 static void devlink_notify(struct devlink *devlink, enum devlink_command cmd) in devlink_notify() argument
750 err = devlink_nl_fill(msg, devlink, cmd, 0, 0, 0); in devlink_notify()
756 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_notify()
855 struct devlink *devlink = devlink_rate->devlink; in devlink_nl_rate_fill() local
862 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_rate_fill()
963 ops = port->devlink->ops; in devlink_nl_port_function_attrs_put()
982 struct devlink *devlink = devlink_port->devlink; in devlink_nl_port_fill() local
989 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_port_fill()
1004 struct net *net = devlink_net(devlink_port->devlink); in devlink_nl_port_fill()
1059 devlink_net(devlink_port->devlink), msg, 0, in devlink_port_notify()
1082 devlink_net(devlink_rate->devlink), msg, 0, in devlink_rate_notify()
1090 struct devlink *devlink; in devlink_nl_cmd_rate_get_dumpit() local
1097 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_rate_get_dumpit()
1098 if (!devlink_try_get(devlink)) in devlink_nl_cmd_rate_get_dumpit()
1101 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_rate_get_dumpit()
1104 mutex_lock(&devlink->lock); in devlink_nl_cmd_rate_get_dumpit()
1105 list_for_each_entry(devlink_rate, &devlink->rate_list, list) { in devlink_nl_cmd_rate_get_dumpit()
1117 mutex_unlock(&devlink->lock); in devlink_nl_cmd_rate_get_dumpit()
1118 devlink_put(devlink); in devlink_nl_cmd_rate_get_dumpit()
1123 mutex_unlock(&devlink->lock); in devlink_nl_cmd_rate_get_dumpit()
1125 devlink_put(devlink); in devlink_nl_cmd_rate_get_dumpit()
1172 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_get_doit() local
1180 err = devlink_nl_fill(msg, devlink, DEVLINK_CMD_NEW, in devlink_nl_cmd_get_doit()
1193 struct devlink *devlink; in devlink_nl_cmd_get_dumpit() local
1200 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_get_dumpit()
1201 if (!devlink_try_get(devlink)) in devlink_nl_cmd_get_dumpit()
1204 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) { in devlink_nl_cmd_get_dumpit()
1205 devlink_put(devlink); in devlink_nl_cmd_get_dumpit()
1211 devlink_put(devlink); in devlink_nl_cmd_get_dumpit()
1215 err = devlink_nl_fill(msg, devlink, DEVLINK_CMD_NEW, in devlink_nl_cmd_get_dumpit()
1218 devlink_put(devlink); in devlink_nl_cmd_get_dumpit()
1255 struct devlink *devlink; in devlink_nl_cmd_port_get_dumpit() local
1263 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_port_get_dumpit()
1264 if (!devlink_try_get(devlink)) in devlink_nl_cmd_port_get_dumpit()
1267 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_port_get_dumpit()
1270 mutex_lock(&devlink->lock); in devlink_nl_cmd_port_get_dumpit()
1271 list_for_each_entry(devlink_port, &devlink->port_list, list) { in devlink_nl_cmd_port_get_dumpit()
1282 mutex_unlock(&devlink->lock); in devlink_nl_cmd_port_get_dumpit()
1283 devlink_put(devlink); in devlink_nl_cmd_port_get_dumpit()
1288 mutex_unlock(&devlink->lock); in devlink_nl_cmd_port_get_dumpit()
1290 devlink_put(devlink); in devlink_nl_cmd_port_get_dumpit()
1305 if (!devlink_port->devlink->ops->port_type_set) in devlink_port_type_set()
1311 err = devlink_port->devlink->ops->port_type_set(devlink_port, in devlink_port_type_set()
1325 const struct devlink_ops *ops = port->devlink->ops; in devlink_port_function_hw_addr_set()
1363 ops = port->devlink->ops; in devlink_port_fn_state_set()
1432 static int devlink_port_split(struct devlink *devlink, u32 port_index, in devlink_port_split() argument
1436 if (devlink->ops->port_split) in devlink_port_split()
1437 return devlink->ops->port_split(devlink, port_index, count, in devlink_port_split()
1445 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_port_split_doit() local
1454 devlink_port = devlink_port_get_from_info(devlink, info); in devlink_nl_cmd_port_split_doit()
1475 return devlink_port_split(devlink, port_index, count, info->extack); in devlink_nl_cmd_port_split_doit()
1478 static int devlink_port_unsplit(struct devlink *devlink, u32 port_index, in devlink_port_unsplit() argument
1482 if (devlink->ops->port_unsplit) in devlink_port_unsplit()
1483 return devlink->ops->port_unsplit(devlink, port_index, extack); in devlink_port_unsplit()
1490 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_port_unsplit_doit() local
1497 return devlink_port_unsplit(devlink, port_index, info->extack); in devlink_nl_cmd_port_unsplit_doit()
1500 static int devlink_port_new_notifiy(struct devlink *devlink, in devlink_port_new_notifiy() argument
1512 mutex_lock(&devlink->lock); in devlink_port_new_notifiy()
1513 devlink_port = devlink_port_get_by_index(devlink, port_index); in devlink_port_new_notifiy()
1525 mutex_unlock(&devlink->lock); in devlink_port_new_notifiy()
1529 mutex_unlock(&devlink->lock); in devlink_port_new_notifiy()
1539 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_port_new_doit() local
1543 if (!devlink->ops->port_new || !devlink->ops->port_del) in devlink_nl_cmd_port_new_doit()
1572 err = devlink->ops->port_new(devlink, &new_attrs, extack, in devlink_nl_cmd_port_new_doit()
1577 err = devlink_port_new_notifiy(devlink, new_port_index, info); in devlink_nl_cmd_port_new_doit()
1580 devlink->ops->port_del(devlink, new_port_index, extack); in devlink_nl_cmd_port_new_doit()
1589 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_port_del_doit() local
1592 if (!devlink->ops->port_del) in devlink_nl_cmd_port_del_doit()
1601 return devlink->ops->port_del(devlink, port_index, extack); in devlink_nl_cmd_port_del_doit()
1609 struct devlink *devlink = devlink_rate->devlink; in devlink_nl_rate_parent_node_set() local
1611 const struct devlink_ops *ops = devlink->ops; in devlink_nl_rate_parent_node_set()
1635 parent = devlink_rate_node_get_by_name(devlink, parent_name); in devlink_nl_rate_parent_node_set()
1759 struct devlink *devlink = devlink_rate->devlink; in devlink_nl_cmd_rate_set_doit() local
1760 const struct devlink_ops *ops = devlink->ops; in devlink_nl_cmd_rate_set_doit()
1776 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_rate_new_doit() local
1781 ops = devlink->ops; in devlink_nl_cmd_rate_new_doit()
1790 rate_node = devlink_rate_node_get_from_attrs(devlink, info->attrs); in devlink_nl_cmd_rate_new_doit()
1800 rate_node->devlink = devlink; in devlink_nl_cmd_rate_new_doit()
1817 list_add(&rate_node->list, &devlink->rate_list); in devlink_nl_cmd_rate_new_doit()
1834 struct devlink *devlink = rate_node->devlink; in devlink_nl_cmd_rate_del_doit() local
1835 const struct devlink_ops *ops = devlink->ops; in devlink_nl_cmd_rate_del_doit()
1853 static int devlink_nl_sb_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_sb_fill() argument
1864 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_sb_fill()
1894 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_get_doit() local
1899 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_get_doit()
1907 err = devlink_nl_sb_fill(msg, devlink, devlink_sb, in devlink_nl_cmd_sb_get_doit()
1921 struct devlink *devlink; in devlink_nl_cmd_sb_get_dumpit() local
1929 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_sb_get_dumpit()
1930 if (!devlink_try_get(devlink)) in devlink_nl_cmd_sb_get_dumpit()
1933 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_sb_get_dumpit()
1936 mutex_lock(&devlink->lock); in devlink_nl_cmd_sb_get_dumpit()
1937 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_nl_cmd_sb_get_dumpit()
1942 err = devlink_nl_sb_fill(msg, devlink, devlink_sb, in devlink_nl_cmd_sb_get_dumpit()
1948 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_get_dumpit()
1949 devlink_put(devlink); in devlink_nl_cmd_sb_get_dumpit()
1954 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_get_dumpit()
1956 devlink_put(devlink); in devlink_nl_cmd_sb_get_dumpit()
1965 static int devlink_nl_sb_pool_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_sb_pool_fill() argument
1974 err = devlink->ops->sb_pool_get(devlink, devlink_sb->index, in devlink_nl_sb_pool_fill()
1983 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_sb_pool_fill()
2011 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_pool_get_doit() local
2017 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_pool_get_doit()
2026 if (!devlink->ops->sb_pool_get) in devlink_nl_cmd_sb_pool_get_doit()
2033 err = devlink_nl_sb_pool_fill(msg, devlink, devlink_sb, pool_index, in devlink_nl_cmd_sb_pool_get_doit()
2045 struct devlink *devlink, in __sb_pool_get_dumpit() argument
2058 err = devlink_nl_sb_pool_fill(msg, devlink, in __sb_pool_get_dumpit()
2073 struct devlink *devlink; in devlink_nl_cmd_sb_pool_get_dumpit() local
2081 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_sb_pool_get_dumpit()
2082 if (!devlink_try_get(devlink)) in devlink_nl_cmd_sb_pool_get_dumpit()
2085 if (!net_eq(devlink_net(devlink), sock_net(msg->sk)) || in devlink_nl_cmd_sb_pool_get_dumpit()
2086 !devlink->ops->sb_pool_get) in devlink_nl_cmd_sb_pool_get_dumpit()
2089 mutex_lock(&devlink->lock); in devlink_nl_cmd_sb_pool_get_dumpit()
2090 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_nl_cmd_sb_pool_get_dumpit()
2091 err = __sb_pool_get_dumpit(msg, start, &idx, devlink, in devlink_nl_cmd_sb_pool_get_dumpit()
2098 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_pool_get_dumpit()
2099 devlink_put(devlink); in devlink_nl_cmd_sb_pool_get_dumpit()
2103 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_pool_get_dumpit()
2105 devlink_put(devlink); in devlink_nl_cmd_sb_pool_get_dumpit()
2117 static int devlink_sb_pool_set(struct devlink *devlink, unsigned int sb_index, in devlink_sb_pool_set() argument
2123 const struct devlink_ops *ops = devlink->ops; in devlink_sb_pool_set()
2126 return ops->sb_pool_set(devlink, sb_index, pool_index, in devlink_sb_pool_set()
2134 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_pool_set_doit() local
2141 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_pool_set_doit()
2158 return devlink_sb_pool_set(devlink, devlink_sb->index, in devlink_nl_cmd_sb_pool_set_doit()
2164 struct devlink *devlink, in devlink_nl_sb_port_pool_fill() argument
2171 const struct devlink_ops *ops = devlink->ops; in devlink_nl_sb_port_pool_fill()
2185 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_sb_port_pool_fill()
2226 struct devlink *devlink = devlink_port->devlink; in devlink_nl_cmd_sb_port_pool_get_doit() local
2232 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_port_pool_get_doit()
2241 if (!devlink->ops->sb_port_pool_get) in devlink_nl_cmd_sb_port_pool_get_doit()
2248 err = devlink_nl_sb_port_pool_fill(msg, devlink, devlink_port, in devlink_nl_cmd_sb_port_pool_get_doit()
2261 struct devlink *devlink, in __sb_port_pool_get_dumpit() argument
2270 list_for_each_entry(devlink_port, &devlink->port_list, list) { in __sb_port_pool_get_dumpit()
2276 err = devlink_nl_sb_port_pool_fill(msg, devlink, in __sb_port_pool_get_dumpit()
2294 struct devlink *devlink; in devlink_nl_cmd_sb_port_pool_get_dumpit() local
2302 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_sb_port_pool_get_dumpit()
2303 if (!devlink_try_get(devlink)) in devlink_nl_cmd_sb_port_pool_get_dumpit()
2306 if (!net_eq(devlink_net(devlink), sock_net(msg->sk)) || in devlink_nl_cmd_sb_port_pool_get_dumpit()
2307 !devlink->ops->sb_port_pool_get) in devlink_nl_cmd_sb_port_pool_get_dumpit()
2310 mutex_lock(&devlink->lock); in devlink_nl_cmd_sb_port_pool_get_dumpit()
2311 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_nl_cmd_sb_port_pool_get_dumpit()
2313 devlink, devlink_sb, in devlink_nl_cmd_sb_port_pool_get_dumpit()
2319 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_port_pool_get_dumpit()
2320 devlink_put(devlink); in devlink_nl_cmd_sb_port_pool_get_dumpit()
2324 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_port_pool_get_dumpit()
2326 devlink_put(devlink); in devlink_nl_cmd_sb_port_pool_get_dumpit()
2344 const struct devlink_ops *ops = devlink_port->devlink->ops; in devlink_sb_port_pool_set()
2356 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_port_pool_set_doit() local
2362 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_port_pool_set_doit()
2380 devlink_nl_sb_tc_pool_bind_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_sb_tc_pool_bind_fill() argument
2387 const struct devlink_ops *ops = devlink->ops; in devlink_nl_sb_tc_pool_bind_fill()
2403 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_sb_tc_pool_bind_fill()
2448 struct devlink *devlink = devlink_port->devlink; in devlink_nl_cmd_sb_tc_pool_bind_get_doit() local
2455 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_tc_pool_bind_get_doit()
2468 if (!devlink->ops->sb_tc_pool_bind_get) in devlink_nl_cmd_sb_tc_pool_bind_get_doit()
2475 err = devlink_nl_sb_tc_pool_bind_fill(msg, devlink, devlink_port, in devlink_nl_cmd_sb_tc_pool_bind_get_doit()
2490 struct devlink *devlink, in __sb_tc_pool_bind_get_dumpit() argument
2498 list_for_each_entry(devlink_port, &devlink->port_list, list) { in __sb_tc_pool_bind_get_dumpit()
2505 err = devlink_nl_sb_tc_pool_bind_fill(msg, devlink, in __sb_tc_pool_bind_get_dumpit()
2523 err = devlink_nl_sb_tc_pool_bind_fill(msg, devlink, in __sb_tc_pool_bind_get_dumpit()
2543 struct devlink *devlink; in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit() local
2551 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
2552 if (!devlink_try_get(devlink)) in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
2555 if (!net_eq(devlink_net(devlink), sock_net(msg->sk)) || in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
2556 !devlink->ops->sb_tc_pool_bind_get) in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
2559 mutex_lock(&devlink->lock); in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
2560 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
2562 devlink, in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
2569 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
2570 devlink_put(devlink); in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
2574 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
2576 devlink_put(devlink); in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
2595 const struct devlink_ops *ops = devlink_port->devlink->ops; in devlink_sb_tc_pool_bind_set()
2608 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_tc_pool_bind_set_doit() local
2616 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_tc_pool_bind_set_doit()
2646 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_occ_snapshot_doit() local
2647 const struct devlink_ops *ops = devlink->ops; in devlink_nl_cmd_sb_occ_snapshot_doit()
2650 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_occ_snapshot_doit()
2655 return ops->sb_occ_snapshot(devlink, devlink_sb->index); in devlink_nl_cmd_sb_occ_snapshot_doit()
2662 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_occ_max_clear_doit() local
2663 const struct devlink_ops *ops = devlink->ops; in devlink_nl_cmd_sb_occ_max_clear_doit()
2666 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_occ_max_clear_doit()
2671 return ops->sb_occ_max_clear(devlink, devlink_sb->index); in devlink_nl_cmd_sb_occ_max_clear_doit()
2675 static int devlink_nl_eswitch_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_eswitch_fill() argument
2679 const struct devlink_ops *ops = devlink->ops; in devlink_nl_eswitch_fill()
2690 err = devlink_nl_put_handle(msg, devlink); in devlink_nl_eswitch_fill()
2695 err = ops->eswitch_mode_get(devlink, &mode); in devlink_nl_eswitch_fill()
2704 err = ops->eswitch_inline_mode_get(devlink, &inline_mode); in devlink_nl_eswitch_fill()
2714 err = ops->eswitch_encap_mode_get(devlink, &encap_mode); in devlink_nl_eswitch_fill()
2733 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_eswitch_get_doit() local
2741 err = devlink_nl_eswitch_fill(msg, devlink, DEVLINK_CMD_ESWITCH_GET, in devlink_nl_cmd_eswitch_get_doit()
2752 static int devlink_rate_nodes_check(struct devlink *devlink, u16 mode, in devlink_rate_nodes_check() argument
2758 mutex_lock(&devlink->lock); in devlink_rate_nodes_check()
2759 list_for_each_entry(devlink_rate, &devlink->rate_list, list) in devlink_rate_nodes_check()
2761 mutex_unlock(&devlink->lock); in devlink_rate_nodes_check()
2765 mutex_unlock(&devlink->lock); in devlink_rate_nodes_check()
2772 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_eswitch_set_doit() local
2773 const struct devlink_ops *ops = devlink->ops; in devlink_nl_cmd_eswitch_set_doit()
2783 err = devlink_rate_nodes_check(devlink, mode, info->extack); in devlink_nl_cmd_eswitch_set_doit()
2786 err = ops->eswitch_mode_set(devlink, mode, info->extack); in devlink_nl_cmd_eswitch_set_doit()
2796 err = ops->eswitch_inline_mode_set(devlink, inline_mode, in devlink_nl_cmd_eswitch_set_doit()
2806 err = ops->eswitch_encap_mode_set(devlink, encap_mode, in devlink_nl_cmd_eswitch_set_doit()
2972 struct devlink *devlink = info->user_ptr[0]; in devlink_dpipe_tables_fill() local
2996 if (devlink_nl_put_handle(skb, devlink)) in devlink_dpipe_tables_fill()
3050 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_dpipe_table_get() local
3057 &devlink->dpipe_table_list, in devlink_nl_cmd_dpipe_table_get()
3209 const char *table_name, struct devlink *devlink) in devlink_dpipe_table_find() argument
3213 lockdep_is_held(&devlink->lock)) { in devlink_dpipe_table_find()
3222 struct devlink *devlink; in devlink_dpipe_entry_ctx_prepare() local
3238 devlink = dump_ctx->info->user_ptr[0]; in devlink_dpipe_entry_ctx_prepare()
3239 if (devlink_nl_put_handle(dump_ctx->skb, devlink)) in devlink_dpipe_entry_ctx_prepare()
3323 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_dpipe_entries_get() local
3331 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, in devlink_nl_cmd_dpipe_entries_get()
3332 table_name, devlink); in devlink_nl_cmd_dpipe_entries_get()
3410 struct devlink *devlink = info->user_ptr[0]; in devlink_dpipe_headers_fill() local
3431 if (devlink_nl_put_handle(skb, devlink)) in devlink_dpipe_headers_fill()
3473 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_dpipe_headers_get() local
3475 if (!devlink->dpipe_headers) in devlink_nl_cmd_dpipe_headers_get()
3478 0, devlink->dpipe_headers); in devlink_nl_cmd_dpipe_headers_get()
3481 static int devlink_dpipe_table_counters_set(struct devlink *devlink, in devlink_dpipe_table_counters_set() argument
3487 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, in devlink_dpipe_table_counters_set()
3488 table_name, devlink); in devlink_dpipe_table_counters_set()
3507 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_dpipe_table_counters_set() local
3518 return devlink_dpipe_table_counters_set(devlink, table_name, in devlink_nl_cmd_dpipe_table_counters_set()
3523 devlink_resource_find(struct devlink *devlink, in devlink_resource_find() argument
3531 resource_list = &devlink->resource_list; in devlink_resource_find()
3539 child_resource = devlink_resource_find(devlink, resource, in devlink_resource_find()
3595 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_resource_set() local
3606 resource = devlink_resource_find(devlink, NULL, resource_id); in devlink_nl_cmd_resource_set()
3650 static int devlink_resource_put(struct devlink *devlink, struct sk_buff *skb, in devlink_resource_put() argument
3687 if (devlink_resource_put(devlink, skb, child_resource)) in devlink_resource_put()
3706 struct devlink *devlink = info->user_ptr[0]; in devlink_resource_fill() local
3716 resource = list_first_entry(&devlink->resource_list, in devlink_resource_fill()
3730 if (devlink_nl_put_handle(skb, devlink)) in devlink_resource_fill()
3740 list_for_each_entry_from(resource, &devlink->resource_list, list) { in devlink_resource_fill()
3741 err = devlink_resource_put(devlink, skb, resource); in devlink_resource_fill()
3775 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_resource_dump() local
3777 if (list_empty(&devlink->resource_list)) in devlink_nl_cmd_resource_dump()
3784 devlink_resources_validate(struct devlink *devlink, in devlink_resources_validate() argument
3794 resource_list = &devlink->resource_list; in devlink_resources_validate()
3799 err = devlink_resources_validate(devlink, resource, info); in devlink_resources_validate()
3843 static void devlink_param_notify(struct devlink *devlink,
3848 static void devlink_ns_change_notify(struct devlink *devlink, in devlink_ns_change_notify() argument
3865 devlink_notify(devlink, DEVLINK_CMD_NEW); in devlink_ns_change_notify()
3868 list_for_each_entry(param_item, &devlink->param_list, list) in devlink_ns_change_notify()
3869 devlink_param_notify(devlink, 0, param_item, cmd); in devlink_ns_change_notify()
3872 devlink_notify(devlink, DEVLINK_CMD_DEL); in devlink_ns_change_notify()
3880 static void devlink_reload_failed_set(struct devlink *devlink, in devlink_reload_failed_set() argument
3883 if (devlink->reload_failed == reload_failed) in devlink_reload_failed_set()
3885 devlink->reload_failed = reload_failed; in devlink_reload_failed_set()
3886 devlink_notify(devlink, DEVLINK_CMD_NEW); in devlink_reload_failed_set()
3889 bool devlink_is_reload_failed(const struct devlink *devlink) in devlink_is_reload_failed() argument
3891 return devlink->reload_failed; in devlink_is_reload_failed()
3896 __devlink_reload_stats_update(struct devlink *devlink, u32 *reload_stats, in __devlink_reload_stats_update() argument
3907 devlink_notify(devlink, DEVLINK_CMD_NEW); in __devlink_reload_stats_update()
3911 devlink_reload_stats_update(struct devlink *devlink, enum devlink_reload_limit limit, in devlink_reload_stats_update() argument
3914 __devlink_reload_stats_update(devlink, devlink->stats.reload_stats, limit, in devlink_reload_stats_update()
3932 void devlink_remote_reload_actions_performed(struct devlink *devlink, in devlink_remote_reload_actions_performed() argument
3942 __devlink_reload_stats_update(devlink, devlink->stats.remote_reload_stats, limit, in devlink_remote_reload_actions_performed()
3947 static int devlink_reload(struct devlink *devlink, struct net *dest_net, in devlink_reload() argument
3955 if (!devlink->reload_enabled) in devlink_reload()
3958 memcpy(remote_reload_stats, devlink->stats.remote_reload_stats, in devlink_reload()
3961 curr_net = devlink_net(devlink); in devlink_reload()
3962 devlink_ns_change_notify(devlink, dest_net, curr_net, false); in devlink_reload()
3963 err = devlink->ops->reload_down(devlink, !!dest_net, action, limit, extack); in devlink_reload()
3968 write_pnet(&devlink->_net, dest_net); in devlink_reload()
3970 err = devlink->ops->reload_up(devlink, action, limit, actions_performed, extack); in devlink_reload()
3971 devlink_reload_failed_set(devlink, !!err); in devlink_reload()
3975 devlink_ns_change_notify(devlink, dest_net, curr_net, true); in devlink_reload()
3978 WARN_ON(memcmp(remote_reload_stats, devlink->stats.remote_reload_stats, in devlink_reload()
3980 devlink_reload_stats_update(devlink, limit, *actions_performed); in devlink_reload()
3985 devlink_nl_reload_actions_performed_snd(struct devlink *devlink, u32 actions_performed, in devlink_nl_reload_actions_performed_snd() argument
3999 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_reload_actions_performed_snd()
4018 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_reload() local
4025 if (!devlink_reload_supported(devlink->ops)) in devlink_nl_cmd_reload()
4028 err = devlink_resources_validate(devlink, NULL, info); in devlink_nl_cmd_reload()
4047 if (!devlink_reload_action_is_supported(devlink, action)) { in devlink_nl_cmd_reload()
4073 if (!devlink_reload_limit_is_supported(devlink, limit)) { in devlink_nl_cmd_reload()
4084 err = devlink_reload(devlink, dest_net, action, limit, &actions_performed, info->extack); in devlink_nl_cmd_reload()
4095 return devlink_nl_reload_actions_performed_snd(devlink, actions_performed, in devlink_nl_cmd_reload()
4100 struct devlink *devlink, in devlink_nl_flash_update_fill() argument
4110 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_flash_update_fill()
4143 static void __devlink_flash_update_notify(struct devlink *devlink, in __devlink_flash_update_notify() argument
4158 err = devlink_nl_flash_update_fill(msg, devlink, cmd, params); in __devlink_flash_update_notify()
4162 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in __devlink_flash_update_notify()
4170 static void devlink_flash_update_begin_notify(struct devlink *devlink) in devlink_flash_update_begin_notify() argument
4174 __devlink_flash_update_notify(devlink, in devlink_flash_update_begin_notify()
4179 static void devlink_flash_update_end_notify(struct devlink *devlink) in devlink_flash_update_end_notify() argument
4183 __devlink_flash_update_notify(devlink, in devlink_flash_update_end_notify()
4188 void devlink_flash_update_status_notify(struct devlink *devlink, in devlink_flash_update_status_notify() argument
4201 __devlink_flash_update_notify(devlink, in devlink_flash_update_status_notify()
4207 void devlink_flash_update_timeout_notify(struct devlink *devlink, in devlink_flash_update_timeout_notify() argument
4218 __devlink_flash_update_notify(devlink, in devlink_flash_update_timeout_notify()
4229 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_flash_update() local
4234 if (!devlink->ops->flash_update) in devlink_nl_cmd_flash_update()
4240 supported_params = devlink->ops->supported_flash_update_params; in devlink_nl_cmd_flash_update()
4267 ret = request_firmware(&params.fw, file_name, devlink->dev); in devlink_nl_cmd_flash_update()
4273 devlink_flash_update_begin_notify(devlink); in devlink_nl_cmd_flash_update()
4274 ret = devlink->ops->flash_update(devlink, &params, info->extack); in devlink_nl_cmd_flash_update()
4275 devlink_flash_update_end_notify(devlink); in devlink_nl_cmd_flash_update()
4412 static int devlink_param_get(struct devlink *devlink, in devlink_param_get() argument
4418 return param->get(devlink, param->id, ctx); in devlink_param_get()
4421 static int devlink_param_set(struct devlink *devlink, in devlink_param_set() argument
4427 return param->set(devlink, param->id, ctx); in devlink_param_set()
4499 static int devlink_nl_param_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_param_fill() argument
4528 err = devlink_param_get(devlink, param, &ctx); in devlink_nl_param_fill()
4540 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_param_fill()
4591 static void devlink_param_notify(struct devlink *devlink, in devlink_param_notify() argument
4606 err = devlink_nl_param_fill(msg, devlink, port_index, param_item, cmd, in devlink_param_notify()
4613 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_param_notify()
4621 struct devlink *devlink; in devlink_nl_cmd_param_get_dumpit() local
4628 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_param_get_dumpit()
4629 if (!devlink_try_get(devlink)) in devlink_nl_cmd_param_get_dumpit()
4632 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_param_get_dumpit()
4635 mutex_lock(&devlink->lock); in devlink_nl_cmd_param_get_dumpit()
4636 list_for_each_entry(param_item, &devlink->param_list, list) { in devlink_nl_cmd_param_get_dumpit()
4641 err = devlink_nl_param_fill(msg, devlink, 0, param_item, in devlink_nl_cmd_param_get_dumpit()
4649 mutex_unlock(&devlink->lock); in devlink_nl_cmd_param_get_dumpit()
4650 devlink_put(devlink); in devlink_nl_cmd_param_get_dumpit()
4655 mutex_unlock(&devlink->lock); in devlink_nl_cmd_param_get_dumpit()
4657 devlink_put(devlink); in devlink_nl_cmd_param_get_dumpit()
4760 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_param_get_doit() local
4765 param_item = devlink_param_get_from_info(&devlink->param_list, info); in devlink_nl_cmd_param_get_doit()
4773 err = devlink_nl_param_fill(msg, devlink, 0, param_item, in devlink_nl_cmd_param_get_doit()
4784 static int __devlink_nl_cmd_param_set_doit(struct devlink *devlink, in __devlink_nl_cmd_param_set_doit() argument
4811 err = param->validate(devlink, param->id, value, info->extack); in __devlink_nl_cmd_param_set_doit()
4833 err = devlink_param_set(devlink, param, &ctx); in __devlink_nl_cmd_param_set_doit()
4838 devlink_param_notify(devlink, port_index, param_item, cmd); in __devlink_nl_cmd_param_set_doit()
4845 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_param_set_doit() local
4847 return __devlink_nl_cmd_param_set_doit(devlink, 0, &devlink->param_list, in devlink_nl_cmd_param_set_doit()
4851 static int devlink_param_register_one(struct devlink *devlink, in devlink_param_register_one() argument
4873 devlink_param_notify(devlink, port_index, param_item, cmd); in devlink_param_register_one()
4877 static void devlink_param_unregister_one(struct devlink *devlink, in devlink_param_unregister_one() argument
4887 devlink_param_notify(devlink, port_index, param_item, cmd); in devlink_param_unregister_one()
4897 struct devlink *devlink; in devlink_nl_cmd_port_param_get_dumpit() local
4904 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_port_param_get_dumpit()
4905 if (!devlink_try_get(devlink)) in devlink_nl_cmd_port_param_get_dumpit()
4908 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_port_param_get_dumpit()
4911 mutex_lock(&devlink->lock); in devlink_nl_cmd_port_param_get_dumpit()
4912 list_for_each_entry(devlink_port, &devlink->port_list, list) { in devlink_nl_cmd_port_param_get_dumpit()
4920 devlink_port->devlink, in devlink_nl_cmd_port_param_get_dumpit()
4929 mutex_unlock(&devlink->lock); in devlink_nl_cmd_port_param_get_dumpit()
4930 devlink_put(devlink); in devlink_nl_cmd_port_param_get_dumpit()
4936 mutex_unlock(&devlink->lock); in devlink_nl_cmd_port_param_get_dumpit()
4938 devlink_put(devlink); in devlink_nl_cmd_port_param_get_dumpit()
4967 err = devlink_nl_param_fill(msg, devlink_port->devlink, in devlink_nl_cmd_port_param_get_doit()
4984 return __devlink_nl_cmd_param_set_doit(devlink_port->devlink, in devlink_nl_cmd_port_param_set_doit()
4991 struct devlink *devlink, in devlink_nl_region_snapshot_id_put() argument
5014 struct devlink *devlink, in devlink_nl_region_snapshots_id_put() argument
5027 err = devlink_nl_region_snapshot_id_put(msg, devlink, snapshot); in devlink_nl_region_snapshots_id_put()
5040 static int devlink_nl_region_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_region_fill() argument
5052 err = devlink_nl_put_handle(msg, devlink); in devlink_nl_region_fill()
5073 err = devlink_nl_region_snapshots_id_put(msg, devlink, region); in devlink_nl_region_fill()
5090 struct devlink *devlink = region->devlink; in devlink_nl_region_notify_build() local
5106 err = devlink_nl_put_handle(msg, devlink); in devlink_nl_region_notify_build()
5157 devlink_net(region->devlink), msg, 0, in devlink_nl_region_notify()
5176 static int __devlink_snapshot_id_increment(struct devlink *devlink, u32 id) in __devlink_snapshot_id_increment() argument
5181 lockdep_assert_held(&devlink->lock); in __devlink_snapshot_id_increment()
5183 p = xa_load(&devlink->snapshot_ids, id); in __devlink_snapshot_id_increment()
5193 return xa_err(xa_store(&devlink->snapshot_ids, id, xa_mk_value(count), in __devlink_snapshot_id_increment()
5212 static void __devlink_snapshot_id_decrement(struct devlink *devlink, u32 id) in __devlink_snapshot_id_decrement() argument
5217 lockdep_assert_held(&devlink->lock); in __devlink_snapshot_id_decrement()
5219 p = xa_load(&devlink->snapshot_ids, id); in __devlink_snapshot_id_decrement()
5230 xa_store(&devlink->snapshot_ids, id, xa_mk_value(count), in __devlink_snapshot_id_decrement()
5234 xa_erase(&devlink->snapshot_ids, id); in __devlink_snapshot_id_decrement()
5254 static int __devlink_snapshot_id_insert(struct devlink *devlink, u32 id) in __devlink_snapshot_id_insert() argument
5256 lockdep_assert_held(&devlink->lock); in __devlink_snapshot_id_insert()
5258 if (xa_load(&devlink->snapshot_ids, id)) in __devlink_snapshot_id_insert()
5261 return xa_err(xa_store(&devlink->snapshot_ids, id, xa_mk_value(0), in __devlink_snapshot_id_insert()
5281 static int __devlink_region_snapshot_id_get(struct devlink *devlink, u32 *id) in __devlink_region_snapshot_id_get() argument
5283 lockdep_assert_held(&devlink->lock); in __devlink_region_snapshot_id_get()
5285 return xa_alloc(&devlink->snapshot_ids, id, xa_mk_value(1), in __devlink_region_snapshot_id_get()
5307 struct devlink *devlink = region->devlink; in __devlink_region_snapshot_create() local
5311 lockdep_assert_held(&devlink->lock); in __devlink_region_snapshot_create()
5324 err = __devlink_snapshot_id_increment(devlink, snapshot_id); in __devlink_region_snapshot_create()
5347 struct devlink *devlink = region->devlink; in devlink_region_snapshot_del() local
5349 lockdep_assert_held(&devlink->lock); in devlink_region_snapshot_del()
5355 __devlink_snapshot_id_decrement(devlink, snapshot->id); in devlink_region_snapshot_del()
5362 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_region_get_doit() local
5376 port = devlink_port_get_by_index(devlink, index); in devlink_nl_cmd_region_get_doit()
5385 region = devlink_region_get_by_name(devlink, region_name); in devlink_nl_cmd_region_get_doit()
5394 err = devlink_nl_region_fill(msg, devlink, DEVLINK_CMD_REGION_GET, in devlink_nl_cmd_region_get_doit()
5419 err = devlink_nl_region_fill(msg, port->devlink, in devlink_nl_cmd_region_get_port_dumpit()
5435 struct devlink *devlink, in devlink_nl_cmd_region_get_devlink_dumpit() argument
5443 mutex_lock(&devlink->lock); in devlink_nl_cmd_region_get_devlink_dumpit()
5444 list_for_each_entry(region, &devlink->region_list, list) { in devlink_nl_cmd_region_get_devlink_dumpit()
5449 err = devlink_nl_region_fill(msg, devlink, in devlink_nl_cmd_region_get_devlink_dumpit()
5459 list_for_each_entry(port, &devlink->port_list, list) { in devlink_nl_cmd_region_get_devlink_dumpit()
5467 mutex_unlock(&devlink->lock); in devlink_nl_cmd_region_get_devlink_dumpit()
5474 struct devlink *devlink; in devlink_nl_cmd_region_get_dumpit() local
5481 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_region_get_dumpit()
5482 if (!devlink_try_get(devlink)) in devlink_nl_cmd_region_get_dumpit()
5485 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_region_get_dumpit()
5488 err = devlink_nl_cmd_region_get_devlink_dumpit(msg, cb, devlink, in devlink_nl_cmd_region_get_dumpit()
5491 devlink_put(devlink); in devlink_nl_cmd_region_get_dumpit()
5504 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_region_del() local
5522 port = devlink_port_get_by_index(devlink, index); in devlink_nl_cmd_region_del()
5530 region = devlink_region_get_by_name(devlink, region_name); in devlink_nl_cmd_region_del()
5546 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_region_new() local
5567 port = devlink_port_get_by_index(devlink, index); in devlink_nl_cmd_region_new()
5575 region = devlink_region_get_by_name(devlink, region_name); in devlink_nl_cmd_region_new()
5601 err = __devlink_snapshot_id_insert(devlink, snapshot_id); in devlink_nl_cmd_region_new()
5605 err = __devlink_region_snapshot_id_get(devlink, &snapshot_id); in devlink_nl_cmd_region_new()
5616 err = region->ops->snapshot(devlink, region->ops, in devlink_nl_cmd_region_new()
5651 __devlink_snapshot_id_decrement(devlink, snapshot_id); in devlink_nl_cmd_region_new()
5660 struct devlink *devlink, in devlink_nl_cmd_region_read_chunk_fill() argument
5691 struct devlink *devlink, in devlink_nl_region_read_snapshot_fill() argument
5720 err = devlink_nl_cmd_region_read_chunk_fill(skb, devlink, in devlink_nl_region_read_snapshot_fill()
5743 struct devlink *devlink; in devlink_nl_cmd_region_read_dumpit() local
5751 devlink = devlink_get_from_attrs(sock_net(cb->skb->sk), attrs); in devlink_nl_cmd_region_read_dumpit()
5752 if (IS_ERR(devlink)) { in devlink_nl_cmd_region_read_dumpit()
5753 err = PTR_ERR(devlink); in devlink_nl_cmd_region_read_dumpit()
5757 mutex_lock(&devlink->lock); in devlink_nl_cmd_region_read_dumpit()
5768 port = devlink_port_get_by_index(devlink, index); in devlink_nl_cmd_region_read_dumpit()
5780 region = devlink_region_get_by_name(devlink, region_name); in devlink_nl_cmd_region_read_dumpit()
5814 err = devlink_nl_put_handle(skb, devlink); in devlink_nl_cmd_region_read_dumpit()
5835 err = devlink_nl_region_read_snapshot_fill(skb, devlink, in devlink_nl_cmd_region_read_dumpit()
5853 mutex_unlock(&devlink->lock); in devlink_nl_cmd_region_read_dumpit()
5854 devlink_put(devlink); in devlink_nl_cmd_region_read_dumpit()
5862 mutex_unlock(&devlink->lock); in devlink_nl_cmd_region_read_dumpit()
5863 devlink_put(devlink); in devlink_nl_cmd_region_read_dumpit()
5951 devlink_nl_info_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_info_fill() argument
5964 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_info_fill()
5968 err = devlink->ops->info_get(devlink, &req, extack); in devlink_nl_info_fill()
5983 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_info_get_doit() local
5987 if (!devlink->ops->info_get) in devlink_nl_cmd_info_get_doit()
5994 err = devlink_nl_info_fill(msg, devlink, DEVLINK_CMD_INFO_GET, in devlink_nl_cmd_info_get_doit()
6008 struct devlink *devlink; in devlink_nl_cmd_info_get_dumpit() local
6015 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_info_get_dumpit()
6016 if (!devlink_try_get(devlink)) in devlink_nl_cmd_info_get_dumpit()
6019 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_info_get_dumpit()
6022 if (idx < start || !devlink->ops->info_get) in devlink_nl_cmd_info_get_dumpit()
6025 mutex_lock(&devlink->lock); in devlink_nl_cmd_info_get_dumpit()
6026 err = devlink_nl_info_fill(msg, devlink, DEVLINK_CMD_INFO_GET, in devlink_nl_cmd_info_get_dumpit()
6030 mutex_unlock(&devlink->lock); in devlink_nl_cmd_info_get_dumpit()
6034 devlink_put(devlink); in devlink_nl_cmd_info_get_dumpit()
6040 devlink_put(devlink); in devlink_nl_cmd_info_get_dumpit()
6648 struct devlink *devlink; member
6686 devlink_health_reporter_find_by_name(struct devlink *devlink, in devlink_health_reporter_find_by_name() argument
6689 return __devlink_health_reporter_find_by_name(&devlink->reporter_list, in devlink_health_reporter_find_by_name()
6690 &devlink->reporters_lock, in devlink_health_reporter_find_by_name()
6704 __devlink_health_reporter_create(struct devlink *devlink, in __devlink_health_reporter_create() argument
6719 reporter->devlink = devlink; in __devlink_health_reporter_create()
6751 reporter = __devlink_health_reporter_create(port->devlink, ops, in devlink_port_health_reporter_create()
6773 devlink_health_reporter_create(struct devlink *devlink, in devlink_health_reporter_create() argument
6779 mutex_lock(&devlink->reporters_lock); in devlink_health_reporter_create()
6780 if (devlink_health_reporter_find_by_name(devlink, ops->name)) { in devlink_health_reporter_create()
6785 reporter = __devlink_health_reporter_create(devlink, ops, in devlink_health_reporter_create()
6790 list_add_tail(&reporter->list, &devlink->reporter_list); in devlink_health_reporter_create()
6792 mutex_unlock(&devlink->reporters_lock); in devlink_health_reporter_create()
6828 struct mutex *lock = &reporter->devlink->reporters_lock; in devlink_health_reporter_destroy()
6858 struct devlink *devlink = reporter->devlink; in devlink_nl_health_reporter_fill() local
6866 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_health_reporter_fill()
6942 devlink_net(reporter->devlink), in devlink_recover_notify()
7031 struct devlink *devlink = reporter->devlink; in devlink_health_report() local
7036 trace_devlink_health_report(devlink, reporter->ops->name, msg); in devlink_health_report()
7049 trace_devlink_health_recover_aborted(devlink, in devlink_health_report()
7075 devlink_health_reporter_get_from_attrs(struct devlink *devlink, in devlink_health_reporter_get_from_attrs() argument
7086 devlink_port = devlink_port_get_from_attrs(devlink, attrs); in devlink_health_reporter_get_from_attrs()
7088 mutex_lock(&devlink->reporters_lock); in devlink_health_reporter_get_from_attrs()
7089 reporter = devlink_health_reporter_find_by_name(devlink, reporter_name); in devlink_health_reporter_get_from_attrs()
7092 mutex_unlock(&devlink->reporters_lock); in devlink_health_reporter_get_from_attrs()
7105 devlink_health_reporter_get_from_info(struct devlink *devlink, in devlink_health_reporter_get_from_info() argument
7108 return devlink_health_reporter_get_from_attrs(devlink, info->attrs); in devlink_health_reporter_get_from_info()
7117 struct devlink *devlink; in devlink_health_reporter_get_from_cb() local
7120 devlink = devlink_get_from_attrs(sock_net(cb->skb->sk), attrs); in devlink_health_reporter_get_from_cb()
7121 if (IS_ERR(devlink)) in devlink_health_reporter_get_from_cb()
7124 reporter = devlink_health_reporter_get_from_attrs(devlink, attrs); in devlink_health_reporter_get_from_cb()
7125 devlink_put(devlink); in devlink_health_reporter_get_from_cb()
7145 trace_devlink_health_reporter_state_update(reporter->devlink, in devlink_health_reporter_state_update()
7154 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_get_doit() local
7159 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_get_doit()
7190 struct devlink *devlink; in devlink_nl_cmd_health_reporter_get_dumpit() local
7197 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_health_reporter_get_dumpit()
7198 if (!devlink_try_get(devlink)) in devlink_nl_cmd_health_reporter_get_dumpit()
7201 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_health_reporter_get_dumpit()
7204 mutex_lock(&devlink->reporters_lock); in devlink_nl_cmd_health_reporter_get_dumpit()
7205 list_for_each_entry(reporter, &devlink->reporter_list, in devlink_nl_cmd_health_reporter_get_dumpit()
7216 mutex_unlock(&devlink->reporters_lock); in devlink_nl_cmd_health_reporter_get_dumpit()
7217 devlink_put(devlink); in devlink_nl_cmd_health_reporter_get_dumpit()
7222 mutex_unlock(&devlink->reporters_lock); in devlink_nl_cmd_health_reporter_get_dumpit()
7224 devlink_put(devlink); in devlink_nl_cmd_health_reporter_get_dumpit()
7227 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_health_reporter_get_dumpit()
7228 if (!devlink_try_get(devlink)) in devlink_nl_cmd_health_reporter_get_dumpit()
7231 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_health_reporter_get_dumpit()
7234 mutex_lock(&devlink->lock); in devlink_nl_cmd_health_reporter_get_dumpit()
7235 list_for_each_entry(port, &devlink->port_list, list) { in devlink_nl_cmd_health_reporter_get_dumpit()
7249 mutex_unlock(&devlink->lock); in devlink_nl_cmd_health_reporter_get_dumpit()
7250 devlink_put(devlink); in devlink_nl_cmd_health_reporter_get_dumpit()
7257 mutex_unlock(&devlink->lock); in devlink_nl_cmd_health_reporter_get_dumpit()
7259 devlink_put(devlink); in devlink_nl_cmd_health_reporter_get_dumpit()
7272 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_set_doit() local
7276 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_set_doit()
7314 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_recover_doit() local
7318 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_recover_doit()
7331 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_diagnose_doit() local
7336 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_diagnose_doit()
7414 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_dump_clear_doit() local
7417 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_dump_clear_doit()
7436 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_test_doit() local
7440 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_test_doit()
7517 devlink_trap_policer_item_lookup(struct devlink *devlink, u32 id) in devlink_trap_policer_item_lookup() argument
7521 list_for_each_entry(policer_item, &devlink->trap_policer_list, list) { in devlink_trap_policer_item_lookup()
7530 devlink_trap_item_lookup(struct devlink *devlink, const char *name) in devlink_trap_item_lookup() argument
7534 list_for_each_entry(trap_item, &devlink->trap_list, list) { in devlink_trap_item_lookup()
7543 devlink_trap_item_get_from_info(struct devlink *devlink, in devlink_trap_item_get_from_info() argument
7552 return devlink_trap_item_lookup(devlink, nla_data(attr)); in devlink_trap_item_get_from_info()
7653 static int devlink_trap_stats_put(struct sk_buff *msg, struct devlink *devlink, in devlink_trap_stats_put() argument
7661 if (devlink->ops->trap_drop_counter_get) { in devlink_trap_stats_put()
7662 err = devlink->ops->trap_drop_counter_get(devlink, in devlink_trap_stats_put()
7675 if (devlink->ops->trap_drop_counter_get && in devlink_trap_stats_put()
7697 static int devlink_nl_trap_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_trap_fill() argument
7710 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_trap_fill()
7734 err = devlink_trap_stats_put(msg, devlink, trap_item); in devlink_nl_trap_fill()
7751 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_get_doit() local
7756 if (list_empty(&devlink->trap_list)) in devlink_nl_cmd_trap_get_doit()
7759 trap_item = devlink_trap_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_get_doit()
7769 err = devlink_nl_trap_fill(msg, devlink, trap_item, in devlink_nl_cmd_trap_get_doit()
7786 struct devlink *devlink; in devlink_nl_cmd_trap_get_dumpit() local
7793 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_trap_get_dumpit()
7794 if (!devlink_try_get(devlink)) in devlink_nl_cmd_trap_get_dumpit()
7797 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_trap_get_dumpit()
7800 mutex_lock(&devlink->lock); in devlink_nl_cmd_trap_get_dumpit()
7801 list_for_each_entry(trap_item, &devlink->trap_list, list) { in devlink_nl_cmd_trap_get_dumpit()
7806 err = devlink_nl_trap_fill(msg, devlink, trap_item, in devlink_nl_cmd_trap_get_dumpit()
7812 mutex_unlock(&devlink->lock); in devlink_nl_cmd_trap_get_dumpit()
7813 devlink_put(devlink); in devlink_nl_cmd_trap_get_dumpit()
7818 mutex_unlock(&devlink->lock); in devlink_nl_cmd_trap_get_dumpit()
7820 devlink_put(devlink); in devlink_nl_cmd_trap_get_dumpit()
7829 static int __devlink_trap_action_set(struct devlink *devlink, in __devlink_trap_action_set() argument
7842 err = devlink->ops->trap_action_set(devlink, trap_item->trap, in __devlink_trap_action_set()
7852 static int devlink_trap_action_set(struct devlink *devlink, in devlink_trap_action_set() argument
7868 return __devlink_trap_action_set(devlink, trap_item, trap_action, in devlink_trap_action_set()
7876 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_set_doit() local
7879 if (list_empty(&devlink->trap_list)) in devlink_nl_cmd_trap_set_doit()
7882 trap_item = devlink_trap_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_set_doit()
7888 return devlink_trap_action_set(devlink, trap_item, info); in devlink_nl_cmd_trap_set_doit()
7892 devlink_trap_group_item_lookup(struct devlink *devlink, const char *name) in devlink_trap_group_item_lookup() argument
7896 list_for_each_entry(group_item, &devlink->trap_group_list, list) { in devlink_trap_group_item_lookup()
7905 devlink_trap_group_item_lookup_by_id(struct devlink *devlink, u16 id) in devlink_trap_group_item_lookup_by_id() argument
7909 list_for_each_entry(group_item, &devlink->trap_group_list, list) { in devlink_trap_group_item_lookup_by_id()
7918 devlink_trap_group_item_get_from_info(struct devlink *devlink, in devlink_trap_group_item_get_from_info() argument
7927 return devlink_trap_group_item_lookup(devlink, name); in devlink_trap_group_item_get_from_info()
7931 devlink_nl_trap_group_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_trap_group_fill() argument
7943 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_trap_group_fill()
7976 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_group_get_doit() local
7981 if (list_empty(&devlink->trap_group_list)) in devlink_nl_cmd_trap_group_get_doit()
7984 group_item = devlink_trap_group_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_group_get_doit()
7994 err = devlink_nl_trap_group_fill(msg, devlink, group_item, in devlink_nl_cmd_trap_group_get_doit()
8013 struct devlink *devlink; in devlink_nl_cmd_trap_group_get_dumpit() local
8020 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_trap_group_get_dumpit()
8021 if (!devlink_try_get(devlink)) in devlink_nl_cmd_trap_group_get_dumpit()
8024 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_trap_group_get_dumpit()
8027 mutex_lock(&devlink->lock); in devlink_nl_cmd_trap_group_get_dumpit()
8028 list_for_each_entry(group_item, &devlink->trap_group_list, in devlink_nl_cmd_trap_group_get_dumpit()
8034 err = devlink_nl_trap_group_fill(msg, devlink, in devlink_nl_cmd_trap_group_get_dumpit()
8040 mutex_unlock(&devlink->lock); in devlink_nl_cmd_trap_group_get_dumpit()
8041 devlink_put(devlink); in devlink_nl_cmd_trap_group_get_dumpit()
8046 mutex_unlock(&devlink->lock); in devlink_nl_cmd_trap_group_get_dumpit()
8048 devlink_put(devlink); in devlink_nl_cmd_trap_group_get_dumpit()
8058 __devlink_trap_group_action_set(struct devlink *devlink, in __devlink_trap_group_action_set() argument
8067 if (devlink->ops->trap_group_action_set) { in __devlink_trap_group_action_set()
8068 err = devlink->ops->trap_group_action_set(devlink, group_item->group, in __devlink_trap_group_action_set()
8073 list_for_each_entry(trap_item, &devlink->trap_list, list) { in __devlink_trap_group_action_set()
8085 list_for_each_entry(trap_item, &devlink->trap_list, list) { in __devlink_trap_group_action_set()
8088 err = __devlink_trap_action_set(devlink, trap_item, in __devlink_trap_group_action_set()
8098 devlink_trap_group_action_set(struct devlink *devlink, in devlink_trap_group_action_set() argument
8114 err = __devlink_trap_group_action_set(devlink, group_item, trap_action, in devlink_trap_group_action_set()
8124 static int devlink_trap_group_set(struct devlink *devlink, in devlink_trap_group_set() argument
8137 if (!devlink->ops->trap_group_set) in devlink_trap_group_set()
8145 policer_item = devlink_trap_policer_item_lookup(devlink, in devlink_trap_group_set()
8154 err = devlink->ops->trap_group_set(devlink, group_item->group, policer, in devlink_trap_group_set()
8168 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_group_set_doit() local
8173 if (list_empty(&devlink->trap_group_list)) in devlink_nl_cmd_trap_group_set_doit()
8176 group_item = devlink_trap_group_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_group_set_doit()
8182 err = devlink_trap_group_action_set(devlink, group_item, info, in devlink_nl_cmd_trap_group_set_doit()
8187 err = devlink_trap_group_set(devlink, group_item, info); in devlink_nl_cmd_trap_group_set_doit()
8200 devlink_trap_policer_item_get_from_info(struct devlink *devlink, in devlink_trap_policer_item_get_from_info() argument
8209 return devlink_trap_policer_item_lookup(devlink, id); in devlink_trap_policer_item_get_from_info()
8213 devlink_trap_policer_stats_put(struct sk_buff *msg, struct devlink *devlink, in devlink_trap_policer_stats_put() argument
8220 if (!devlink->ops->trap_policer_counter_get) in devlink_trap_policer_stats_put()
8223 err = devlink->ops->trap_policer_counter_get(devlink, policer, &drops); in devlink_trap_policer_stats_put()
8245 devlink_nl_trap_policer_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_trap_policer_fill() argument
8257 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_trap_policer_fill()
8272 err = devlink_trap_policer_stats_put(msg, devlink, in devlink_nl_trap_policer_fill()
8291 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_policer_get_doit() local
8295 if (list_empty(&devlink->trap_policer_list)) in devlink_nl_cmd_trap_policer_get_doit()
8298 policer_item = devlink_trap_policer_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_policer_get_doit()
8308 err = devlink_nl_trap_policer_fill(msg, devlink, policer_item, in devlink_nl_cmd_trap_policer_get_doit()
8327 struct devlink *devlink; in devlink_nl_cmd_trap_policer_get_dumpit() local
8334 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_trap_policer_get_dumpit()
8335 if (!devlink_try_get(devlink)) in devlink_nl_cmd_trap_policer_get_dumpit()
8338 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_trap_policer_get_dumpit()
8341 mutex_lock(&devlink->lock); in devlink_nl_cmd_trap_policer_get_dumpit()
8342 list_for_each_entry(policer_item, &devlink->trap_policer_list, in devlink_nl_cmd_trap_policer_get_dumpit()
8348 err = devlink_nl_trap_policer_fill(msg, devlink, in devlink_nl_cmd_trap_policer_get_dumpit()
8354 mutex_unlock(&devlink->lock); in devlink_nl_cmd_trap_policer_get_dumpit()
8355 devlink_put(devlink); in devlink_nl_cmd_trap_policer_get_dumpit()
8360 mutex_unlock(&devlink->lock); in devlink_nl_cmd_trap_policer_get_dumpit()
8362 devlink_put(devlink); in devlink_nl_cmd_trap_policer_get_dumpit()
8372 devlink_trap_policer_set(struct devlink *devlink, in devlink_trap_policer_set() argument
8410 err = devlink->ops->trap_policer_set(devlink, policer_item->policer, in devlink_trap_policer_set()
8426 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_policer_set_doit() local
8428 if (list_empty(&devlink->trap_policer_list)) in devlink_nl_cmd_trap_policer_set_doit()
8431 if (!devlink->ops->trap_policer_set) in devlink_nl_cmd_trap_policer_set_doit()
8434 policer_item = devlink_trap_policer_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_policer_set_doit()
8440 return devlink_trap_policer_set(devlink, policer_item, info); in devlink_nl_cmd_trap_policer_set_doit()
8914 struct devlink *devlink_alloc_ns(const struct devlink_ops *ops, in devlink_alloc_ns()
8918 struct devlink *devlink; in devlink_alloc_ns() local
8926 devlink = kzalloc(sizeof(*devlink) + priv_size, GFP_KERNEL); in devlink_alloc_ns()
8927 if (!devlink) in devlink_alloc_ns()
8930 ret = xa_alloc_cyclic(&devlinks, &devlink->index, devlink, xa_limit_31b, in devlink_alloc_ns()
8933 kfree(devlink); in devlink_alloc_ns()
8937 devlink->dev = dev; in devlink_alloc_ns()
8938 devlink->ops = ops; in devlink_alloc_ns()
8939 xa_init_flags(&devlink->snapshot_ids, XA_FLAGS_ALLOC); in devlink_alloc_ns()
8940 write_pnet(&devlink->_net, net); in devlink_alloc_ns()
8941 INIT_LIST_HEAD(&devlink->port_list); in devlink_alloc_ns()
8942 INIT_LIST_HEAD(&devlink->rate_list); in devlink_alloc_ns()
8943 INIT_LIST_HEAD(&devlink->sb_list); in devlink_alloc_ns()
8944 INIT_LIST_HEAD_RCU(&devlink->dpipe_table_list); in devlink_alloc_ns()
8945 INIT_LIST_HEAD(&devlink->resource_list); in devlink_alloc_ns()
8946 INIT_LIST_HEAD(&devlink->param_list); in devlink_alloc_ns()
8947 INIT_LIST_HEAD(&devlink->region_list); in devlink_alloc_ns()
8948 INIT_LIST_HEAD(&devlink->reporter_list); in devlink_alloc_ns()
8949 INIT_LIST_HEAD(&devlink->trap_list); in devlink_alloc_ns()
8950 INIT_LIST_HEAD(&devlink->trap_group_list); in devlink_alloc_ns()
8951 INIT_LIST_HEAD(&devlink->trap_policer_list); in devlink_alloc_ns()
8952 mutex_init(&devlink->lock); in devlink_alloc_ns()
8953 mutex_init(&devlink->reporters_lock); in devlink_alloc_ns()
8954 refcount_set(&devlink->refcount, 1); in devlink_alloc_ns()
8955 init_completion(&devlink->comp); in devlink_alloc_ns()
8957 return devlink; in devlink_alloc_ns()
8966 int devlink_register(struct devlink *devlink) in devlink_register() argument
8969 xa_set_mark(&devlinks, devlink->index, DEVLINK_REGISTERED); in devlink_register()
8970 devlink_notify(devlink, DEVLINK_CMD_NEW); in devlink_register()
8981 void devlink_unregister(struct devlink *devlink) in devlink_unregister() argument
8983 devlink_put(devlink); in devlink_unregister()
8984 wait_for_completion(&devlink->comp); in devlink_unregister()
8987 WARN_ON(devlink_reload_supported(devlink->ops) && in devlink_unregister()
8988 devlink->reload_enabled); in devlink_unregister()
8989 devlink_notify(devlink, DEVLINK_CMD_DEL); in devlink_unregister()
8990 xa_clear_mark(&devlinks, devlink->index, DEVLINK_REGISTERED); in devlink_unregister()
9003 void devlink_reload_enable(struct devlink *devlink) in devlink_reload_enable() argument
9006 devlink->reload_enabled = true; in devlink_reload_enable()
9019 void devlink_reload_disable(struct devlink *devlink) in devlink_reload_disable() argument
9025 devlink->reload_enabled = false; in devlink_reload_disable()
9035 void devlink_free(struct devlink *devlink) in devlink_free() argument
9037 mutex_destroy(&devlink->reporters_lock); in devlink_free()
9038 mutex_destroy(&devlink->lock); in devlink_free()
9039 WARN_ON(!list_empty(&devlink->trap_policer_list)); in devlink_free()
9040 WARN_ON(!list_empty(&devlink->trap_group_list)); in devlink_free()
9041 WARN_ON(!list_empty(&devlink->trap_list)); in devlink_free()
9042 WARN_ON(!list_empty(&devlink->reporter_list)); in devlink_free()
9043 WARN_ON(!list_empty(&devlink->region_list)); in devlink_free()
9044 WARN_ON(!list_empty(&devlink->param_list)); in devlink_free()
9045 WARN_ON(!list_empty(&devlink->resource_list)); in devlink_free()
9046 WARN_ON(!list_empty(&devlink->dpipe_table_list)); in devlink_free()
9047 WARN_ON(!list_empty(&devlink->sb_list)); in devlink_free()
9048 WARN_ON(!list_empty(&devlink->rate_list)); in devlink_free()
9049 WARN_ON(!list_empty(&devlink->port_list)); in devlink_free()
9051 xa_destroy(&devlink->snapshot_ids); in devlink_free()
9052 xa_erase(&devlinks, devlink->index); in devlink_free()
9054 kfree(devlink); in devlink_free()
9104 int devlink_port_register(struct devlink *devlink, in devlink_port_register() argument
9108 mutex_lock(&devlink->lock); in devlink_port_register()
9109 if (devlink_port_index_exists(devlink, port_index)) { in devlink_port_register()
9110 mutex_unlock(&devlink->lock); in devlink_port_register()
9114 WARN_ON(devlink_port->devlink); in devlink_port_register()
9115 devlink_port->devlink = devlink; in devlink_port_register()
9120 list_add_tail(&devlink_port->list, &devlink->port_list); in devlink_port_register()
9123 mutex_unlock(&devlink->lock); in devlink_port_register()
9138 struct devlink *devlink = devlink_port->devlink; in devlink_port_unregister() local
9142 mutex_lock(&devlink->lock); in devlink_port_unregister()
9144 mutex_unlock(&devlink->lock); in devlink_port_unregister()
9155 if (WARN_ON(!devlink_port->devlink)) in __devlink_port_type_set()
9214 dev_warn(devlink_port->devlink->dev, in devlink_port_type_eth_set()
9275 if (WARN_ON(devlink_port->devlink)) in devlink_port_attrs_set()
9299 if (WARN_ON(devlink_port->devlink)) in devlink_port_attrs_pci_pf_set()
9326 if (WARN_ON(devlink_port->devlink)) in devlink_port_attrs_pci_vf_set()
9354 if (WARN_ON(devlink_port->devlink)) in devlink_port_attrs_pci_sf_set()
9383 struct devlink *devlink = devlink_port->devlink; in devlink_rate_leaf_create() local
9390 mutex_lock(&devlink->lock); in devlink_rate_leaf_create()
9393 devlink_rate->devlink = devlink; in devlink_rate_leaf_create()
9396 list_add_tail(&devlink_rate->list, &devlink->rate_list); in devlink_rate_leaf_create()
9399 mutex_unlock(&devlink->lock); in devlink_rate_leaf_create()
9415 struct devlink *devlink = devlink_port->devlink; in devlink_rate_leaf_destroy() local
9420 mutex_lock(&devlink->lock); in devlink_rate_leaf_destroy()
9426 mutex_unlock(&devlink->lock); in devlink_rate_leaf_destroy()
9441 void devlink_rate_nodes_destroy(struct devlink *devlink) in devlink_rate_nodes_destroy() argument
9444 const struct devlink_ops *ops = devlink->ops; in devlink_rate_nodes_destroy()
9446 mutex_lock(&devlink->lock); in devlink_rate_nodes_destroy()
9447 list_for_each_entry(devlink_rate, &devlink->rate_list, list) { in devlink_rate_nodes_destroy()
9459 list_for_each_entry_safe(devlink_rate, tmp, &devlink->rate_list, list) { in devlink_rate_nodes_destroy()
9467 mutex_unlock(&devlink->lock); in devlink_rate_nodes_destroy()
9537 int devlink_sb_register(struct devlink *devlink, unsigned int sb_index, in devlink_sb_register() argument
9545 mutex_lock(&devlink->lock); in devlink_sb_register()
9546 if (devlink_sb_index_exists(devlink, sb_index)) { in devlink_sb_register()
9562 list_add_tail(&devlink_sb->list, &devlink->sb_list); in devlink_sb_register()
9564 mutex_unlock(&devlink->lock); in devlink_sb_register()
9569 void devlink_sb_unregister(struct devlink *devlink, unsigned int sb_index) in devlink_sb_unregister() argument
9573 mutex_lock(&devlink->lock); in devlink_sb_unregister()
9574 devlink_sb = devlink_sb_get_by_index(devlink, sb_index); in devlink_sb_unregister()
9577 mutex_unlock(&devlink->lock); in devlink_sb_unregister()
9590 int devlink_dpipe_headers_register(struct devlink *devlink, in devlink_dpipe_headers_register() argument
9593 mutex_lock(&devlink->lock); in devlink_dpipe_headers_register()
9594 devlink->dpipe_headers = dpipe_headers; in devlink_dpipe_headers_register()
9595 mutex_unlock(&devlink->lock); in devlink_dpipe_headers_register()
9607 void devlink_dpipe_headers_unregister(struct devlink *devlink) in devlink_dpipe_headers_unregister() argument
9609 mutex_lock(&devlink->lock); in devlink_dpipe_headers_unregister()
9610 devlink->dpipe_headers = NULL; in devlink_dpipe_headers_unregister()
9611 mutex_unlock(&devlink->lock); in devlink_dpipe_headers_unregister()
9629 bool devlink_dpipe_table_counter_enabled(struct devlink *devlink, in devlink_dpipe_table_counter_enabled() argument
9636 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, in devlink_dpipe_table_counter_enabled()
9637 table_name, devlink); in devlink_dpipe_table_counter_enabled()
9655 int devlink_dpipe_table_register(struct devlink *devlink, in devlink_dpipe_table_register() argument
9666 mutex_lock(&devlink->lock); in devlink_dpipe_table_register()
9668 if (devlink_dpipe_table_find(&devlink->dpipe_table_list, table_name, in devlink_dpipe_table_register()
9669 devlink)) { in devlink_dpipe_table_register()
9685 list_add_tail_rcu(&table->list, &devlink->dpipe_table_list); in devlink_dpipe_table_register()
9687 mutex_unlock(&devlink->lock); in devlink_dpipe_table_register()
9698 void devlink_dpipe_table_unregister(struct devlink *devlink, in devlink_dpipe_table_unregister() argument
9703 mutex_lock(&devlink->lock); in devlink_dpipe_table_unregister()
9704 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, in devlink_dpipe_table_unregister()
9705 table_name, devlink); in devlink_dpipe_table_unregister()
9709 mutex_unlock(&devlink->lock); in devlink_dpipe_table_unregister()
9713 mutex_unlock(&devlink->lock); in devlink_dpipe_table_unregister()
9731 int devlink_resource_register(struct devlink *devlink, in devlink_resource_register() argument
9745 mutex_lock(&devlink->lock); in devlink_resource_register()
9746 resource = devlink_resource_find(devlink, NULL, resource_id); in devlink_resource_register()
9759 resource_list = &devlink->resource_list; in devlink_resource_register()
9763 parent_resource = devlink_resource_find(devlink, NULL, in devlink_resource_register()
9785 mutex_unlock(&devlink->lock); in devlink_resource_register()
9796 void devlink_resources_unregister(struct devlink *devlink, in devlink_resources_unregister() argument
9805 resource_list = &devlink->resource_list; in devlink_resources_unregister()
9808 mutex_lock(&devlink->lock); in devlink_resources_unregister()
9811 devlink_resources_unregister(devlink, child_resource); in devlink_resources_unregister()
9817 mutex_unlock(&devlink->lock); in devlink_resources_unregister()
9828 int devlink_resource_size_get(struct devlink *devlink, in devlink_resource_size_get() argument
9835 mutex_lock(&devlink->lock); in devlink_resource_size_get()
9836 resource = devlink_resource_find(devlink, NULL, resource_id); in devlink_resource_size_get()
9844 mutex_unlock(&devlink->lock); in devlink_resource_size_get()
9857 int devlink_dpipe_table_resource_set(struct devlink *devlink, in devlink_dpipe_table_resource_set() argument
9864 mutex_lock(&devlink->lock); in devlink_dpipe_table_resource_set()
9865 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, in devlink_dpipe_table_resource_set()
9866 table_name, devlink); in devlink_dpipe_table_resource_set()
9875 mutex_unlock(&devlink->lock); in devlink_dpipe_table_resource_set()
9888 void devlink_resource_occ_get_register(struct devlink *devlink, in devlink_resource_occ_get_register() argument
9895 mutex_lock(&devlink->lock); in devlink_resource_occ_get_register()
9896 resource = devlink_resource_find(devlink, NULL, resource_id); in devlink_resource_occ_get_register()
9904 mutex_unlock(&devlink->lock); in devlink_resource_occ_get_register()
9914 void devlink_resource_occ_get_unregister(struct devlink *devlink, in devlink_resource_occ_get_unregister() argument
9919 mutex_lock(&devlink->lock); in devlink_resource_occ_get_unregister()
9920 resource = devlink_resource_find(devlink, NULL, resource_id); in devlink_resource_occ_get_unregister()
9928 mutex_unlock(&devlink->lock); in devlink_resource_occ_get_unregister()
9942 static int __devlink_param_register_one(struct devlink *devlink, in __devlink_param_register_one() argument
9954 return devlink_param_register_one(devlink, port_index, in __devlink_param_register_one()
9958 static int __devlink_params_register(struct devlink *devlink, in __devlink_params_register() argument
9970 mutex_lock(&devlink->lock); in __devlink_params_register()
9972 err = __devlink_param_register_one(devlink, port_index, in __devlink_params_register()
9978 mutex_unlock(&devlink->lock); in __devlink_params_register()
9985 devlink_param_unregister_one(devlink, port_index, param_list, in __devlink_params_register()
9988 mutex_unlock(&devlink->lock); in __devlink_params_register()
9992 static void __devlink_params_unregister(struct devlink *devlink, in __devlink_params_unregister() argument
10002 mutex_lock(&devlink->lock); in __devlink_params_unregister()
10004 devlink_param_unregister_one(devlink, 0, param_list, param, in __devlink_params_unregister()
10006 mutex_unlock(&devlink->lock); in __devlink_params_unregister()
10018 int devlink_params_register(struct devlink *devlink, in devlink_params_register() argument
10022 return __devlink_params_register(devlink, 0, &devlink->param_list, in devlink_params_register()
10035 void devlink_params_unregister(struct devlink *devlink, in devlink_params_unregister() argument
10039 return __devlink_params_unregister(devlink, 0, &devlink->param_list, in devlink_params_unregister()
10054 int devlink_param_register(struct devlink *devlink, in devlink_param_register() argument
10059 mutex_lock(&devlink->lock); in devlink_param_register()
10060 err = __devlink_param_register_one(devlink, 0, &devlink->param_list, in devlink_param_register()
10062 mutex_unlock(&devlink->lock); in devlink_param_register()
10072 void devlink_param_unregister(struct devlink *devlink, in devlink_param_unregister() argument
10075 mutex_lock(&devlink->lock); in devlink_param_unregister()
10076 devlink_param_unregister_one(devlink, 0, &devlink->param_list, param, in devlink_param_unregister()
10078 mutex_unlock(&devlink->lock); in devlink_param_unregister()
10089 void devlink_params_publish(struct devlink *devlink) in devlink_params_publish() argument
10093 list_for_each_entry(param_item, &devlink->param_list, list) { in devlink_params_publish()
10097 devlink_param_notify(devlink, 0, param_item, in devlink_params_publish()
10110 void devlink_params_unpublish(struct devlink *devlink) in devlink_params_unpublish() argument
10114 list_for_each_entry(param_item, &devlink->param_list, list) { in devlink_params_unpublish()
10118 devlink_param_notify(devlink, 0, param_item, in devlink_params_unpublish()
10132 void devlink_param_publish(struct devlink *devlink, in devlink_param_publish() argument
10137 list_for_each_entry(param_item, &devlink->param_list, list) { in devlink_param_publish()
10141 devlink_param_notify(devlink, 0, param_item, in devlink_param_publish()
10156 void devlink_param_unpublish(struct devlink *devlink, in devlink_param_unpublish() argument
10161 list_for_each_entry(param_item, &devlink->param_list, list) { in devlink_param_unpublish()
10165 devlink_param_notify(devlink, 0, param_item, in devlink_param_unpublish()
10185 return __devlink_params_register(devlink_port->devlink, in devlink_port_params_register()
10206 return __devlink_params_unregister(devlink_port->devlink, in devlink_port_params_unregister()
10238 __devlink_param_driverinit_value_set(struct devlink *devlink, in __devlink_param_driverinit_value_set() argument
10260 devlink_param_notify(devlink, port_index, param_item, cmd); in __devlink_param_driverinit_value_set()
10275 int devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id, in devlink_param_driverinit_value_get() argument
10278 if (!devlink_reload_supported(devlink->ops)) in devlink_param_driverinit_value_get()
10281 return __devlink_param_driverinit_value_get(&devlink->param_list, in devlink_param_driverinit_value_get()
10298 int devlink_param_driverinit_value_set(struct devlink *devlink, u32 param_id, in devlink_param_driverinit_value_set() argument
10301 return __devlink_param_driverinit_value_set(devlink, 0, in devlink_param_driverinit_value_set()
10302 &devlink->param_list, in devlink_param_driverinit_value_set()
10323 struct devlink *devlink = devlink_port->devlink; in devlink_port_param_driverinit_value_get() local
10325 if (!devlink_reload_supported(devlink->ops)) in devlink_port_param_driverinit_value_get()
10349 return __devlink_param_driverinit_value_set(devlink_port->devlink, in devlink_port_param_driverinit_value_set()
10369 void devlink_param_value_changed(struct devlink *devlink, u32 param_id) in devlink_param_value_changed() argument
10373 param_item = devlink_param_find_by_id(&devlink->param_list, param_id); in devlink_param_value_changed()
10376 devlink_param_notify(devlink, 0, param_item, DEVLINK_CMD_PARAM_NEW); in devlink_param_value_changed()
10402 devlink_param_notify(devlink_port->devlink, devlink_port->index, in devlink_port_param_value_changed()
10433 devlink_region_create(struct devlink *devlink, in devlink_region_create() argument
10443 mutex_lock(&devlink->lock); in devlink_region_create()
10445 if (devlink_region_get_by_name(devlink, ops->name)) { in devlink_region_create()
10456 region->devlink = devlink; in devlink_region_create()
10461 list_add_tail(&region->list, &devlink->region_list); in devlink_region_create()
10464 mutex_unlock(&devlink->lock); in devlink_region_create()
10468 mutex_unlock(&devlink->lock); in devlink_region_create()
10486 struct devlink *devlink = port->devlink; in devlink_port_region_create() local
10493 mutex_lock(&devlink->lock); in devlink_port_region_create()
10506 region->devlink = devlink; in devlink_port_region_create()
10515 mutex_unlock(&devlink->lock); in devlink_port_region_create()
10519 mutex_unlock(&devlink->lock); in devlink_port_region_create()
10531 struct devlink *devlink = region->devlink; in devlink_region_destroy() local
10534 mutex_lock(&devlink->lock); in devlink_region_destroy()
10543 mutex_unlock(&devlink->lock); in devlink_region_destroy()
10563 int devlink_region_snapshot_id_get(struct devlink *devlink, u32 *id) in devlink_region_snapshot_id_get() argument
10567 mutex_lock(&devlink->lock); in devlink_region_snapshot_id_get()
10568 err = __devlink_region_snapshot_id_get(devlink, id); in devlink_region_snapshot_id_get()
10569 mutex_unlock(&devlink->lock); in devlink_region_snapshot_id_get()
10585 void devlink_region_snapshot_id_put(struct devlink *devlink, u32 id) in devlink_region_snapshot_id_put() argument
10587 mutex_lock(&devlink->lock); in devlink_region_snapshot_id_put()
10588 __devlink_snapshot_id_decrement(devlink, id); in devlink_region_snapshot_id_put()
10589 mutex_unlock(&devlink->lock); in devlink_region_snapshot_id_put()
10608 struct devlink *devlink = region->devlink; in devlink_region_snapshot_create() local
10611 mutex_lock(&devlink->lock); in devlink_region_snapshot_create()
10613 mutex_unlock(&devlink->lock); in devlink_region_snapshot_create()
10833 devlink_trap_group_notify(struct devlink *devlink, in devlink_trap_group_notify() argument
10847 err = devlink_nl_trap_group_fill(msg, devlink, group_item, cmd, 0, 0, in devlink_trap_group_notify()
10854 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_trap_group_notify()
10859 devlink_trap_item_group_link(struct devlink *devlink, in devlink_trap_item_group_link() argument
10865 group_item = devlink_trap_group_item_lookup_by_id(devlink, group_id); in devlink_trap_item_group_link()
10874 static void devlink_trap_notify(struct devlink *devlink, in devlink_trap_notify() argument
10888 err = devlink_nl_trap_fill(msg, devlink, trap_item, cmd, 0, 0, 0); in devlink_trap_notify()
10894 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_trap_notify()
10899 devlink_trap_register(struct devlink *devlink, in devlink_trap_register() argument
10905 if (devlink_trap_item_lookup(devlink, trap->name)) in devlink_trap_register()
10922 err = devlink_trap_item_group_link(devlink, trap_item); in devlink_trap_register()
10926 err = devlink->ops->trap_init(devlink, trap, trap_item); in devlink_trap_register()
10930 list_add_tail(&trap_item->list, &devlink->trap_list); in devlink_trap_register()
10931 devlink_trap_notify(devlink, trap_item, DEVLINK_CMD_TRAP_NEW); in devlink_trap_register()
10943 static void devlink_trap_unregister(struct devlink *devlink, in devlink_trap_unregister() argument
10948 trap_item = devlink_trap_item_lookup(devlink, trap->name); in devlink_trap_unregister()
10952 devlink_trap_notify(devlink, trap_item, DEVLINK_CMD_TRAP_DEL); in devlink_trap_unregister()
10954 if (devlink->ops->trap_fini) in devlink_trap_unregister()
10955 devlink->ops->trap_fini(devlink, trap, trap_item); in devlink_trap_unregister()
10960 static void devlink_trap_disable(struct devlink *devlink, in devlink_trap_disable() argument
10965 trap_item = devlink_trap_item_lookup(devlink, trap->name); in devlink_trap_disable()
10969 devlink->ops->trap_action_set(devlink, trap, DEVLINK_TRAP_ACTION_DROP, in devlink_trap_disable()
10983 int devlink_traps_register(struct devlink *devlink, in devlink_traps_register() argument
10989 if (!devlink->ops->trap_init || !devlink->ops->trap_action_set) in devlink_traps_register()
10992 mutex_lock(&devlink->lock); in devlink_traps_register()
11000 err = devlink_trap_register(devlink, trap, priv); in devlink_traps_register()
11004 mutex_unlock(&devlink->lock); in devlink_traps_register()
11011 devlink_trap_unregister(devlink, &traps[i]); in devlink_traps_register()
11012 mutex_unlock(&devlink->lock); in devlink_traps_register()
11023 void devlink_traps_unregister(struct devlink *devlink, in devlink_traps_unregister() argument
11029 mutex_lock(&devlink->lock); in devlink_traps_unregister()
11034 devlink_trap_disable(devlink, &traps[i]); in devlink_traps_unregister()
11037 devlink_trap_unregister(devlink, &traps[i]); in devlink_traps_unregister()
11038 mutex_unlock(&devlink->lock); in devlink_traps_unregister()
11080 void devlink_trap_report(struct devlink *devlink, struct sk_buff *skb, in devlink_trap_report() argument
11095 trace_devlink_trap_report(devlink, skb, &metadata); in devlink_trap_report()
11115 devlink_trap_group_item_policer_link(struct devlink *devlink, in devlink_trap_group_item_policer_link() argument
11124 policer_item = devlink_trap_policer_item_lookup(devlink, policer_id); in devlink_trap_group_item_policer_link()
11134 devlink_trap_group_register(struct devlink *devlink, in devlink_trap_group_register() argument
11140 if (devlink_trap_group_item_lookup(devlink, group->name)) in devlink_trap_group_register()
11155 err = devlink_trap_group_item_policer_link(devlink, group_item); in devlink_trap_group_register()
11159 if (devlink->ops->trap_group_init) { in devlink_trap_group_register()
11160 err = devlink->ops->trap_group_init(devlink, group); in devlink_trap_group_register()
11165 list_add_tail(&group_item->list, &devlink->trap_group_list); in devlink_trap_group_register()
11166 devlink_trap_group_notify(devlink, group_item, in devlink_trap_group_register()
11180 devlink_trap_group_unregister(struct devlink *devlink, in devlink_trap_group_unregister() argument
11185 group_item = devlink_trap_group_item_lookup(devlink, group->name); in devlink_trap_group_unregister()
11189 devlink_trap_group_notify(devlink, group_item, in devlink_trap_group_unregister()
11204 int devlink_trap_groups_register(struct devlink *devlink, in devlink_trap_groups_register() argument
11210 mutex_lock(&devlink->lock); in devlink_trap_groups_register()
11218 err = devlink_trap_group_register(devlink, group); in devlink_trap_groups_register()
11222 mutex_unlock(&devlink->lock); in devlink_trap_groups_register()
11229 devlink_trap_group_unregister(devlink, &groups[i]); in devlink_trap_groups_register()
11230 mutex_unlock(&devlink->lock); in devlink_trap_groups_register()
11241 void devlink_trap_groups_unregister(struct devlink *devlink, in devlink_trap_groups_unregister() argument
11247 mutex_lock(&devlink->lock); in devlink_trap_groups_unregister()
11249 devlink_trap_group_unregister(devlink, &groups[i]); in devlink_trap_groups_unregister()
11250 mutex_unlock(&devlink->lock); in devlink_trap_groups_unregister()
11255 devlink_trap_policer_notify(struct devlink *devlink, in devlink_trap_policer_notify() argument
11269 err = devlink_nl_trap_policer_fill(msg, devlink, policer_item, cmd, 0, in devlink_trap_policer_notify()
11276 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_trap_policer_notify()
11281 devlink_trap_policer_register(struct devlink *devlink, in devlink_trap_policer_register() argument
11287 if (devlink_trap_policer_item_lookup(devlink, policer->id)) in devlink_trap_policer_register()
11298 if (devlink->ops->trap_policer_init) { in devlink_trap_policer_register()
11299 err = devlink->ops->trap_policer_init(devlink, policer); in devlink_trap_policer_register()
11304 list_add_tail(&policer_item->list, &devlink->trap_policer_list); in devlink_trap_policer_register()
11305 devlink_trap_policer_notify(devlink, policer_item, in devlink_trap_policer_register()
11316 devlink_trap_policer_unregister(struct devlink *devlink, in devlink_trap_policer_unregister() argument
11321 policer_item = devlink_trap_policer_item_lookup(devlink, policer->id); in devlink_trap_policer_unregister()
11325 devlink_trap_policer_notify(devlink, policer_item, in devlink_trap_policer_unregister()
11328 if (devlink->ops->trap_policer_fini) in devlink_trap_policer_unregister()
11329 devlink->ops->trap_policer_fini(devlink, policer); in devlink_trap_policer_unregister()
11342 devlink_trap_policers_register(struct devlink *devlink, in devlink_trap_policers_register() argument
11348 mutex_lock(&devlink->lock); in devlink_trap_policers_register()
11359 err = devlink_trap_policer_register(devlink, policer); in devlink_trap_policers_register()
11363 mutex_unlock(&devlink->lock); in devlink_trap_policers_register()
11370 devlink_trap_policer_unregister(devlink, &policers[i]); in devlink_trap_policers_register()
11371 mutex_unlock(&devlink->lock); in devlink_trap_policers_register()
11383 devlink_trap_policers_unregister(struct devlink *devlink, in devlink_trap_policers_unregister() argument
11389 mutex_lock(&devlink->lock); in devlink_trap_policers_unregister()
11391 devlink_trap_policer_unregister(devlink, &policers[i]); in devlink_trap_policers_unregister()
11392 mutex_unlock(&devlink->lock); in devlink_trap_policers_unregister()
11396 static void __devlink_compat_running_version(struct devlink *devlink, in __devlink_compat_running_version() argument
11409 err = devlink->ops->info_get(devlink, &req, NULL); in __devlink_compat_running_version()
11435 struct devlink *devlink; in devlink_compat_running_version() local
11440 devlink = netdev_to_devlink(dev); in devlink_compat_running_version()
11441 if (!devlink || !devlink->ops->info_get) in devlink_compat_running_version()
11444 mutex_lock(&devlink->lock); in devlink_compat_running_version()
11445 __devlink_compat_running_version(devlink, buf, len); in devlink_compat_running_version()
11446 mutex_unlock(&devlink->lock); in devlink_compat_running_version()
11456 struct devlink *devlink; in devlink_compat_flash_update() local
11462 devlink = netdev_to_devlink(dev); in devlink_compat_flash_update()
11463 if (!devlink || !devlink->ops->flash_update) { in devlink_compat_flash_update()
11468 ret = request_firmware(&params.fw, file_name, devlink->dev); in devlink_compat_flash_update()
11472 mutex_lock(&devlink->lock); in devlink_compat_flash_update()
11473 devlink_flash_update_begin_notify(devlink); in devlink_compat_flash_update()
11474 ret = devlink->ops->flash_update(devlink, &params, NULL); in devlink_compat_flash_update()
11475 devlink_flash_update_end_notify(devlink); in devlink_compat_flash_update()
11476 mutex_unlock(&devlink->lock); in devlink_compat_flash_update()
11525 struct devlink *devlink; in devlink_pernet_pre_exit() local
11534 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_pernet_pre_exit()
11535 if (!devlink_try_get(devlink)) in devlink_pernet_pre_exit()
11538 if (!net_eq(devlink_net(devlink), net)) in devlink_pernet_pre_exit()
11541 WARN_ON(!devlink_reload_supported(devlink->ops)); in devlink_pernet_pre_exit()
11542 err = devlink_reload(devlink, &init_net, in devlink_pernet_pre_exit()
11549 devlink_put(devlink); in devlink_pernet_pre_exit()