Lines Matching refs:devlink
102 struct net *devlink_net(const struct devlink *devlink) in devlink_net() argument
104 return read_pnet(&devlink->_net); in devlink_net()
108 static void __devlink_net_set(struct devlink *devlink, struct net *net) in __devlink_net_set() argument
110 write_pnet(&devlink->_net, net); in __devlink_net_set()
113 void devlink_net_set(struct devlink *devlink, struct net *net) in devlink_net_set() argument
115 if (WARN_ON(devlink->registered)) in devlink_net_set()
117 __devlink_net_set(devlink, net); in devlink_net_set()
121 static struct devlink *devlink_get_from_attrs(struct net *net, in devlink_get_from_attrs()
124 struct devlink *devlink; in devlink_get_from_attrs() local
136 list_for_each_entry(devlink, &devlink_list, list) { in devlink_get_from_attrs()
137 if (strcmp(devlink->dev->bus->name, busname) == 0 && in devlink_get_from_attrs()
138 strcmp(dev_name(devlink->dev), devname) == 0 && in devlink_get_from_attrs()
139 net_eq(devlink_net(devlink), net)) in devlink_get_from_attrs()
140 return devlink; in devlink_get_from_attrs()
146 static struct devlink *devlink_get_from_info(struct genl_info *info) in devlink_get_from_info()
151 static struct devlink_port *devlink_port_get_by_index(struct devlink *devlink, in devlink_port_get_by_index() argument
156 list_for_each_entry(devlink_port, &devlink->port_list, list) { in devlink_port_get_by_index()
163 static bool devlink_port_index_exists(struct devlink *devlink, in devlink_port_index_exists() argument
166 return devlink_port_get_by_index(devlink, port_index); in devlink_port_index_exists()
169 static struct devlink_port *devlink_port_get_from_attrs(struct devlink *devlink, in devlink_port_get_from_attrs() argument
176 devlink_port = devlink_port_get_by_index(devlink, port_index); in devlink_port_get_from_attrs()
184 static struct devlink_port *devlink_port_get_from_info(struct devlink *devlink, in devlink_port_get_from_info() argument
187 return devlink_port_get_from_attrs(devlink, info->attrs); in devlink_port_get_from_info()
205 static struct devlink_sb *devlink_sb_get_by_index(struct devlink *devlink, in devlink_sb_get_by_index() argument
210 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_sb_get_by_index()
217 static bool devlink_sb_index_exists(struct devlink *devlink, in devlink_sb_index_exists() argument
220 return devlink_sb_get_by_index(devlink, sb_index); in devlink_sb_index_exists()
223 static struct devlink_sb *devlink_sb_get_from_attrs(struct devlink *devlink, in devlink_sb_get_from_attrs() argument
230 devlink_sb = devlink_sb_get_by_index(devlink, sb_index); in devlink_sb_get_from_attrs()
238 static struct devlink_sb *devlink_sb_get_from_info(struct devlink *devlink, in devlink_sb_get_from_info() argument
241 return devlink_sb_get_from_attrs(devlink, info->attrs); in devlink_sb_get_from_info()
349 struct devlink *devlink; member
370 devlink_region_get_by_name(struct devlink *devlink, const char *region_name) in devlink_region_get_by_name() argument
374 list_for_each_entry(region, &devlink->region_list, list) in devlink_region_get_by_name()
419 struct devlink *devlink; in devlink_nl_pre_doit() local
423 devlink = devlink_get_from_info(info); in devlink_nl_pre_doit()
424 if (IS_ERR(devlink)) { in devlink_nl_pre_doit()
426 return PTR_ERR(devlink); in devlink_nl_pre_doit()
429 mutex_lock(&devlink->lock); in devlink_nl_pre_doit()
430 info->user_ptr[0] = devlink; in devlink_nl_pre_doit()
432 devlink_port = devlink_port_get_from_info(devlink, info); in devlink_nl_pre_doit()
439 devlink_port = devlink_port_get_from_info(devlink, info); in devlink_nl_pre_doit()
447 mutex_unlock(&devlink->lock); in devlink_nl_pre_doit()
455 struct devlink *devlink; in devlink_nl_post_doit() local
457 devlink = info->user_ptr[0]; in devlink_nl_post_doit()
459 mutex_unlock(&devlink->lock); in devlink_nl_post_doit()
473 static int devlink_nl_put_handle(struct sk_buff *msg, struct devlink *devlink) in devlink_nl_put_handle() argument
475 if (nla_put_string(msg, DEVLINK_ATTR_BUS_NAME, devlink->dev->bus->name)) in devlink_nl_put_handle()
477 if (nla_put_string(msg, DEVLINK_ATTR_DEV_NAME, dev_name(devlink->dev))) in devlink_nl_put_handle()
509 devlink_reload_action_is_supported(struct devlink *devlink, enum devlink_reload_action action) in devlink_reload_action_is_supported() argument
511 return test_bit(action, &devlink->ops->reload_actions); in devlink_reload_action_is_supported()
515 devlink_reload_limit_is_supported(struct devlink *devlink, enum devlink_reload_limit limit) in devlink_reload_limit_is_supported() argument
517 return test_bit(limit, &devlink->ops->reload_limits); in devlink_reload_limit_is_supported()
540 static int devlink_reload_stats_put(struct sk_buff *msg, struct devlink *devlink, bool is_remote) in devlink_reload_stats_put() argument
556 !devlink_reload_action_is_supported(devlink, i)) || in devlink_reload_stats_put()
576 !devlink_reload_limit_is_supported(devlink, j)) || in devlink_reload_stats_put()
582 value = devlink->stats.reload_stats[stat_idx]; in devlink_reload_stats_put()
584 value = devlink->stats.remote_reload_stats[stat_idx]; in devlink_reload_stats_put()
603 static int devlink_nl_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_fill() argument
614 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_fill()
616 if (nla_put_u8(msg, DEVLINK_ATTR_RELOAD_FAILED, devlink->reload_failed)) in devlink_nl_fill()
623 if (devlink_reload_stats_put(msg, devlink, false)) in devlink_nl_fill()
625 if (devlink_reload_stats_put(msg, devlink, true)) in devlink_nl_fill()
639 static void devlink_notify(struct devlink *devlink, enum devlink_command cmd) in devlink_notify() argument
650 err = devlink_nl_fill(msg, devlink, cmd, 0, 0, 0); in devlink_notify()
656 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_notify()
718 struct devlink *devlink = port->devlink; in devlink_nl_port_function_attrs_put() local
728 ops = devlink->ops; in devlink_nl_port_function_attrs_put()
733 err = ops->port_function_hw_addr_get(devlink, port, hw_addr, &hw_addr_len, extack); in devlink_nl_port_function_attrs_put()
757 static int devlink_nl_port_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_port_fill() argument
769 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_port_fill()
784 struct net *net = devlink_net(devlink_port->devlink); in devlink_nl_port_fill()
823 struct devlink *devlink = devlink_port->devlink; in devlink_port_notify() local
836 err = devlink_nl_port_fill(msg, devlink, devlink_port, cmd, 0, 0, 0, in devlink_port_notify()
843 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_port_notify()
849 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_get_doit() local
857 err = devlink_nl_fill(msg, devlink, DEVLINK_CMD_NEW, in devlink_nl_cmd_get_doit()
870 struct devlink *devlink; in devlink_nl_cmd_get_dumpit() local
876 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_get_dumpit()
877 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_get_dumpit()
883 err = devlink_nl_fill(msg, devlink, DEVLINK_CMD_NEW, in devlink_nl_cmd_get_dumpit()
901 struct devlink *devlink = devlink_port->devlink; in devlink_nl_cmd_port_get_doit() local
909 err = devlink_nl_port_fill(msg, devlink, devlink_port, in devlink_nl_cmd_port_get_doit()
924 struct devlink *devlink; in devlink_nl_cmd_port_get_dumpit() local
931 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_port_get_dumpit()
932 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_port_get_dumpit()
934 mutex_lock(&devlink->lock); in devlink_nl_cmd_port_get_dumpit()
935 list_for_each_entry(devlink_port, &devlink->port_list, list) { in devlink_nl_cmd_port_get_dumpit()
940 err = devlink_nl_port_fill(msg, devlink, devlink_port, in devlink_nl_cmd_port_get_dumpit()
947 mutex_unlock(&devlink->lock); in devlink_nl_cmd_port_get_dumpit()
952 mutex_unlock(&devlink->lock); in devlink_nl_cmd_port_get_dumpit()
961 static int devlink_port_type_set(struct devlink *devlink, in devlink_port_type_set() argument
968 if (devlink->ops->port_type_set) { in devlink_port_type_set()
971 err = devlink->ops->port_type_set(devlink_port, port_type); in devlink_port_type_set()
982 devlink_port_function_hw_addr_set(struct devlink *devlink, struct devlink_port *port, in devlink_port_function_hw_addr_set() argument
1007 ops = devlink->ops; in devlink_port_function_hw_addr_set()
1013 err = ops->port_function_hw_addr_set(devlink, port, hw_addr, hw_addr_len, extack); in devlink_port_function_hw_addr_set()
1022 devlink_port_function_set(struct devlink *devlink, struct devlink_port *port, in devlink_port_function_set() argument
1037 err = devlink_port_function_hw_addr_set(devlink, port, attr, extack); in devlink_port_function_set()
1046 struct devlink *devlink = devlink_port->devlink; in devlink_nl_cmd_port_set_doit() local
1053 err = devlink_port_type_set(devlink, devlink_port, port_type); in devlink_nl_cmd_port_set_doit()
1062 err = devlink_port_function_set(devlink, devlink_port, attr, extack); in devlink_nl_cmd_port_set_doit()
1070 static int devlink_port_split(struct devlink *devlink, u32 port_index, in devlink_port_split() argument
1074 if (devlink->ops->port_split) in devlink_port_split()
1075 return devlink->ops->port_split(devlink, port_index, count, in devlink_port_split()
1083 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_port_split_doit() local
1092 devlink_port = devlink_port_get_from_info(devlink, info); in devlink_nl_cmd_port_split_doit()
1113 return devlink_port_split(devlink, port_index, count, info->extack); in devlink_nl_cmd_port_split_doit()
1116 static int devlink_port_unsplit(struct devlink *devlink, u32 port_index, in devlink_port_unsplit() argument
1120 if (devlink->ops->port_unsplit) in devlink_port_unsplit()
1121 return devlink->ops->port_unsplit(devlink, port_index, extack); in devlink_port_unsplit()
1128 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_port_unsplit_doit() local
1135 return devlink_port_unsplit(devlink, port_index, info->extack); in devlink_nl_cmd_port_unsplit_doit()
1138 static int devlink_nl_sb_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_sb_fill() argument
1149 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_sb_fill()
1179 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_get_doit() local
1184 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_get_doit()
1192 err = devlink_nl_sb_fill(msg, devlink, devlink_sb, in devlink_nl_cmd_sb_get_doit()
1206 struct devlink *devlink; in devlink_nl_cmd_sb_get_dumpit() local
1213 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_sb_get_dumpit()
1214 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_sb_get_dumpit()
1216 mutex_lock(&devlink->lock); in devlink_nl_cmd_sb_get_dumpit()
1217 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_nl_cmd_sb_get_dumpit()
1222 err = devlink_nl_sb_fill(msg, devlink, devlink_sb, in devlink_nl_cmd_sb_get_dumpit()
1228 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_get_dumpit()
1233 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_get_dumpit()
1242 static int devlink_nl_sb_pool_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_sb_pool_fill() argument
1251 err = devlink->ops->sb_pool_get(devlink, devlink_sb->index, in devlink_nl_sb_pool_fill()
1260 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_sb_pool_fill()
1288 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_pool_get_doit() local
1294 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_pool_get_doit()
1303 if (!devlink->ops->sb_pool_get) in devlink_nl_cmd_sb_pool_get_doit()
1310 err = devlink_nl_sb_pool_fill(msg, devlink, devlink_sb, pool_index, in devlink_nl_cmd_sb_pool_get_doit()
1322 struct devlink *devlink, in __sb_pool_get_dumpit() argument
1335 err = devlink_nl_sb_pool_fill(msg, devlink, in __sb_pool_get_dumpit()
1350 struct devlink *devlink; in devlink_nl_cmd_sb_pool_get_dumpit() local
1357 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_sb_pool_get_dumpit()
1358 if (!net_eq(devlink_net(devlink), sock_net(msg->sk)) || in devlink_nl_cmd_sb_pool_get_dumpit()
1359 !devlink->ops->sb_pool_get) in devlink_nl_cmd_sb_pool_get_dumpit()
1361 mutex_lock(&devlink->lock); in devlink_nl_cmd_sb_pool_get_dumpit()
1362 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_nl_cmd_sb_pool_get_dumpit()
1363 err = __sb_pool_get_dumpit(msg, start, &idx, devlink, in devlink_nl_cmd_sb_pool_get_dumpit()
1370 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_pool_get_dumpit()
1374 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_pool_get_dumpit()
1386 static int devlink_sb_pool_set(struct devlink *devlink, unsigned int sb_index, in devlink_sb_pool_set() argument
1392 const struct devlink_ops *ops = devlink->ops; in devlink_sb_pool_set()
1395 return ops->sb_pool_set(devlink, sb_index, pool_index, in devlink_sb_pool_set()
1403 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_pool_set_doit() local
1410 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_pool_set_doit()
1427 return devlink_sb_pool_set(devlink, devlink_sb->index, in devlink_nl_cmd_sb_pool_set_doit()
1433 struct devlink *devlink, in devlink_nl_sb_port_pool_fill() argument
1440 const struct devlink_ops *ops = devlink->ops; in devlink_nl_sb_port_pool_fill()
1454 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_sb_port_pool_fill()
1495 struct devlink *devlink = devlink_port->devlink; in devlink_nl_cmd_sb_port_pool_get_doit() local
1501 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_port_pool_get_doit()
1510 if (!devlink->ops->sb_port_pool_get) in devlink_nl_cmd_sb_port_pool_get_doit()
1517 err = devlink_nl_sb_port_pool_fill(msg, devlink, devlink_port, in devlink_nl_cmd_sb_port_pool_get_doit()
1530 struct devlink *devlink, in __sb_port_pool_get_dumpit() argument
1539 list_for_each_entry(devlink_port, &devlink->port_list, list) { in __sb_port_pool_get_dumpit()
1545 err = devlink_nl_sb_port_pool_fill(msg, devlink, in __sb_port_pool_get_dumpit()
1563 struct devlink *devlink; in devlink_nl_cmd_sb_port_pool_get_dumpit() local
1570 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_sb_port_pool_get_dumpit()
1571 if (!net_eq(devlink_net(devlink), sock_net(msg->sk)) || in devlink_nl_cmd_sb_port_pool_get_dumpit()
1572 !devlink->ops->sb_port_pool_get) in devlink_nl_cmd_sb_port_pool_get_dumpit()
1574 mutex_lock(&devlink->lock); in devlink_nl_cmd_sb_port_pool_get_dumpit()
1575 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_nl_cmd_sb_port_pool_get_dumpit()
1577 devlink, devlink_sb, in devlink_nl_cmd_sb_port_pool_get_dumpit()
1583 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_port_pool_get_dumpit()
1587 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_port_pool_get_dumpit()
1605 const struct devlink_ops *ops = devlink_port->devlink->ops; in devlink_sb_port_pool_set()
1617 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_port_pool_set_doit() local
1623 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_port_pool_set_doit()
1641 devlink_nl_sb_tc_pool_bind_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_sb_tc_pool_bind_fill() argument
1648 const struct devlink_ops *ops = devlink->ops; in devlink_nl_sb_tc_pool_bind_fill()
1664 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_sb_tc_pool_bind_fill()
1709 struct devlink *devlink = devlink_port->devlink; in devlink_nl_cmd_sb_tc_pool_bind_get_doit() local
1716 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_tc_pool_bind_get_doit()
1729 if (!devlink->ops->sb_tc_pool_bind_get) in devlink_nl_cmd_sb_tc_pool_bind_get_doit()
1736 err = devlink_nl_sb_tc_pool_bind_fill(msg, devlink, devlink_port, in devlink_nl_cmd_sb_tc_pool_bind_get_doit()
1751 struct devlink *devlink, in __sb_tc_pool_bind_get_dumpit() argument
1759 list_for_each_entry(devlink_port, &devlink->port_list, list) { in __sb_tc_pool_bind_get_dumpit()
1766 err = devlink_nl_sb_tc_pool_bind_fill(msg, devlink, in __sb_tc_pool_bind_get_dumpit()
1784 err = devlink_nl_sb_tc_pool_bind_fill(msg, devlink, in __sb_tc_pool_bind_get_dumpit()
1804 struct devlink *devlink; in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit() local
1811 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
1812 if (!net_eq(devlink_net(devlink), sock_net(msg->sk)) || in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
1813 !devlink->ops->sb_tc_pool_bind_get) in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
1816 mutex_lock(&devlink->lock); in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
1817 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
1819 devlink, in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
1826 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
1830 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
1849 const struct devlink_ops *ops = devlink_port->devlink->ops; in devlink_sb_tc_pool_bind_set()
1862 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_tc_pool_bind_set_doit() local
1870 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_tc_pool_bind_set_doit()
1900 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_occ_snapshot_doit() local
1901 const struct devlink_ops *ops = devlink->ops; in devlink_nl_cmd_sb_occ_snapshot_doit()
1904 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_occ_snapshot_doit()
1909 return ops->sb_occ_snapshot(devlink, devlink_sb->index); in devlink_nl_cmd_sb_occ_snapshot_doit()
1916 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_occ_max_clear_doit() local
1917 const struct devlink_ops *ops = devlink->ops; in devlink_nl_cmd_sb_occ_max_clear_doit()
1920 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_occ_max_clear_doit()
1925 return ops->sb_occ_max_clear(devlink, devlink_sb->index); in devlink_nl_cmd_sb_occ_max_clear_doit()
1929 static int devlink_nl_eswitch_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_eswitch_fill() argument
1933 const struct devlink_ops *ops = devlink->ops; in devlink_nl_eswitch_fill()
1944 err = devlink_nl_put_handle(msg, devlink); in devlink_nl_eswitch_fill()
1949 err = ops->eswitch_mode_get(devlink, &mode); in devlink_nl_eswitch_fill()
1958 err = ops->eswitch_inline_mode_get(devlink, &inline_mode); in devlink_nl_eswitch_fill()
1968 err = ops->eswitch_encap_mode_get(devlink, &encap_mode); in devlink_nl_eswitch_fill()
1987 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_eswitch_get_doit() local
1995 err = devlink_nl_eswitch_fill(msg, devlink, DEVLINK_CMD_ESWITCH_GET, in devlink_nl_cmd_eswitch_get_doit()
2009 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_eswitch_set_doit() local
2010 const struct devlink_ops *ops = devlink->ops; in devlink_nl_cmd_eswitch_set_doit()
2020 err = ops->eswitch_mode_set(devlink, mode, info->extack); in devlink_nl_cmd_eswitch_set_doit()
2030 err = ops->eswitch_inline_mode_set(devlink, inline_mode, in devlink_nl_cmd_eswitch_set_doit()
2040 err = ops->eswitch_encap_mode_set(devlink, encap_mode, in devlink_nl_cmd_eswitch_set_doit()
2206 struct devlink *devlink = info->user_ptr[0]; in devlink_dpipe_tables_fill() local
2230 if (devlink_nl_put_handle(skb, devlink)) in devlink_dpipe_tables_fill()
2284 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_dpipe_table_get() local
2291 &devlink->dpipe_table_list, in devlink_nl_cmd_dpipe_table_get()
2443 const char *table_name, struct devlink *devlink) in devlink_dpipe_table_find() argument
2447 lockdep_is_held(&devlink->lock)) { in devlink_dpipe_table_find()
2456 struct devlink *devlink; in devlink_dpipe_entry_ctx_prepare() local
2472 devlink = dump_ctx->info->user_ptr[0]; in devlink_dpipe_entry_ctx_prepare()
2473 if (devlink_nl_put_handle(dump_ctx->skb, devlink)) in devlink_dpipe_entry_ctx_prepare()
2557 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_dpipe_entries_get() local
2565 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, in devlink_nl_cmd_dpipe_entries_get()
2566 table_name, devlink); in devlink_nl_cmd_dpipe_entries_get()
2644 struct devlink *devlink = info->user_ptr[0]; in devlink_dpipe_headers_fill() local
2665 if (devlink_nl_put_handle(skb, devlink)) in devlink_dpipe_headers_fill()
2707 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_dpipe_headers_get() local
2709 if (!devlink->dpipe_headers) in devlink_nl_cmd_dpipe_headers_get()
2712 0, devlink->dpipe_headers); in devlink_nl_cmd_dpipe_headers_get()
2715 static int devlink_dpipe_table_counters_set(struct devlink *devlink, in devlink_dpipe_table_counters_set() argument
2721 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, in devlink_dpipe_table_counters_set()
2722 table_name, devlink); in devlink_dpipe_table_counters_set()
2741 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_dpipe_table_counters_set() local
2752 return devlink_dpipe_table_counters_set(devlink, table_name, in devlink_nl_cmd_dpipe_table_counters_set()
2757 devlink_resource_find(struct devlink *devlink, in devlink_resource_find() argument
2765 resource_list = &devlink->resource_list; in devlink_resource_find()
2773 child_resource = devlink_resource_find(devlink, resource, in devlink_resource_find()
2829 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_resource_set() local
2840 resource = devlink_resource_find(devlink, NULL, resource_id); in devlink_nl_cmd_resource_set()
2884 static int devlink_resource_put(struct devlink *devlink, struct sk_buff *skb, in devlink_resource_put() argument
2921 if (devlink_resource_put(devlink, skb, child_resource)) in devlink_resource_put()
2940 struct devlink *devlink = info->user_ptr[0]; in devlink_resource_fill() local
2950 resource = list_first_entry(&devlink->resource_list, in devlink_resource_fill()
2964 if (devlink_nl_put_handle(skb, devlink)) in devlink_resource_fill()
2974 list_for_each_entry_from(resource, &devlink->resource_list, list) { in devlink_resource_fill()
2975 err = devlink_resource_put(devlink, skb, resource); in devlink_resource_fill()
3009 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_resource_dump() local
3011 if (list_empty(&devlink->resource_list)) in devlink_nl_cmd_resource_dump()
3018 devlink_resources_validate(struct devlink *devlink, in devlink_resources_validate() argument
3028 resource_list = &devlink->resource_list; in devlink_resources_validate()
3033 err = devlink_resources_validate(devlink, resource, info); in devlink_resources_validate()
3077 static void devlink_param_notify(struct devlink *devlink,
3082 static void devlink_ns_change_notify(struct devlink *devlink, in devlink_ns_change_notify() argument
3099 devlink_notify(devlink, DEVLINK_CMD_NEW); in devlink_ns_change_notify()
3102 list_for_each_entry(param_item, &devlink->param_list, list) in devlink_ns_change_notify()
3103 devlink_param_notify(devlink, 0, param_item, cmd); in devlink_ns_change_notify()
3106 devlink_notify(devlink, DEVLINK_CMD_DEL); in devlink_ns_change_notify()
3114 static void devlink_reload_failed_set(struct devlink *devlink, in devlink_reload_failed_set() argument
3117 if (devlink->reload_failed == reload_failed) in devlink_reload_failed_set()
3119 devlink->reload_failed = reload_failed; in devlink_reload_failed_set()
3120 devlink_notify(devlink, DEVLINK_CMD_NEW); in devlink_reload_failed_set()
3123 bool devlink_is_reload_failed(const struct devlink *devlink) in devlink_is_reload_failed() argument
3125 return devlink->reload_failed; in devlink_is_reload_failed()
3130 __devlink_reload_stats_update(struct devlink *devlink, u32 *reload_stats, in __devlink_reload_stats_update() argument
3141 devlink_notify(devlink, DEVLINK_CMD_NEW); in __devlink_reload_stats_update()
3145 devlink_reload_stats_update(struct devlink *devlink, enum devlink_reload_limit limit, in devlink_reload_stats_update() argument
3148 __devlink_reload_stats_update(devlink, devlink->stats.reload_stats, limit, in devlink_reload_stats_update()
3166 void devlink_remote_reload_actions_performed(struct devlink *devlink, in devlink_remote_reload_actions_performed() argument
3176 __devlink_reload_stats_update(devlink, devlink->stats.remote_reload_stats, limit, in devlink_remote_reload_actions_performed()
3181 static int devlink_reload(struct devlink *devlink, struct net *dest_net, in devlink_reload() argument
3189 if (!devlink->reload_enabled) in devlink_reload()
3192 memcpy(remote_reload_stats, devlink->stats.remote_reload_stats, in devlink_reload()
3195 curr_net = devlink_net(devlink); in devlink_reload()
3196 devlink_ns_change_notify(devlink, dest_net, curr_net, false); in devlink_reload()
3197 err = devlink->ops->reload_down(devlink, !!dest_net, action, limit, extack); in devlink_reload()
3202 __devlink_net_set(devlink, dest_net); in devlink_reload()
3204 err = devlink->ops->reload_up(devlink, action, limit, actions_performed, extack); in devlink_reload()
3205 devlink_reload_failed_set(devlink, !!err); in devlink_reload()
3209 devlink_ns_change_notify(devlink, dest_net, curr_net, true); in devlink_reload()
3212 WARN_ON(memcmp(remote_reload_stats, devlink->stats.remote_reload_stats, in devlink_reload()
3214 devlink_reload_stats_update(devlink, limit, *actions_performed); in devlink_reload()
3219 devlink_nl_reload_actions_performed_snd(struct devlink *devlink, u32 actions_performed, in devlink_nl_reload_actions_performed_snd() argument
3233 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_reload_actions_performed_snd()
3252 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_reload() local
3259 if (!devlink_reload_supported(devlink->ops)) in devlink_nl_cmd_reload()
3262 err = devlink_resources_validate(devlink, NULL, info); in devlink_nl_cmd_reload()
3273 if (!devlink_reload_action_is_supported(devlink, action)) { in devlink_nl_cmd_reload()
3299 if (!devlink_reload_limit_is_supported(devlink, limit)) { in devlink_nl_cmd_reload()
3318 err = devlink_reload(devlink, dest_net, action, limit, &actions_performed, info->extack); in devlink_nl_cmd_reload()
3329 return devlink_nl_reload_actions_performed_snd(devlink, actions_performed, in devlink_nl_cmd_reload()
3334 struct devlink *devlink, in devlink_nl_flash_update_fill() argument
3344 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_flash_update_fill()
3377 static void __devlink_flash_update_notify(struct devlink *devlink, in __devlink_flash_update_notify() argument
3392 err = devlink_nl_flash_update_fill(msg, devlink, cmd, params); in __devlink_flash_update_notify()
3396 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in __devlink_flash_update_notify()
3404 void devlink_flash_update_begin_notify(struct devlink *devlink) in devlink_flash_update_begin_notify() argument
3408 __devlink_flash_update_notify(devlink, in devlink_flash_update_begin_notify()
3414 void devlink_flash_update_end_notify(struct devlink *devlink) in devlink_flash_update_end_notify() argument
3418 __devlink_flash_update_notify(devlink, in devlink_flash_update_end_notify()
3424 void devlink_flash_update_status_notify(struct devlink *devlink, in devlink_flash_update_status_notify() argument
3437 __devlink_flash_update_notify(devlink, in devlink_flash_update_status_notify()
3443 void devlink_flash_update_timeout_notify(struct devlink *devlink, in devlink_flash_update_timeout_notify() argument
3454 __devlink_flash_update_notify(devlink, in devlink_flash_update_timeout_notify()
3465 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_flash_update() local
3468 if (!devlink->ops->flash_update) in devlink_nl_cmd_flash_update()
3474 supported_params = devlink->ops->supported_flash_update_params; in devlink_nl_cmd_flash_update()
3501 return devlink->ops->flash_update(devlink, ¶ms, info->extack); in devlink_nl_cmd_flash_update()
3619 static int devlink_param_get(struct devlink *devlink, in devlink_param_get() argument
3623 if (!param->get || devlink->reload_failed) in devlink_param_get()
3625 return param->get(devlink, param->id, ctx); in devlink_param_get()
3628 static int devlink_param_set(struct devlink *devlink, in devlink_param_set() argument
3632 if (!param->set || devlink->reload_failed) in devlink_param_set()
3634 return param->set(devlink, param->id, ctx); in devlink_param_set()
3706 static int devlink_nl_param_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_param_fill() argument
3735 err = devlink_param_get(devlink, param, &ctx); in devlink_nl_param_fill()
3747 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_param_fill()
3798 static void devlink_param_notify(struct devlink *devlink, in devlink_param_notify() argument
3813 err = devlink_nl_param_fill(msg, devlink, port_index, param_item, cmd, in devlink_param_notify()
3820 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_param_notify()
3828 struct devlink *devlink; in devlink_nl_cmd_param_get_dumpit() local
3834 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_param_get_dumpit()
3835 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_param_get_dumpit()
3837 mutex_lock(&devlink->lock); in devlink_nl_cmd_param_get_dumpit()
3838 list_for_each_entry(param_item, &devlink->param_list, list) { in devlink_nl_cmd_param_get_dumpit()
3843 err = devlink_nl_param_fill(msg, devlink, 0, param_item, in devlink_nl_cmd_param_get_dumpit()
3851 mutex_unlock(&devlink->lock); in devlink_nl_cmd_param_get_dumpit()
3856 mutex_unlock(&devlink->lock); in devlink_nl_cmd_param_get_dumpit()
3959 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_param_get_doit() local
3964 param_item = devlink_param_get_from_info(&devlink->param_list, info); in devlink_nl_cmd_param_get_doit()
3972 err = devlink_nl_param_fill(msg, devlink, 0, param_item, in devlink_nl_cmd_param_get_doit()
3983 static int __devlink_nl_cmd_param_set_doit(struct devlink *devlink, in __devlink_nl_cmd_param_set_doit() argument
4010 err = param->validate(devlink, param->id, value, info->extack); in __devlink_nl_cmd_param_set_doit()
4032 err = devlink_param_set(devlink, param, &ctx); in __devlink_nl_cmd_param_set_doit()
4037 devlink_param_notify(devlink, port_index, param_item, cmd); in __devlink_nl_cmd_param_set_doit()
4044 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_param_set_doit() local
4046 return __devlink_nl_cmd_param_set_doit(devlink, 0, &devlink->param_list, in devlink_nl_cmd_param_set_doit()
4050 static int devlink_param_register_one(struct devlink *devlink, in devlink_param_register_one() argument
4072 devlink_param_notify(devlink, port_index, param_item, cmd); in devlink_param_register_one()
4076 static void devlink_param_unregister_one(struct devlink *devlink, in devlink_param_unregister_one() argument
4086 devlink_param_notify(devlink, port_index, param_item, cmd); in devlink_param_unregister_one()
4096 struct devlink *devlink; in devlink_nl_cmd_port_param_get_dumpit() local
4102 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_port_param_get_dumpit()
4103 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_port_param_get_dumpit()
4105 mutex_lock(&devlink->lock); in devlink_nl_cmd_port_param_get_dumpit()
4106 list_for_each_entry(devlink_port, &devlink->port_list, list) { in devlink_nl_cmd_port_param_get_dumpit()
4114 devlink_port->devlink, in devlink_nl_cmd_port_param_get_dumpit()
4123 mutex_unlock(&devlink->lock); in devlink_nl_cmd_port_param_get_dumpit()
4129 mutex_unlock(&devlink->lock); in devlink_nl_cmd_port_param_get_dumpit()
4158 err = devlink_nl_param_fill(msg, devlink_port->devlink, in devlink_nl_cmd_port_param_get_doit()
4175 return __devlink_nl_cmd_param_set_doit(devlink_port->devlink, in devlink_nl_cmd_port_param_set_doit()
4182 struct devlink *devlink, in devlink_nl_region_snapshot_id_put() argument
4205 struct devlink *devlink, in devlink_nl_region_snapshots_id_put() argument
4218 err = devlink_nl_region_snapshot_id_put(msg, devlink, snapshot); in devlink_nl_region_snapshots_id_put()
4231 static int devlink_nl_region_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_region_fill() argument
4243 err = devlink_nl_put_handle(msg, devlink); in devlink_nl_region_fill()
4264 err = devlink_nl_region_snapshots_id_put(msg, devlink, region); in devlink_nl_region_fill()
4281 struct devlink *devlink = region->devlink; in devlink_nl_region_notify_build() local
4297 err = devlink_nl_put_handle(msg, devlink); in devlink_nl_region_notify_build()
4339 struct devlink *devlink = region->devlink; in devlink_nl_region_notify() local
4348 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_nl_region_notify()
4367 static int __devlink_snapshot_id_increment(struct devlink *devlink, u32 id) in __devlink_snapshot_id_increment() argument
4372 lockdep_assert_held(&devlink->lock); in __devlink_snapshot_id_increment()
4374 p = xa_load(&devlink->snapshot_ids, id); in __devlink_snapshot_id_increment()
4384 return xa_err(xa_store(&devlink->snapshot_ids, id, xa_mk_value(count), in __devlink_snapshot_id_increment()
4403 static void __devlink_snapshot_id_decrement(struct devlink *devlink, u32 id) in __devlink_snapshot_id_decrement() argument
4408 lockdep_assert_held(&devlink->lock); in __devlink_snapshot_id_decrement()
4410 p = xa_load(&devlink->snapshot_ids, id); in __devlink_snapshot_id_decrement()
4421 xa_store(&devlink->snapshot_ids, id, xa_mk_value(count), in __devlink_snapshot_id_decrement()
4425 xa_erase(&devlink->snapshot_ids, id); in __devlink_snapshot_id_decrement()
4445 static int __devlink_snapshot_id_insert(struct devlink *devlink, u32 id) in __devlink_snapshot_id_insert() argument
4447 lockdep_assert_held(&devlink->lock); in __devlink_snapshot_id_insert()
4449 if (xa_load(&devlink->snapshot_ids, id)) in __devlink_snapshot_id_insert()
4452 return xa_err(xa_store(&devlink->snapshot_ids, id, xa_mk_value(0), in __devlink_snapshot_id_insert()
4472 static int __devlink_region_snapshot_id_get(struct devlink *devlink, u32 *id) in __devlink_region_snapshot_id_get() argument
4474 lockdep_assert_held(&devlink->lock); in __devlink_region_snapshot_id_get()
4476 return xa_alloc(&devlink->snapshot_ids, id, xa_mk_value(1), in __devlink_region_snapshot_id_get()
4498 struct devlink *devlink = region->devlink; in __devlink_region_snapshot_create() local
4502 lockdep_assert_held(&devlink->lock); in __devlink_region_snapshot_create()
4515 err = __devlink_snapshot_id_increment(devlink, snapshot_id); in __devlink_region_snapshot_create()
4538 struct devlink *devlink = region->devlink; in devlink_region_snapshot_del() local
4540 lockdep_assert_held(&devlink->lock); in devlink_region_snapshot_del()
4546 __devlink_snapshot_id_decrement(devlink, snapshot->id); in devlink_region_snapshot_del()
4553 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_region_get_doit() local
4567 port = devlink_port_get_by_index(devlink, index); in devlink_nl_cmd_region_get_doit()
4576 region = devlink_region_get_by_name(devlink, region_name); in devlink_nl_cmd_region_get_doit()
4585 err = devlink_nl_region_fill(msg, devlink, DEVLINK_CMD_REGION_GET, in devlink_nl_cmd_region_get_doit()
4610 err = devlink_nl_region_fill(msg, port->devlink, in devlink_nl_cmd_region_get_port_dumpit()
4626 struct devlink *devlink, in devlink_nl_cmd_region_get_devlink_dumpit() argument
4634 mutex_lock(&devlink->lock); in devlink_nl_cmd_region_get_devlink_dumpit()
4635 list_for_each_entry(region, &devlink->region_list, list) { in devlink_nl_cmd_region_get_devlink_dumpit()
4640 err = devlink_nl_region_fill(msg, devlink, in devlink_nl_cmd_region_get_devlink_dumpit()
4650 list_for_each_entry(port, &devlink->port_list, list) { in devlink_nl_cmd_region_get_devlink_dumpit()
4658 mutex_unlock(&devlink->lock); in devlink_nl_cmd_region_get_devlink_dumpit()
4665 struct devlink *devlink; in devlink_nl_cmd_region_get_dumpit() local
4671 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_region_get_dumpit()
4672 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_region_get_dumpit()
4674 err = devlink_nl_cmd_region_get_devlink_dumpit(msg, cb, devlink, in devlink_nl_cmd_region_get_dumpit()
4688 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_region_del() local
4706 port = devlink_port_get_by_index(devlink, index); in devlink_nl_cmd_region_del()
4714 region = devlink_region_get_by_name(devlink, region_name); in devlink_nl_cmd_region_del()
4730 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_region_new() local
4751 port = devlink_port_get_by_index(devlink, index); in devlink_nl_cmd_region_new()
4759 region = devlink_region_get_by_name(devlink, region_name); in devlink_nl_cmd_region_new()
4785 err = __devlink_snapshot_id_insert(devlink, snapshot_id); in devlink_nl_cmd_region_new()
4789 err = __devlink_region_snapshot_id_get(devlink, &snapshot_id); in devlink_nl_cmd_region_new()
4800 err = region->ops->snapshot(devlink, region->ops, in devlink_nl_cmd_region_new()
4835 __devlink_snapshot_id_decrement(devlink, snapshot_id); in devlink_nl_cmd_region_new()
4844 struct devlink *devlink, in devlink_nl_cmd_region_read_chunk_fill() argument
4875 struct devlink *devlink, in devlink_nl_region_read_snapshot_fill() argument
4904 err = devlink_nl_cmd_region_read_chunk_fill(skb, devlink, in devlink_nl_region_read_snapshot_fill()
4927 struct devlink *devlink; in devlink_nl_cmd_region_read_dumpit() local
4935 devlink = devlink_get_from_attrs(sock_net(cb->skb->sk), attrs); in devlink_nl_cmd_region_read_dumpit()
4936 if (IS_ERR(devlink)) { in devlink_nl_cmd_region_read_dumpit()
4937 err = PTR_ERR(devlink); in devlink_nl_cmd_region_read_dumpit()
4941 mutex_lock(&devlink->lock); in devlink_nl_cmd_region_read_dumpit()
4952 port = devlink_port_get_by_index(devlink, index); in devlink_nl_cmd_region_read_dumpit()
4964 region = devlink_region_get_by_name(devlink, region_name); in devlink_nl_cmd_region_read_dumpit()
4998 err = devlink_nl_put_handle(skb, devlink); in devlink_nl_cmd_region_read_dumpit()
5019 err = devlink_nl_region_read_snapshot_fill(skb, devlink, in devlink_nl_cmd_region_read_dumpit()
5037 mutex_unlock(&devlink->lock); in devlink_nl_cmd_region_read_dumpit()
5045 mutex_unlock(&devlink->lock); in devlink_nl_cmd_region_read_dumpit()
5133 devlink_nl_info_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_info_fill() argument
5146 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_info_fill()
5150 err = devlink->ops->info_get(devlink, &req, extack); in devlink_nl_info_fill()
5165 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_info_get_doit() local
5169 if (!devlink->ops->info_get) in devlink_nl_cmd_info_get_doit()
5176 err = devlink_nl_info_fill(msg, devlink, DEVLINK_CMD_INFO_GET, in devlink_nl_cmd_info_get_doit()
5190 struct devlink *devlink; in devlink_nl_cmd_info_get_dumpit() local
5196 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_info_get_dumpit()
5197 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_info_get_dumpit()
5204 if (!devlink->ops->info_get) { in devlink_nl_cmd_info_get_dumpit()
5209 mutex_lock(&devlink->lock); in devlink_nl_cmd_info_get_dumpit()
5210 err = devlink_nl_info_fill(msg, devlink, DEVLINK_CMD_INFO_GET, in devlink_nl_cmd_info_get_dumpit()
5214 mutex_unlock(&devlink->lock); in devlink_nl_cmd_info_get_dumpit()
5827 struct devlink *devlink; member
5865 devlink_health_reporter_find_by_name(struct devlink *devlink, in devlink_health_reporter_find_by_name() argument
5868 return __devlink_health_reporter_find_by_name(&devlink->reporter_list, in devlink_health_reporter_find_by_name()
5869 &devlink->reporters_lock, in devlink_health_reporter_find_by_name()
5883 __devlink_health_reporter_create(struct devlink *devlink, in __devlink_health_reporter_create() argument
5898 reporter->devlink = devlink; in __devlink_health_reporter_create()
5930 reporter = __devlink_health_reporter_create(port->devlink, ops, in devlink_port_health_reporter_create()
5952 devlink_health_reporter_create(struct devlink *devlink, in devlink_health_reporter_create() argument
5958 mutex_lock(&devlink->reporters_lock); in devlink_health_reporter_create()
5959 if (devlink_health_reporter_find_by_name(devlink, ops->name)) { in devlink_health_reporter_create()
5964 reporter = __devlink_health_reporter_create(devlink, ops, in devlink_health_reporter_create()
5969 list_add_tail(&reporter->list, &devlink->reporter_list); in devlink_health_reporter_create()
5971 mutex_unlock(&devlink->reporters_lock); in devlink_health_reporter_create()
6007 struct mutex *lock = &reporter->devlink->reporters_lock; in devlink_health_reporter_destroy()
6033 struct devlink *devlink, in devlink_nl_health_reporter_fill() argument
6045 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_health_reporter_fill()
6114 err = devlink_nl_health_reporter_fill(msg, reporter->devlink, in devlink_recover_notify()
6122 devlink_net(reporter->devlink), in devlink_recover_notify()
6211 struct devlink *devlink = reporter->devlink; in devlink_health_report() local
6216 trace_devlink_health_report(devlink, reporter->ops->name, msg); in devlink_health_report()
6229 trace_devlink_health_recover_aborted(devlink, in devlink_health_report()
6255 devlink_health_reporter_get_from_attrs(struct devlink *devlink, in devlink_health_reporter_get_from_attrs() argument
6266 devlink_port = devlink_port_get_from_attrs(devlink, attrs); in devlink_health_reporter_get_from_attrs()
6268 mutex_lock(&devlink->reporters_lock); in devlink_health_reporter_get_from_attrs()
6269 reporter = devlink_health_reporter_find_by_name(devlink, reporter_name); in devlink_health_reporter_get_from_attrs()
6272 mutex_unlock(&devlink->reporters_lock); in devlink_health_reporter_get_from_attrs()
6285 devlink_health_reporter_get_from_info(struct devlink *devlink, in devlink_health_reporter_get_from_info() argument
6288 return devlink_health_reporter_get_from_attrs(devlink, info->attrs); in devlink_health_reporter_get_from_info()
6297 struct devlink *devlink; in devlink_health_reporter_get_from_cb() local
6300 devlink = devlink_get_from_attrs(sock_net(cb->skb->sk), attrs); in devlink_health_reporter_get_from_cb()
6301 if (IS_ERR(devlink)) in devlink_health_reporter_get_from_cb()
6304 reporter = devlink_health_reporter_get_from_attrs(devlink, attrs); in devlink_health_reporter_get_from_cb()
6324 trace_devlink_health_reporter_state_update(reporter->devlink, in devlink_health_reporter_state_update()
6333 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_get_doit() local
6338 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_get_doit()
6348 err = devlink_nl_health_reporter_fill(msg, devlink, reporter, in devlink_nl_cmd_health_reporter_get_doit()
6369 struct devlink *devlink; in devlink_nl_cmd_health_reporter_get_dumpit() local
6375 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_health_reporter_get_dumpit()
6376 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_health_reporter_get_dumpit()
6378 mutex_lock(&devlink->reporters_lock); in devlink_nl_cmd_health_reporter_get_dumpit()
6379 list_for_each_entry(reporter, &devlink->reporter_list, in devlink_nl_cmd_health_reporter_get_dumpit()
6385 err = devlink_nl_health_reporter_fill(msg, devlink, in devlink_nl_cmd_health_reporter_get_dumpit()
6392 mutex_unlock(&devlink->reporters_lock); in devlink_nl_cmd_health_reporter_get_dumpit()
6397 mutex_unlock(&devlink->reporters_lock); in devlink_nl_cmd_health_reporter_get_dumpit()
6400 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_health_reporter_get_dumpit()
6401 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_health_reporter_get_dumpit()
6403 mutex_lock(&devlink->lock); in devlink_nl_cmd_health_reporter_get_dumpit()
6404 list_for_each_entry(port, &devlink->port_list, list) { in devlink_nl_cmd_health_reporter_get_dumpit()
6411 err = devlink_nl_health_reporter_fill(msg, devlink, reporter, in devlink_nl_cmd_health_reporter_get_dumpit()
6418 mutex_unlock(&devlink->lock); in devlink_nl_cmd_health_reporter_get_dumpit()
6425 mutex_unlock(&devlink->lock); in devlink_nl_cmd_health_reporter_get_dumpit()
6438 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_set_doit() local
6442 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_set_doit()
6480 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_recover_doit() local
6484 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_recover_doit()
6497 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_diagnose_doit() local
6502 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_diagnose_doit()
6580 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_dump_clear_doit() local
6583 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_dump_clear_doit()
6602 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_test_doit() local
6606 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_test_doit()
6683 devlink_trap_policer_item_lookup(struct devlink *devlink, u32 id) in devlink_trap_policer_item_lookup() argument
6687 list_for_each_entry(policer_item, &devlink->trap_policer_list, list) { in devlink_trap_policer_item_lookup()
6696 devlink_trap_item_lookup(struct devlink *devlink, const char *name) in devlink_trap_item_lookup() argument
6700 list_for_each_entry(trap_item, &devlink->trap_list, list) { in devlink_trap_item_lookup()
6709 devlink_trap_item_get_from_info(struct devlink *devlink, in devlink_trap_item_get_from_info() argument
6718 return devlink_trap_item_lookup(devlink, nla_data(attr)); in devlink_trap_item_get_from_info()
6818 static int devlink_nl_trap_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_trap_fill() argument
6831 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_trap_fill()
6872 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_get_doit() local
6877 if (list_empty(&devlink->trap_list)) in devlink_nl_cmd_trap_get_doit()
6880 trap_item = devlink_trap_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_get_doit()
6890 err = devlink_nl_trap_fill(msg, devlink, trap_item, in devlink_nl_cmd_trap_get_doit()
6907 struct devlink *devlink; in devlink_nl_cmd_trap_get_dumpit() local
6913 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_trap_get_dumpit()
6914 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_trap_get_dumpit()
6916 mutex_lock(&devlink->lock); in devlink_nl_cmd_trap_get_dumpit()
6917 list_for_each_entry(trap_item, &devlink->trap_list, list) { in devlink_nl_cmd_trap_get_dumpit()
6922 err = devlink_nl_trap_fill(msg, devlink, trap_item, in devlink_nl_cmd_trap_get_dumpit()
6928 mutex_unlock(&devlink->lock); in devlink_nl_cmd_trap_get_dumpit()
6933 mutex_unlock(&devlink->lock); in devlink_nl_cmd_trap_get_dumpit()
6942 static int __devlink_trap_action_set(struct devlink *devlink, in __devlink_trap_action_set() argument
6955 err = devlink->ops->trap_action_set(devlink, trap_item->trap, in __devlink_trap_action_set()
6965 static int devlink_trap_action_set(struct devlink *devlink, in devlink_trap_action_set() argument
6981 return __devlink_trap_action_set(devlink, trap_item, trap_action, in devlink_trap_action_set()
6989 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_set_doit() local
6993 if (list_empty(&devlink->trap_list)) in devlink_nl_cmd_trap_set_doit()
6996 trap_item = devlink_trap_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_set_doit()
7002 err = devlink_trap_action_set(devlink, trap_item, info); in devlink_nl_cmd_trap_set_doit()
7010 devlink_trap_group_item_lookup(struct devlink *devlink, const char *name) in devlink_trap_group_item_lookup() argument
7014 list_for_each_entry(group_item, &devlink->trap_group_list, list) { in devlink_trap_group_item_lookup()
7023 devlink_trap_group_item_lookup_by_id(struct devlink *devlink, u16 id) in devlink_trap_group_item_lookup_by_id() argument
7027 list_for_each_entry(group_item, &devlink->trap_group_list, list) { in devlink_trap_group_item_lookup_by_id()
7036 devlink_trap_group_item_get_from_info(struct devlink *devlink, in devlink_trap_group_item_get_from_info() argument
7045 return devlink_trap_group_item_lookup(devlink, name); in devlink_trap_group_item_get_from_info()
7049 devlink_nl_trap_group_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_trap_group_fill() argument
7061 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_trap_group_fill()
7094 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_group_get_doit() local
7099 if (list_empty(&devlink->trap_group_list)) in devlink_nl_cmd_trap_group_get_doit()
7102 group_item = devlink_trap_group_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_group_get_doit()
7112 err = devlink_nl_trap_group_fill(msg, devlink, group_item, in devlink_nl_cmd_trap_group_get_doit()
7131 struct devlink *devlink; in devlink_nl_cmd_trap_group_get_dumpit() local
7137 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_trap_group_get_dumpit()
7138 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_trap_group_get_dumpit()
7140 mutex_lock(&devlink->lock); in devlink_nl_cmd_trap_group_get_dumpit()
7141 list_for_each_entry(group_item, &devlink->trap_group_list, in devlink_nl_cmd_trap_group_get_dumpit()
7147 err = devlink_nl_trap_group_fill(msg, devlink, in devlink_nl_cmd_trap_group_get_dumpit()
7153 mutex_unlock(&devlink->lock); in devlink_nl_cmd_trap_group_get_dumpit()
7158 mutex_unlock(&devlink->lock); in devlink_nl_cmd_trap_group_get_dumpit()
7168 __devlink_trap_group_action_set(struct devlink *devlink, in __devlink_trap_group_action_set() argument
7177 if (devlink->ops->trap_group_action_set) { in __devlink_trap_group_action_set()
7178 err = devlink->ops->trap_group_action_set(devlink, group_item->group, in __devlink_trap_group_action_set()
7183 list_for_each_entry(trap_item, &devlink->trap_list, list) { in __devlink_trap_group_action_set()
7195 list_for_each_entry(trap_item, &devlink->trap_list, list) { in __devlink_trap_group_action_set()
7198 err = __devlink_trap_action_set(devlink, trap_item, in __devlink_trap_group_action_set()
7208 devlink_trap_group_action_set(struct devlink *devlink, in devlink_trap_group_action_set() argument
7224 err = __devlink_trap_group_action_set(devlink, group_item, trap_action, in devlink_trap_group_action_set()
7234 static int devlink_trap_group_set(struct devlink *devlink, in devlink_trap_group_set() argument
7247 if (!devlink->ops->trap_group_set) in devlink_trap_group_set()
7255 policer_item = devlink_trap_policer_item_lookup(devlink, in devlink_trap_group_set()
7264 err = devlink->ops->trap_group_set(devlink, group_item->group, policer, in devlink_trap_group_set()
7278 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_group_set_doit() local
7283 if (list_empty(&devlink->trap_group_list)) in devlink_nl_cmd_trap_group_set_doit()
7286 group_item = devlink_trap_group_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_group_set_doit()
7292 err = devlink_trap_group_action_set(devlink, group_item, info, in devlink_nl_cmd_trap_group_set_doit()
7297 err = devlink_trap_group_set(devlink, group_item, info); in devlink_nl_cmd_trap_group_set_doit()
7310 devlink_trap_policer_item_get_from_info(struct devlink *devlink, in devlink_trap_policer_item_get_from_info() argument
7319 return devlink_trap_policer_item_lookup(devlink, id); in devlink_trap_policer_item_get_from_info()
7323 devlink_trap_policer_stats_put(struct sk_buff *msg, struct devlink *devlink, in devlink_trap_policer_stats_put() argument
7330 if (!devlink->ops->trap_policer_counter_get) in devlink_trap_policer_stats_put()
7333 err = devlink->ops->trap_policer_counter_get(devlink, policer, &drops); in devlink_trap_policer_stats_put()
7355 devlink_nl_trap_policer_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_trap_policer_fill() argument
7367 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_trap_policer_fill()
7382 err = devlink_trap_policer_stats_put(msg, devlink, in devlink_nl_trap_policer_fill()
7401 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_policer_get_doit() local
7405 if (list_empty(&devlink->trap_policer_list)) in devlink_nl_cmd_trap_policer_get_doit()
7408 policer_item = devlink_trap_policer_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_policer_get_doit()
7418 err = devlink_nl_trap_policer_fill(msg, devlink, policer_item, in devlink_nl_cmd_trap_policer_get_doit()
7437 struct devlink *devlink; in devlink_nl_cmd_trap_policer_get_dumpit() local
7443 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_trap_policer_get_dumpit()
7444 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_trap_policer_get_dumpit()
7446 mutex_lock(&devlink->lock); in devlink_nl_cmd_trap_policer_get_dumpit()
7447 list_for_each_entry(policer_item, &devlink->trap_policer_list, in devlink_nl_cmd_trap_policer_get_dumpit()
7453 err = devlink_nl_trap_policer_fill(msg, devlink, in devlink_nl_cmd_trap_policer_get_dumpit()
7459 mutex_unlock(&devlink->lock); in devlink_nl_cmd_trap_policer_get_dumpit()
7464 mutex_unlock(&devlink->lock); in devlink_nl_cmd_trap_policer_get_dumpit()
7474 devlink_trap_policer_set(struct devlink *devlink, in devlink_trap_policer_set() argument
7512 err = devlink->ops->trap_policer_set(devlink, policer_item->policer, in devlink_trap_policer_set()
7528 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_policer_set_doit() local
7530 if (list_empty(&devlink->trap_policer_list)) in devlink_nl_cmd_trap_policer_set_doit()
7533 if (!devlink->ops->trap_policer_set) in devlink_nl_cmd_trap_policer_set_doit()
7536 policer_item = devlink_trap_policer_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_policer_set_doit()
7542 return devlink_trap_policer_set(devlink, policer_item, info); in devlink_nl_cmd_trap_policer_set_doit()
7966 struct devlink *devlink_alloc(const struct devlink_ops *ops, size_t priv_size) in devlink_alloc()
7968 struct devlink *devlink; in devlink_alloc() local
7976 devlink = kzalloc(sizeof(*devlink) + priv_size, GFP_KERNEL); in devlink_alloc()
7977 if (!devlink) in devlink_alloc()
7979 devlink->ops = ops; in devlink_alloc()
7980 xa_init_flags(&devlink->snapshot_ids, XA_FLAGS_ALLOC); in devlink_alloc()
7981 __devlink_net_set(devlink, &init_net); in devlink_alloc()
7982 INIT_LIST_HEAD(&devlink->port_list); in devlink_alloc()
7983 INIT_LIST_HEAD(&devlink->sb_list); in devlink_alloc()
7984 INIT_LIST_HEAD_RCU(&devlink->dpipe_table_list); in devlink_alloc()
7985 INIT_LIST_HEAD(&devlink->resource_list); in devlink_alloc()
7986 INIT_LIST_HEAD(&devlink->param_list); in devlink_alloc()
7987 INIT_LIST_HEAD(&devlink->region_list); in devlink_alloc()
7988 INIT_LIST_HEAD(&devlink->reporter_list); in devlink_alloc()
7989 INIT_LIST_HEAD(&devlink->trap_list); in devlink_alloc()
7990 INIT_LIST_HEAD(&devlink->trap_group_list); in devlink_alloc()
7991 INIT_LIST_HEAD(&devlink->trap_policer_list); in devlink_alloc()
7992 mutex_init(&devlink->lock); in devlink_alloc()
7993 mutex_init(&devlink->reporters_lock); in devlink_alloc()
7994 return devlink; in devlink_alloc()
8004 int devlink_register(struct devlink *devlink, struct device *dev) in devlink_register() argument
8006 devlink->dev = dev; in devlink_register()
8007 devlink->registered = true; in devlink_register()
8009 list_add_tail(&devlink->list, &devlink_list); in devlink_register()
8010 devlink_notify(devlink, DEVLINK_CMD_NEW); in devlink_register()
8021 void devlink_unregister(struct devlink *devlink) in devlink_unregister() argument
8024 WARN_ON(devlink_reload_supported(devlink->ops) && in devlink_unregister()
8025 devlink->reload_enabled); in devlink_unregister()
8026 devlink_notify(devlink, DEVLINK_CMD_DEL); in devlink_unregister()
8027 list_del(&devlink->list); in devlink_unregister()
8040 void devlink_reload_enable(struct devlink *devlink) in devlink_reload_enable() argument
8043 devlink->reload_enabled = true; in devlink_reload_enable()
8056 void devlink_reload_disable(struct devlink *devlink) in devlink_reload_disable() argument
8062 devlink->reload_enabled = false; in devlink_reload_disable()
8072 void devlink_free(struct devlink *devlink) in devlink_free() argument
8074 mutex_destroy(&devlink->reporters_lock); in devlink_free()
8075 mutex_destroy(&devlink->lock); in devlink_free()
8076 WARN_ON(!list_empty(&devlink->trap_policer_list)); in devlink_free()
8077 WARN_ON(!list_empty(&devlink->trap_group_list)); in devlink_free()
8078 WARN_ON(!list_empty(&devlink->trap_list)); in devlink_free()
8079 WARN_ON(!list_empty(&devlink->reporter_list)); in devlink_free()
8080 WARN_ON(!list_empty(&devlink->region_list)); in devlink_free()
8081 WARN_ON(!list_empty(&devlink->param_list)); in devlink_free()
8082 WARN_ON(!list_empty(&devlink->resource_list)); in devlink_free()
8083 WARN_ON(!list_empty(&devlink->dpipe_table_list)); in devlink_free()
8084 WARN_ON(!list_empty(&devlink->sb_list)); in devlink_free()
8085 WARN_ON(!list_empty(&devlink->port_list)); in devlink_free()
8087 xa_destroy(&devlink->snapshot_ids); in devlink_free()
8089 kfree(devlink); in devlink_free()
8139 int devlink_port_register(struct devlink *devlink, in devlink_port_register() argument
8143 mutex_lock(&devlink->lock); in devlink_port_register()
8144 if (devlink_port_index_exists(devlink, port_index)) { in devlink_port_register()
8145 mutex_unlock(&devlink->lock); in devlink_port_register()
8148 devlink_port->devlink = devlink; in devlink_port_register()
8154 list_add_tail(&devlink_port->list, &devlink->port_list); in devlink_port_register()
8157 mutex_unlock(&devlink->lock); in devlink_port_register()
8172 struct devlink *devlink = devlink_port->devlink; in devlink_port_unregister() local
8176 mutex_lock(&devlink->lock); in devlink_port_unregister()
8178 mutex_unlock(&devlink->lock); in devlink_port_unregister()
8248 dev_warn(devlink_port->devlink->dev, in devlink_port_type_eth_set()
8430 int devlink_sb_register(struct devlink *devlink, unsigned int sb_index, in devlink_sb_register() argument
8438 mutex_lock(&devlink->lock); in devlink_sb_register()
8439 if (devlink_sb_index_exists(devlink, sb_index)) { in devlink_sb_register()
8455 list_add_tail(&devlink_sb->list, &devlink->sb_list); in devlink_sb_register()
8457 mutex_unlock(&devlink->lock); in devlink_sb_register()
8462 void devlink_sb_unregister(struct devlink *devlink, unsigned int sb_index) in devlink_sb_unregister() argument
8466 mutex_lock(&devlink->lock); in devlink_sb_unregister()
8467 devlink_sb = devlink_sb_get_by_index(devlink, sb_index); in devlink_sb_unregister()
8470 mutex_unlock(&devlink->lock); in devlink_sb_unregister()
8483 int devlink_dpipe_headers_register(struct devlink *devlink, in devlink_dpipe_headers_register() argument
8486 mutex_lock(&devlink->lock); in devlink_dpipe_headers_register()
8487 devlink->dpipe_headers = dpipe_headers; in devlink_dpipe_headers_register()
8488 mutex_unlock(&devlink->lock); in devlink_dpipe_headers_register()
8500 void devlink_dpipe_headers_unregister(struct devlink *devlink) in devlink_dpipe_headers_unregister() argument
8502 mutex_lock(&devlink->lock); in devlink_dpipe_headers_unregister()
8503 devlink->dpipe_headers = NULL; in devlink_dpipe_headers_unregister()
8504 mutex_unlock(&devlink->lock); in devlink_dpipe_headers_unregister()
8522 bool devlink_dpipe_table_counter_enabled(struct devlink *devlink, in devlink_dpipe_table_counter_enabled() argument
8529 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, in devlink_dpipe_table_counter_enabled()
8530 table_name, devlink); in devlink_dpipe_table_counter_enabled()
8548 int devlink_dpipe_table_register(struct devlink *devlink, in devlink_dpipe_table_register() argument
8559 mutex_lock(&devlink->lock); in devlink_dpipe_table_register()
8561 if (devlink_dpipe_table_find(&devlink->dpipe_table_list, table_name, in devlink_dpipe_table_register()
8562 devlink)) { in devlink_dpipe_table_register()
8578 list_add_tail_rcu(&table->list, &devlink->dpipe_table_list); in devlink_dpipe_table_register()
8580 mutex_unlock(&devlink->lock); in devlink_dpipe_table_register()
8591 void devlink_dpipe_table_unregister(struct devlink *devlink, in devlink_dpipe_table_unregister() argument
8596 mutex_lock(&devlink->lock); in devlink_dpipe_table_unregister()
8597 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, in devlink_dpipe_table_unregister()
8598 table_name, devlink); in devlink_dpipe_table_unregister()
8602 mutex_unlock(&devlink->lock); in devlink_dpipe_table_unregister()
8606 mutex_unlock(&devlink->lock); in devlink_dpipe_table_unregister()
8620 int devlink_resource_register(struct devlink *devlink, in devlink_resource_register() argument
8634 mutex_lock(&devlink->lock); in devlink_resource_register()
8635 resource = devlink_resource_find(devlink, NULL, resource_id); in devlink_resource_register()
8648 resource_list = &devlink->resource_list; in devlink_resource_register()
8652 parent_resource = devlink_resource_find(devlink, NULL, in devlink_resource_register()
8674 mutex_unlock(&devlink->lock); in devlink_resource_register()
8685 void devlink_resources_unregister(struct devlink *devlink, in devlink_resources_unregister() argument
8694 resource_list = &devlink->resource_list; in devlink_resources_unregister()
8697 mutex_lock(&devlink->lock); in devlink_resources_unregister()
8700 devlink_resources_unregister(devlink, child_resource); in devlink_resources_unregister()
8706 mutex_unlock(&devlink->lock); in devlink_resources_unregister()
8717 int devlink_resource_size_get(struct devlink *devlink, in devlink_resource_size_get() argument
8724 mutex_lock(&devlink->lock); in devlink_resource_size_get()
8725 resource = devlink_resource_find(devlink, NULL, resource_id); in devlink_resource_size_get()
8733 mutex_unlock(&devlink->lock); in devlink_resource_size_get()
8746 int devlink_dpipe_table_resource_set(struct devlink *devlink, in devlink_dpipe_table_resource_set() argument
8753 mutex_lock(&devlink->lock); in devlink_dpipe_table_resource_set()
8754 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, in devlink_dpipe_table_resource_set()
8755 table_name, devlink); in devlink_dpipe_table_resource_set()
8764 mutex_unlock(&devlink->lock); in devlink_dpipe_table_resource_set()
8777 void devlink_resource_occ_get_register(struct devlink *devlink, in devlink_resource_occ_get_register() argument
8784 mutex_lock(&devlink->lock); in devlink_resource_occ_get_register()
8785 resource = devlink_resource_find(devlink, NULL, resource_id); in devlink_resource_occ_get_register()
8793 mutex_unlock(&devlink->lock); in devlink_resource_occ_get_register()
8803 void devlink_resource_occ_get_unregister(struct devlink *devlink, in devlink_resource_occ_get_unregister() argument
8808 mutex_lock(&devlink->lock); in devlink_resource_occ_get_unregister()
8809 resource = devlink_resource_find(devlink, NULL, resource_id); in devlink_resource_occ_get_unregister()
8817 mutex_unlock(&devlink->lock); in devlink_resource_occ_get_unregister()
8831 static int __devlink_params_register(struct devlink *devlink, in __devlink_params_register() argument
8843 mutex_lock(&devlink->lock); in __devlink_params_register()
8849 err = devlink_param_register_one(devlink, port_index, in __devlink_params_register()
8855 mutex_unlock(&devlink->lock); in __devlink_params_register()
8862 devlink_param_unregister_one(devlink, port_index, param_list, in __devlink_params_register()
8865 mutex_unlock(&devlink->lock); in __devlink_params_register()
8869 static void __devlink_params_unregister(struct devlink *devlink, in __devlink_params_unregister() argument
8879 mutex_lock(&devlink->lock); in __devlink_params_unregister()
8881 devlink_param_unregister_one(devlink, 0, param_list, param, in __devlink_params_unregister()
8883 mutex_unlock(&devlink->lock); in __devlink_params_unregister()
8895 int devlink_params_register(struct devlink *devlink, in devlink_params_register() argument
8899 return __devlink_params_register(devlink, 0, &devlink->param_list, in devlink_params_register()
8912 void devlink_params_unregister(struct devlink *devlink, in devlink_params_unregister() argument
8916 return __devlink_params_unregister(devlink, 0, &devlink->param_list, in devlink_params_unregister()
8929 void devlink_params_publish(struct devlink *devlink) in devlink_params_publish() argument
8933 list_for_each_entry(param_item, &devlink->param_list, list) { in devlink_params_publish()
8937 devlink_param_notify(devlink, 0, param_item, in devlink_params_publish()
8950 void devlink_params_unpublish(struct devlink *devlink) in devlink_params_unpublish() argument
8954 list_for_each_entry(param_item, &devlink->param_list, list) { in devlink_params_unpublish()
8958 devlink_param_notify(devlink, 0, param_item, in devlink_params_unpublish()
8977 return __devlink_params_register(devlink_port->devlink, in devlink_port_params_register()
8998 return __devlink_params_unregister(devlink_port->devlink, in devlink_port_params_unregister()
9030 __devlink_param_driverinit_value_set(struct devlink *devlink, in __devlink_param_driverinit_value_set() argument
9052 devlink_param_notify(devlink, port_index, param_item, cmd); in __devlink_param_driverinit_value_set()
9067 int devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id, in devlink_param_driverinit_value_get() argument
9070 if (!devlink_reload_supported(devlink->ops)) in devlink_param_driverinit_value_get()
9073 return __devlink_param_driverinit_value_get(&devlink->param_list, in devlink_param_driverinit_value_get()
9090 int devlink_param_driverinit_value_set(struct devlink *devlink, u32 param_id, in devlink_param_driverinit_value_set() argument
9093 return __devlink_param_driverinit_value_set(devlink, 0, in devlink_param_driverinit_value_set()
9094 &devlink->param_list, in devlink_param_driverinit_value_set()
9115 struct devlink *devlink = devlink_port->devlink; in devlink_port_param_driverinit_value_get() local
9117 if (!devlink_reload_supported(devlink->ops)) in devlink_port_param_driverinit_value_get()
9141 return __devlink_param_driverinit_value_set(devlink_port->devlink, in devlink_port_param_driverinit_value_set()
9161 void devlink_param_value_changed(struct devlink *devlink, u32 param_id) in devlink_param_value_changed() argument
9165 param_item = devlink_param_find_by_id(&devlink->param_list, param_id); in devlink_param_value_changed()
9168 devlink_param_notify(devlink, 0, param_item, DEVLINK_CMD_PARAM_NEW); in devlink_param_value_changed()
9194 devlink_param_notify(devlink_port->devlink, devlink_port->index, in devlink_port_param_value_changed()
9225 devlink_region_create(struct devlink *devlink, in devlink_region_create() argument
9235 mutex_lock(&devlink->lock); in devlink_region_create()
9237 if (devlink_region_get_by_name(devlink, ops->name)) { in devlink_region_create()
9248 region->devlink = devlink; in devlink_region_create()
9253 list_add_tail(®ion->list, &devlink->region_list); in devlink_region_create()
9256 mutex_unlock(&devlink->lock); in devlink_region_create()
9260 mutex_unlock(&devlink->lock); in devlink_region_create()
9278 struct devlink *devlink = port->devlink; in devlink_port_region_create() local
9285 mutex_lock(&devlink->lock); in devlink_port_region_create()
9298 region->devlink = devlink; in devlink_port_region_create()
9307 mutex_unlock(&devlink->lock); in devlink_port_region_create()
9311 mutex_unlock(&devlink->lock); in devlink_port_region_create()
9323 struct devlink *devlink = region->devlink; in devlink_region_destroy() local
9326 mutex_lock(&devlink->lock); in devlink_region_destroy()
9335 mutex_unlock(&devlink->lock); in devlink_region_destroy()
9355 int devlink_region_snapshot_id_get(struct devlink *devlink, u32 *id) in devlink_region_snapshot_id_get() argument
9359 mutex_lock(&devlink->lock); in devlink_region_snapshot_id_get()
9360 err = __devlink_region_snapshot_id_get(devlink, id); in devlink_region_snapshot_id_get()
9361 mutex_unlock(&devlink->lock); in devlink_region_snapshot_id_get()
9377 void devlink_region_snapshot_id_put(struct devlink *devlink, u32 id) in devlink_region_snapshot_id_put() argument
9379 mutex_lock(&devlink->lock); in devlink_region_snapshot_id_put()
9380 __devlink_snapshot_id_decrement(devlink, id); in devlink_region_snapshot_id_put()
9381 mutex_unlock(&devlink->lock); in devlink_region_snapshot_id_put()
9400 struct devlink *devlink = region->devlink; in devlink_region_snapshot_create() local
9403 mutex_lock(&devlink->lock); in devlink_region_snapshot_create()
9405 mutex_unlock(&devlink->lock); in devlink_region_snapshot_create()
9623 devlink_trap_group_notify(struct devlink *devlink, in devlink_trap_group_notify() argument
9637 err = devlink_nl_trap_group_fill(msg, devlink, group_item, cmd, 0, 0, in devlink_trap_group_notify()
9644 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_trap_group_notify()
9649 devlink_trap_item_group_link(struct devlink *devlink, in devlink_trap_item_group_link() argument
9655 group_item = devlink_trap_group_item_lookup_by_id(devlink, group_id); in devlink_trap_item_group_link()
9664 static void devlink_trap_notify(struct devlink *devlink, in devlink_trap_notify() argument
9678 err = devlink_nl_trap_fill(msg, devlink, trap_item, cmd, 0, 0, 0); in devlink_trap_notify()
9684 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_trap_notify()
9689 devlink_trap_register(struct devlink *devlink, in devlink_trap_register() argument
9695 if (devlink_trap_item_lookup(devlink, trap->name)) in devlink_trap_register()
9712 err = devlink_trap_item_group_link(devlink, trap_item); in devlink_trap_register()
9716 err = devlink->ops->trap_init(devlink, trap, trap_item); in devlink_trap_register()
9720 list_add_tail(&trap_item->list, &devlink->trap_list); in devlink_trap_register()
9721 devlink_trap_notify(devlink, trap_item, DEVLINK_CMD_TRAP_NEW); in devlink_trap_register()
9733 static void devlink_trap_unregister(struct devlink *devlink, in devlink_trap_unregister() argument
9738 trap_item = devlink_trap_item_lookup(devlink, trap->name); in devlink_trap_unregister()
9742 devlink_trap_notify(devlink, trap_item, DEVLINK_CMD_TRAP_DEL); in devlink_trap_unregister()
9744 if (devlink->ops->trap_fini) in devlink_trap_unregister()
9745 devlink->ops->trap_fini(devlink, trap, trap_item); in devlink_trap_unregister()
9750 static void devlink_trap_disable(struct devlink *devlink, in devlink_trap_disable() argument
9755 trap_item = devlink_trap_item_lookup(devlink, trap->name); in devlink_trap_disable()
9759 devlink->ops->trap_action_set(devlink, trap, DEVLINK_TRAP_ACTION_DROP, in devlink_trap_disable()
9773 int devlink_traps_register(struct devlink *devlink, in devlink_traps_register() argument
9779 if (!devlink->ops->trap_init || !devlink->ops->trap_action_set) in devlink_traps_register()
9782 mutex_lock(&devlink->lock); in devlink_traps_register()
9790 err = devlink_trap_register(devlink, trap, priv); in devlink_traps_register()
9794 mutex_unlock(&devlink->lock); in devlink_traps_register()
9801 devlink_trap_unregister(devlink, &traps[i]); in devlink_traps_register()
9802 mutex_unlock(&devlink->lock); in devlink_traps_register()
9813 void devlink_traps_unregister(struct devlink *devlink, in devlink_traps_unregister() argument
9819 mutex_lock(&devlink->lock); in devlink_traps_unregister()
9824 devlink_trap_disable(devlink, &traps[i]); in devlink_traps_unregister()
9827 devlink_trap_unregister(devlink, &traps[i]); in devlink_traps_unregister()
9828 mutex_unlock(&devlink->lock); in devlink_traps_unregister()
9870 void devlink_trap_report(struct devlink *devlink, struct sk_buff *skb, in devlink_trap_report() argument
9885 trace_devlink_trap_report(devlink, skb, &metadata); in devlink_trap_report()
9905 devlink_trap_group_item_policer_link(struct devlink *devlink, in devlink_trap_group_item_policer_link() argument
9914 policer_item = devlink_trap_policer_item_lookup(devlink, policer_id); in devlink_trap_group_item_policer_link()
9924 devlink_trap_group_register(struct devlink *devlink, in devlink_trap_group_register() argument
9930 if (devlink_trap_group_item_lookup(devlink, group->name)) in devlink_trap_group_register()
9945 err = devlink_trap_group_item_policer_link(devlink, group_item); in devlink_trap_group_register()
9949 if (devlink->ops->trap_group_init) { in devlink_trap_group_register()
9950 err = devlink->ops->trap_group_init(devlink, group); in devlink_trap_group_register()
9955 list_add_tail(&group_item->list, &devlink->trap_group_list); in devlink_trap_group_register()
9956 devlink_trap_group_notify(devlink, group_item, in devlink_trap_group_register()
9970 devlink_trap_group_unregister(struct devlink *devlink, in devlink_trap_group_unregister() argument
9975 group_item = devlink_trap_group_item_lookup(devlink, group->name); in devlink_trap_group_unregister()
9979 devlink_trap_group_notify(devlink, group_item, in devlink_trap_group_unregister()
9994 int devlink_trap_groups_register(struct devlink *devlink, in devlink_trap_groups_register() argument
10000 mutex_lock(&devlink->lock); in devlink_trap_groups_register()
10008 err = devlink_trap_group_register(devlink, group); in devlink_trap_groups_register()
10012 mutex_unlock(&devlink->lock); in devlink_trap_groups_register()
10019 devlink_trap_group_unregister(devlink, &groups[i]); in devlink_trap_groups_register()
10020 mutex_unlock(&devlink->lock); in devlink_trap_groups_register()
10031 void devlink_trap_groups_unregister(struct devlink *devlink, in devlink_trap_groups_unregister() argument
10037 mutex_lock(&devlink->lock); in devlink_trap_groups_unregister()
10039 devlink_trap_group_unregister(devlink, &groups[i]); in devlink_trap_groups_unregister()
10040 mutex_unlock(&devlink->lock); in devlink_trap_groups_unregister()
10045 devlink_trap_policer_notify(struct devlink *devlink, in devlink_trap_policer_notify() argument
10059 err = devlink_nl_trap_policer_fill(msg, devlink, policer_item, cmd, 0, in devlink_trap_policer_notify()
10066 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_trap_policer_notify()
10071 devlink_trap_policer_register(struct devlink *devlink, in devlink_trap_policer_register() argument
10077 if (devlink_trap_policer_item_lookup(devlink, policer->id)) in devlink_trap_policer_register()
10088 if (devlink->ops->trap_policer_init) { in devlink_trap_policer_register()
10089 err = devlink->ops->trap_policer_init(devlink, policer); in devlink_trap_policer_register()
10094 list_add_tail(&policer_item->list, &devlink->trap_policer_list); in devlink_trap_policer_register()
10095 devlink_trap_policer_notify(devlink, policer_item, in devlink_trap_policer_register()
10106 devlink_trap_policer_unregister(struct devlink *devlink, in devlink_trap_policer_unregister() argument
10111 policer_item = devlink_trap_policer_item_lookup(devlink, policer->id); in devlink_trap_policer_unregister()
10115 devlink_trap_policer_notify(devlink, policer_item, in devlink_trap_policer_unregister()
10118 if (devlink->ops->trap_policer_fini) in devlink_trap_policer_unregister()
10119 devlink->ops->trap_policer_fini(devlink, policer); in devlink_trap_policer_unregister()
10132 devlink_trap_policers_register(struct devlink *devlink, in devlink_trap_policers_register() argument
10138 mutex_lock(&devlink->lock); in devlink_trap_policers_register()
10149 err = devlink_trap_policer_register(devlink, policer); in devlink_trap_policers_register()
10153 mutex_unlock(&devlink->lock); in devlink_trap_policers_register()
10160 devlink_trap_policer_unregister(devlink, &policers[i]); in devlink_trap_policers_register()
10161 mutex_unlock(&devlink->lock); in devlink_trap_policers_register()
10173 devlink_trap_policers_unregister(struct devlink *devlink, in devlink_trap_policers_unregister() argument
10179 mutex_lock(&devlink->lock); in devlink_trap_policers_unregister()
10181 devlink_trap_policer_unregister(devlink, &policers[i]); in devlink_trap_policers_unregister()
10182 mutex_unlock(&devlink->lock); in devlink_trap_policers_unregister()
10186 static void __devlink_compat_running_version(struct devlink *devlink, in __devlink_compat_running_version() argument
10199 err = devlink->ops->info_get(devlink, &req, NULL); in __devlink_compat_running_version()
10225 struct devlink *devlink; in devlink_compat_running_version() local
10230 devlink = netdev_to_devlink(dev); in devlink_compat_running_version()
10231 if (!devlink || !devlink->ops->info_get) in devlink_compat_running_version()
10234 mutex_lock(&devlink->lock); in devlink_compat_running_version()
10235 __devlink_compat_running_version(devlink, buf, len); in devlink_compat_running_version()
10236 mutex_unlock(&devlink->lock); in devlink_compat_running_version()
10246 struct devlink *devlink; in devlink_compat_flash_update() local
10252 devlink = netdev_to_devlink(dev); in devlink_compat_flash_update()
10253 if (!devlink || !devlink->ops->flash_update) { in devlink_compat_flash_update()
10260 mutex_lock(&devlink->lock); in devlink_compat_flash_update()
10261 ret = devlink->ops->flash_update(devlink, ¶ms, NULL); in devlink_compat_flash_update()
10262 mutex_unlock(&devlink->lock); in devlink_compat_flash_update()
10309 struct devlink *devlink; in devlink_pernet_pre_exit() local
10317 list_for_each_entry(devlink, &devlink_list, list) { in devlink_pernet_pre_exit()
10318 if (net_eq(devlink_net(devlink), net)) { in devlink_pernet_pre_exit()
10319 if (WARN_ON(!devlink_reload_supported(devlink->ops))) in devlink_pernet_pre_exit()
10321 err = devlink_reload(devlink, &init_net, in devlink_pernet_pre_exit()