Lines Matching refs:devlink

41 struct devlink {  struct
72 void *devlink_priv(struct devlink *devlink) in devlink_priv() argument
74 return &devlink->priv; in devlink_priv()
78 struct devlink *priv_to_devlink(void *priv) in priv_to_devlink()
80 return container_of(priv, struct devlink, priv); in priv_to_devlink()
84 struct device *devlink_to_dev(const struct devlink *devlink) in devlink_to_dev() argument
86 return devlink->dev; in devlink_to_dev()
179 struct net *devlink_net(const struct devlink *devlink) in devlink_net() argument
181 return read_pnet(&devlink->_net); in devlink_net()
185 void devlink_put(struct devlink *devlink) in devlink_put() argument
187 if (refcount_dec_and_test(&devlink->refcount)) in devlink_put()
188 complete(&devlink->comp); in devlink_put()
191 struct devlink *__must_check devlink_try_get(struct devlink *devlink) in devlink_try_get() argument
193 if (refcount_inc_not_zero(&devlink->refcount)) in devlink_try_get()
194 return devlink; in devlink_try_get()
198 static struct devlink *devlink_get_from_attrs(struct net *net, in devlink_get_from_attrs()
201 struct devlink *devlink; in devlink_get_from_attrs() local
215 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_get_from_attrs()
216 if (strcmp(devlink->dev->bus->name, busname) == 0 && in devlink_get_from_attrs()
217 strcmp(dev_name(devlink->dev), devname) == 0 && in devlink_get_from_attrs()
218 net_eq(devlink_net(devlink), net)) { in devlink_get_from_attrs()
224 if (!found || !devlink_try_get(devlink)) in devlink_get_from_attrs()
225 devlink = ERR_PTR(-ENODEV); in devlink_get_from_attrs()
227 return devlink; in devlink_get_from_attrs()
230 static struct devlink_port *devlink_port_get_by_index(struct devlink *devlink, in devlink_port_get_by_index() argument
235 list_for_each_entry(devlink_port, &devlink->port_list, list) { in devlink_port_get_by_index()
242 static bool devlink_port_index_exists(struct devlink *devlink, in devlink_port_index_exists() argument
245 return devlink_port_get_by_index(devlink, port_index); in devlink_port_index_exists()
248 static struct devlink_port *devlink_port_get_from_attrs(struct devlink *devlink, in devlink_port_get_from_attrs() argument
255 devlink_port = devlink_port_get_by_index(devlink, port_index); in devlink_port_get_from_attrs()
263 static struct devlink_port *devlink_port_get_from_info(struct devlink *devlink, in devlink_port_get_from_info() argument
266 return devlink_port_get_from_attrs(devlink, info->attrs); in devlink_port_get_from_info()
282 devlink_rate_leaf_get_from_info(struct devlink *devlink, struct genl_info *info) in devlink_rate_leaf_get_from_info() argument
287 devlink_port = devlink_port_get_from_attrs(devlink, info->attrs); in devlink_rate_leaf_get_from_info()
295 devlink_rate_node_get_by_name(struct devlink *devlink, const char *node_name) in devlink_rate_node_get_by_name() argument
299 list_for_each_entry(devlink_rate, &devlink->rate_list, list) { in devlink_rate_node_get_by_name()
308 devlink_rate_node_get_from_attrs(struct devlink *devlink, struct nlattr **attrs) in devlink_rate_node_get_from_attrs() argument
321 return devlink_rate_node_get_by_name(devlink, rate_node_name); in devlink_rate_node_get_from_attrs()
325 devlink_rate_node_get_from_info(struct devlink *devlink, struct genl_info *info) in devlink_rate_node_get_from_info() argument
327 return devlink_rate_node_get_from_attrs(devlink, info->attrs); in devlink_rate_node_get_from_info()
331 devlink_rate_get_from_info(struct devlink *devlink, struct genl_info *info) in devlink_rate_get_from_info() argument
336 return devlink_rate_leaf_get_from_info(devlink, info); in devlink_rate_get_from_info()
338 return devlink_rate_node_get_from_info(devlink, info); in devlink_rate_get_from_info()
358 static struct devlink_sb *devlink_sb_get_by_index(struct devlink *devlink, in devlink_sb_get_by_index() argument
363 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_sb_get_by_index()
370 static bool devlink_sb_index_exists(struct devlink *devlink, in devlink_sb_index_exists() argument
373 return devlink_sb_get_by_index(devlink, sb_index); in devlink_sb_index_exists()
376 static struct devlink_sb *devlink_sb_get_from_attrs(struct devlink *devlink, in devlink_sb_get_from_attrs() argument
383 devlink_sb = devlink_sb_get_by_index(devlink, sb_index); in devlink_sb_get_from_attrs()
391 static struct devlink_sb *devlink_sb_get_from_info(struct devlink *devlink, in devlink_sb_get_from_info() argument
394 return devlink_sb_get_from_attrs(devlink, info->attrs); in devlink_sb_get_from_info()
502 struct devlink *devlink; member
523 devlink_region_get_by_name(struct devlink *devlink, const char *region_name) in devlink_region_get_by_name() argument
527 list_for_each_entry(region, &devlink->region_list, list) in devlink_region_get_by_name()
574 struct devlink *devlink; in devlink_nl_pre_doit() local
578 devlink = devlink_get_from_attrs(genl_info_net(info), info->attrs); in devlink_nl_pre_doit()
579 if (IS_ERR(devlink)) { in devlink_nl_pre_doit()
581 return PTR_ERR(devlink); in devlink_nl_pre_doit()
584 mutex_lock(&devlink->lock); in devlink_nl_pre_doit()
585 info->user_ptr[0] = devlink; in devlink_nl_pre_doit()
587 devlink_port = devlink_port_get_from_info(devlink, info); in devlink_nl_pre_doit()
594 devlink_port = devlink_port_get_from_info(devlink, info); in devlink_nl_pre_doit()
600 devlink_rate = devlink_rate_get_from_info(devlink, info); in devlink_nl_pre_doit()
609 rate_node = devlink_rate_node_get_from_info(devlink, info); in devlink_nl_pre_doit()
620 mutex_unlock(&devlink->lock); in devlink_nl_pre_doit()
621 devlink_put(devlink); in devlink_nl_pre_doit()
629 struct devlink *devlink; in devlink_nl_post_doit() local
631 devlink = info->user_ptr[0]; in devlink_nl_post_doit()
633 mutex_unlock(&devlink->lock); in devlink_nl_post_doit()
634 devlink_put(devlink); in devlink_nl_post_doit()
648 static int devlink_nl_put_handle(struct sk_buff *msg, struct devlink *devlink) in devlink_nl_put_handle() argument
650 if (nla_put_string(msg, DEVLINK_ATTR_BUS_NAME, devlink->dev->bus->name)) in devlink_nl_put_handle()
652 if (nla_put_string(msg, DEVLINK_ATTR_DEV_NAME, dev_name(devlink->dev))) in devlink_nl_put_handle()
684 devlink_reload_action_is_supported(struct devlink *devlink, enum devlink_reload_action action) in devlink_reload_action_is_supported() argument
686 return test_bit(action, &devlink->ops->reload_actions); in devlink_reload_action_is_supported()
690 devlink_reload_limit_is_supported(struct devlink *devlink, enum devlink_reload_limit limit) in devlink_reload_limit_is_supported() argument
692 return test_bit(limit, &devlink->ops->reload_limits); in devlink_reload_limit_is_supported()
715 static int devlink_reload_stats_put(struct sk_buff *msg, struct devlink *devlink, bool is_remote) in devlink_reload_stats_put() argument
731 !devlink_reload_action_is_supported(devlink, i)) || in devlink_reload_stats_put()
751 !devlink_reload_limit_is_supported(devlink, j)) || in devlink_reload_stats_put()
757 value = devlink->stats.reload_stats[stat_idx]; in devlink_reload_stats_put()
759 value = devlink->stats.remote_reload_stats[stat_idx]; in devlink_reload_stats_put()
778 static int devlink_nl_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_fill() argument
789 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_fill()
791 if (nla_put_u8(msg, DEVLINK_ATTR_RELOAD_FAILED, devlink->reload_failed)) in devlink_nl_fill()
798 if (devlink_reload_stats_put(msg, devlink, false)) in devlink_nl_fill()
800 if (devlink_reload_stats_put(msg, devlink, true)) in devlink_nl_fill()
814 static void devlink_notify(struct devlink *devlink, enum devlink_command cmd) in devlink_notify() argument
820 WARN_ON(!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)); in devlink_notify()
826 err = devlink_nl_fill(msg, devlink, cmd, 0, 0, 0); in devlink_notify()
832 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_notify()
931 struct devlink *devlink = devlink_rate->devlink; in devlink_nl_rate_fill() local
938 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_rate_fill()
1039 ops = port->devlink->ops; in devlink_nl_port_function_attrs_put()
1058 struct devlink *devlink = devlink_port->devlink; in devlink_nl_port_fill() local
1065 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_port_fill()
1080 struct net *net = devlink_net(devlink_port->devlink); in devlink_nl_port_fill()
1119 struct devlink *devlink = devlink_port->devlink; in devlink_port_notify() local
1125 if (!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)) in devlink_port_notify()
1138 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), msg, in devlink_port_notify()
1145 struct devlink *devlink = devlink_rate->devlink; in devlink_rate_notify() local
1151 if (!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)) in devlink_rate_notify()
1164 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), msg, in devlink_rate_notify()
1172 struct devlink *devlink; in devlink_nl_cmd_rate_get_dumpit() local
1179 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_rate_get_dumpit()
1180 if (!devlink_try_get(devlink)) in devlink_nl_cmd_rate_get_dumpit()
1183 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_rate_get_dumpit()
1186 mutex_lock(&devlink->lock); in devlink_nl_cmd_rate_get_dumpit()
1187 list_for_each_entry(devlink_rate, &devlink->rate_list, list) { in devlink_nl_cmd_rate_get_dumpit()
1199 mutex_unlock(&devlink->lock); in devlink_nl_cmd_rate_get_dumpit()
1200 devlink_put(devlink); in devlink_nl_cmd_rate_get_dumpit()
1205 mutex_unlock(&devlink->lock); in devlink_nl_cmd_rate_get_dumpit()
1207 devlink_put(devlink); in devlink_nl_cmd_rate_get_dumpit()
1254 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_get_doit() local
1262 err = devlink_nl_fill(msg, devlink, DEVLINK_CMD_NEW, in devlink_nl_cmd_get_doit()
1275 struct devlink *devlink; in devlink_nl_cmd_get_dumpit() local
1282 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_get_dumpit()
1283 if (!devlink_try_get(devlink)) in devlink_nl_cmd_get_dumpit()
1286 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) { in devlink_nl_cmd_get_dumpit()
1287 devlink_put(devlink); in devlink_nl_cmd_get_dumpit()
1293 devlink_put(devlink); in devlink_nl_cmd_get_dumpit()
1297 err = devlink_nl_fill(msg, devlink, DEVLINK_CMD_NEW, in devlink_nl_cmd_get_dumpit()
1300 devlink_put(devlink); in devlink_nl_cmd_get_dumpit()
1337 struct devlink *devlink; in devlink_nl_cmd_port_get_dumpit() local
1345 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_port_get_dumpit()
1346 if (!devlink_try_get(devlink)) in devlink_nl_cmd_port_get_dumpit()
1349 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_port_get_dumpit()
1352 mutex_lock(&devlink->lock); in devlink_nl_cmd_port_get_dumpit()
1353 list_for_each_entry(devlink_port, &devlink->port_list, list) { in devlink_nl_cmd_port_get_dumpit()
1364 mutex_unlock(&devlink->lock); in devlink_nl_cmd_port_get_dumpit()
1365 devlink_put(devlink); in devlink_nl_cmd_port_get_dumpit()
1370 mutex_unlock(&devlink->lock); in devlink_nl_cmd_port_get_dumpit()
1372 devlink_put(devlink); in devlink_nl_cmd_port_get_dumpit()
1387 if (!devlink_port->devlink->ops->port_type_set) in devlink_port_type_set()
1393 err = devlink_port->devlink->ops->port_type_set(devlink_port, in devlink_port_type_set()
1407 const struct devlink_ops *ops = port->devlink->ops; in devlink_port_function_hw_addr_set()
1445 ops = port->devlink->ops; in devlink_port_fn_state_set()
1514 static int devlink_port_split(struct devlink *devlink, u32 port_index, in devlink_port_split() argument
1518 if (devlink->ops->port_split) in devlink_port_split()
1519 return devlink->ops->port_split(devlink, port_index, count, in devlink_port_split()
1527 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_port_split_doit() local
1536 devlink_port = devlink_port_get_from_info(devlink, info); in devlink_nl_cmd_port_split_doit()
1557 return devlink_port_split(devlink, port_index, count, info->extack); in devlink_nl_cmd_port_split_doit()
1560 static int devlink_port_unsplit(struct devlink *devlink, u32 port_index, in devlink_port_unsplit() argument
1564 if (devlink->ops->port_unsplit) in devlink_port_unsplit()
1565 return devlink->ops->port_unsplit(devlink, port_index, extack); in devlink_port_unsplit()
1572 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_port_unsplit_doit() local
1579 return devlink_port_unsplit(devlink, port_index, info->extack); in devlink_nl_cmd_port_unsplit_doit()
1582 static int devlink_port_new_notifiy(struct devlink *devlink, in devlink_port_new_notifiy() argument
1594 mutex_lock(&devlink->lock); in devlink_port_new_notifiy()
1595 devlink_port = devlink_port_get_by_index(devlink, port_index); in devlink_port_new_notifiy()
1607 mutex_unlock(&devlink->lock); in devlink_port_new_notifiy()
1611 mutex_unlock(&devlink->lock); in devlink_port_new_notifiy()
1621 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_port_new_doit() local
1625 if (!devlink->ops->port_new || !devlink->ops->port_del) in devlink_nl_cmd_port_new_doit()
1654 err = devlink->ops->port_new(devlink, &new_attrs, extack, in devlink_nl_cmd_port_new_doit()
1659 err = devlink_port_new_notifiy(devlink, new_port_index, info); in devlink_nl_cmd_port_new_doit()
1662 devlink->ops->port_del(devlink, new_port_index, extack); in devlink_nl_cmd_port_new_doit()
1671 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_port_del_doit() local
1674 if (!devlink->ops->port_del) in devlink_nl_cmd_port_del_doit()
1683 return devlink->ops->port_del(devlink, port_index, extack); in devlink_nl_cmd_port_del_doit()
1691 struct devlink *devlink = devlink_rate->devlink; in devlink_nl_rate_parent_node_set() local
1693 const struct devlink_ops *ops = devlink->ops; in devlink_nl_rate_parent_node_set()
1717 parent = devlink_rate_node_get_by_name(devlink, parent_name); in devlink_nl_rate_parent_node_set()
1841 struct devlink *devlink = devlink_rate->devlink; in devlink_nl_cmd_rate_set_doit() local
1842 const struct devlink_ops *ops = devlink->ops; in devlink_nl_cmd_rate_set_doit()
1858 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_rate_new_doit() local
1863 ops = devlink->ops; in devlink_nl_cmd_rate_new_doit()
1872 rate_node = devlink_rate_node_get_from_attrs(devlink, info->attrs); in devlink_nl_cmd_rate_new_doit()
1882 rate_node->devlink = devlink; in devlink_nl_cmd_rate_new_doit()
1899 list_add(&rate_node->list, &devlink->rate_list); in devlink_nl_cmd_rate_new_doit()
1916 struct devlink *devlink = rate_node->devlink; in devlink_nl_cmd_rate_del_doit() local
1917 const struct devlink_ops *ops = devlink->ops; in devlink_nl_cmd_rate_del_doit()
1935 static int devlink_nl_sb_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_sb_fill() argument
1946 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_sb_fill()
1976 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_get_doit() local
1981 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_get_doit()
1989 err = devlink_nl_sb_fill(msg, devlink, devlink_sb, in devlink_nl_cmd_sb_get_doit()
2003 struct devlink *devlink; in devlink_nl_cmd_sb_get_dumpit() local
2011 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_sb_get_dumpit()
2012 if (!devlink_try_get(devlink)) in devlink_nl_cmd_sb_get_dumpit()
2015 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_sb_get_dumpit()
2018 mutex_lock(&devlink->lock); in devlink_nl_cmd_sb_get_dumpit()
2019 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_nl_cmd_sb_get_dumpit()
2024 err = devlink_nl_sb_fill(msg, devlink, devlink_sb, in devlink_nl_cmd_sb_get_dumpit()
2030 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_get_dumpit()
2031 devlink_put(devlink); in devlink_nl_cmd_sb_get_dumpit()
2036 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_get_dumpit()
2038 devlink_put(devlink); in devlink_nl_cmd_sb_get_dumpit()
2047 static int devlink_nl_sb_pool_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_sb_pool_fill() argument
2056 err = devlink->ops->sb_pool_get(devlink, devlink_sb->index, in devlink_nl_sb_pool_fill()
2065 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_sb_pool_fill()
2093 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_pool_get_doit() local
2099 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_pool_get_doit()
2108 if (!devlink->ops->sb_pool_get) in devlink_nl_cmd_sb_pool_get_doit()
2115 err = devlink_nl_sb_pool_fill(msg, devlink, devlink_sb, pool_index, in devlink_nl_cmd_sb_pool_get_doit()
2127 struct devlink *devlink, in __sb_pool_get_dumpit() argument
2140 err = devlink_nl_sb_pool_fill(msg, devlink, in __sb_pool_get_dumpit()
2155 struct devlink *devlink; in devlink_nl_cmd_sb_pool_get_dumpit() local
2163 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_sb_pool_get_dumpit()
2164 if (!devlink_try_get(devlink)) in devlink_nl_cmd_sb_pool_get_dumpit()
2167 if (!net_eq(devlink_net(devlink), sock_net(msg->sk)) || in devlink_nl_cmd_sb_pool_get_dumpit()
2168 !devlink->ops->sb_pool_get) in devlink_nl_cmd_sb_pool_get_dumpit()
2171 mutex_lock(&devlink->lock); in devlink_nl_cmd_sb_pool_get_dumpit()
2172 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_nl_cmd_sb_pool_get_dumpit()
2173 err = __sb_pool_get_dumpit(msg, start, &idx, devlink, in devlink_nl_cmd_sb_pool_get_dumpit()
2180 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_pool_get_dumpit()
2181 devlink_put(devlink); in devlink_nl_cmd_sb_pool_get_dumpit()
2185 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_pool_get_dumpit()
2187 devlink_put(devlink); in devlink_nl_cmd_sb_pool_get_dumpit()
2199 static int devlink_sb_pool_set(struct devlink *devlink, unsigned int sb_index, in devlink_sb_pool_set() argument
2205 const struct devlink_ops *ops = devlink->ops; in devlink_sb_pool_set()
2208 return ops->sb_pool_set(devlink, sb_index, pool_index, in devlink_sb_pool_set()
2216 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_pool_set_doit() local
2223 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_pool_set_doit()
2240 return devlink_sb_pool_set(devlink, devlink_sb->index, in devlink_nl_cmd_sb_pool_set_doit()
2246 struct devlink *devlink, in devlink_nl_sb_port_pool_fill() argument
2253 const struct devlink_ops *ops = devlink->ops; in devlink_nl_sb_port_pool_fill()
2267 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_sb_port_pool_fill()
2308 struct devlink *devlink = devlink_port->devlink; in devlink_nl_cmd_sb_port_pool_get_doit() local
2314 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_port_pool_get_doit()
2323 if (!devlink->ops->sb_port_pool_get) in devlink_nl_cmd_sb_port_pool_get_doit()
2330 err = devlink_nl_sb_port_pool_fill(msg, devlink, devlink_port, in devlink_nl_cmd_sb_port_pool_get_doit()
2343 struct devlink *devlink, in __sb_port_pool_get_dumpit() argument
2352 list_for_each_entry(devlink_port, &devlink->port_list, list) { in __sb_port_pool_get_dumpit()
2358 err = devlink_nl_sb_port_pool_fill(msg, devlink, in __sb_port_pool_get_dumpit()
2376 struct devlink *devlink; in devlink_nl_cmd_sb_port_pool_get_dumpit() local
2384 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_sb_port_pool_get_dumpit()
2385 if (!devlink_try_get(devlink)) in devlink_nl_cmd_sb_port_pool_get_dumpit()
2388 if (!net_eq(devlink_net(devlink), sock_net(msg->sk)) || in devlink_nl_cmd_sb_port_pool_get_dumpit()
2389 !devlink->ops->sb_port_pool_get) in devlink_nl_cmd_sb_port_pool_get_dumpit()
2392 mutex_lock(&devlink->lock); in devlink_nl_cmd_sb_port_pool_get_dumpit()
2393 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_nl_cmd_sb_port_pool_get_dumpit()
2395 devlink, devlink_sb, in devlink_nl_cmd_sb_port_pool_get_dumpit()
2401 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_port_pool_get_dumpit()
2402 devlink_put(devlink); in devlink_nl_cmd_sb_port_pool_get_dumpit()
2406 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_port_pool_get_dumpit()
2408 devlink_put(devlink); in devlink_nl_cmd_sb_port_pool_get_dumpit()
2426 const struct devlink_ops *ops = devlink_port->devlink->ops; in devlink_sb_port_pool_set()
2438 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_port_pool_set_doit() local
2444 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_port_pool_set_doit()
2462 devlink_nl_sb_tc_pool_bind_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_sb_tc_pool_bind_fill() argument
2469 const struct devlink_ops *ops = devlink->ops; in devlink_nl_sb_tc_pool_bind_fill()
2485 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_sb_tc_pool_bind_fill()
2530 struct devlink *devlink = devlink_port->devlink; in devlink_nl_cmd_sb_tc_pool_bind_get_doit() local
2537 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_tc_pool_bind_get_doit()
2550 if (!devlink->ops->sb_tc_pool_bind_get) in devlink_nl_cmd_sb_tc_pool_bind_get_doit()
2557 err = devlink_nl_sb_tc_pool_bind_fill(msg, devlink, devlink_port, in devlink_nl_cmd_sb_tc_pool_bind_get_doit()
2572 struct devlink *devlink, in __sb_tc_pool_bind_get_dumpit() argument
2580 list_for_each_entry(devlink_port, &devlink->port_list, list) { in __sb_tc_pool_bind_get_dumpit()
2587 err = devlink_nl_sb_tc_pool_bind_fill(msg, devlink, in __sb_tc_pool_bind_get_dumpit()
2605 err = devlink_nl_sb_tc_pool_bind_fill(msg, devlink, in __sb_tc_pool_bind_get_dumpit()
2625 struct devlink *devlink; in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit() local
2633 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
2634 if (!devlink_try_get(devlink)) in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
2637 if (!net_eq(devlink_net(devlink), sock_net(msg->sk)) || in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
2638 !devlink->ops->sb_tc_pool_bind_get) in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
2641 mutex_lock(&devlink->lock); in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
2642 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
2644 devlink, in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
2651 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
2652 devlink_put(devlink); in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
2656 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
2658 devlink_put(devlink); in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
2677 const struct devlink_ops *ops = devlink_port->devlink->ops; in devlink_sb_tc_pool_bind_set()
2690 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_tc_pool_bind_set_doit() local
2698 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_tc_pool_bind_set_doit()
2728 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_occ_snapshot_doit() local
2729 const struct devlink_ops *ops = devlink->ops; in devlink_nl_cmd_sb_occ_snapshot_doit()
2732 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_occ_snapshot_doit()
2737 return ops->sb_occ_snapshot(devlink, devlink_sb->index); in devlink_nl_cmd_sb_occ_snapshot_doit()
2744 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_occ_max_clear_doit() local
2745 const struct devlink_ops *ops = devlink->ops; in devlink_nl_cmd_sb_occ_max_clear_doit()
2748 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_occ_max_clear_doit()
2753 return ops->sb_occ_max_clear(devlink, devlink_sb->index); in devlink_nl_cmd_sb_occ_max_clear_doit()
2757 static int devlink_nl_eswitch_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_eswitch_fill() argument
2761 const struct devlink_ops *ops = devlink->ops; in devlink_nl_eswitch_fill()
2772 err = devlink_nl_put_handle(msg, devlink); in devlink_nl_eswitch_fill()
2777 err = ops->eswitch_mode_get(devlink, &mode); in devlink_nl_eswitch_fill()
2786 err = ops->eswitch_inline_mode_get(devlink, &inline_mode); in devlink_nl_eswitch_fill()
2796 err = ops->eswitch_encap_mode_get(devlink, &encap_mode); in devlink_nl_eswitch_fill()
2815 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_eswitch_get_doit() local
2823 err = devlink_nl_eswitch_fill(msg, devlink, DEVLINK_CMD_ESWITCH_GET, in devlink_nl_cmd_eswitch_get_doit()
2834 static int devlink_rate_nodes_check(struct devlink *devlink, u16 mode, in devlink_rate_nodes_check() argument
2840 mutex_lock(&devlink->lock); in devlink_rate_nodes_check()
2841 list_for_each_entry(devlink_rate, &devlink->rate_list, list) in devlink_rate_nodes_check()
2843 mutex_unlock(&devlink->lock); in devlink_rate_nodes_check()
2847 mutex_unlock(&devlink->lock); in devlink_rate_nodes_check()
2854 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_eswitch_set_doit() local
2855 const struct devlink_ops *ops = devlink->ops; in devlink_nl_cmd_eswitch_set_doit()
2865 err = devlink_rate_nodes_check(devlink, mode, info->extack); in devlink_nl_cmd_eswitch_set_doit()
2868 err = ops->eswitch_mode_set(devlink, mode, info->extack); in devlink_nl_cmd_eswitch_set_doit()
2878 err = ops->eswitch_inline_mode_set(devlink, inline_mode, in devlink_nl_cmd_eswitch_set_doit()
2888 err = ops->eswitch_encap_mode_set(devlink, encap_mode, in devlink_nl_cmd_eswitch_set_doit()
3054 struct devlink *devlink = info->user_ptr[0]; in devlink_dpipe_tables_fill() local
3078 if (devlink_nl_put_handle(skb, devlink)) in devlink_dpipe_tables_fill()
3132 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_dpipe_table_get() local
3139 &devlink->dpipe_table_list, in devlink_nl_cmd_dpipe_table_get()
3291 const char *table_name, struct devlink *devlink) in devlink_dpipe_table_find() argument
3295 lockdep_is_held(&devlink->lock)) { in devlink_dpipe_table_find()
3304 struct devlink *devlink; in devlink_dpipe_entry_ctx_prepare() local
3320 devlink = dump_ctx->info->user_ptr[0]; in devlink_dpipe_entry_ctx_prepare()
3321 if (devlink_nl_put_handle(dump_ctx->skb, devlink)) in devlink_dpipe_entry_ctx_prepare()
3405 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_dpipe_entries_get() local
3413 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, in devlink_nl_cmd_dpipe_entries_get()
3414 table_name, devlink); in devlink_nl_cmd_dpipe_entries_get()
3492 struct devlink *devlink = info->user_ptr[0]; in devlink_dpipe_headers_fill() local
3513 if (devlink_nl_put_handle(skb, devlink)) in devlink_dpipe_headers_fill()
3555 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_dpipe_headers_get() local
3557 if (!devlink->dpipe_headers) in devlink_nl_cmd_dpipe_headers_get()
3560 0, devlink->dpipe_headers); in devlink_nl_cmd_dpipe_headers_get()
3563 static int devlink_dpipe_table_counters_set(struct devlink *devlink, in devlink_dpipe_table_counters_set() argument
3569 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, in devlink_dpipe_table_counters_set()
3570 table_name, devlink); in devlink_dpipe_table_counters_set()
3589 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_dpipe_table_counters_set() local
3600 return devlink_dpipe_table_counters_set(devlink, table_name, in devlink_nl_cmd_dpipe_table_counters_set()
3605 devlink_resource_find(struct devlink *devlink, in devlink_resource_find() argument
3613 resource_list = &devlink->resource_list; in devlink_resource_find()
3621 child_resource = devlink_resource_find(devlink, resource, in devlink_resource_find()
3677 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_resource_set() local
3688 resource = devlink_resource_find(devlink, NULL, resource_id); in devlink_nl_cmd_resource_set()
3732 static int devlink_resource_put(struct devlink *devlink, struct sk_buff *skb, in devlink_resource_put() argument
3769 if (devlink_resource_put(devlink, skb, child_resource)) in devlink_resource_put()
3788 struct devlink *devlink = info->user_ptr[0]; in devlink_resource_fill() local
3798 resource = list_first_entry(&devlink->resource_list, in devlink_resource_fill()
3812 if (devlink_nl_put_handle(skb, devlink)) in devlink_resource_fill()
3822 list_for_each_entry_from(resource, &devlink->resource_list, list) { in devlink_resource_fill()
3823 err = devlink_resource_put(devlink, skb, resource); in devlink_resource_fill()
3857 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_resource_dump() local
3859 if (list_empty(&devlink->resource_list)) in devlink_nl_cmd_resource_dump()
3866 devlink_resources_validate(struct devlink *devlink, in devlink_resources_validate() argument
3876 resource_list = &devlink->resource_list; in devlink_resources_validate()
3881 err = devlink_resources_validate(devlink, resource, info); in devlink_resources_validate()
3925 static void devlink_param_notify(struct devlink *devlink,
3930 static void devlink_ns_change_notify(struct devlink *devlink, in devlink_ns_change_notify() argument
3947 devlink_notify(devlink, DEVLINK_CMD_NEW); in devlink_ns_change_notify()
3950 list_for_each_entry(param_item, &devlink->param_list, list) in devlink_ns_change_notify()
3951 devlink_param_notify(devlink, 0, param_item, cmd); in devlink_ns_change_notify()
3954 devlink_notify(devlink, DEVLINK_CMD_DEL); in devlink_ns_change_notify()
3962 static void devlink_reload_failed_set(struct devlink *devlink, in devlink_reload_failed_set() argument
3965 if (devlink->reload_failed == reload_failed) in devlink_reload_failed_set()
3967 devlink->reload_failed = reload_failed; in devlink_reload_failed_set()
3968 devlink_notify(devlink, DEVLINK_CMD_NEW); in devlink_reload_failed_set()
3971 bool devlink_is_reload_failed(const struct devlink *devlink) in devlink_is_reload_failed() argument
3973 return devlink->reload_failed; in devlink_is_reload_failed()
3978 __devlink_reload_stats_update(struct devlink *devlink, u32 *reload_stats, in __devlink_reload_stats_update() argument
3989 devlink_notify(devlink, DEVLINK_CMD_NEW); in __devlink_reload_stats_update()
3993 devlink_reload_stats_update(struct devlink *devlink, enum devlink_reload_limit limit, in devlink_reload_stats_update() argument
3996 __devlink_reload_stats_update(devlink, devlink->stats.reload_stats, limit, in devlink_reload_stats_update()
4014 void devlink_remote_reload_actions_performed(struct devlink *devlink, in devlink_remote_reload_actions_performed() argument
4024 __devlink_reload_stats_update(devlink, devlink->stats.remote_reload_stats, limit, in devlink_remote_reload_actions_performed()
4029 static int devlink_reload(struct devlink *devlink, struct net *dest_net, in devlink_reload() argument
4037 memcpy(remote_reload_stats, devlink->stats.remote_reload_stats, in devlink_reload()
4040 curr_net = devlink_net(devlink); in devlink_reload()
4041 devlink_ns_change_notify(devlink, dest_net, curr_net, false); in devlink_reload()
4042 err = devlink->ops->reload_down(devlink, !!dest_net, action, limit, extack); in devlink_reload()
4047 write_pnet(&devlink->_net, dest_net); in devlink_reload()
4049 err = devlink->ops->reload_up(devlink, action, limit, actions_performed, extack); in devlink_reload()
4050 devlink_reload_failed_set(devlink, !!err); in devlink_reload()
4054 devlink_ns_change_notify(devlink, dest_net, curr_net, true); in devlink_reload()
4057 WARN_ON(memcmp(remote_reload_stats, devlink->stats.remote_reload_stats, in devlink_reload()
4059 devlink_reload_stats_update(devlink, limit, *actions_performed); in devlink_reload()
4064 devlink_nl_reload_actions_performed_snd(struct devlink *devlink, u32 actions_performed, in devlink_nl_reload_actions_performed_snd() argument
4078 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_reload_actions_performed_snd()
4097 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_reload() local
4104 if (!(devlink->features & DEVLINK_F_RELOAD)) in devlink_nl_cmd_reload()
4107 err = devlink_resources_validate(devlink, NULL, info); in devlink_nl_cmd_reload()
4118 if (!devlink_reload_action_is_supported(devlink, action)) { in devlink_nl_cmd_reload()
4144 if (!devlink_reload_limit_is_supported(devlink, limit)) { in devlink_nl_cmd_reload()
4163 err = devlink_reload(devlink, dest_net, action, limit, &actions_performed, info->extack); in devlink_nl_cmd_reload()
4174 return devlink_nl_reload_actions_performed_snd(devlink, actions_performed, in devlink_nl_cmd_reload()
4179 struct devlink *devlink, in devlink_nl_flash_update_fill() argument
4189 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_flash_update_fill()
4222 static void __devlink_flash_update_notify(struct devlink *devlink, in __devlink_flash_update_notify() argument
4233 if (!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)) in __devlink_flash_update_notify()
4240 err = devlink_nl_flash_update_fill(msg, devlink, cmd, params); in __devlink_flash_update_notify()
4244 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in __devlink_flash_update_notify()
4252 static void devlink_flash_update_begin_notify(struct devlink *devlink) in devlink_flash_update_begin_notify() argument
4256 __devlink_flash_update_notify(devlink, in devlink_flash_update_begin_notify()
4261 static void devlink_flash_update_end_notify(struct devlink *devlink) in devlink_flash_update_end_notify() argument
4265 __devlink_flash_update_notify(devlink, in devlink_flash_update_end_notify()
4270 void devlink_flash_update_status_notify(struct devlink *devlink, in devlink_flash_update_status_notify() argument
4283 __devlink_flash_update_notify(devlink, in devlink_flash_update_status_notify()
4289 void devlink_flash_update_timeout_notify(struct devlink *devlink, in devlink_flash_update_timeout_notify() argument
4300 __devlink_flash_update_notify(devlink, in devlink_flash_update_timeout_notify()
4311 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_flash_update() local
4316 if (!devlink->ops->flash_update) in devlink_nl_cmd_flash_update()
4322 supported_params = devlink->ops->supported_flash_update_params; in devlink_nl_cmd_flash_update()
4349 ret = request_firmware(&params.fw, file_name, devlink->dev); in devlink_nl_cmd_flash_update()
4355 devlink_flash_update_begin_notify(devlink); in devlink_nl_cmd_flash_update()
4356 ret = devlink->ops->flash_update(devlink, &params, info->extack); in devlink_nl_cmd_flash_update()
4357 devlink_flash_update_end_notify(devlink); in devlink_nl_cmd_flash_update()
4494 static int devlink_param_get(struct devlink *devlink, in devlink_param_get() argument
4500 return param->get(devlink, param->id, ctx); in devlink_param_get()
4503 static int devlink_param_set(struct devlink *devlink, in devlink_param_set() argument
4509 return param->set(devlink, param->id, ctx); in devlink_param_set()
4581 static int devlink_nl_param_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_param_fill() argument
4608 err = devlink_param_get(devlink, param, &ctx); in devlink_nl_param_fill()
4620 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_param_fill()
4671 static void devlink_param_notify(struct devlink *devlink, in devlink_param_notify() argument
4682 ASSERT_DEVLINK_REGISTERED(devlink); in devlink_param_notify()
4687 err = devlink_nl_param_fill(msg, devlink, port_index, param_item, cmd, in devlink_param_notify()
4694 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_param_notify()
4702 struct devlink *devlink; in devlink_nl_cmd_param_get_dumpit() local
4709 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_param_get_dumpit()
4710 if (!devlink_try_get(devlink)) in devlink_nl_cmd_param_get_dumpit()
4713 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_param_get_dumpit()
4716 mutex_lock(&devlink->lock); in devlink_nl_cmd_param_get_dumpit()
4717 list_for_each_entry(param_item, &devlink->param_list, list) { in devlink_nl_cmd_param_get_dumpit()
4722 err = devlink_nl_param_fill(msg, devlink, 0, param_item, in devlink_nl_cmd_param_get_dumpit()
4730 mutex_unlock(&devlink->lock); in devlink_nl_cmd_param_get_dumpit()
4731 devlink_put(devlink); in devlink_nl_cmd_param_get_dumpit()
4736 mutex_unlock(&devlink->lock); in devlink_nl_cmd_param_get_dumpit()
4738 devlink_put(devlink); in devlink_nl_cmd_param_get_dumpit()
4841 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_param_get_doit() local
4846 param_item = devlink_param_get_from_info(&devlink->param_list, info); in devlink_nl_cmd_param_get_doit()
4854 err = devlink_nl_param_fill(msg, devlink, 0, param_item, in devlink_nl_cmd_param_get_doit()
4865 static int __devlink_nl_cmd_param_set_doit(struct devlink *devlink, in __devlink_nl_cmd_param_set_doit() argument
4892 err = param->validate(devlink, param->id, value, info->extack); in __devlink_nl_cmd_param_set_doit()
4914 err = devlink_param_set(devlink, param, &ctx); in __devlink_nl_cmd_param_set_doit()
4919 devlink_param_notify(devlink, port_index, param_item, cmd); in __devlink_nl_cmd_param_set_doit()
4926 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_param_set_doit() local
4928 return __devlink_nl_cmd_param_set_doit(devlink, 0, &devlink->param_list, in devlink_nl_cmd_param_set_doit()
4937 struct devlink *devlink; in devlink_nl_cmd_port_param_get_dumpit() local
4944 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_port_param_get_dumpit()
4945 if (!devlink_try_get(devlink)) in devlink_nl_cmd_port_param_get_dumpit()
4948 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_port_param_get_dumpit()
4951 mutex_lock(&devlink->lock); in devlink_nl_cmd_port_param_get_dumpit()
4952 list_for_each_entry(devlink_port, &devlink->port_list, list) { in devlink_nl_cmd_port_param_get_dumpit()
4960 devlink_port->devlink, in devlink_nl_cmd_port_param_get_dumpit()
4969 mutex_unlock(&devlink->lock); in devlink_nl_cmd_port_param_get_dumpit()
4970 devlink_put(devlink); in devlink_nl_cmd_port_param_get_dumpit()
4976 mutex_unlock(&devlink->lock); in devlink_nl_cmd_port_param_get_dumpit()
4978 devlink_put(devlink); in devlink_nl_cmd_port_param_get_dumpit()
5007 err = devlink_nl_param_fill(msg, devlink_port->devlink, in devlink_nl_cmd_port_param_get_doit()
5024 return __devlink_nl_cmd_param_set_doit(devlink_port->devlink, in devlink_nl_cmd_port_param_set_doit()
5031 struct devlink *devlink, in devlink_nl_region_snapshot_id_put() argument
5054 struct devlink *devlink, in devlink_nl_region_snapshots_id_put() argument
5067 err = devlink_nl_region_snapshot_id_put(msg, devlink, snapshot); in devlink_nl_region_snapshots_id_put()
5080 static int devlink_nl_region_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_region_fill() argument
5092 err = devlink_nl_put_handle(msg, devlink); in devlink_nl_region_fill()
5118 err = devlink_nl_region_snapshots_id_put(msg, devlink, region); in devlink_nl_region_fill()
5135 struct devlink *devlink = region->devlink; in devlink_nl_region_notify_build() local
5151 err = devlink_nl_put_handle(msg, devlink); in devlink_nl_region_notify_build()
5193 struct devlink *devlink = region->devlink; in devlink_nl_region_notify() local
5197 if (!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)) in devlink_nl_region_notify()
5204 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), msg, in devlink_nl_region_notify()
5223 static int __devlink_snapshot_id_increment(struct devlink *devlink, u32 id) in __devlink_snapshot_id_increment() argument
5228 lockdep_assert_held(&devlink->lock); in __devlink_snapshot_id_increment()
5230 p = xa_load(&devlink->snapshot_ids, id); in __devlink_snapshot_id_increment()
5240 return xa_err(xa_store(&devlink->snapshot_ids, id, xa_mk_value(count), in __devlink_snapshot_id_increment()
5259 static void __devlink_snapshot_id_decrement(struct devlink *devlink, u32 id) in __devlink_snapshot_id_decrement() argument
5264 lockdep_assert_held(&devlink->lock); in __devlink_snapshot_id_decrement()
5266 p = xa_load(&devlink->snapshot_ids, id); in __devlink_snapshot_id_decrement()
5277 xa_store(&devlink->snapshot_ids, id, xa_mk_value(count), in __devlink_snapshot_id_decrement()
5281 xa_erase(&devlink->snapshot_ids, id); in __devlink_snapshot_id_decrement()
5301 static int __devlink_snapshot_id_insert(struct devlink *devlink, u32 id) in __devlink_snapshot_id_insert() argument
5303 lockdep_assert_held(&devlink->lock); in __devlink_snapshot_id_insert()
5305 if (xa_load(&devlink->snapshot_ids, id)) in __devlink_snapshot_id_insert()
5308 return xa_err(xa_store(&devlink->snapshot_ids, id, xa_mk_value(0), in __devlink_snapshot_id_insert()
5328 static int __devlink_region_snapshot_id_get(struct devlink *devlink, u32 *id) in __devlink_region_snapshot_id_get() argument
5330 lockdep_assert_held(&devlink->lock); in __devlink_region_snapshot_id_get()
5332 return xa_alloc(&devlink->snapshot_ids, id, xa_mk_value(1), in __devlink_region_snapshot_id_get()
5354 struct devlink *devlink = region->devlink; in __devlink_region_snapshot_create() local
5358 lockdep_assert_held(&devlink->lock); in __devlink_region_snapshot_create()
5371 err = __devlink_snapshot_id_increment(devlink, snapshot_id); in __devlink_region_snapshot_create()
5394 struct devlink *devlink = region->devlink; in devlink_region_snapshot_del() local
5396 lockdep_assert_held(&devlink->lock); in devlink_region_snapshot_del()
5402 __devlink_snapshot_id_decrement(devlink, snapshot->id); in devlink_region_snapshot_del()
5409 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_region_get_doit() local
5423 port = devlink_port_get_by_index(devlink, index); in devlink_nl_cmd_region_get_doit()
5432 region = devlink_region_get_by_name(devlink, region_name); in devlink_nl_cmd_region_get_doit()
5441 err = devlink_nl_region_fill(msg, devlink, DEVLINK_CMD_REGION_GET, in devlink_nl_cmd_region_get_doit()
5466 err = devlink_nl_region_fill(msg, port->devlink, in devlink_nl_cmd_region_get_port_dumpit()
5482 struct devlink *devlink, in devlink_nl_cmd_region_get_devlink_dumpit() argument
5490 mutex_lock(&devlink->lock); in devlink_nl_cmd_region_get_devlink_dumpit()
5491 list_for_each_entry(region, &devlink->region_list, list) { in devlink_nl_cmd_region_get_devlink_dumpit()
5496 err = devlink_nl_region_fill(msg, devlink, in devlink_nl_cmd_region_get_devlink_dumpit()
5506 list_for_each_entry(port, &devlink->port_list, list) { in devlink_nl_cmd_region_get_devlink_dumpit()
5514 mutex_unlock(&devlink->lock); in devlink_nl_cmd_region_get_devlink_dumpit()
5521 struct devlink *devlink; in devlink_nl_cmd_region_get_dumpit() local
5528 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_region_get_dumpit()
5529 if (!devlink_try_get(devlink)) in devlink_nl_cmd_region_get_dumpit()
5532 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_region_get_dumpit()
5535 err = devlink_nl_cmd_region_get_devlink_dumpit(msg, cb, devlink, in devlink_nl_cmd_region_get_dumpit()
5538 devlink_put(devlink); in devlink_nl_cmd_region_get_dumpit()
5551 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_region_del() local
5569 port = devlink_port_get_by_index(devlink, index); in devlink_nl_cmd_region_del()
5577 region = devlink_region_get_by_name(devlink, region_name); in devlink_nl_cmd_region_del()
5593 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_region_new() local
5614 port = devlink_port_get_by_index(devlink, index); in devlink_nl_cmd_region_new()
5622 region = devlink_region_get_by_name(devlink, region_name); in devlink_nl_cmd_region_new()
5648 err = __devlink_snapshot_id_insert(devlink, snapshot_id); in devlink_nl_cmd_region_new()
5652 err = __devlink_region_snapshot_id_get(devlink, &snapshot_id); in devlink_nl_cmd_region_new()
5663 err = region->ops->snapshot(devlink, region->ops, in devlink_nl_cmd_region_new()
5698 __devlink_snapshot_id_decrement(devlink, snapshot_id); in devlink_nl_cmd_region_new()
5707 struct devlink *devlink, in devlink_nl_cmd_region_read_chunk_fill() argument
5738 struct devlink *devlink, in devlink_nl_region_read_snapshot_fill() argument
5767 err = devlink_nl_cmd_region_read_chunk_fill(skb, devlink, in devlink_nl_region_read_snapshot_fill()
5790 struct devlink *devlink; in devlink_nl_cmd_region_read_dumpit() local
5798 devlink = devlink_get_from_attrs(sock_net(cb->skb->sk), attrs); in devlink_nl_cmd_region_read_dumpit()
5799 if (IS_ERR(devlink)) { in devlink_nl_cmd_region_read_dumpit()
5800 err = PTR_ERR(devlink); in devlink_nl_cmd_region_read_dumpit()
5804 mutex_lock(&devlink->lock); in devlink_nl_cmd_region_read_dumpit()
5815 port = devlink_port_get_by_index(devlink, index); in devlink_nl_cmd_region_read_dumpit()
5827 region = devlink_region_get_by_name(devlink, region_name); in devlink_nl_cmd_region_read_dumpit()
5861 err = devlink_nl_put_handle(skb, devlink); in devlink_nl_cmd_region_read_dumpit()
5882 err = devlink_nl_region_read_snapshot_fill(skb, devlink, in devlink_nl_cmd_region_read_dumpit()
5900 mutex_unlock(&devlink->lock); in devlink_nl_cmd_region_read_dumpit()
5901 devlink_put(devlink); in devlink_nl_cmd_region_read_dumpit()
5909 mutex_unlock(&devlink->lock); in devlink_nl_cmd_region_read_dumpit()
5910 devlink_put(devlink); in devlink_nl_cmd_region_read_dumpit()
5998 devlink_nl_info_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_info_fill() argument
6011 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_info_fill()
6015 err = devlink->ops->info_get(devlink, &req, extack); in devlink_nl_info_fill()
6030 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_info_get_doit() local
6034 if (!devlink->ops->info_get) in devlink_nl_cmd_info_get_doit()
6041 err = devlink_nl_info_fill(msg, devlink, DEVLINK_CMD_INFO_GET, in devlink_nl_cmd_info_get_doit()
6055 struct devlink *devlink; in devlink_nl_cmd_info_get_dumpit() local
6062 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_info_get_dumpit()
6063 if (!devlink_try_get(devlink)) in devlink_nl_cmd_info_get_dumpit()
6066 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_info_get_dumpit()
6069 if (idx < start || !devlink->ops->info_get) in devlink_nl_cmd_info_get_dumpit()
6072 mutex_lock(&devlink->lock); in devlink_nl_cmd_info_get_dumpit()
6073 err = devlink_nl_info_fill(msg, devlink, DEVLINK_CMD_INFO_GET, in devlink_nl_cmd_info_get_dumpit()
6077 mutex_unlock(&devlink->lock); in devlink_nl_cmd_info_get_dumpit()
6081 devlink_put(devlink); in devlink_nl_cmd_info_get_dumpit()
6087 devlink_put(devlink); in devlink_nl_cmd_info_get_dumpit()
6692 struct devlink *devlink; member
6730 devlink_health_reporter_find_by_name(struct devlink *devlink, in devlink_health_reporter_find_by_name() argument
6733 return __devlink_health_reporter_find_by_name(&devlink->reporter_list, in devlink_health_reporter_find_by_name()
6734 &devlink->reporters_lock, in devlink_health_reporter_find_by_name()
6748 __devlink_health_reporter_create(struct devlink *devlink, in __devlink_health_reporter_create() argument
6763 reporter->devlink = devlink; in __devlink_health_reporter_create()
6795 reporter = __devlink_health_reporter_create(port->devlink, ops, in devlink_port_health_reporter_create()
6817 devlink_health_reporter_create(struct devlink *devlink, in devlink_health_reporter_create() argument
6823 mutex_lock(&devlink->reporters_lock); in devlink_health_reporter_create()
6824 if (devlink_health_reporter_find_by_name(devlink, ops->name)) { in devlink_health_reporter_create()
6829 reporter = __devlink_health_reporter_create(devlink, ops, in devlink_health_reporter_create()
6834 list_add_tail(&reporter->list, &devlink->reporter_list); in devlink_health_reporter_create()
6836 mutex_unlock(&devlink->reporters_lock); in devlink_health_reporter_create()
6872 struct mutex *lock = &reporter->devlink->reporters_lock; in devlink_health_reporter_destroy()
6902 struct devlink *devlink = reporter->devlink; in devlink_nl_health_reporter_fill() local
6910 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_health_reporter_fill()
6970 struct devlink *devlink = reporter->devlink; in devlink_recover_notify() local
6975 WARN_ON(!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)); in devlink_recover_notify()
6987 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), msg, in devlink_recover_notify()
7076 struct devlink *devlink = reporter->devlink; in devlink_health_report() local
7081 trace_devlink_health_report(devlink, reporter->ops->name, msg); in devlink_health_report()
7094 trace_devlink_health_recover_aborted(devlink, in devlink_health_report()
7120 devlink_health_reporter_get_from_attrs(struct devlink *devlink, in devlink_health_reporter_get_from_attrs() argument
7131 devlink_port = devlink_port_get_from_attrs(devlink, attrs); in devlink_health_reporter_get_from_attrs()
7133 mutex_lock(&devlink->reporters_lock); in devlink_health_reporter_get_from_attrs()
7134 reporter = devlink_health_reporter_find_by_name(devlink, reporter_name); in devlink_health_reporter_get_from_attrs()
7137 mutex_unlock(&devlink->reporters_lock); in devlink_health_reporter_get_from_attrs()
7150 devlink_health_reporter_get_from_info(struct devlink *devlink, in devlink_health_reporter_get_from_info() argument
7153 return devlink_health_reporter_get_from_attrs(devlink, info->attrs); in devlink_health_reporter_get_from_info()
7162 struct devlink *devlink; in devlink_health_reporter_get_from_cb() local
7165 devlink = devlink_get_from_attrs(sock_net(cb->skb->sk), attrs); in devlink_health_reporter_get_from_cb()
7166 if (IS_ERR(devlink)) in devlink_health_reporter_get_from_cb()
7169 reporter = devlink_health_reporter_get_from_attrs(devlink, attrs); in devlink_health_reporter_get_from_cb()
7170 devlink_put(devlink); in devlink_health_reporter_get_from_cb()
7190 trace_devlink_health_reporter_state_update(reporter->devlink, in devlink_health_reporter_state_update()
7199 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_get_doit() local
7204 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_get_doit()
7235 struct devlink *devlink; in devlink_nl_cmd_health_reporter_get_dumpit() local
7242 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_health_reporter_get_dumpit()
7243 if (!devlink_try_get(devlink)) in devlink_nl_cmd_health_reporter_get_dumpit()
7246 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_health_reporter_get_dumpit()
7249 mutex_lock(&devlink->reporters_lock); in devlink_nl_cmd_health_reporter_get_dumpit()
7250 list_for_each_entry(reporter, &devlink->reporter_list, in devlink_nl_cmd_health_reporter_get_dumpit()
7261 mutex_unlock(&devlink->reporters_lock); in devlink_nl_cmd_health_reporter_get_dumpit()
7262 devlink_put(devlink); in devlink_nl_cmd_health_reporter_get_dumpit()
7267 mutex_unlock(&devlink->reporters_lock); in devlink_nl_cmd_health_reporter_get_dumpit()
7269 devlink_put(devlink); in devlink_nl_cmd_health_reporter_get_dumpit()
7272 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_health_reporter_get_dumpit()
7273 if (!devlink_try_get(devlink)) in devlink_nl_cmd_health_reporter_get_dumpit()
7276 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_health_reporter_get_dumpit()
7279 mutex_lock(&devlink->lock); in devlink_nl_cmd_health_reporter_get_dumpit()
7280 list_for_each_entry(port, &devlink->port_list, list) { in devlink_nl_cmd_health_reporter_get_dumpit()
7294 mutex_unlock(&devlink->lock); in devlink_nl_cmd_health_reporter_get_dumpit()
7295 devlink_put(devlink); in devlink_nl_cmd_health_reporter_get_dumpit()
7302 mutex_unlock(&devlink->lock); in devlink_nl_cmd_health_reporter_get_dumpit()
7304 devlink_put(devlink); in devlink_nl_cmd_health_reporter_get_dumpit()
7317 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_set_doit() local
7321 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_set_doit()
7359 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_recover_doit() local
7363 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_recover_doit()
7376 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_diagnose_doit() local
7381 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_diagnose_doit()
7459 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_dump_clear_doit() local
7462 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_dump_clear_doit()
7481 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_test_doit() local
7485 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_test_doit()
7562 devlink_trap_policer_item_lookup(struct devlink *devlink, u32 id) in devlink_trap_policer_item_lookup() argument
7566 list_for_each_entry(policer_item, &devlink->trap_policer_list, list) { in devlink_trap_policer_item_lookup()
7575 devlink_trap_item_lookup(struct devlink *devlink, const char *name) in devlink_trap_item_lookup() argument
7579 list_for_each_entry(trap_item, &devlink->trap_list, list) { in devlink_trap_item_lookup()
7588 devlink_trap_item_get_from_info(struct devlink *devlink, in devlink_trap_item_get_from_info() argument
7597 return devlink_trap_item_lookup(devlink, nla_data(attr)); in devlink_trap_item_get_from_info()
7698 static int devlink_trap_stats_put(struct sk_buff *msg, struct devlink *devlink, in devlink_trap_stats_put() argument
7706 if (devlink->ops->trap_drop_counter_get) { in devlink_trap_stats_put()
7707 err = devlink->ops->trap_drop_counter_get(devlink, in devlink_trap_stats_put()
7720 if (devlink->ops->trap_drop_counter_get && in devlink_trap_stats_put()
7742 static int devlink_nl_trap_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_trap_fill() argument
7755 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_trap_fill()
7779 err = devlink_trap_stats_put(msg, devlink, trap_item); in devlink_nl_trap_fill()
7796 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_get_doit() local
7801 if (list_empty(&devlink->trap_list)) in devlink_nl_cmd_trap_get_doit()
7804 trap_item = devlink_trap_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_get_doit()
7814 err = devlink_nl_trap_fill(msg, devlink, trap_item, in devlink_nl_cmd_trap_get_doit()
7831 struct devlink *devlink; in devlink_nl_cmd_trap_get_dumpit() local
7838 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_trap_get_dumpit()
7839 if (!devlink_try_get(devlink)) in devlink_nl_cmd_trap_get_dumpit()
7842 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_trap_get_dumpit()
7845 mutex_lock(&devlink->lock); in devlink_nl_cmd_trap_get_dumpit()
7846 list_for_each_entry(trap_item, &devlink->trap_list, list) { in devlink_nl_cmd_trap_get_dumpit()
7851 err = devlink_nl_trap_fill(msg, devlink, trap_item, in devlink_nl_cmd_trap_get_dumpit()
7857 mutex_unlock(&devlink->lock); in devlink_nl_cmd_trap_get_dumpit()
7858 devlink_put(devlink); in devlink_nl_cmd_trap_get_dumpit()
7863 mutex_unlock(&devlink->lock); in devlink_nl_cmd_trap_get_dumpit()
7865 devlink_put(devlink); in devlink_nl_cmd_trap_get_dumpit()
7874 static int __devlink_trap_action_set(struct devlink *devlink, in __devlink_trap_action_set() argument
7887 err = devlink->ops->trap_action_set(devlink, trap_item->trap, in __devlink_trap_action_set()
7897 static int devlink_trap_action_set(struct devlink *devlink, in devlink_trap_action_set() argument
7913 return __devlink_trap_action_set(devlink, trap_item, trap_action, in devlink_trap_action_set()
7921 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_set_doit() local
7924 if (list_empty(&devlink->trap_list)) in devlink_nl_cmd_trap_set_doit()
7927 trap_item = devlink_trap_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_set_doit()
7933 return devlink_trap_action_set(devlink, trap_item, info); in devlink_nl_cmd_trap_set_doit()
7937 devlink_trap_group_item_lookup(struct devlink *devlink, const char *name) in devlink_trap_group_item_lookup() argument
7941 list_for_each_entry(group_item, &devlink->trap_group_list, list) { in devlink_trap_group_item_lookup()
7950 devlink_trap_group_item_lookup_by_id(struct devlink *devlink, u16 id) in devlink_trap_group_item_lookup_by_id() argument
7954 list_for_each_entry(group_item, &devlink->trap_group_list, list) { in devlink_trap_group_item_lookup_by_id()
7963 devlink_trap_group_item_get_from_info(struct devlink *devlink, in devlink_trap_group_item_get_from_info() argument
7972 return devlink_trap_group_item_lookup(devlink, name); in devlink_trap_group_item_get_from_info()
7976 devlink_nl_trap_group_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_trap_group_fill() argument
7988 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_trap_group_fill()
8021 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_group_get_doit() local
8026 if (list_empty(&devlink->trap_group_list)) in devlink_nl_cmd_trap_group_get_doit()
8029 group_item = devlink_trap_group_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_group_get_doit()
8039 err = devlink_nl_trap_group_fill(msg, devlink, group_item, in devlink_nl_cmd_trap_group_get_doit()
8058 struct devlink *devlink; in devlink_nl_cmd_trap_group_get_dumpit() local
8065 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_trap_group_get_dumpit()
8066 if (!devlink_try_get(devlink)) in devlink_nl_cmd_trap_group_get_dumpit()
8069 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_trap_group_get_dumpit()
8072 mutex_lock(&devlink->lock); in devlink_nl_cmd_trap_group_get_dumpit()
8073 list_for_each_entry(group_item, &devlink->trap_group_list, in devlink_nl_cmd_trap_group_get_dumpit()
8079 err = devlink_nl_trap_group_fill(msg, devlink, in devlink_nl_cmd_trap_group_get_dumpit()
8085 mutex_unlock(&devlink->lock); in devlink_nl_cmd_trap_group_get_dumpit()
8086 devlink_put(devlink); in devlink_nl_cmd_trap_group_get_dumpit()
8091 mutex_unlock(&devlink->lock); in devlink_nl_cmd_trap_group_get_dumpit()
8093 devlink_put(devlink); in devlink_nl_cmd_trap_group_get_dumpit()
8103 __devlink_trap_group_action_set(struct devlink *devlink, in __devlink_trap_group_action_set() argument
8112 if (devlink->ops->trap_group_action_set) { in __devlink_trap_group_action_set()
8113 err = devlink->ops->trap_group_action_set(devlink, group_item->group, in __devlink_trap_group_action_set()
8118 list_for_each_entry(trap_item, &devlink->trap_list, list) { in __devlink_trap_group_action_set()
8130 list_for_each_entry(trap_item, &devlink->trap_list, list) { in __devlink_trap_group_action_set()
8133 err = __devlink_trap_action_set(devlink, trap_item, in __devlink_trap_group_action_set()
8143 devlink_trap_group_action_set(struct devlink *devlink, in devlink_trap_group_action_set() argument
8159 err = __devlink_trap_group_action_set(devlink, group_item, trap_action, in devlink_trap_group_action_set()
8169 static int devlink_trap_group_set(struct devlink *devlink, in devlink_trap_group_set() argument
8182 if (!devlink->ops->trap_group_set) in devlink_trap_group_set()
8190 policer_item = devlink_trap_policer_item_lookup(devlink, in devlink_trap_group_set()
8199 err = devlink->ops->trap_group_set(devlink, group_item->group, policer, in devlink_trap_group_set()
8213 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_group_set_doit() local
8218 if (list_empty(&devlink->trap_group_list)) in devlink_nl_cmd_trap_group_set_doit()
8221 group_item = devlink_trap_group_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_group_set_doit()
8227 err = devlink_trap_group_action_set(devlink, group_item, info, in devlink_nl_cmd_trap_group_set_doit()
8232 err = devlink_trap_group_set(devlink, group_item, info); in devlink_nl_cmd_trap_group_set_doit()
8245 devlink_trap_policer_item_get_from_info(struct devlink *devlink, in devlink_trap_policer_item_get_from_info() argument
8254 return devlink_trap_policer_item_lookup(devlink, id); in devlink_trap_policer_item_get_from_info()
8258 devlink_trap_policer_stats_put(struct sk_buff *msg, struct devlink *devlink, in devlink_trap_policer_stats_put() argument
8265 if (!devlink->ops->trap_policer_counter_get) in devlink_trap_policer_stats_put()
8268 err = devlink->ops->trap_policer_counter_get(devlink, policer, &drops); in devlink_trap_policer_stats_put()
8290 devlink_nl_trap_policer_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_trap_policer_fill() argument
8302 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_trap_policer_fill()
8317 err = devlink_trap_policer_stats_put(msg, devlink, in devlink_nl_trap_policer_fill()
8336 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_policer_get_doit() local
8340 if (list_empty(&devlink->trap_policer_list)) in devlink_nl_cmd_trap_policer_get_doit()
8343 policer_item = devlink_trap_policer_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_policer_get_doit()
8353 err = devlink_nl_trap_policer_fill(msg, devlink, policer_item, in devlink_nl_cmd_trap_policer_get_doit()
8372 struct devlink *devlink; in devlink_nl_cmd_trap_policer_get_dumpit() local
8379 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_nl_cmd_trap_policer_get_dumpit()
8380 if (!devlink_try_get(devlink)) in devlink_nl_cmd_trap_policer_get_dumpit()
8383 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_trap_policer_get_dumpit()
8386 mutex_lock(&devlink->lock); in devlink_nl_cmd_trap_policer_get_dumpit()
8387 list_for_each_entry(policer_item, &devlink->trap_policer_list, in devlink_nl_cmd_trap_policer_get_dumpit()
8393 err = devlink_nl_trap_policer_fill(msg, devlink, in devlink_nl_cmd_trap_policer_get_dumpit()
8399 mutex_unlock(&devlink->lock); in devlink_nl_cmd_trap_policer_get_dumpit()
8400 devlink_put(devlink); in devlink_nl_cmd_trap_policer_get_dumpit()
8405 mutex_unlock(&devlink->lock); in devlink_nl_cmd_trap_policer_get_dumpit()
8407 devlink_put(devlink); in devlink_nl_cmd_trap_policer_get_dumpit()
8417 devlink_trap_policer_set(struct devlink *devlink, in devlink_trap_policer_set() argument
8455 err = devlink->ops->trap_policer_set(devlink, policer_item->policer, in devlink_trap_policer_set()
8471 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_policer_set_doit() local
8473 if (list_empty(&devlink->trap_policer_list)) in devlink_nl_cmd_trap_policer_set_doit()
8476 if (!devlink->ops->trap_policer_set) in devlink_nl_cmd_trap_policer_set_doit()
8479 policer_item = devlink_trap_policer_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_policer_set_doit()
8485 return devlink_trap_policer_set(devlink, policer_item, info); in devlink_nl_cmd_trap_policer_set_doit()
8956 void devlink_set_features(struct devlink *devlink, u64 features) in devlink_set_features() argument
8958 ASSERT_DEVLINK_NOT_REGISTERED(devlink); in devlink_set_features()
8961 !devlink_reload_supported(devlink->ops)); in devlink_set_features()
8962 devlink->features = features; in devlink_set_features()
8978 struct devlink *devlink_alloc_ns(const struct devlink_ops *ops, in devlink_alloc_ns()
8982 struct devlink *devlink; in devlink_alloc_ns() local
8990 devlink = kzalloc(sizeof(*devlink) + priv_size, GFP_KERNEL); in devlink_alloc_ns()
8991 if (!devlink) in devlink_alloc_ns()
8994 ret = xa_alloc_cyclic(&devlinks, &devlink->index, devlink, xa_limit_31b, in devlink_alloc_ns()
8997 kfree(devlink); in devlink_alloc_ns()
9001 devlink->dev = dev; in devlink_alloc_ns()
9002 devlink->ops = ops; in devlink_alloc_ns()
9003 xa_init_flags(&devlink->snapshot_ids, XA_FLAGS_ALLOC); in devlink_alloc_ns()
9004 write_pnet(&devlink->_net, net); in devlink_alloc_ns()
9005 INIT_LIST_HEAD(&devlink->port_list); in devlink_alloc_ns()
9006 INIT_LIST_HEAD(&devlink->rate_list); in devlink_alloc_ns()
9007 INIT_LIST_HEAD(&devlink->sb_list); in devlink_alloc_ns()
9008 INIT_LIST_HEAD_RCU(&devlink->dpipe_table_list); in devlink_alloc_ns()
9009 INIT_LIST_HEAD(&devlink->resource_list); in devlink_alloc_ns()
9010 INIT_LIST_HEAD(&devlink->param_list); in devlink_alloc_ns()
9011 INIT_LIST_HEAD(&devlink->region_list); in devlink_alloc_ns()
9012 INIT_LIST_HEAD(&devlink->reporter_list); in devlink_alloc_ns()
9013 INIT_LIST_HEAD(&devlink->trap_list); in devlink_alloc_ns()
9014 INIT_LIST_HEAD(&devlink->trap_group_list); in devlink_alloc_ns()
9015 INIT_LIST_HEAD(&devlink->trap_policer_list); in devlink_alloc_ns()
9016 mutex_init(&devlink->lock); in devlink_alloc_ns()
9017 mutex_init(&devlink->reporters_lock); in devlink_alloc_ns()
9018 refcount_set(&devlink->refcount, 1); in devlink_alloc_ns()
9019 init_completion(&devlink->comp); in devlink_alloc_ns()
9021 return devlink; in devlink_alloc_ns()
9026 devlink_trap_policer_notify(struct devlink *devlink,
9030 devlink_trap_group_notify(struct devlink *devlink,
9033 static void devlink_trap_notify(struct devlink *devlink,
9037 static void devlink_notify_register(struct devlink *devlink) in devlink_notify_register() argument
9047 devlink_notify(devlink, DEVLINK_CMD_NEW); in devlink_notify_register()
9048 list_for_each_entry(devlink_port, &devlink->port_list, list) in devlink_notify_register()
9051 list_for_each_entry(policer_item, &devlink->trap_policer_list, list) in devlink_notify_register()
9052 devlink_trap_policer_notify(devlink, policer_item, in devlink_notify_register()
9055 list_for_each_entry(group_item, &devlink->trap_group_list, list) in devlink_notify_register()
9056 devlink_trap_group_notify(devlink, group_item, in devlink_notify_register()
9059 list_for_each_entry(trap_item, &devlink->trap_list, list) in devlink_notify_register()
9060 devlink_trap_notify(devlink, trap_item, DEVLINK_CMD_TRAP_NEW); in devlink_notify_register()
9062 list_for_each_entry(rate_node, &devlink->rate_list, list) in devlink_notify_register()
9065 list_for_each_entry(region, &devlink->region_list, list) in devlink_notify_register()
9068 list_for_each_entry(param_item, &devlink->param_list, list) in devlink_notify_register()
9069 devlink_param_notify(devlink, 0, param_item, in devlink_notify_register()
9073 static void devlink_notify_unregister(struct devlink *devlink) in devlink_notify_unregister() argument
9083 list_for_each_entry_reverse(param_item, &devlink->param_list, list) in devlink_notify_unregister()
9084 devlink_param_notify(devlink, 0, param_item, in devlink_notify_unregister()
9087 list_for_each_entry_reverse(region, &devlink->region_list, list) in devlink_notify_unregister()
9090 list_for_each_entry_reverse(rate_node, &devlink->rate_list, list) in devlink_notify_unregister()
9093 list_for_each_entry_reverse(trap_item, &devlink->trap_list, list) in devlink_notify_unregister()
9094 devlink_trap_notify(devlink, trap_item, DEVLINK_CMD_TRAP_DEL); in devlink_notify_unregister()
9096 list_for_each_entry_reverse(group_item, &devlink->trap_group_list, list) in devlink_notify_unregister()
9097 devlink_trap_group_notify(devlink, group_item, in devlink_notify_unregister()
9099 list_for_each_entry_reverse(policer_item, &devlink->trap_policer_list, in devlink_notify_unregister()
9101 devlink_trap_policer_notify(devlink, policer_item, in devlink_notify_unregister()
9104 list_for_each_entry_reverse(devlink_port, &devlink->port_list, list) in devlink_notify_unregister()
9106 devlink_notify(devlink, DEVLINK_CMD_DEL); in devlink_notify_unregister()
9114 void devlink_register(struct devlink *devlink) in devlink_register() argument
9116 ASSERT_DEVLINK_NOT_REGISTERED(devlink); in devlink_register()
9120 xa_set_mark(&devlinks, devlink->index, DEVLINK_REGISTERED); in devlink_register()
9121 devlink_notify_register(devlink); in devlink_register()
9131 void devlink_unregister(struct devlink *devlink) in devlink_unregister() argument
9133 ASSERT_DEVLINK_REGISTERED(devlink); in devlink_unregister()
9136 devlink_put(devlink); in devlink_unregister()
9137 wait_for_completion(&devlink->comp); in devlink_unregister()
9140 devlink_notify_unregister(devlink); in devlink_unregister()
9141 xa_clear_mark(&devlinks, devlink->index, DEVLINK_REGISTERED); in devlink_unregister()
9151 void devlink_free(struct devlink *devlink) in devlink_free() argument
9153 ASSERT_DEVLINK_NOT_REGISTERED(devlink); in devlink_free()
9155 mutex_destroy(&devlink->reporters_lock); in devlink_free()
9156 mutex_destroy(&devlink->lock); in devlink_free()
9157 WARN_ON(!list_empty(&devlink->trap_policer_list)); in devlink_free()
9158 WARN_ON(!list_empty(&devlink->trap_group_list)); in devlink_free()
9159 WARN_ON(!list_empty(&devlink->trap_list)); in devlink_free()
9160 WARN_ON(!list_empty(&devlink->reporter_list)); in devlink_free()
9161 WARN_ON(!list_empty(&devlink->region_list)); in devlink_free()
9162 WARN_ON(!list_empty(&devlink->param_list)); in devlink_free()
9163 WARN_ON(!list_empty(&devlink->resource_list)); in devlink_free()
9164 WARN_ON(!list_empty(&devlink->dpipe_table_list)); in devlink_free()
9165 WARN_ON(!list_empty(&devlink->sb_list)); in devlink_free()
9166 WARN_ON(!list_empty(&devlink->rate_list)); in devlink_free()
9167 WARN_ON(!list_empty(&devlink->port_list)); in devlink_free()
9169 xa_destroy(&devlink->snapshot_ids); in devlink_free()
9170 xa_erase(&devlinks, devlink->index); in devlink_free()
9172 kfree(devlink); in devlink_free()
9222 int devlink_port_register(struct devlink *devlink, in devlink_port_register() argument
9226 mutex_lock(&devlink->lock); in devlink_port_register()
9227 if (devlink_port_index_exists(devlink, port_index)) { in devlink_port_register()
9228 mutex_unlock(&devlink->lock); in devlink_port_register()
9232 WARN_ON(devlink_port->devlink); in devlink_port_register()
9233 devlink_port->devlink = devlink; in devlink_port_register()
9238 list_add_tail(&devlink_port->list, &devlink->port_list); in devlink_port_register()
9241 mutex_unlock(&devlink->lock); in devlink_port_register()
9256 struct devlink *devlink = devlink_port->devlink; in devlink_port_unregister() local
9260 mutex_lock(&devlink->lock); in devlink_port_unregister()
9262 mutex_unlock(&devlink->lock); in devlink_port_unregister()
9273 if (WARN_ON(!devlink_port->devlink)) in __devlink_port_type_set()
9332 dev_warn(devlink_port->devlink->dev, in devlink_port_type_eth_set()
9393 if (WARN_ON(devlink_port->devlink)) in devlink_port_attrs_set()
9417 if (WARN_ON(devlink_port->devlink)) in devlink_port_attrs_pci_pf_set()
9444 if (WARN_ON(devlink_port->devlink)) in devlink_port_attrs_pci_vf_set()
9472 if (WARN_ON(devlink_port->devlink)) in devlink_port_attrs_pci_sf_set()
9501 struct devlink *devlink = devlink_port->devlink; in devlink_rate_leaf_create() local
9508 mutex_lock(&devlink->lock); in devlink_rate_leaf_create()
9511 devlink_rate->devlink = devlink; in devlink_rate_leaf_create()
9514 list_add_tail(&devlink_rate->list, &devlink->rate_list); in devlink_rate_leaf_create()
9517 mutex_unlock(&devlink->lock); in devlink_rate_leaf_create()
9533 struct devlink *devlink = devlink_port->devlink; in devlink_rate_leaf_destroy() local
9538 mutex_lock(&devlink->lock); in devlink_rate_leaf_destroy()
9544 mutex_unlock(&devlink->lock); in devlink_rate_leaf_destroy()
9559 void devlink_rate_nodes_destroy(struct devlink *devlink) in devlink_rate_nodes_destroy() argument
9562 const struct devlink_ops *ops = devlink->ops; in devlink_rate_nodes_destroy()
9564 mutex_lock(&devlink->lock); in devlink_rate_nodes_destroy()
9565 list_for_each_entry(devlink_rate, &devlink->rate_list, list) { in devlink_rate_nodes_destroy()
9577 list_for_each_entry_safe(devlink_rate, tmp, &devlink->rate_list, list) { in devlink_rate_nodes_destroy()
9585 mutex_unlock(&devlink->lock); in devlink_rate_nodes_destroy()
9655 int devlink_sb_register(struct devlink *devlink, unsigned int sb_index, in devlink_sb_register() argument
9663 mutex_lock(&devlink->lock); in devlink_sb_register()
9664 if (devlink_sb_index_exists(devlink, sb_index)) { in devlink_sb_register()
9680 list_add_tail(&devlink_sb->list, &devlink->sb_list); in devlink_sb_register()
9682 mutex_unlock(&devlink->lock); in devlink_sb_register()
9687 void devlink_sb_unregister(struct devlink *devlink, unsigned int sb_index) in devlink_sb_unregister() argument
9691 mutex_lock(&devlink->lock); in devlink_sb_unregister()
9692 devlink_sb = devlink_sb_get_by_index(devlink, sb_index); in devlink_sb_unregister()
9695 mutex_unlock(&devlink->lock); in devlink_sb_unregister()
9708 int devlink_dpipe_headers_register(struct devlink *devlink, in devlink_dpipe_headers_register() argument
9711 mutex_lock(&devlink->lock); in devlink_dpipe_headers_register()
9712 devlink->dpipe_headers = dpipe_headers; in devlink_dpipe_headers_register()
9713 mutex_unlock(&devlink->lock); in devlink_dpipe_headers_register()
9725 void devlink_dpipe_headers_unregister(struct devlink *devlink) in devlink_dpipe_headers_unregister() argument
9727 mutex_lock(&devlink->lock); in devlink_dpipe_headers_unregister()
9728 devlink->dpipe_headers = NULL; in devlink_dpipe_headers_unregister()
9729 mutex_unlock(&devlink->lock); in devlink_dpipe_headers_unregister()
9747 bool devlink_dpipe_table_counter_enabled(struct devlink *devlink, in devlink_dpipe_table_counter_enabled() argument
9754 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, in devlink_dpipe_table_counter_enabled()
9755 table_name, devlink); in devlink_dpipe_table_counter_enabled()
9773 int devlink_dpipe_table_register(struct devlink *devlink, in devlink_dpipe_table_register() argument
9784 mutex_lock(&devlink->lock); in devlink_dpipe_table_register()
9786 if (devlink_dpipe_table_find(&devlink->dpipe_table_list, table_name, in devlink_dpipe_table_register()
9787 devlink)) { in devlink_dpipe_table_register()
9803 list_add_tail_rcu(&table->list, &devlink->dpipe_table_list); in devlink_dpipe_table_register()
9805 mutex_unlock(&devlink->lock); in devlink_dpipe_table_register()
9816 void devlink_dpipe_table_unregister(struct devlink *devlink, in devlink_dpipe_table_unregister() argument
9821 mutex_lock(&devlink->lock); in devlink_dpipe_table_unregister()
9822 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, in devlink_dpipe_table_unregister()
9823 table_name, devlink); in devlink_dpipe_table_unregister()
9827 mutex_unlock(&devlink->lock); in devlink_dpipe_table_unregister()
9831 mutex_unlock(&devlink->lock); in devlink_dpipe_table_unregister()
9849 int devlink_resource_register(struct devlink *devlink, in devlink_resource_register() argument
9863 mutex_lock(&devlink->lock); in devlink_resource_register()
9864 resource = devlink_resource_find(devlink, NULL, resource_id); in devlink_resource_register()
9877 resource_list = &devlink->resource_list; in devlink_resource_register()
9881 parent_resource = devlink_resource_find(devlink, NULL, in devlink_resource_register()
9903 mutex_unlock(&devlink->lock); in devlink_resource_register()
9914 void devlink_resources_unregister(struct devlink *devlink, in devlink_resources_unregister() argument
9923 resource_list = &devlink->resource_list; in devlink_resources_unregister()
9926 mutex_lock(&devlink->lock); in devlink_resources_unregister()
9929 devlink_resources_unregister(devlink, child_resource); in devlink_resources_unregister()
9935 mutex_unlock(&devlink->lock); in devlink_resources_unregister()
9946 int devlink_resource_size_get(struct devlink *devlink, in devlink_resource_size_get() argument
9953 mutex_lock(&devlink->lock); in devlink_resource_size_get()
9954 resource = devlink_resource_find(devlink, NULL, resource_id); in devlink_resource_size_get()
9962 mutex_unlock(&devlink->lock); in devlink_resource_size_get()
9975 int devlink_dpipe_table_resource_set(struct devlink *devlink, in devlink_dpipe_table_resource_set() argument
9982 mutex_lock(&devlink->lock); in devlink_dpipe_table_resource_set()
9983 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, in devlink_dpipe_table_resource_set()
9984 table_name, devlink); in devlink_dpipe_table_resource_set()
9993 mutex_unlock(&devlink->lock); in devlink_dpipe_table_resource_set()
10006 void devlink_resource_occ_get_register(struct devlink *devlink, in devlink_resource_occ_get_register() argument
10013 mutex_lock(&devlink->lock); in devlink_resource_occ_get_register()
10014 resource = devlink_resource_find(devlink, NULL, resource_id); in devlink_resource_occ_get_register()
10022 mutex_unlock(&devlink->lock); in devlink_resource_occ_get_register()
10032 void devlink_resource_occ_get_unregister(struct devlink *devlink, in devlink_resource_occ_get_unregister() argument
10037 mutex_lock(&devlink->lock); in devlink_resource_occ_get_unregister()
10038 resource = devlink_resource_find(devlink, NULL, resource_id); in devlink_resource_occ_get_unregister()
10046 mutex_unlock(&devlink->lock); in devlink_resource_occ_get_unregister()
10069 int devlink_params_register(struct devlink *devlink, in devlink_params_register() argument
10076 ASSERT_DEVLINK_NOT_REGISTERED(devlink); in devlink_params_register()
10079 err = devlink_param_register(devlink, param); in devlink_params_register()
10090 devlink_param_unregister(devlink, param); in devlink_params_register()
10101 void devlink_params_unregister(struct devlink *devlink, in devlink_params_unregister() argument
10108 ASSERT_DEVLINK_NOT_REGISTERED(devlink); in devlink_params_unregister()
10111 devlink_param_unregister(devlink, param); in devlink_params_unregister()
10124 int devlink_param_register(struct devlink *devlink, in devlink_param_register() argument
10129 ASSERT_DEVLINK_NOT_REGISTERED(devlink); in devlink_param_register()
10132 WARN_ON(devlink_param_find_by_name(&devlink->param_list, param->name)); in devlink_param_register()
10145 list_add_tail(&param_item->list, &devlink->param_list); in devlink_param_register()
10155 void devlink_param_unregister(struct devlink *devlink, in devlink_param_unregister() argument
10160 ASSERT_DEVLINK_NOT_REGISTERED(devlink); in devlink_param_unregister()
10163 devlink_param_find_by_name(&devlink->param_list, param->name); in devlink_param_unregister()
10181 int devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id, in devlink_param_driverinit_value_get() argument
10186 if (!devlink_reload_supported(devlink->ops)) in devlink_param_driverinit_value_get()
10189 param_item = devlink_param_find_by_id(&devlink->param_list, param_id); in devlink_param_driverinit_value_get()
10219 int devlink_param_driverinit_value_set(struct devlink *devlink, u32 param_id, in devlink_param_driverinit_value_set() argument
10224 ASSERT_DEVLINK_NOT_REGISTERED(devlink); in devlink_param_driverinit_value_set()
10226 param_item = devlink_param_find_by_id(&devlink->param_list, param_id); in devlink_param_driverinit_value_set()
10255 void devlink_param_value_changed(struct devlink *devlink, u32 param_id) in devlink_param_value_changed() argument
10259 param_item = devlink_param_find_by_id(&devlink->param_list, param_id); in devlink_param_value_changed()
10262 devlink_param_notify(devlink, 0, param_item, DEVLINK_CMD_PARAM_NEW); in devlink_param_value_changed()
10275 devlink_region_create(struct devlink *devlink, in devlink_region_create() argument
10285 mutex_lock(&devlink->lock); in devlink_region_create()
10287 if (devlink_region_get_by_name(devlink, ops->name)) { in devlink_region_create()
10298 region->devlink = devlink; in devlink_region_create()
10303 list_add_tail(&region->list, &devlink->region_list); in devlink_region_create()
10306 mutex_unlock(&devlink->lock); in devlink_region_create()
10310 mutex_unlock(&devlink->lock); in devlink_region_create()
10328 struct devlink *devlink = port->devlink; in devlink_port_region_create() local
10335 mutex_lock(&devlink->lock); in devlink_port_region_create()
10348 region->devlink = devlink; in devlink_port_region_create()
10357 mutex_unlock(&devlink->lock); in devlink_port_region_create()
10361 mutex_unlock(&devlink->lock); in devlink_port_region_create()
10373 struct devlink *devlink = region->devlink; in devlink_region_destroy() local
10376 mutex_lock(&devlink->lock); in devlink_region_destroy()
10385 mutex_unlock(&devlink->lock); in devlink_region_destroy()
10405 int devlink_region_snapshot_id_get(struct devlink *devlink, u32 *id) in devlink_region_snapshot_id_get() argument
10409 mutex_lock(&devlink->lock); in devlink_region_snapshot_id_get()
10410 err = __devlink_region_snapshot_id_get(devlink, id); in devlink_region_snapshot_id_get()
10411 mutex_unlock(&devlink->lock); in devlink_region_snapshot_id_get()
10427 void devlink_region_snapshot_id_put(struct devlink *devlink, u32 id) in devlink_region_snapshot_id_put() argument
10429 mutex_lock(&devlink->lock); in devlink_region_snapshot_id_put()
10430 __devlink_snapshot_id_decrement(devlink, id); in devlink_region_snapshot_id_put()
10431 mutex_unlock(&devlink->lock); in devlink_region_snapshot_id_put()
10450 struct devlink *devlink = region->devlink; in devlink_region_snapshot_create() local
10453 mutex_lock(&devlink->lock); in devlink_region_snapshot_create()
10455 mutex_unlock(&devlink->lock); in devlink_region_snapshot_create()
10675 devlink_trap_group_notify(struct devlink *devlink, in devlink_trap_group_notify() argument
10684 if (!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)) in devlink_trap_group_notify()
10691 err = devlink_nl_trap_group_fill(msg, devlink, group_item, cmd, 0, 0, in devlink_trap_group_notify()
10698 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_trap_group_notify()
10703 devlink_trap_item_group_link(struct devlink *devlink, in devlink_trap_item_group_link() argument
10709 group_item = devlink_trap_group_item_lookup_by_id(devlink, group_id); in devlink_trap_item_group_link()
10718 static void devlink_trap_notify(struct devlink *devlink, in devlink_trap_notify() argument
10727 if (!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)) in devlink_trap_notify()
10734 err = devlink_nl_trap_fill(msg, devlink, trap_item, cmd, 0, 0, 0); in devlink_trap_notify()
10740 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_trap_notify()
10745 devlink_trap_register(struct devlink *devlink, in devlink_trap_register() argument
10751 if (devlink_trap_item_lookup(devlink, trap->name)) in devlink_trap_register()
10768 err = devlink_trap_item_group_link(devlink, trap_item); in devlink_trap_register()
10772 err = devlink->ops->trap_init(devlink, trap, trap_item); in devlink_trap_register()
10776 list_add_tail(&trap_item->list, &devlink->trap_list); in devlink_trap_register()
10777 devlink_trap_notify(devlink, trap_item, DEVLINK_CMD_TRAP_NEW); in devlink_trap_register()
10789 static void devlink_trap_unregister(struct devlink *devlink, in devlink_trap_unregister() argument
10794 trap_item = devlink_trap_item_lookup(devlink, trap->name); in devlink_trap_unregister()
10798 devlink_trap_notify(devlink, trap_item, DEVLINK_CMD_TRAP_DEL); in devlink_trap_unregister()
10800 if (devlink->ops->trap_fini) in devlink_trap_unregister()
10801 devlink->ops->trap_fini(devlink, trap, trap_item); in devlink_trap_unregister()
10806 static void devlink_trap_disable(struct devlink *devlink, in devlink_trap_disable() argument
10811 trap_item = devlink_trap_item_lookup(devlink, trap->name); in devlink_trap_disable()
10815 devlink->ops->trap_action_set(devlink, trap, DEVLINK_TRAP_ACTION_DROP, in devlink_trap_disable()
10829 int devlink_traps_register(struct devlink *devlink, in devlink_traps_register() argument
10835 if (!devlink->ops->trap_init || !devlink->ops->trap_action_set) in devlink_traps_register()
10838 mutex_lock(&devlink->lock); in devlink_traps_register()
10846 err = devlink_trap_register(devlink, trap, priv); in devlink_traps_register()
10850 mutex_unlock(&devlink->lock); in devlink_traps_register()
10857 devlink_trap_unregister(devlink, &traps[i]); in devlink_traps_register()
10858 mutex_unlock(&devlink->lock); in devlink_traps_register()
10869 void devlink_traps_unregister(struct devlink *devlink, in devlink_traps_unregister() argument
10875 mutex_lock(&devlink->lock); in devlink_traps_unregister()
10880 devlink_trap_disable(devlink, &traps[i]); in devlink_traps_unregister()
10883 devlink_trap_unregister(devlink, &traps[i]); in devlink_traps_unregister()
10884 mutex_unlock(&devlink->lock); in devlink_traps_unregister()
10926 void devlink_trap_report(struct devlink *devlink, struct sk_buff *skb, in devlink_trap_report() argument
10941 trace_devlink_trap_report(devlink, skb, &metadata); in devlink_trap_report()
10961 devlink_trap_group_item_policer_link(struct devlink *devlink, in devlink_trap_group_item_policer_link() argument
10970 policer_item = devlink_trap_policer_item_lookup(devlink, policer_id); in devlink_trap_group_item_policer_link()
10980 devlink_trap_group_register(struct devlink *devlink, in devlink_trap_group_register() argument
10986 if (devlink_trap_group_item_lookup(devlink, group->name)) in devlink_trap_group_register()
11001 err = devlink_trap_group_item_policer_link(devlink, group_item); in devlink_trap_group_register()
11005 if (devlink->ops->trap_group_init) { in devlink_trap_group_register()
11006 err = devlink->ops->trap_group_init(devlink, group); in devlink_trap_group_register()
11011 list_add_tail(&group_item->list, &devlink->trap_group_list); in devlink_trap_group_register()
11012 devlink_trap_group_notify(devlink, group_item, in devlink_trap_group_register()
11026 devlink_trap_group_unregister(struct devlink *devlink, in devlink_trap_group_unregister() argument
11031 group_item = devlink_trap_group_item_lookup(devlink, group->name); in devlink_trap_group_unregister()
11035 devlink_trap_group_notify(devlink, group_item, in devlink_trap_group_unregister()
11050 int devlink_trap_groups_register(struct devlink *devlink, in devlink_trap_groups_register() argument
11056 mutex_lock(&devlink->lock); in devlink_trap_groups_register()
11064 err = devlink_trap_group_register(devlink, group); in devlink_trap_groups_register()
11068 mutex_unlock(&devlink->lock); in devlink_trap_groups_register()
11075 devlink_trap_group_unregister(devlink, &groups[i]); in devlink_trap_groups_register()
11076 mutex_unlock(&devlink->lock); in devlink_trap_groups_register()
11087 void devlink_trap_groups_unregister(struct devlink *devlink, in devlink_trap_groups_unregister() argument
11093 mutex_lock(&devlink->lock); in devlink_trap_groups_unregister()
11095 devlink_trap_group_unregister(devlink, &groups[i]); in devlink_trap_groups_unregister()
11096 mutex_unlock(&devlink->lock); in devlink_trap_groups_unregister()
11101 devlink_trap_policer_notify(struct devlink *devlink, in devlink_trap_policer_notify() argument
11110 if (!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED)) in devlink_trap_policer_notify()
11117 err = devlink_nl_trap_policer_fill(msg, devlink, policer_item, cmd, 0, in devlink_trap_policer_notify()
11124 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_trap_policer_notify()
11129 devlink_trap_policer_register(struct devlink *devlink, in devlink_trap_policer_register() argument
11135 if (devlink_trap_policer_item_lookup(devlink, policer->id)) in devlink_trap_policer_register()
11146 if (devlink->ops->trap_policer_init) { in devlink_trap_policer_register()
11147 err = devlink->ops->trap_policer_init(devlink, policer); in devlink_trap_policer_register()
11152 list_add_tail(&policer_item->list, &devlink->trap_policer_list); in devlink_trap_policer_register()
11153 devlink_trap_policer_notify(devlink, policer_item, in devlink_trap_policer_register()
11164 devlink_trap_policer_unregister(struct devlink *devlink, in devlink_trap_policer_unregister() argument
11169 policer_item = devlink_trap_policer_item_lookup(devlink, policer->id); in devlink_trap_policer_unregister()
11173 devlink_trap_policer_notify(devlink, policer_item, in devlink_trap_policer_unregister()
11176 if (devlink->ops->trap_policer_fini) in devlink_trap_policer_unregister()
11177 devlink->ops->trap_policer_fini(devlink, policer); in devlink_trap_policer_unregister()
11190 devlink_trap_policers_register(struct devlink *devlink, in devlink_trap_policers_register() argument
11196 mutex_lock(&devlink->lock); in devlink_trap_policers_register()
11207 err = devlink_trap_policer_register(devlink, policer); in devlink_trap_policers_register()
11211 mutex_unlock(&devlink->lock); in devlink_trap_policers_register()
11218 devlink_trap_policer_unregister(devlink, &policers[i]); in devlink_trap_policers_register()
11219 mutex_unlock(&devlink->lock); in devlink_trap_policers_register()
11231 devlink_trap_policers_unregister(struct devlink *devlink, in devlink_trap_policers_unregister() argument
11237 mutex_lock(&devlink->lock); in devlink_trap_policers_unregister()
11239 devlink_trap_policer_unregister(devlink, &policers[i]); in devlink_trap_policers_unregister()
11240 mutex_unlock(&devlink->lock); in devlink_trap_policers_unregister()
11244 static void __devlink_compat_running_version(struct devlink *devlink, in __devlink_compat_running_version() argument
11257 err = devlink->ops->info_get(devlink, &req, NULL); in __devlink_compat_running_version()
11288 void devlink_compat_running_version(struct devlink *devlink, in devlink_compat_running_version() argument
11291 if (!devlink->ops->info_get) in devlink_compat_running_version()
11294 mutex_lock(&devlink->lock); in devlink_compat_running_version()
11295 __devlink_compat_running_version(devlink, buf, len); in devlink_compat_running_version()
11296 mutex_unlock(&devlink->lock); in devlink_compat_running_version()
11299 int devlink_compat_flash_update(struct devlink *devlink, const char *file_name) in devlink_compat_flash_update() argument
11304 if (!devlink->ops->flash_update) in devlink_compat_flash_update()
11307 ret = request_firmware(&params.fw, file_name, devlink->dev); in devlink_compat_flash_update()
11311 mutex_lock(&devlink->lock); in devlink_compat_flash_update()
11312 devlink_flash_update_begin_notify(devlink); in devlink_compat_flash_update()
11313 ret = devlink->ops->flash_update(devlink, &params, NULL); in devlink_compat_flash_update()
11314 devlink_flash_update_end_notify(devlink); in devlink_compat_flash_update()
11315 mutex_unlock(&devlink->lock); in devlink_compat_flash_update()
11360 struct devlink *devlink; in devlink_pernet_pre_exit() local
11369 xa_for_each_marked(&devlinks, index, devlink, DEVLINK_REGISTERED) { in devlink_pernet_pre_exit()
11370 if (!devlink_try_get(devlink)) in devlink_pernet_pre_exit()
11373 if (!net_eq(devlink_net(devlink), net)) in devlink_pernet_pre_exit()
11376 WARN_ON(!(devlink->features & DEVLINK_F_RELOAD)); in devlink_pernet_pre_exit()
11377 err = devlink_reload(devlink, &init_net, in devlink_pernet_pre_exit()
11384 devlink_put(devlink); in devlink_pernet_pre_exit()