Lines Matching defs:devlink

3  * net/core/devlink.c - Network physical/parent device Netlink interface
29 #include <net/devlink.h>
31 #include <trace/events/devlink.h>
97 * It also guards devlink devices list and it is taken when
102 struct net *devlink_net(const struct devlink *devlink)
104 return read_pnet(&devlink->_net);
108 static void __devlink_net_set(struct devlink *devlink, struct net *net)
110 write_pnet(&devlink->_net, net);
113 void devlink_net_set(struct devlink *devlink, struct net *net)
115 if (WARN_ON(devlink->registered))
117 __devlink_net_set(devlink, net);
121 static struct devlink *devlink_get_from_attrs(struct net *net,
124 struct devlink *devlink;
136 list_for_each_entry(devlink, &devlink_list, list) {
137 if (strcmp(devlink->dev->bus->name, busname) == 0 &&
138 strcmp(dev_name(devlink->dev), devname) == 0 &&
139 net_eq(devlink_net(devlink), net))
140 return devlink;
146 static struct devlink *devlink_get_from_info(struct genl_info *info)
151 static struct devlink_port *devlink_port_get_by_index(struct devlink *devlink,
156 list_for_each_entry(devlink_port, &devlink->port_list, list) {
163 static bool devlink_port_index_exists(struct devlink *devlink,
166 return devlink_port_get_by_index(devlink, port_index);
169 static struct devlink_port *devlink_port_get_from_attrs(struct devlink *devlink,
176 devlink_port = devlink_port_get_by_index(devlink, port_index);
184 static struct devlink_port *devlink_port_get_from_info(struct devlink *devlink,
187 return devlink_port_get_from_attrs(devlink, info->attrs);
205 static struct devlink_sb *devlink_sb_get_by_index(struct devlink *devlink,
210 list_for_each_entry(devlink_sb, &devlink->sb_list, list) {
217 static bool devlink_sb_index_exists(struct devlink *devlink,
220 return devlink_sb_get_by_index(devlink, sb_index);
223 static struct devlink_sb *devlink_sb_get_from_attrs(struct devlink *devlink,
230 devlink_sb = devlink_sb_get_by_index(devlink, sb_index);
238 static struct devlink_sb *devlink_sb_get_from_info(struct devlink *devlink,
241 return devlink_sb_get_from_attrs(devlink, info->attrs);
349 struct devlink *devlink;
370 devlink_region_get_by_name(struct devlink *devlink, const char *region_name)
374 list_for_each_entry(region, &devlink->region_list, list)
409 /* The per devlink instance lock is taken by default in the pre-doit
411 * devlink lock is taken and protects from disruption by user-calls.
419 struct devlink *devlink;
423 devlink = devlink_get_from_info(info);
424 if (IS_ERR(devlink)) {
426 return PTR_ERR(devlink);
429 mutex_lock(&devlink->lock);
430 info->user_ptr[0] = devlink;
432 devlink_port = devlink_port_get_from_info(devlink, info);
439 devlink_port = devlink_port_get_from_info(devlink, info);
447 mutex_unlock(&devlink->lock);
455 struct devlink *devlink;
457 devlink = info->user_ptr[0];
459 mutex_unlock(&devlink->lock);
473 static int devlink_nl_put_handle(struct sk_buff *msg, struct devlink *devlink)
475 if (nla_put_string(msg, DEVLINK_ATTR_BUS_NAME, devlink->dev->bus->name))
477 if (nla_put_string(msg, DEVLINK_ATTR_DEV_NAME, dev_name(devlink->dev)))
509 devlink_reload_action_is_supported(struct devlink *devlink, enum devlink_reload_action action)
511 return test_bit(action, &devlink->ops->reload_actions);
515 devlink_reload_limit_is_supported(struct devlink *devlink, enum devlink_reload_limit limit)
517 return test_bit(limit, &devlink->ops->reload_limits);
540 static int devlink_reload_stats_put(struct sk_buff *msg, struct devlink *devlink, bool is_remote)
556 !devlink_reload_action_is_supported(devlink, i)) ||
576 !devlink_reload_limit_is_supported(devlink, j)) ||
582 value = devlink->stats.reload_stats[stat_idx];
584 value = devlink->stats.remote_reload_stats[stat_idx];
603 static int devlink_nl_fill(struct sk_buff *msg, struct devlink *devlink,
614 if (devlink_nl_put_handle(msg, devlink))
616 if (nla_put_u8(msg, DEVLINK_ATTR_RELOAD_FAILED, devlink->reload_failed))
623 if (devlink_reload_stats_put(msg, devlink, false))
625 if (devlink_reload_stats_put(msg, devlink, true))
639 static void devlink_notify(struct devlink *devlink, enum devlink_command cmd)
650 err = devlink_nl_fill(msg, devlink, cmd, 0, 0, 0);
656 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink),
718 struct devlink *devlink = port->devlink;
728 ops = devlink->ops;
733 err = ops->port_function_hw_addr_get(devlink, port, hw_addr, &hw_addr_len, extack);
757 static int devlink_nl_port_fill(struct sk_buff *msg, struct devlink *devlink,
769 if (devlink_nl_put_handle(msg, devlink))
784 struct net *net = devlink_net(devlink_port->devlink);
823 struct devlink *devlink = devlink_port->devlink;
836 err = devlink_nl_port_fill(msg, devlink, devlink_port, cmd, 0, 0, 0,
843 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink),
849 struct devlink *devlink = info->user_ptr[0];
857 err = devlink_nl_fill(msg, devlink, DEVLINK_CMD_NEW,
870 struct devlink *devlink;
876 list_for_each_entry(devlink, &devlink_list, list) {
877 if (!net_eq(devlink_net(devlink), sock_net(msg->sk)))
883 err = devlink_nl_fill(msg, devlink, DEVLINK_CMD_NEW,
901 struct devlink *devlink = devlink_port->devlink;
909 err = devlink_nl_port_fill(msg, devlink, devlink_port,
924 struct devlink *devlink;
931 list_for_each_entry(devlink, &devlink_list, list) {
932 if (!net_eq(devlink_net(devlink), sock_net(msg->sk)))
934 mutex_lock(&devlink->lock);
935 list_for_each_entry(devlink_port, &devlink->port_list, list) {
940 err = devlink_nl_port_fill(msg, devlink, devlink_port,
947 mutex_unlock(&devlink->lock);
952 mutex_unlock(&devlink->lock);
961 static int devlink_port_type_set(struct devlink *devlink,
968 if (devlink->ops->port_type_set) {
971 err = devlink->ops->port_type_set(devlink_port, port_type);
982 devlink_port_function_hw_addr_set(struct devlink *devlink, struct devlink_port *port,
1007 ops = devlink->ops;
1013 err = ops->port_function_hw_addr_set(devlink, port, hw_addr, hw_addr_len, extack);
1022 devlink_port_function_set(struct devlink *devlink, struct devlink_port *port,
1037 err = devlink_port_function_hw_addr_set(devlink, port, attr, extack);
1046 struct devlink *devlink = devlink_port->devlink;
1053 err = devlink_port_type_set(devlink, devlink_port, port_type);
1062 err = devlink_port_function_set(devlink, devlink_port, attr, extack);
1070 static int devlink_port_split(struct devlink *devlink, u32 port_index,
1074 if (devlink->ops->port_split)
1075 return devlink->ops->port_split(devlink, port_index, count,
1083 struct devlink *devlink = info->user_ptr[0];
1092 devlink_port = devlink_port_get_from_info(devlink, info);
1113 return devlink_port_split(devlink, port_index, count, info->extack);
1116 static int devlink_port_unsplit(struct devlink *devlink, u32 port_index,
1120 if (devlink->ops->port_unsplit)
1121 return devlink->ops->port_unsplit(devlink, port_index, extack);
1128 struct devlink *devlink = info->user_ptr[0];
1135 return devlink_port_unsplit(devlink, port_index, info->extack);
1138 static int devlink_nl_sb_fill(struct sk_buff *msg, struct devlink *devlink,
1149 if (devlink_nl_put_handle(msg, devlink))
1179 struct devlink *devlink = info->user_ptr[0];
1184 devlink_sb = devlink_sb_get_from_info(devlink, info);
1192 err = devlink_nl_sb_fill(msg, devlink, devlink_sb,
1206 struct devlink *devlink;
1213 list_for_each_entry(devlink, &devlink_list, list) {
1214 if (!net_eq(devlink_net(devlink), sock_net(msg->sk)))
1216 mutex_lock(&devlink->lock);
1217 list_for_each_entry(devlink_sb, &devlink->sb_list, list) {
1222 err = devlink_nl_sb_fill(msg, devlink, devlink_sb,
1228 mutex_unlock(&devlink->lock);
1233 mutex_unlock(&devlink->lock);
1242 static int devlink_nl_sb_pool_fill(struct sk_buff *msg, struct devlink *devlink,
1251 err = devlink->ops->sb_pool_get(devlink, devlink_sb->index,
1260 if (devlink_nl_put_handle(msg, devlink))
1288 struct devlink *devlink = info->user_ptr[0];
1294 devlink_sb = devlink_sb_get_from_info(devlink, info);
1303 if (!devlink->ops->sb_pool_get)
1310 err = devlink_nl_sb_pool_fill(msg, devlink, devlink_sb, pool_index,
1322 struct devlink *devlink,
1335 err = devlink_nl_sb_pool_fill(msg, devlink,
1350 struct devlink *devlink;
1357 list_for_each_entry(devlink, &devlink_list, list) {
1358 if (!net_eq(devlink_net(devlink), sock_net(msg->sk)) ||
1359 !devlink->ops->sb_pool_get)
1361 mutex_lock(&devlink->lock);
1362 list_for_each_entry(devlink_sb, &devlink->sb_list, list) {
1363 err = __sb_pool_get_dumpit(msg, start, &idx, devlink,
1370 mutex_unlock(&devlink->lock);
1374 mutex_unlock(&devlink->lock);
1386 static int devlink_sb_pool_set(struct devlink *devlink, unsigned int sb_index,
1392 const struct devlink_ops *ops = devlink->ops;
1395 return ops->sb_pool_set(devlink, sb_index, pool_index,
1403 struct devlink *devlink = info->user_ptr[0];
1410 devlink_sb = devlink_sb_get_from_info(devlink, info);
1427 return devlink_sb_pool_set(devlink, devlink_sb->index,
1433 struct devlink *devlink,
1440 const struct devlink_ops *ops = devlink->ops;
1454 if (devlink_nl_put_handle(msg, devlink))
1495 struct devlink *devlink = devlink_port->devlink;
1501 devlink_sb = devlink_sb_get_from_info(devlink, info);
1510 if (!devlink->ops->sb_port_pool_get)
1517 err = devlink_nl_sb_port_pool_fill(msg, devlink, devlink_port,
1530 struct devlink *devlink,
1539 list_for_each_entry(devlink_port, &devlink->port_list, list) {
1545 err = devlink_nl_sb_port_pool_fill(msg, devlink,
1563 struct devlink *devlink;
1570 list_for_each_entry(devlink, &devlink_list, list) {
1571 if (!net_eq(devlink_net(devlink), sock_net(msg->sk)) ||
1572 !devlink->ops->sb_port_pool_get)
1574 mutex_lock(&devlink->lock);
1575 list_for_each_entry(devlink_sb, &devlink->sb_list, list) {
1577 devlink, devlink_sb,
1583 mutex_unlock(&devlink->lock);
1587 mutex_unlock(&devlink->lock);
1605 const struct devlink_ops *ops = devlink_port->devlink->ops;
1617 struct devlink *devlink = info->user_ptr[0];
1623 devlink_sb = devlink_sb_get_from_info(devlink, info);
1641 devlink_nl_sb_tc_pool_bind_fill(struct sk_buff *msg, struct devlink *devlink,
1648 const struct devlink_ops *ops = devlink->ops;
1664 if (devlink_nl_put_handle(msg, devlink))
1709 struct devlink *devlink = devlink_port->devlink;
1716 devlink_sb = devlink_sb_get_from_info(devlink, info);
1729 if (!devlink->ops->sb_tc_pool_bind_get)
1736 err = devlink_nl_sb_tc_pool_bind_fill(msg, devlink, devlink_port,
1751 struct devlink *devlink,
1759 list_for_each_entry(devlink_port, &devlink->port_list, list) {
1766 err = devlink_nl_sb_tc_pool_bind_fill(msg, devlink,
1784 err = devlink_nl_sb_tc_pool_bind_fill(msg, devlink,
1804 struct devlink *devlink;
1811 list_for_each_entry(devlink, &devlink_list, list) {
1812 if (!net_eq(devlink_net(devlink), sock_net(msg->sk)) ||
1813 !devlink->ops->sb_tc_pool_bind_get)
1816 mutex_lock(&devlink->lock);
1817 list_for_each_entry(devlink_sb, &devlink->sb_list, list) {
1819 devlink,
1826 mutex_unlock(&devlink->lock);
1830 mutex_unlock(&devlink->lock);
1849 const struct devlink_ops *ops = devlink_port->devlink->ops;
1862 struct devlink *devlink = info->user_ptr[0];
1870 devlink_sb = devlink_sb_get_from_info(devlink, info);
1900 struct devlink *devlink = info->user_ptr[0];
1901 const struct devlink_ops *ops = devlink->ops;
1904 devlink_sb = devlink_sb_get_from_info(devlink, info);
1909 return ops->sb_occ_snapshot(devlink, devlink_sb->index);
1916 struct devlink *devlink = info->user_ptr[0];
1917 const struct devlink_ops *ops = devlink->ops;
1920 devlink_sb = devlink_sb_get_from_info(devlink, info);
1925 return ops->sb_occ_max_clear(devlink, devlink_sb->index);
1929 static int devlink_nl_eswitch_fill(struct sk_buff *msg, struct devlink *devlink,
1933 const struct devlink_ops *ops = devlink->ops;
1944 err = devlink_nl_put_handle(msg, devlink);
1949 err = ops->eswitch_mode_get(devlink, &mode);
1958 err = ops->eswitch_inline_mode_get(devlink, &inline_mode);
1968 err = ops->eswitch_encap_mode_get(devlink, &encap_mode);
1987 struct devlink *devlink = info->user_ptr[0];
1995 err = devlink_nl_eswitch_fill(msg, devlink, DEVLINK_CMD_ESWITCH_GET,
2009 struct devlink *devlink = info->user_ptr[0];
2010 const struct devlink_ops *ops = devlink->ops;
2020 err = ops->eswitch_mode_set(devlink, mode, info->extack);
2030 err = ops->eswitch_inline_mode_set(devlink, inline_mode,
2040 err = ops->eswitch_encap_mode_set(devlink, encap_mode,
2206 struct devlink *devlink = info->user_ptr[0];
2230 if (devlink_nl_put_handle(skb, devlink))
2284 struct devlink *devlink = info->user_ptr[0];
2291 &devlink->dpipe_table_list,
2443 const char *table_name, struct devlink *devlink)
2447 lockdep_is_held(&devlink->lock)) {
2456 struct devlink *devlink;
2472 devlink = dump_ctx->info->user_ptr[0];
2473 if (devlink_nl_put_handle(dump_ctx->skb, devlink))
2557 struct devlink *devlink = info->user_ptr[0];
2565 table = devlink_dpipe_table_find(&devlink->dpipe_table_list,
2566 table_name, devlink);
2644 struct devlink *devlink = info->user_ptr[0];
2665 if (devlink_nl_put_handle(skb, devlink))
2707 struct devlink *devlink = info->user_ptr[0];
2709 if (!devlink->dpipe_headers)
2712 0, devlink->dpipe_headers);
2715 static int devlink_dpipe_table_counters_set(struct devlink *devlink,
2721 table = devlink_dpipe_table_find(&devlink->dpipe_table_list,
2722 table_name, devlink);
2741 struct devlink *devlink = info->user_ptr[0];
2752 return devlink_dpipe_table_counters_set(devlink, table_name,
2757 devlink_resource_find(struct devlink *devlink,
2765 resource_list = &devlink->resource_list;
2773 child_resource = devlink_resource_find(devlink, resource,
2829 struct devlink *devlink = info->user_ptr[0];
2840 resource = devlink_resource_find(devlink, NULL, resource_id);
2884 static int devlink_resource_put(struct devlink *devlink, struct sk_buff *skb,
2921 if (devlink_resource_put(devlink, skb, child_resource))
2940 struct devlink *devlink = info->user_ptr[0];
2950 resource = list_first_entry(&devlink->resource_list,
2964 if (devlink_nl_put_handle(skb, devlink))
2974 list_for_each_entry_from(resource, &devlink->resource_list, list) {
2975 err = devlink_resource_put(devlink, skb, resource);
3009 struct devlink *devlink = info->user_ptr[0];
3011 if (list_empty(&devlink->resource_list))
3018 devlink_resources_validate(struct devlink *devlink,
3028 resource_list = &devlink->resource_list;
3033 err = devlink_resources_validate(devlink, resource, info);
3077 static void devlink_param_notify(struct devlink *devlink,
3082 static void devlink_ns_change_notify(struct devlink *devlink,
3089 /* Userspace needs to be notified about devlink objects
3091 * The rest of the devlink objects are re-created during
3099 devlink_notify(devlink, DEVLINK_CMD_NEW);
3102 list_for_each_entry(param_item, &devlink->param_list, list)
3103 devlink_param_notify(devlink, 0, param_item, cmd);
3106 devlink_notify(devlink, DEVLINK_CMD_DEL);
3114 static void devlink_reload_failed_set(struct devlink *devlink,
3117 if (devlink->reload_failed == reload_failed)
3119 devlink->reload_failed = reload_failed;
3120 devlink_notify(devlink, DEVLINK_CMD_NEW);
3123 bool devlink_is_reload_failed(const struct devlink *devlink)
3125 return devlink->reload_failed;
3130 __devlink_reload_stats_update(struct devlink *devlink, u32 *reload_stats,
3141 devlink_notify(devlink, DEVLINK_CMD_NEW);
3145 devlink_reload_stats_update(struct devlink *devlink, enum devlink_reload_limit limit,
3148 __devlink_reload_stats_update(devlink, devlink->stats.reload_stats, limit,
3153 * devlink_remote_reload_actions_performed - Update devlink on reload actions
3154 * performed which are not a direct result of devlink reload call.
3157 * a result of devlink reload call. For example fw_activate was performed as a result
3158 * of devlink reload triggered fw_activate on another host.
3160 * function whether it was done due to direct devlink reload call or not.
3162 * @devlink: devlink
3166 void devlink_remote_reload_actions_performed(struct devlink *devlink,
3176 __devlink_reload_stats_update(devlink, devlink->stats.remote_reload_stats, limit,
3181 static int devlink_reload(struct devlink *devlink, struct net *dest_net,
3189 if (!devlink->reload_enabled)
3192 memcpy(remote_reload_stats, devlink->stats.remote_reload_stats,
3195 curr_net = devlink_net(devlink);
3196 devlink_ns_change_notify(devlink, dest_net, curr_net, false);
3197 err = devlink->ops->reload_down(devlink, !!dest_net, action, limit, extack);
3202 __devlink_net_set(devlink, dest_net);
3204 err = devlink->ops->reload_up(devlink, action, limit, actions_performed, extack);
3205 devlink_reload_failed_set(devlink, !!err);
3209 devlink_ns_change_notify(devlink, dest_net, curr_net, true);
3211 /* Catch driver on updating the remote action within devlink reload */
3212 WARN_ON(memcmp(remote_reload_stats, devlink->stats.remote_reload_stats,
3214 devlink_reload_stats_update(devlink, limit, *actions_performed);
3219 devlink_nl_reload_actions_performed_snd(struct devlink *devlink, u32 actions_performed,
3233 if (devlink_nl_put_handle(msg, devlink))
3252 struct devlink *devlink = info->user_ptr[0];
3259 if (!devlink_reload_supported(devlink->ops))
3262 err = devlink_resources_validate(devlink, NULL, info);
3273 if (!devlink_reload_action_is_supported(devlink, action)) {
3299 if (!devlink_reload_limit_is_supported(devlink, limit)) {
3318 err = devlink_reload(devlink, dest_net, action, limit, &actions_performed, info->extack);
3329 return devlink_nl_reload_actions_performed_snd(devlink, actions_performed,
3334 struct devlink *devlink,
3344 if (devlink_nl_put_handle(msg, devlink))
3377 static void __devlink_flash_update_notify(struct devlink *devlink,
3392 err = devlink_nl_flash_update_fill(msg, devlink, cmd, params);
3396 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink),
3404 void devlink_flash_update_begin_notify(struct devlink *devlink)
3408 __devlink_flash_update_notify(devlink,
3414 void devlink_flash_update_end_notify(struct devlink *devlink)
3418 __devlink_flash_update_notify(devlink,
3424 void devlink_flash_update_status_notify(struct devlink *devlink,
3437 __devlink_flash_update_notify(devlink,
3443 void devlink_flash_update_timeout_notify(struct devlink *devlink,
3454 __devlink_flash_update_notify(devlink,
3465 struct devlink *devlink = info->user_ptr[0];
3468 if (!devlink->ops->flash_update)
3474 supported_params = devlink->ops->supported_flash_update_params;
3501 return devlink->ops->flash_update(devlink, &params, info->extack);
3619 static int devlink_param_get(struct devlink *devlink,
3625 return param->get(devlink, param->id, ctx);
3628 static int devlink_param_set(struct devlink *devlink,
3634 return param->set(devlink, param->id, ctx);
3706 static int devlink_nl_param_fill(struct sk_buff *msg, struct devlink *devlink,
3735 err = devlink_param_get(devlink, param, &ctx);
3747 if (devlink_nl_put_handle(msg, devlink))
3798 static void devlink_param_notify(struct devlink *devlink,
3813 err = devlink_nl_param_fill(msg, devlink, port_index, param_item, cmd,
3820 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink),
3828 struct devlink *devlink;
3834 list_for_each_entry(devlink, &devlink_list, list) {
3835 if (!net_eq(devlink_net(devlink), sock_net(msg->sk)))
3837 mutex_lock(&devlink->lock);
3838 list_for_each_entry(param_item, &devlink->param_list, list) {
3843 err = devlink_nl_param_fill(msg, devlink, 0, param_item,
3851 mutex_unlock(&devlink->lock);
3856 mutex_unlock(&devlink->lock);
3959 struct devlink *devlink = info->user_ptr[0];
3964 param_item = devlink_param_get_from_info(&devlink->param_list, info);
3972 err = devlink_nl_param_fill(msg, devlink, 0, param_item,
3983 static int __devlink_nl_cmd_param_set_doit(struct devlink *devlink,
4010 err = param->validate(devlink, param->id, value, info->extack);
4032 err = devlink_param_set(devlink, param, &ctx);
4037 devlink_param_notify(devlink, port_index, param_item, cmd);
4044 struct devlink *devlink = info->user_ptr[0];
4046 return __devlink_nl_cmd_param_set_doit(devlink, 0, &devlink->param_list,
4050 static int devlink_param_register_one(struct devlink *devlink,
4072 devlink_param_notify(devlink, port_index, param_item, cmd);
4076 static void devlink_param_unregister_one(struct devlink *devlink,
4086 devlink_param_notify(devlink, port_index, param_item, cmd);
4096 struct devlink *devlink;
4102 list_for_each_entry(devlink, &devlink_list, list) {
4103 if (!net_eq(devlink_net(devlink), sock_net(msg->sk)))
4105 mutex_lock(&devlink->lock);
4106 list_for_each_entry(devlink_port, &devlink->port_list, list) {
4114 devlink_port->devlink,
4123 mutex_unlock(&devlink->lock);
4129 mutex_unlock(&devlink->lock);
4158 err = devlink_nl_param_fill(msg, devlink_port->devlink,
4175 return __devlink_nl_cmd_param_set_doit(devlink_port->devlink,
4182 struct devlink *devlink,
4205 struct devlink *devlink,
4218 err = devlink_nl_region_snapshot_id_put(msg, devlink, snapshot);
4231 static int devlink_nl_region_fill(struct sk_buff *msg, struct devlink *devlink,
4243 err = devlink_nl_put_handle(msg, devlink);
4264 err = devlink_nl_region_snapshots_id_put(msg, devlink, region);
4281 struct devlink *devlink = region->devlink;
4297 err = devlink_nl_put_handle(msg, devlink);
4339 struct devlink *devlink = region->devlink;
4348 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink),
4354 * @devlink: devlink instance
4367 static int __devlink_snapshot_id_increment(struct devlink *devlink, u32 id)
4372 lockdep_assert_held(&devlink->lock);
4374 p = xa_load(&devlink->snapshot_ids, id);
4384 return xa_err(xa_store(&devlink->snapshot_ids, id, xa_mk_value(count),
4390 * @devlink: devlink instance
4403 static void __devlink_snapshot_id_decrement(struct devlink *devlink, u32 id)
4408 lockdep_assert_held(&devlink->lock);
4410 p = xa_load(&devlink->snapshot_ids, id);
4421 xa_store(&devlink->snapshot_ids, id, xa_mk_value(count),
4425 xa_erase(&devlink->snapshot_ids, id);
4431 * @devlink: devlink instance
4437 * This must be called while holding the devlink instance lock. Unlike
4440 * releasing the devlink instance lock.
4445 static int __devlink_snapshot_id_insert(struct devlink *devlink, u32 id)
4447 lockdep_assert_held(&devlink->lock);
4449 if (xa_load(&devlink->snapshot_ids, id))
4452 return xa_err(xa_store(&devlink->snapshot_ids, id, xa_mk_value(0),
4458 * @devlink: devlink instance
4462 * error on failure. Must be called while holding the devlink instance
4472 static int __devlink_region_snapshot_id_get(struct devlink *devlink, u32 *id)
4474 lockdep_assert_held(&devlink->lock);
4476 return xa_alloc(&devlink->snapshot_ids, id, xa_mk_value(1),
4484 * from devlink. This is useful for future analyses of snapshots.
4488 * Must be called only while holding the devlink instance lock.
4490 * @region: devlink region of the snapshot
4498 struct devlink *devlink = region->devlink;
4502 lockdep_assert_held(&devlink->lock);
4515 err = __devlink_snapshot_id_increment(devlink, snapshot_id);
4538 struct devlink *devlink = region->devlink;
4540 lockdep_assert_held(&devlink->lock);
4546 __devlink_snapshot_id_decrement(devlink, snapshot->id);
4553 struct devlink *devlink = info->user_ptr[0];
4567 port = devlink_port_get_by_index(devlink, index);
4576 region = devlink_region_get_by_name(devlink, region_name);
4585 err = devlink_nl_region_fill(msg, devlink, DEVLINK_CMD_REGION_GET,
4610 err = devlink_nl_region_fill(msg, port->devlink,
4626 struct devlink *devlink,
4634 mutex_lock(&devlink->lock);
4635 list_for_each_entry(region, &devlink->region_list, list) {
4640 err = devlink_nl_region_fill(msg, devlink,
4650 list_for_each_entry(port, &devlink->port_list, list) {
4658 mutex_unlock(&devlink->lock);
4665 struct devlink *devlink;
4671 list_for_each_entry(devlink, &devlink_list, list) {
4672 if (!net_eq(devlink_net(devlink), sock_net(msg->sk)))
4674 err = devlink_nl_cmd_region_get_devlink_dumpit(msg, cb, devlink,
4688 struct devlink *devlink = info->user_ptr[0];
4706 port = devlink_port_get_by_index(devlink, index);
4714 region = devlink_region_get_by_name(devlink, region_name);
4730 struct devlink *devlink = info->user_ptr[0];
4751 port = devlink_port_get_by_index(devlink, index);
4759 region = devlink_region_get_by_name(devlink, region_name);
4785 err = __devlink_snapshot_id_insert(devlink, snapshot_id);
4789 err = __devlink_region_snapshot_id_get(devlink, &snapshot_id);
4800 err = region->ops->snapshot(devlink, region->ops,
4835 __devlink_snapshot_id_decrement(devlink, snapshot_id);
4844 struct devlink *devlink,
4875 struct devlink *devlink,
4904 err = devlink_nl_cmd_region_read_chunk_fill(skb, devlink,
4927 struct devlink *devlink;
4935 devlink = devlink_get_from_attrs(sock_net(cb->skb->sk), attrs);
4936 if (IS_ERR(devlink)) {
4937 err = PTR_ERR(devlink);
4941 mutex_lock(&devlink->lock);
4952 port = devlink_port_get_by_index(devlink, index);
4964 region = devlink_region_get_by_name(devlink, region_name);
4998 err = devlink_nl_put_handle(skb, devlink);
5019 err = devlink_nl_region_read_snapshot_fill(skb, devlink,
5037 mutex_unlock(&devlink->lock);
5045 mutex_unlock(&devlink->lock);
5133 devlink_nl_info_fill(struct sk_buff *msg, struct devlink *devlink,
5146 if (devlink_nl_put_handle(msg, devlink))
5150 err = devlink->ops->info_get(devlink, &req, extack);
5165 struct devlink *devlink = info->user_ptr[0];
5169 if (!devlink->ops->info_get)
5176 err = devlink_nl_info_fill(msg, devlink, DEVLINK_CMD_INFO_GET,
5190 struct devlink *devlink;
5196 list_for_each_entry(devlink, &devlink_list, list) {
5197 if (!net_eq(devlink_net(devlink), sock_net(msg->sk)))
5204 if (!devlink->ops->info_get) {
5209 mutex_lock(&devlink->lock);
5210 err = devlink_nl_info_fill(msg, devlink, DEVLINK_CMD_INFO_GET,
5214 mutex_unlock(&devlink->lock);
5827 struct devlink *devlink;
5865 devlink_health_reporter_find_by_name(struct devlink *devlink,
5868 return __devlink_health_reporter_find_by_name(&devlink->reporter_list,
5869 &devlink->reporters_lock,
5883 __devlink_health_reporter_create(struct devlink *devlink,
5898 reporter->devlink = devlink;
5908 * devlink_port_health_reporter_create - create devlink health reporter for
5930 reporter = __devlink_health_reporter_create(port->devlink, ops,
5944 * devlink_health_reporter_create - create devlink health reporter
5946 * @devlink: devlink
5952 devlink_health_reporter_create(struct devlink *devlink,
5958 mutex_lock(&devlink->reporters_lock);
5959 if (devlink_health_reporter_find_by_name(devlink, ops->name)) {
5964 reporter = __devlink_health_reporter_create(devlink, ops,
5969 list_add_tail(&reporter->list, &devlink->reporter_list);
5971 mutex_unlock(&devlink->reporters_lock);
6000 * devlink_health_reporter_destroy - destroy devlink health reporter
6002 * @reporter: devlink health reporter to destroy
6007 struct mutex *lock = &reporter->devlink->reporters_lock;
6016 * devlink_port_health_reporter_destroy - destroy devlink port health reporter
6018 * @reporter: devlink health reporter to destroy
6033 struct devlink *devlink,
6045 if (devlink_nl_put_handle(msg, devlink))
6114 err = devlink_nl_health_reporter_fill(msg, reporter->devlink,
6122 devlink_net(reporter->devlink),
6211 struct devlink *devlink = reporter->devlink;
6216 trace_devlink_health_report(devlink, reporter->ops->name, msg);
6229 trace_devlink_health_recover_aborted(devlink,
6255 devlink_health_reporter_get_from_attrs(struct devlink *devlink,
6266 devlink_port = devlink_port_get_from_attrs(devlink, attrs);
6268 mutex_lock(&devlink->reporters_lock);
6269 reporter = devlink_health_reporter_find_by_name(devlink, reporter_name);
6272 mutex_unlock(&devlink->reporters_lock);
6285 devlink_health_reporter_get_from_info(struct devlink *devlink,
6288 return devlink_health_reporter_get_from_attrs(devlink, info->attrs);
6297 struct devlink *devlink;
6300 devlink = devlink_get_from_attrs(sock_net(cb->skb->sk), attrs);
6301 if (IS_ERR(devlink))
6304 reporter = devlink_health_reporter_get_from_attrs(devlink, attrs);
6324 trace_devlink_health_reporter_state_update(reporter->devlink,
6333 struct devlink *devlink = info->user_ptr[0];
6338 reporter = devlink_health_reporter_get_from_info(devlink, info);
6348 err = devlink_nl_health_reporter_fill(msg, devlink, reporter,
6369 struct devlink *devlink;
6375 list_for_each_entry(devlink, &devlink_list, list) {
6376 if (!net_eq(devlink_net(devlink), sock_net(msg->sk)))
6378 mutex_lock(&devlink->reporters_lock);
6379 list_for_each_entry(reporter, &devlink->reporter_list,
6385 err = devlink_nl_health_reporter_fill(msg, devlink,
6392 mutex_unlock(&devlink->reporters_lock);
6397 mutex_unlock(&devlink->reporters_lock);
6400 list_for_each_entry(devlink, &devlink_list, list) {
6401 if (!net_eq(devlink_net(devlink), sock_net(msg->sk)))
6403 mutex_lock(&devlink->lock);
6404 list_for_each_entry(port, &devlink->port_list, list) {
6411 err = devlink_nl_health_reporter_fill(msg, devlink, reporter,
6418 mutex_unlock(&devlink->lock);
6425 mutex_unlock(&devlink->lock);
6438 struct devlink *devlink = info->user_ptr[0];
6442 reporter = devlink_health_reporter_get_from_info(devlink, info);
6480 struct devlink *devlink = info->user_ptr[0];
6484 reporter = devlink_health_reporter_get_from_info(devlink, info);
6497 struct devlink *devlink = info->user_ptr[0];
6502 reporter = devlink_health_reporter_get_from_info(devlink, info);
6580 struct devlink *devlink = info->user_ptr[0];
6583 reporter = devlink_health_reporter_get_from_info(devlink, info);
6602 struct devlink *devlink = info->user_ptr[0];
6606 reporter = devlink_health_reporter_get_from_info(devlink, info);
6634 * Describes packet trap policer attributes. Created by devlink during trap
6651 * Describes packet trap group attributes. Created by devlink during trap
6671 * devlink during trap registration and used for all trap related operations.
6683 devlink_trap_policer_item_lookup(struct devlink *devlink, u32 id)
6687 list_for_each_entry(policer_item, &devlink->trap_policer_list, list) {
6696 devlink_trap_item_lookup(struct devlink *devlink, const char *name)
6700 list_for_each_entry(trap_item, &devlink->trap_list, list) {
6709 devlink_trap_item_get_from_info(struct devlink *devlink,
6718 return devlink_trap_item_lookup(devlink, nla_data(attr));
6818 static int devlink_nl_trap_fill(struct sk_buff *msg, struct devlink *devlink,
6831 if (devlink_nl_put_handle(msg, devlink))
6872 struct devlink *devlink = info->user_ptr[0];
6877 if (list_empty(&devlink->trap_list))
6880 trap_item = devlink_trap_item_get_from_info(devlink, info);
6890 err = devlink_nl_trap_fill(msg, devlink, trap_item,
6907 struct devlink *devlink;
6913 list_for_each_entry(devlink, &devlink_list, list) {
6914 if (!net_eq(devlink_net(devlink), sock_net(msg->sk)))
6916 mutex_lock(&devlink->lock);
6917 list_for_each_entry(trap_item, &devlink->trap_list, list) {
6922 err = devlink_nl_trap_fill(msg, devlink, trap_item,
6928 mutex_unlock(&devlink->lock);
6933 mutex_unlock(&devlink->lock);
6942 static int __devlink_trap_action_set(struct devlink *devlink,
6955 err = devlink->ops->trap_action_set(devlink, trap_item->trap,
6965 static int devlink_trap_action_set(struct devlink *devlink,
6981 return __devlink_trap_action_set(devlink, trap_item, trap_action,
6989 struct devlink *devlink = info->user_ptr[0];
6993 if (list_empty(&devlink->trap_list))
6996 trap_item = devlink_trap_item_get_from_info(devlink, info);
7002 err = devlink_trap_action_set(devlink, trap_item, info);
7010 devlink_trap_group_item_lookup(struct devlink *devlink, const char *name)
7014 list_for_each_entry(group_item, &devlink->trap_group_list, list) {
7023 devlink_trap_group_item_lookup_by_id(struct devlink *devlink, u16 id)
7027 list_for_each_entry(group_item, &devlink->trap_group_list, list) {
7036 devlink_trap_group_item_get_from_info(struct devlink *devlink,
7045 return devlink_trap_group_item_lookup(devlink, name);
7049 devlink_nl_trap_group_fill(struct sk_buff *msg, struct devlink *devlink,
7061 if (devlink_nl_put_handle(msg, devlink))
7094 struct devlink *devlink = info->user_ptr[0];
7099 if (list_empty(&devlink->trap_group_list))
7102 group_item = devlink_trap_group_item_get_from_info(devlink, info);
7112 err = devlink_nl_trap_group_fill(msg, devlink, group_item,
7131 struct devlink *devlink;
7137 list_for_each_entry(devlink, &devlink_list, list) {
7138 if (!net_eq(devlink_net(devlink), sock_net(msg->sk)))
7140 mutex_lock(&devlink->lock);
7141 list_for_each_entry(group_item, &devlink->trap_group_list,
7147 err = devlink_nl_trap_group_fill(msg, devlink,
7153 mutex_unlock(&devlink->lock);
7158 mutex_unlock(&devlink->lock);
7168 __devlink_trap_group_action_set(struct devlink *devlink,
7177 if (devlink->ops->trap_group_action_set) {
7178 err = devlink->ops->trap_group_action_set(devlink, group_item->group,
7183 list_for_each_entry(trap_item, &devlink->trap_list, list) {
7195 list_for_each_entry(trap_item, &devlink->trap_list, list) {
7198 err = __devlink_trap_action_set(devlink, trap_item,
7208 devlink_trap_group_action_set(struct devlink *devlink,
7224 err = __devlink_trap_group_action_set(devlink, group_item, trap_action,
7234 static int devlink_trap_group_set(struct devlink *devlink,
7247 if (!devlink->ops->trap_group_set)
7255 policer_item = devlink_trap_policer_item_lookup(devlink,
7264 err = devlink->ops->trap_group_set(devlink, group_item->group, policer,
7278 struct devlink *devlink = info->user_ptr[0];
7283 if (list_empty(&devlink->trap_group_list))
7286 group_item = devlink_trap_group_item_get_from_info(devlink, info);
7292 err = devlink_trap_group_action_set(devlink, group_item, info,
7297 err = devlink_trap_group_set(devlink, group_item, info);
7310 devlink_trap_policer_item_get_from_info(struct devlink *devlink,
7319 return devlink_trap_policer_item_lookup(devlink, id);
7323 devlink_trap_policer_stats_put(struct sk_buff *msg, struct devlink *devlink,
7330 if (!devlink->ops->trap_policer_counter_get)
7333 err = devlink->ops->trap_policer_counter_get(devlink, policer, &drops);
7355 devlink_nl_trap_policer_fill(struct sk_buff *msg, struct devlink *devlink,
7367 if (devlink_nl_put_handle(msg, devlink))
7382 err = devlink_trap_policer_stats_put(msg, devlink,
7401 struct devlink *devlink = info->user_ptr[0];
7405 if (list_empty(&devlink->trap_policer_list))
7408 policer_item = devlink_trap_policer_item_get_from_info(devlink, info);
7418 err = devlink_nl_trap_policer_fill(msg, devlink, policer_item,
7437 struct devlink *devlink;
7443 list_for_each_entry(devlink, &devlink_list, list) {
7444 if (!net_eq(devlink_net(devlink), sock_net(msg->sk)))
7446 mutex_lock(&devlink->lock);
7447 list_for_each_entry(policer_item, &devlink->trap_policer_list,
7453 err = devlink_nl_trap_policer_fill(msg, devlink,
7459 mutex_unlock(&devlink->lock);
7464 mutex_unlock(&devlink->lock);
7474 devlink_trap_policer_set(struct devlink *devlink,
7512 err = devlink->ops->trap_policer_set(devlink, policer_item->policer,
7528 struct devlink *devlink = info->user_ptr[0];
7530 if (list_empty(&devlink->trap_policer_list))
7533 if (!devlink->ops->trap_policer_set)
7536 policer_item = devlink_trap_policer_item_get_from_info(devlink, info);
7542 return devlink_trap_policer_set(devlink, policer_item, info);
7958 * devlink_alloc - Allocate new devlink instance resources
7963 * Allocate new devlink instance resources, including devlink index
7966 struct devlink *devlink_alloc(const struct devlink_ops *ops, size_t priv_size)
7968 struct devlink *devlink;
7976 devlink = kzalloc(sizeof(*devlink) + priv_size, GFP_KERNEL);
7977 if (!devlink)
7979 devlink->ops = ops;
7980 xa_init_flags(&devlink->snapshot_ids, XA_FLAGS_ALLOC);
7981 __devlink_net_set(devlink, &init_net);
7982 INIT_LIST_HEAD(&devlink->port_list);
7983 INIT_LIST_HEAD(&devlink->sb_list);
7984 INIT_LIST_HEAD_RCU(&devlink->dpipe_table_list);
7985 INIT_LIST_HEAD(&devlink->resource_list);
7986 INIT_LIST_HEAD(&devlink->param_list);
7987 INIT_LIST_HEAD(&devlink->region_list);
7988 INIT_LIST_HEAD(&devlink->reporter_list);
7989 INIT_LIST_HEAD(&devlink->trap_list);
7990 INIT_LIST_HEAD(&devlink->trap_group_list);
7991 INIT_LIST_HEAD(&devlink->trap_policer_list);
7992 mutex_init(&devlink->lock);
7993 mutex_init(&devlink->reporters_lock);
7994 return devlink;
7999 * devlink_register - Register devlink instance
8001 * @devlink: devlink
8004 int devlink_register(struct devlink *devlink, struct device *dev)
8006 devlink->dev = dev;
8007 devlink->registered = true;
8009 list_add_tail(&devlink->list, &devlink_list);
8010 devlink_notify(devlink, DEVLINK_CMD_NEW);
8017 * devlink_unregister - Unregister devlink instance
8019 * @devlink: devlink
8021 void devlink_unregister(struct devlink *devlink)
8024 WARN_ON(devlink_reload_supported(devlink->ops) &&
8025 devlink->reload_enabled);
8026 devlink_notify(devlink, DEVLINK_CMD_DEL);
8027 list_del(&devlink->list);
8033 * devlink_reload_enable - Enable reload of devlink instance
8035 * @devlink: devlink
8040 void devlink_reload_enable(struct devlink *devlink)
8043 devlink->reload_enabled = true;
8049 * devlink_reload_disable - Disable reload of devlink instance
8051 * @devlink: devlink
8056 void devlink_reload_disable(struct devlink *devlink)
8062 devlink->reload_enabled = false;
8068 * devlink_free - Free devlink instance resources
8070 * @devlink: devlink
8072 void devlink_free(struct devlink *devlink)
8074 mutex_destroy(&devlink->reporters_lock);
8075 mutex_destroy(&devlink->lock);
8076 WARN_ON(!list_empty(&devlink->trap_policer_list));
8077 WARN_ON(!list_empty(&devlink->trap_group_list));
8078 WARN_ON(!list_empty(&devlink->trap_list));
8079 WARN_ON(!list_empty(&devlink->reporter_list));
8080 WARN_ON(!list_empty(&devlink->region_list));
8081 WARN_ON(!list_empty(&devlink->param_list));
8082 WARN_ON(!list_empty(&devlink->resource_list));
8083 WARN_ON(!list_empty(&devlink->dpipe_table_list));
8084 WARN_ON(!list_empty(&devlink->sb_list));
8085 WARN_ON(!list_empty(&devlink->port_list));
8087 xa_destroy(&devlink->snapshot_ids);
8089 kfree(devlink);
8098 dev_warn(port->devlink->dev, "Type was not set for devlink port.");
8130 * devlink_port_register - Register devlink port
8132 * @devlink: devlink
8133 * @devlink_port: devlink port
8136 * Register devlink port with provided port index. User can use
8142 int devlink_port_register(struct devlink *devlink,
8146 mutex_lock(&devlink->lock);
8147 if (devlink_port_index_exists(devlink, port_index)) {
8148 mutex_unlock(&devlink->lock);
8151 devlink_port->devlink = devlink;
8157 list_add_tail(&devlink_port->list, &devlink->port_list);
8160 mutex_unlock(&devlink->lock);
8169 * devlink_port_unregister - Unregister devlink port
8171 * @devlink_port: devlink port
8175 struct devlink *devlink = devlink_port->devlink;
8179 mutex_lock(&devlink->lock);
8181 mutex_unlock(&devlink->lock);
8207 /* If driver registers devlink port, it should set devlink port
8242 * @devlink_port: devlink port
8251 dev_warn(devlink_port->devlink->dev,
8252 "devlink port type for port %d set to Ethernet without a software interface reference, device type not supported by the kernel?\n",
8262 * @devlink_port: devlink port
8275 * @devlink_port: devlink port
8304 * @devlink_port: devlink port
8305 * @attrs: devlink port attrs
8325 * @devlink_port: devlink port
8326 * @controller: associated controller number for the devlink port instance
8327 * @pf: associated PF for the devlink port instance
8351 * @devlink_port: devlink port
8352 * @controller: associated controller number for the devlink port instance
8353 * @pf: associated PF for the devlink port instance
8354 * @vf: associated VF of a PF for the devlink port instance
8433 int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
8441 mutex_lock(&devlink->lock);
8442 if (devlink_sb_index_exists(devlink, sb_index)) {
8458 list_add_tail(&devlink_sb->list, &devlink->sb_list);
8460 mutex_unlock(&devlink->lock);
8465 void devlink_sb_unregister(struct devlink *devlink, unsigned int sb_index)
8469 mutex_lock(&devlink->lock);
8470 devlink_sb = devlink_sb_get_by_index(devlink, sb_index);
8473 mutex_unlock(&devlink->lock);
8481 * @devlink: devlink
8486 int devlink_dpipe_headers_register(struct devlink *devlink,
8489 mutex_lock(&devlink->lock);
8490 devlink->dpipe_headers = dpipe_headers;
8491 mutex_unlock(&devlink->lock);
8499 * @devlink: devlink
8503 void devlink_dpipe_headers_unregister(struct devlink *devlink)
8505 mutex_lock(&devlink->lock);
8506 devlink->dpipe_headers = NULL;
8507 mutex_unlock(&devlink->lock);
8514 * @devlink: devlink
8525 bool devlink_dpipe_table_counter_enabled(struct devlink *devlink,
8532 table = devlink_dpipe_table_find(&devlink->dpipe_table_list,
8533 table_name, devlink);
8545 * @devlink: devlink
8551 int devlink_dpipe_table_register(struct devlink *devlink,
8562 mutex_lock(&devlink->lock);
8564 if (devlink_dpipe_table_find(&devlink->dpipe_table_list, table_name,
8565 devlink)) {
8581 list_add_tail_rcu(&table->list, &devlink->dpipe_table_list);
8583 mutex_unlock(&devlink->lock);
8591 * @devlink: devlink
8594 void devlink_dpipe_table_unregister(struct devlink *devlink,
8599 mutex_lock(&devlink->lock);
8600 table = devlink_dpipe_table_find(&devlink->dpipe_table_list,
8601 table_name, devlink);
8605 mutex_unlock(&devlink->lock);
8609 mutex_unlock(&devlink->lock);
8614 * devlink_resource_register - devlink resource register
8616 * @devlink: devlink
8623 int devlink_resource_register(struct devlink *devlink,
8637 mutex_lock(&devlink->lock);
8638 resource = devlink_resource_find(devlink, NULL, resource_id);
8651 resource_list = &devlink->resource_list;
8655 parent_resource = devlink_resource_find(devlink, NULL,
8677 mutex_unlock(&devlink->lock);
8685 * @devlink: devlink
8688 void devlink_resources_unregister(struct devlink *devlink,
8697 resource_list = &devlink->resource_list;
8700 mutex_lock(&devlink->lock);
8703 devlink_resources_unregister(devlink, child_resource);
8709 mutex_unlock(&devlink->lock);
8716 * @devlink: devlink
8720 int devlink_resource_size_get(struct devlink *devlink,
8727 mutex_lock(&devlink->lock);
8728 resource = devlink_resource_find(devlink, NULL, resource_id);
8736 mutex_unlock(&devlink->lock);
8744 * @devlink: devlink
8749 int devlink_dpipe_table_resource_set(struct devlink *devlink,
8756 mutex_lock(&devlink->lock);
8757 table = devlink_dpipe_table_find(&devlink->dpipe_table_list,
8758 table_name, devlink);
8767 mutex_unlock(&devlink->lock);
8775 * @devlink: devlink
8780 void devlink_resource_occ_get_register(struct devlink *devlink,
8787 mutex_lock(&devlink->lock);
8788 resource = devlink_resource_find(devlink, NULL, resource_id);
8796 mutex_unlock(&devlink->lock);
8803 * @devlink: devlink
8806 void devlink_resource_occ_get_unregister(struct devlink *devlink,
8811 mutex_lock(&devlink->lock);
8812 resource = devlink_resource_find(devlink, NULL, resource_id);
8820 mutex_unlock(&devlink->lock);
8834 static int __devlink_params_register(struct devlink *devlink,
8846 mutex_lock(&devlink->lock);
8852 err = devlink_param_register_one(devlink, port_index,
8858 mutex_unlock(&devlink->lock);
8865 devlink_param_unregister_one(devlink, port_index, param_list,
8868 mutex_unlock(&devlink->lock);
8872 static void __devlink_params_unregister(struct devlink *devlink,
8882 mutex_lock(&devlink->lock);
8884 devlink_param_unregister_one(devlink, 0, param_list, param,
8886 mutex_unlock(&devlink->lock);
8892 * @devlink: devlink
8898 int devlink_params_register(struct devlink *devlink,
8902 return __devlink_params_register(devlink, 0, &devlink->param_list,
8911 * @devlink: devlink
8915 void devlink_params_unregister(struct devlink *devlink,
8919 return __devlink_params_unregister(devlink, 0, &devlink->param_list,
8928 * @devlink: devlink
8932 void devlink_params_publish(struct devlink *devlink)
8936 list_for_each_entry(param_item, &devlink->param_list, list) {
8940 devlink_param_notify(devlink, 0, param_item,
8949 * @devlink: devlink
8953 void devlink_params_unpublish(struct devlink *devlink)
8957 list_for_each_entry(param_item, &devlink->param_list, list) {
8961 devlink_param_notify(devlink, 0, param_item,
8970 * @devlink_port: devlink port
8980 return __devlink_params_register(devlink_port->devlink,
8993 * @devlink_port: devlink port
9001 return __devlink_params_unregister(devlink_port->devlink,
9033 __devlink_param_driverinit_value_set(struct devlink *devlink,
9055 devlink_param_notify(devlink, port_index, param_item, cmd);
9063 * @devlink: devlink
9070 int devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id,
9073 if (!devlink_reload_supported(devlink->ops))
9076 return __devlink_param_driverinit_value_get(&devlink->param_list,
9086 * @devlink: devlink
9093 int devlink_param_driverinit_value_set(struct devlink *devlink, u32 param_id,
9096 return __devlink_param_driverinit_value_set(devlink, 0,
9097 &devlink->param_list,
9118 struct devlink *devlink = devlink_port->devlink;
9120 if (!devlink_reload_supported(devlink->ops))
9144 return __devlink_param_driverinit_value_set(devlink_port->devlink,
9153 * devlink_param_value_changed - notify devlink on a parameter's value
9157 * @devlink: devlink
9160 * This function should be used by the driver to notify devlink on value
9164 void devlink_param_value_changed(struct devlink *devlink, u32 param_id)
9168 param_item = devlink_param_find_by_id(&devlink->param_list, param_id);
9171 devlink_param_notify(devlink, 0, param_item, DEVLINK_CMD_PARAM_NEW);
9176 * devlink_port_param_value_changed - notify devlink on a parameter's value
9183 * This function should be used by the driver to notify devlink on value
9197 devlink_param_notify(devlink_port->devlink, devlink_port->index,
9222 * @devlink: devlink
9228 devlink_region_create(struct devlink *devlink,
9238 mutex_lock(&devlink->lock);
9240 if (devlink_region_get_by_name(devlink, ops->name)) {
9251 region->devlink = devlink;
9256 list_add_tail(&region->list, &devlink->region_list);
9259 mutex_unlock(&devlink->lock);
9263 mutex_unlock(&devlink->lock);
9271 * @port: devlink port
9281 struct devlink *devlink = port->devlink;
9288 mutex_lock(&devlink->lock);
9301 region->devlink = devlink;
9310 mutex_unlock(&devlink->lock);
9314 mutex_unlock(&devlink->lock);
9322 * @region: devlink region to destroy
9326 struct devlink *devlink = region->devlink;
9329 mutex_lock(&devlink->lock);
9338 mutex_unlock(&devlink->lock);
9355 * @devlink: devlink
9358 int devlink_region_snapshot_id_get(struct devlink *devlink, u32 *id)
9362 mutex_lock(&devlink->lock);
9363 err = __devlink_region_snapshot_id_get(devlink, id);
9364 mutex_unlock(&devlink->lock);
9377 * @devlink: devlink
9380 void devlink_region_snapshot_id_put(struct devlink *devlink, u32 id)
9382 mutex_lock(&devlink->lock);
9383 __devlink_snapshot_id_decrement(devlink, id);
9384 mutex_unlock(&devlink->lock);
9392 * from devlink. This is useful for future analyses of snapshots.
9396 * @region: devlink region of the snapshot
9403 struct devlink *devlink = region->devlink;
9406 mutex_lock(&devlink->lock);
9408 mutex_unlock(&devlink->lock);
9626 devlink_trap_group_notify(struct devlink *devlink,
9640 err = devlink_nl_trap_group_fill(msg, devlink, group_item, cmd, 0, 0,
9647 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink),
9652 devlink_trap_item_group_link(struct devlink *devlink,
9658 group_item = devlink_trap_group_item_lookup_by_id(devlink, group_id);
9667 static void devlink_trap_notify(struct devlink *devlink,
9681 err = devlink_nl_trap_fill(msg, devlink, trap_item, cmd, 0, 0, 0);
9687 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink),
9692 devlink_trap_register(struct devlink *devlink,
9698 if (devlink_trap_item_lookup(devlink, trap->name))
9715 err = devlink_trap_item_group_link(devlink, trap_item);
9719 err = devlink->ops->trap_init(devlink, trap, trap_item);
9723 list_add_tail(&trap_item->list, &devlink->trap_list);
9724 devlink_trap_notify(devlink, trap_item, DEVLINK_CMD_TRAP_NEW);
9736 static void devlink_trap_unregister(struct devlink *devlink,
9741 trap_item = devlink_trap_item_lookup(devlink, trap->name);
9745 devlink_trap_notify(devlink, trap_item, DEVLINK_CMD_TRAP_DEL);
9747 if (devlink->ops->trap_fini)
9748 devlink->ops->trap_fini(devlink, trap, trap_item);
9753 static void devlink_trap_disable(struct devlink *devlink,
9758 trap_item = devlink_trap_item_lookup(devlink, trap->name);
9762 devlink->ops->trap_action_set(devlink, trap, DEVLINK_TRAP_ACTION_DROP,
9768 * devlink_traps_register - Register packet traps with devlink.
9769 * @devlink: devlink.
9776 int devlink_traps_register(struct devlink *devlink,
9782 if (!devlink->ops->trap_init || !devlink->ops->trap_action_set)
9785 mutex_lock(&devlink->lock);
9793 err = devlink_trap_register(devlink, trap, priv);
9797 mutex_unlock(&devlink->lock);
9804 devlink_trap_unregister(devlink, &traps[i]);
9805 mutex_unlock(&devlink->lock);
9811 * devlink_traps_unregister - Unregister packet traps from devlink.
9812 * @devlink: devlink.
9816 void devlink_traps_unregister(struct devlink *devlink,
9822 mutex_lock(&devlink->lock);
9827 devlink_trap_disable(devlink, &traps[i]);
9830 devlink_trap_unregister(devlink, &traps[i]);
9831 mutex_unlock(&devlink->lock);
9867 * @devlink: devlink.
9870 * @in_devlink_port: Input devlink port.
9873 void devlink_trap_report(struct devlink *devlink, struct sk_buff *skb,
9888 trace_devlink_trap_report(devlink, skb, &metadata);
9908 devlink_trap_group_item_policer_link(struct devlink *devlink,
9917 policer_item = devlink_trap_policer_item_lookup(devlink, policer_id);
9927 devlink_trap_group_register(struct devlink *devlink,
9933 if (devlink_trap_group_item_lookup(devlink, group->name))
9948 err = devlink_trap_group_item_policer_link(devlink, group_item);
9952 if (devlink->ops->trap_group_init) {
9953 err = devlink->ops->trap_group_init(devlink, group);
9958 list_add_tail(&group_item->list, &devlink->trap_group_list);
9959 devlink_trap_group_notify(devlink, group_item,
9973 devlink_trap_group_unregister(struct devlink *devlink,
9978 group_item = devlink_trap_group_item_lookup(devlink, group->name);
9982 devlink_trap_group_notify(devlink, group_item,
9990 * devlink_trap_groups_register - Register packet trap groups with devlink.
9991 * @devlink: devlink.
9997 int devlink_trap_groups_register(struct devlink *devlink,
10003 mutex_lock(&devlink->lock);
10011 err = devlink_trap_group_register(devlink, group);
10015 mutex_unlock(&devlink->lock);
10022 devlink_trap_group_unregister(devlink, &groups[i]);
10023 mutex_unlock(&devlink->lock);
10029 * devlink_trap_groups_unregister - Unregister packet trap groups from devlink.
10030 * @devlink: devlink.
10034 void devlink_trap_groups_unregister(struct devlink *devlink,
10040 mutex_lock(&devlink->lock);
10042 devlink_trap_group_unregister(devlink, &groups[i]);
10043 mutex_unlock(&devlink->lock);
10048 devlink_trap_policer_notify(struct devlink *devlink,
10062 err = devlink_nl_trap_policer_fill(msg, devlink, policer_item, cmd, 0,
10069 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink),
10074 devlink_trap_policer_register(struct devlink *devlink,
10080 if (devlink_trap_policer_item_lookup(devlink, policer->id))
10091 if (devlink->ops->trap_policer_init) {
10092 err = devlink->ops->trap_policer_init(devlink, policer);
10097 list_add_tail(&policer_item->list, &devlink->trap_policer_list);
10098 devlink_trap_policer_notify(devlink, policer_item,
10109 devlink_trap_policer_unregister(struct devlink *devlink,
10114 policer_item = devlink_trap_policer_item_lookup(devlink, policer->id);
10118 devlink_trap_policer_notify(devlink, policer_item,
10121 if (devlink->ops->trap_policer_fini)
10122 devlink->ops->trap_policer_fini(devlink, policer);
10127 * devlink_trap_policers_register - Register packet trap policers with devlink.
10128 * @devlink: devlink.
10135 devlink_trap_policers_register(struct devlink *devlink,
10141 mutex_lock(&devlink->lock);
10152 err = devlink_trap_policer_register(devlink, policer);
10156 mutex_unlock(&devlink->lock);
10163 devlink_trap_policer_unregister(devlink, &policers[i]);
10164 mutex_unlock(&devlink->lock);
10170 * devlink_trap_policers_unregister - Unregister packet trap policers from devlink.
10171 * @devlink: devlink.
10176 devlink_trap_policers_unregister(struct devlink *devlink,
10182 mutex_lock(&devlink->lock);
10184 devlink_trap_policer_unregister(devlink, &policers[i]);
10185 mutex_unlock(&devlink->lock);
10189 static void __devlink_compat_running_version(struct devlink *devlink,
10202 err = devlink->ops->info_get(devlink, &req, NULL);
10228 struct devlink *devlink;
10233 devlink = netdev_to_devlink(dev);
10234 if (!devlink || !devlink->ops->info_get)
10237 mutex_lock(&devlink->lock);
10238 __devlink_compat_running_version(devlink, buf, len);
10239 mutex_unlock(&devlink->lock);
10249 struct devlink *devlink;
10255 devlink = netdev_to_devlink(dev);
10256 if (!devlink || !devlink->ops->flash_update) {
10263 mutex_lock(&devlink->lock);
10264 ret = devlink->ops->flash_update(devlink, &params, NULL);
10265 mutex_unlock(&devlink->lock);
10281 * any devlink lock as only permanent values are accessed.
10299 * any devlink lock as only permanent values are accessed.
10312 struct devlink *devlink;
10317 * all devlink instances from this namespace into init_net.
10320 list_for_each_entry(devlink, &devlink_list, list) {
10321 if (net_eq(devlink_net(devlink), net)) {
10322 if (WARN_ON(!devlink_reload_supported(devlink->ops)))
10324 err = devlink_reload(devlink, &init_net,
10329 pr_warn("Failed to reload devlink instance into init_net\n");