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()
719 struct devlink *devlink = port->devlink; in devlink_nl_port_function_attrs_put() local
729 ops = devlink->ops; in devlink_nl_port_function_attrs_put()
734 err = ops->port_function_hw_addr_get(devlink, port, hw_addr, &hw_addr_len, extack); in devlink_nl_port_function_attrs_put()
758 static int devlink_nl_port_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_port_fill() argument
770 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_port_fill()
785 struct net *net = devlink_net(devlink_port->devlink); in devlink_nl_port_fill()
824 struct devlink *devlink = devlink_port->devlink; in devlink_port_notify() local
837 err = devlink_nl_port_fill(msg, devlink, devlink_port, cmd, 0, 0, 0, in devlink_port_notify()
844 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_port_notify()
850 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_get_doit() local
858 err = devlink_nl_fill(msg, devlink, DEVLINK_CMD_NEW, in devlink_nl_cmd_get_doit()
871 struct devlink *devlink; in devlink_nl_cmd_get_dumpit() local
877 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_get_dumpit()
878 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_get_dumpit()
884 err = devlink_nl_fill(msg, devlink, DEVLINK_CMD_NEW, in devlink_nl_cmd_get_dumpit()
902 struct devlink *devlink = devlink_port->devlink; in devlink_nl_cmd_port_get_doit() local
910 err = devlink_nl_port_fill(msg, devlink, devlink_port, in devlink_nl_cmd_port_get_doit()
925 struct devlink *devlink; in devlink_nl_cmd_port_get_dumpit() local
932 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_port_get_dumpit()
933 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_port_get_dumpit()
935 mutex_lock(&devlink->lock); in devlink_nl_cmd_port_get_dumpit()
936 list_for_each_entry(devlink_port, &devlink->port_list, list) { in devlink_nl_cmd_port_get_dumpit()
941 err = devlink_nl_port_fill(msg, devlink, devlink_port, in devlink_nl_cmd_port_get_dumpit()
948 mutex_unlock(&devlink->lock); in devlink_nl_cmd_port_get_dumpit()
953 mutex_unlock(&devlink->lock); in devlink_nl_cmd_port_get_dumpit()
962 static int devlink_port_type_set(struct devlink *devlink, in devlink_port_type_set() argument
969 if (devlink->ops->port_type_set) { in devlink_port_type_set()
972 err = devlink->ops->port_type_set(devlink_port, port_type); in devlink_port_type_set()
983 devlink_port_function_hw_addr_set(struct devlink *devlink, struct devlink_port *port, in devlink_port_function_hw_addr_set() argument
1008 ops = devlink->ops; in devlink_port_function_hw_addr_set()
1014 err = ops->port_function_hw_addr_set(devlink, port, hw_addr, hw_addr_len, extack); in devlink_port_function_hw_addr_set()
1023 devlink_port_function_set(struct devlink *devlink, struct devlink_port *port, in devlink_port_function_set() argument
1038 err = devlink_port_function_hw_addr_set(devlink, port, attr, extack); in devlink_port_function_set()
1047 struct devlink *devlink = devlink_port->devlink; in devlink_nl_cmd_port_set_doit() local
1054 err = devlink_port_type_set(devlink, devlink_port, port_type); in devlink_nl_cmd_port_set_doit()
1063 err = devlink_port_function_set(devlink, devlink_port, attr, extack); in devlink_nl_cmd_port_set_doit()
1071 static int devlink_port_split(struct devlink *devlink, u32 port_index, in devlink_port_split() argument
1075 if (devlink->ops->port_split) in devlink_port_split()
1076 return devlink->ops->port_split(devlink, port_index, count, in devlink_port_split()
1084 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_port_split_doit() local
1093 devlink_port = devlink_port_get_from_info(devlink, info); in devlink_nl_cmd_port_split_doit()
1114 return devlink_port_split(devlink, port_index, count, info->extack); in devlink_nl_cmd_port_split_doit()
1117 static int devlink_port_unsplit(struct devlink *devlink, u32 port_index, in devlink_port_unsplit() argument
1121 if (devlink->ops->port_unsplit) in devlink_port_unsplit()
1122 return devlink->ops->port_unsplit(devlink, port_index, extack); in devlink_port_unsplit()
1129 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_port_unsplit_doit() local
1136 return devlink_port_unsplit(devlink, port_index, info->extack); in devlink_nl_cmd_port_unsplit_doit()
1139 static int devlink_nl_sb_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_sb_fill() argument
1150 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_sb_fill()
1180 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_get_doit() local
1185 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_get_doit()
1193 err = devlink_nl_sb_fill(msg, devlink, devlink_sb, in devlink_nl_cmd_sb_get_doit()
1207 struct devlink *devlink; in devlink_nl_cmd_sb_get_dumpit() local
1214 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_sb_get_dumpit()
1215 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_sb_get_dumpit()
1217 mutex_lock(&devlink->lock); in devlink_nl_cmd_sb_get_dumpit()
1218 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_nl_cmd_sb_get_dumpit()
1223 err = devlink_nl_sb_fill(msg, devlink, devlink_sb, in devlink_nl_cmd_sb_get_dumpit()
1229 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_get_dumpit()
1234 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_get_dumpit()
1243 static int devlink_nl_sb_pool_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_sb_pool_fill() argument
1252 err = devlink->ops->sb_pool_get(devlink, devlink_sb->index, in devlink_nl_sb_pool_fill()
1261 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_sb_pool_fill()
1289 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_pool_get_doit() local
1295 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_pool_get_doit()
1304 if (!devlink->ops->sb_pool_get) in devlink_nl_cmd_sb_pool_get_doit()
1311 err = devlink_nl_sb_pool_fill(msg, devlink, devlink_sb, pool_index, in devlink_nl_cmd_sb_pool_get_doit()
1323 struct devlink *devlink, in __sb_pool_get_dumpit() argument
1336 err = devlink_nl_sb_pool_fill(msg, devlink, in __sb_pool_get_dumpit()
1351 struct devlink *devlink; in devlink_nl_cmd_sb_pool_get_dumpit() local
1358 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_sb_pool_get_dumpit()
1359 if (!net_eq(devlink_net(devlink), sock_net(msg->sk)) || in devlink_nl_cmd_sb_pool_get_dumpit()
1360 !devlink->ops->sb_pool_get) in devlink_nl_cmd_sb_pool_get_dumpit()
1362 mutex_lock(&devlink->lock); in devlink_nl_cmd_sb_pool_get_dumpit()
1363 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_nl_cmd_sb_pool_get_dumpit()
1364 err = __sb_pool_get_dumpit(msg, start, &idx, devlink, in devlink_nl_cmd_sb_pool_get_dumpit()
1371 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_pool_get_dumpit()
1375 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_pool_get_dumpit()
1387 static int devlink_sb_pool_set(struct devlink *devlink, unsigned int sb_index, in devlink_sb_pool_set() argument
1393 const struct devlink_ops *ops = devlink->ops; in devlink_sb_pool_set()
1396 return ops->sb_pool_set(devlink, sb_index, pool_index, in devlink_sb_pool_set()
1404 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_pool_set_doit() local
1411 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_pool_set_doit()
1428 return devlink_sb_pool_set(devlink, devlink_sb->index, in devlink_nl_cmd_sb_pool_set_doit()
1434 struct devlink *devlink, in devlink_nl_sb_port_pool_fill() argument
1441 const struct devlink_ops *ops = devlink->ops; in devlink_nl_sb_port_pool_fill()
1455 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_sb_port_pool_fill()
1496 struct devlink *devlink = devlink_port->devlink; in devlink_nl_cmd_sb_port_pool_get_doit() local
1502 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_port_pool_get_doit()
1511 if (!devlink->ops->sb_port_pool_get) in devlink_nl_cmd_sb_port_pool_get_doit()
1518 err = devlink_nl_sb_port_pool_fill(msg, devlink, devlink_port, in devlink_nl_cmd_sb_port_pool_get_doit()
1531 struct devlink *devlink, in __sb_port_pool_get_dumpit() argument
1540 list_for_each_entry(devlink_port, &devlink->port_list, list) { in __sb_port_pool_get_dumpit()
1546 err = devlink_nl_sb_port_pool_fill(msg, devlink, in __sb_port_pool_get_dumpit()
1564 struct devlink *devlink; in devlink_nl_cmd_sb_port_pool_get_dumpit() local
1571 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_sb_port_pool_get_dumpit()
1572 if (!net_eq(devlink_net(devlink), sock_net(msg->sk)) || in devlink_nl_cmd_sb_port_pool_get_dumpit()
1573 !devlink->ops->sb_port_pool_get) in devlink_nl_cmd_sb_port_pool_get_dumpit()
1575 mutex_lock(&devlink->lock); in devlink_nl_cmd_sb_port_pool_get_dumpit()
1576 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_nl_cmd_sb_port_pool_get_dumpit()
1578 devlink, devlink_sb, in devlink_nl_cmd_sb_port_pool_get_dumpit()
1584 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_port_pool_get_dumpit()
1588 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_port_pool_get_dumpit()
1606 const struct devlink_ops *ops = devlink_port->devlink->ops; in devlink_sb_port_pool_set()
1618 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_port_pool_set_doit() local
1624 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_port_pool_set_doit()
1642 devlink_nl_sb_tc_pool_bind_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_sb_tc_pool_bind_fill() argument
1649 const struct devlink_ops *ops = devlink->ops; in devlink_nl_sb_tc_pool_bind_fill()
1665 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_sb_tc_pool_bind_fill()
1710 struct devlink *devlink = devlink_port->devlink; in devlink_nl_cmd_sb_tc_pool_bind_get_doit() local
1717 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_tc_pool_bind_get_doit()
1730 if (!devlink->ops->sb_tc_pool_bind_get) in devlink_nl_cmd_sb_tc_pool_bind_get_doit()
1737 err = devlink_nl_sb_tc_pool_bind_fill(msg, devlink, devlink_port, in devlink_nl_cmd_sb_tc_pool_bind_get_doit()
1752 struct devlink *devlink, in __sb_tc_pool_bind_get_dumpit() argument
1760 list_for_each_entry(devlink_port, &devlink->port_list, list) { in __sb_tc_pool_bind_get_dumpit()
1767 err = devlink_nl_sb_tc_pool_bind_fill(msg, devlink, in __sb_tc_pool_bind_get_dumpit()
1785 err = devlink_nl_sb_tc_pool_bind_fill(msg, devlink, in __sb_tc_pool_bind_get_dumpit()
1805 struct devlink *devlink; in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit() local
1812 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
1813 if (!net_eq(devlink_net(devlink), sock_net(msg->sk)) || in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
1814 !devlink->ops->sb_tc_pool_bind_get) in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
1817 mutex_lock(&devlink->lock); in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
1818 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
1820 devlink, in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
1827 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
1831 mutex_unlock(&devlink->lock); in devlink_nl_cmd_sb_tc_pool_bind_get_dumpit()
1850 const struct devlink_ops *ops = devlink_port->devlink->ops; in devlink_sb_tc_pool_bind_set()
1863 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_tc_pool_bind_set_doit() local
1871 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_tc_pool_bind_set_doit()
1901 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_occ_snapshot_doit() local
1902 const struct devlink_ops *ops = devlink->ops; in devlink_nl_cmd_sb_occ_snapshot_doit()
1905 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_occ_snapshot_doit()
1910 return ops->sb_occ_snapshot(devlink, devlink_sb->index); in devlink_nl_cmd_sb_occ_snapshot_doit()
1917 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_sb_occ_max_clear_doit() local
1918 const struct devlink_ops *ops = devlink->ops; in devlink_nl_cmd_sb_occ_max_clear_doit()
1921 devlink_sb = devlink_sb_get_from_info(devlink, info); in devlink_nl_cmd_sb_occ_max_clear_doit()
1926 return ops->sb_occ_max_clear(devlink, devlink_sb->index); in devlink_nl_cmd_sb_occ_max_clear_doit()
1930 static int devlink_nl_eswitch_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_eswitch_fill() argument
1934 const struct devlink_ops *ops = devlink->ops; in devlink_nl_eswitch_fill()
1945 err = devlink_nl_put_handle(msg, devlink); in devlink_nl_eswitch_fill()
1950 err = ops->eswitch_mode_get(devlink, &mode); in devlink_nl_eswitch_fill()
1959 err = ops->eswitch_inline_mode_get(devlink, &inline_mode); in devlink_nl_eswitch_fill()
1969 err = ops->eswitch_encap_mode_get(devlink, &encap_mode); in devlink_nl_eswitch_fill()
1988 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_eswitch_get_doit() local
1996 err = devlink_nl_eswitch_fill(msg, devlink, DEVLINK_CMD_ESWITCH_GET, in devlink_nl_cmd_eswitch_get_doit()
2010 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_eswitch_set_doit() local
2011 const struct devlink_ops *ops = devlink->ops; in devlink_nl_cmd_eswitch_set_doit()
2021 err = ops->eswitch_mode_set(devlink, mode, info->extack); in devlink_nl_cmd_eswitch_set_doit()
2031 err = ops->eswitch_inline_mode_set(devlink, inline_mode, in devlink_nl_cmd_eswitch_set_doit()
2041 err = ops->eswitch_encap_mode_set(devlink, encap_mode, in devlink_nl_cmd_eswitch_set_doit()
2207 struct devlink *devlink = info->user_ptr[0]; in devlink_dpipe_tables_fill() local
2231 if (devlink_nl_put_handle(skb, devlink)) in devlink_dpipe_tables_fill()
2285 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_dpipe_table_get() local
2292 &devlink->dpipe_table_list, in devlink_nl_cmd_dpipe_table_get()
2444 const char *table_name, struct devlink *devlink) in devlink_dpipe_table_find() argument
2448 lockdep_is_held(&devlink->lock)) { in devlink_dpipe_table_find()
2457 struct devlink *devlink; in devlink_dpipe_entry_ctx_prepare() local
2473 devlink = dump_ctx->info->user_ptr[0]; in devlink_dpipe_entry_ctx_prepare()
2474 if (devlink_nl_put_handle(dump_ctx->skb, devlink)) in devlink_dpipe_entry_ctx_prepare()
2558 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_dpipe_entries_get() local
2566 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, in devlink_nl_cmd_dpipe_entries_get()
2567 table_name, devlink); in devlink_nl_cmd_dpipe_entries_get()
2645 struct devlink *devlink = info->user_ptr[0]; in devlink_dpipe_headers_fill() local
2666 if (devlink_nl_put_handle(skb, devlink)) in devlink_dpipe_headers_fill()
2708 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_dpipe_headers_get() local
2710 if (!devlink->dpipe_headers) in devlink_nl_cmd_dpipe_headers_get()
2713 0, devlink->dpipe_headers); in devlink_nl_cmd_dpipe_headers_get()
2716 static int devlink_dpipe_table_counters_set(struct devlink *devlink, in devlink_dpipe_table_counters_set() argument
2722 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, in devlink_dpipe_table_counters_set()
2723 table_name, devlink); in devlink_dpipe_table_counters_set()
2742 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_dpipe_table_counters_set() local
2753 return devlink_dpipe_table_counters_set(devlink, table_name, in devlink_nl_cmd_dpipe_table_counters_set()
2758 devlink_resource_find(struct devlink *devlink, in devlink_resource_find() argument
2766 resource_list = &devlink->resource_list; in devlink_resource_find()
2774 child_resource = devlink_resource_find(devlink, resource, in devlink_resource_find()
2830 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_resource_set() local
2841 resource = devlink_resource_find(devlink, NULL, resource_id); in devlink_nl_cmd_resource_set()
2885 static int devlink_resource_put(struct devlink *devlink, struct sk_buff *skb, in devlink_resource_put() argument
2922 if (devlink_resource_put(devlink, skb, child_resource)) in devlink_resource_put()
2941 struct devlink *devlink = info->user_ptr[0]; in devlink_resource_fill() local
2951 resource = list_first_entry(&devlink->resource_list, in devlink_resource_fill()
2965 if (devlink_nl_put_handle(skb, devlink)) in devlink_resource_fill()
2975 list_for_each_entry_from(resource, &devlink->resource_list, list) { in devlink_resource_fill()
2976 err = devlink_resource_put(devlink, skb, resource); in devlink_resource_fill()
3010 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_resource_dump() local
3012 if (list_empty(&devlink->resource_list)) in devlink_nl_cmd_resource_dump()
3019 devlink_resources_validate(struct devlink *devlink, in devlink_resources_validate() argument
3029 resource_list = &devlink->resource_list; in devlink_resources_validate()
3034 err = devlink_resources_validate(devlink, resource, info); in devlink_resources_validate()
3078 static void devlink_param_notify(struct devlink *devlink,
3083 static void devlink_reload_netns_change(struct devlink *devlink, in devlink_reload_netns_change() argument
3094 list_for_each_entry(param_item, &devlink->param_list, list) in devlink_reload_netns_change()
3095 devlink_param_notify(devlink, 0, param_item, in devlink_reload_netns_change()
3097 devlink_notify(devlink, DEVLINK_CMD_DEL); in devlink_reload_netns_change()
3099 __devlink_net_set(devlink, dest_net); in devlink_reload_netns_change()
3101 devlink_notify(devlink, DEVLINK_CMD_NEW); in devlink_reload_netns_change()
3102 list_for_each_entry(param_item, &devlink->param_list, list) in devlink_reload_netns_change()
3103 devlink_param_notify(devlink, 0, param_item, in devlink_reload_netns_change()
3112 static void devlink_reload_failed_set(struct devlink *devlink, in devlink_reload_failed_set() argument
3115 if (devlink->reload_failed == reload_failed) in devlink_reload_failed_set()
3117 devlink->reload_failed = reload_failed; in devlink_reload_failed_set()
3118 devlink_notify(devlink, DEVLINK_CMD_NEW); in devlink_reload_failed_set()
3121 bool devlink_is_reload_failed(const struct devlink *devlink) in devlink_is_reload_failed() argument
3123 return devlink->reload_failed; in devlink_is_reload_failed()
3128 __devlink_reload_stats_update(struct devlink *devlink, u32 *reload_stats, in __devlink_reload_stats_update() argument
3139 devlink_notify(devlink, DEVLINK_CMD_NEW); in __devlink_reload_stats_update()
3143 devlink_reload_stats_update(struct devlink *devlink, enum devlink_reload_limit limit, in devlink_reload_stats_update() argument
3146 __devlink_reload_stats_update(devlink, devlink->stats.reload_stats, limit, in devlink_reload_stats_update()
3164 void devlink_remote_reload_actions_performed(struct devlink *devlink, in devlink_remote_reload_actions_performed() argument
3174 __devlink_reload_stats_update(devlink, devlink->stats.remote_reload_stats, limit, in devlink_remote_reload_actions_performed()
3179 static int devlink_reload(struct devlink *devlink, struct net *dest_net, in devlink_reload() argument
3186 if (!devlink->reload_enabled) in devlink_reload()
3189 memcpy(remote_reload_stats, devlink->stats.remote_reload_stats, in devlink_reload()
3191 err = devlink->ops->reload_down(devlink, !!dest_net, action, limit, extack); in devlink_reload()
3195 if (dest_net && !net_eq(dest_net, devlink_net(devlink))) in devlink_reload()
3196 devlink_reload_netns_change(devlink, dest_net); in devlink_reload()
3198 err = devlink->ops->reload_up(devlink, action, limit, actions_performed, extack); in devlink_reload()
3199 devlink_reload_failed_set(devlink, !!err); in devlink_reload()
3205 WARN_ON(memcmp(remote_reload_stats, devlink->stats.remote_reload_stats, in devlink_reload()
3207 devlink_reload_stats_update(devlink, limit, *actions_performed); in devlink_reload()
3212 devlink_nl_reload_actions_performed_snd(struct devlink *devlink, u32 actions_performed, in devlink_nl_reload_actions_performed_snd() argument
3226 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_reload_actions_performed_snd()
3245 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_reload() local
3252 if (!devlink_reload_supported(devlink->ops)) in devlink_nl_cmd_reload()
3255 err = devlink_resources_validate(devlink, NULL, info); in devlink_nl_cmd_reload()
3274 if (!devlink_reload_action_is_supported(devlink, action)) { in devlink_nl_cmd_reload()
3300 if (!devlink_reload_limit_is_supported(devlink, limit)) { in devlink_nl_cmd_reload()
3311 err = devlink_reload(devlink, dest_net, action, limit, &actions_performed, info->extack); in devlink_nl_cmd_reload()
3322 return devlink_nl_reload_actions_performed_snd(devlink, actions_performed, in devlink_nl_cmd_reload()
3327 struct devlink *devlink, in devlink_nl_flash_update_fill() argument
3337 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_flash_update_fill()
3370 static void __devlink_flash_update_notify(struct devlink *devlink, in __devlink_flash_update_notify() argument
3385 err = devlink_nl_flash_update_fill(msg, devlink, cmd, params); in __devlink_flash_update_notify()
3389 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in __devlink_flash_update_notify()
3397 void devlink_flash_update_begin_notify(struct devlink *devlink) in devlink_flash_update_begin_notify() argument
3401 __devlink_flash_update_notify(devlink, in devlink_flash_update_begin_notify()
3407 void devlink_flash_update_end_notify(struct devlink *devlink) in devlink_flash_update_end_notify() argument
3411 __devlink_flash_update_notify(devlink, in devlink_flash_update_end_notify()
3417 void devlink_flash_update_status_notify(struct devlink *devlink, in devlink_flash_update_status_notify() argument
3430 __devlink_flash_update_notify(devlink, in devlink_flash_update_status_notify()
3436 void devlink_flash_update_timeout_notify(struct devlink *devlink, in devlink_flash_update_timeout_notify() argument
3447 __devlink_flash_update_notify(devlink, in devlink_flash_update_timeout_notify()
3458 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_flash_update() local
3461 if (!devlink->ops->flash_update) in devlink_nl_cmd_flash_update()
3467 supported_params = devlink->ops->supported_flash_update_params; in devlink_nl_cmd_flash_update()
3494 return devlink->ops->flash_update(devlink, ¶ms, info->extack); in devlink_nl_cmd_flash_update()
3612 static int devlink_param_get(struct devlink *devlink, in devlink_param_get() argument
3618 return param->get(devlink, param->id, ctx); in devlink_param_get()
3621 static int devlink_param_set(struct devlink *devlink, in devlink_param_set() argument
3627 return param->set(devlink, param->id, ctx); in devlink_param_set()
3699 static int devlink_nl_param_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_param_fill() argument
3728 err = devlink_param_get(devlink, param, &ctx); in devlink_nl_param_fill()
3740 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_param_fill()
3791 static void devlink_param_notify(struct devlink *devlink, in devlink_param_notify() argument
3806 err = devlink_nl_param_fill(msg, devlink, port_index, param_item, cmd, in devlink_param_notify()
3813 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_param_notify()
3821 struct devlink *devlink; in devlink_nl_cmd_param_get_dumpit() local
3827 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_param_get_dumpit()
3828 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_param_get_dumpit()
3830 mutex_lock(&devlink->lock); in devlink_nl_cmd_param_get_dumpit()
3831 list_for_each_entry(param_item, &devlink->param_list, list) { in devlink_nl_cmd_param_get_dumpit()
3836 err = devlink_nl_param_fill(msg, devlink, 0, param_item, in devlink_nl_cmd_param_get_dumpit()
3844 mutex_unlock(&devlink->lock); in devlink_nl_cmd_param_get_dumpit()
3849 mutex_unlock(&devlink->lock); in devlink_nl_cmd_param_get_dumpit()
3952 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_param_get_doit() local
3957 param_item = devlink_param_get_from_info(&devlink->param_list, info); in devlink_nl_cmd_param_get_doit()
3965 err = devlink_nl_param_fill(msg, devlink, 0, param_item, in devlink_nl_cmd_param_get_doit()
3976 static int __devlink_nl_cmd_param_set_doit(struct devlink *devlink, in __devlink_nl_cmd_param_set_doit() argument
4003 err = param->validate(devlink, param->id, value, info->extack); in __devlink_nl_cmd_param_set_doit()
4025 err = devlink_param_set(devlink, param, &ctx); in __devlink_nl_cmd_param_set_doit()
4030 devlink_param_notify(devlink, port_index, param_item, cmd); in __devlink_nl_cmd_param_set_doit()
4037 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_param_set_doit() local
4039 return __devlink_nl_cmd_param_set_doit(devlink, 0, &devlink->param_list, in devlink_nl_cmd_param_set_doit()
4043 static int devlink_param_register_one(struct devlink *devlink, in devlink_param_register_one() argument
4065 devlink_param_notify(devlink, port_index, param_item, cmd); in devlink_param_register_one()
4069 static void devlink_param_unregister_one(struct devlink *devlink, in devlink_param_unregister_one() argument
4079 devlink_param_notify(devlink, port_index, param_item, cmd); in devlink_param_unregister_one()
4089 struct devlink *devlink; in devlink_nl_cmd_port_param_get_dumpit() local
4095 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_port_param_get_dumpit()
4096 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_port_param_get_dumpit()
4098 mutex_lock(&devlink->lock); in devlink_nl_cmd_port_param_get_dumpit()
4099 list_for_each_entry(devlink_port, &devlink->port_list, list) { in devlink_nl_cmd_port_param_get_dumpit()
4107 devlink_port->devlink, in devlink_nl_cmd_port_param_get_dumpit()
4116 mutex_unlock(&devlink->lock); in devlink_nl_cmd_port_param_get_dumpit()
4122 mutex_unlock(&devlink->lock); in devlink_nl_cmd_port_param_get_dumpit()
4151 err = devlink_nl_param_fill(msg, devlink_port->devlink, in devlink_nl_cmd_port_param_get_doit()
4168 return __devlink_nl_cmd_param_set_doit(devlink_port->devlink, in devlink_nl_cmd_port_param_set_doit()
4175 struct devlink *devlink, in devlink_nl_region_snapshot_id_put() argument
4198 struct devlink *devlink, in devlink_nl_region_snapshots_id_put() argument
4211 err = devlink_nl_region_snapshot_id_put(msg, devlink, snapshot); in devlink_nl_region_snapshots_id_put()
4224 static int devlink_nl_region_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_region_fill() argument
4236 err = devlink_nl_put_handle(msg, devlink); in devlink_nl_region_fill()
4257 err = devlink_nl_region_snapshots_id_put(msg, devlink, region); in devlink_nl_region_fill()
4274 struct devlink *devlink = region->devlink; in devlink_nl_region_notify_build() local
4290 err = devlink_nl_put_handle(msg, devlink); in devlink_nl_region_notify_build()
4332 struct devlink *devlink = region->devlink; in devlink_nl_region_notify() local
4341 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_nl_region_notify()
4360 static int __devlink_snapshot_id_increment(struct devlink *devlink, u32 id) in __devlink_snapshot_id_increment() argument
4365 lockdep_assert_held(&devlink->lock); in __devlink_snapshot_id_increment()
4367 p = xa_load(&devlink->snapshot_ids, id); in __devlink_snapshot_id_increment()
4377 return xa_err(xa_store(&devlink->snapshot_ids, id, xa_mk_value(count), in __devlink_snapshot_id_increment()
4396 static void __devlink_snapshot_id_decrement(struct devlink *devlink, u32 id) in __devlink_snapshot_id_decrement() argument
4401 lockdep_assert_held(&devlink->lock); in __devlink_snapshot_id_decrement()
4403 p = xa_load(&devlink->snapshot_ids, id); in __devlink_snapshot_id_decrement()
4414 xa_store(&devlink->snapshot_ids, id, xa_mk_value(count), in __devlink_snapshot_id_decrement()
4418 xa_erase(&devlink->snapshot_ids, id); in __devlink_snapshot_id_decrement()
4438 static int __devlink_snapshot_id_insert(struct devlink *devlink, u32 id) in __devlink_snapshot_id_insert() argument
4440 lockdep_assert_held(&devlink->lock); in __devlink_snapshot_id_insert()
4442 if (xa_load(&devlink->snapshot_ids, id)) in __devlink_snapshot_id_insert()
4445 return xa_err(xa_store(&devlink->snapshot_ids, id, xa_mk_value(0), in __devlink_snapshot_id_insert()
4465 static int __devlink_region_snapshot_id_get(struct devlink *devlink, u32 *id) in __devlink_region_snapshot_id_get() argument
4467 lockdep_assert_held(&devlink->lock); in __devlink_region_snapshot_id_get()
4469 return xa_alloc(&devlink->snapshot_ids, id, xa_mk_value(1), in __devlink_region_snapshot_id_get()
4491 struct devlink *devlink = region->devlink; in __devlink_region_snapshot_create() local
4495 lockdep_assert_held(&devlink->lock); in __devlink_region_snapshot_create()
4508 err = __devlink_snapshot_id_increment(devlink, snapshot_id); in __devlink_region_snapshot_create()
4531 struct devlink *devlink = region->devlink; in devlink_region_snapshot_del() local
4533 lockdep_assert_held(&devlink->lock); in devlink_region_snapshot_del()
4539 __devlink_snapshot_id_decrement(devlink, snapshot->id); in devlink_region_snapshot_del()
4546 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_region_get_doit() local
4560 port = devlink_port_get_by_index(devlink, index); in devlink_nl_cmd_region_get_doit()
4569 region = devlink_region_get_by_name(devlink, region_name); in devlink_nl_cmd_region_get_doit()
4578 err = devlink_nl_region_fill(msg, devlink, DEVLINK_CMD_REGION_GET, in devlink_nl_cmd_region_get_doit()
4603 err = devlink_nl_region_fill(msg, port->devlink, in devlink_nl_cmd_region_get_port_dumpit()
4619 struct devlink *devlink, in devlink_nl_cmd_region_get_devlink_dumpit() argument
4627 mutex_lock(&devlink->lock); in devlink_nl_cmd_region_get_devlink_dumpit()
4628 list_for_each_entry(region, &devlink->region_list, list) { in devlink_nl_cmd_region_get_devlink_dumpit()
4633 err = devlink_nl_region_fill(msg, devlink, in devlink_nl_cmd_region_get_devlink_dumpit()
4643 list_for_each_entry(port, &devlink->port_list, list) { in devlink_nl_cmd_region_get_devlink_dumpit()
4651 mutex_unlock(&devlink->lock); in devlink_nl_cmd_region_get_devlink_dumpit()
4658 struct devlink *devlink; in devlink_nl_cmd_region_get_dumpit() local
4664 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_region_get_dumpit()
4665 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_region_get_dumpit()
4667 err = devlink_nl_cmd_region_get_devlink_dumpit(msg, cb, devlink, in devlink_nl_cmd_region_get_dumpit()
4681 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_region_del() local
4699 port = devlink_port_get_by_index(devlink, index); in devlink_nl_cmd_region_del()
4707 region = devlink_region_get_by_name(devlink, region_name); in devlink_nl_cmd_region_del()
4723 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_region_new() local
4744 port = devlink_port_get_by_index(devlink, index); in devlink_nl_cmd_region_new()
4752 region = devlink_region_get_by_name(devlink, region_name); in devlink_nl_cmd_region_new()
4778 err = __devlink_snapshot_id_insert(devlink, snapshot_id); in devlink_nl_cmd_region_new()
4782 err = __devlink_region_snapshot_id_get(devlink, &snapshot_id); in devlink_nl_cmd_region_new()
4793 err = region->ops->snapshot(devlink, region->ops, in devlink_nl_cmd_region_new()
4828 __devlink_snapshot_id_decrement(devlink, snapshot_id); in devlink_nl_cmd_region_new()
4837 struct devlink *devlink, in devlink_nl_cmd_region_read_chunk_fill() argument
4868 struct devlink *devlink, in devlink_nl_region_read_snapshot_fill() argument
4897 err = devlink_nl_cmd_region_read_chunk_fill(skb, devlink, in devlink_nl_region_read_snapshot_fill()
4920 struct devlink *devlink; in devlink_nl_cmd_region_read_dumpit() local
4928 devlink = devlink_get_from_attrs(sock_net(cb->skb->sk), attrs); in devlink_nl_cmd_region_read_dumpit()
4929 if (IS_ERR(devlink)) { in devlink_nl_cmd_region_read_dumpit()
4930 err = PTR_ERR(devlink); in devlink_nl_cmd_region_read_dumpit()
4934 mutex_lock(&devlink->lock); in devlink_nl_cmd_region_read_dumpit()
4945 port = devlink_port_get_by_index(devlink, index); in devlink_nl_cmd_region_read_dumpit()
4957 region = devlink_region_get_by_name(devlink, region_name); in devlink_nl_cmd_region_read_dumpit()
4991 err = devlink_nl_put_handle(skb, devlink); in devlink_nl_cmd_region_read_dumpit()
5012 err = devlink_nl_region_read_snapshot_fill(skb, devlink, in devlink_nl_cmd_region_read_dumpit()
5030 mutex_unlock(&devlink->lock); in devlink_nl_cmd_region_read_dumpit()
5038 mutex_unlock(&devlink->lock); in devlink_nl_cmd_region_read_dumpit()
5126 devlink_nl_info_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_info_fill() argument
5139 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_info_fill()
5143 err = devlink->ops->info_get(devlink, &req, extack); in devlink_nl_info_fill()
5158 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_info_get_doit() local
5162 if (!devlink->ops->info_get) in devlink_nl_cmd_info_get_doit()
5169 err = devlink_nl_info_fill(msg, devlink, DEVLINK_CMD_INFO_GET, in devlink_nl_cmd_info_get_doit()
5183 struct devlink *devlink; in devlink_nl_cmd_info_get_dumpit() local
5189 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_info_get_dumpit()
5190 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_info_get_dumpit()
5197 if (!devlink->ops->info_get) { in devlink_nl_cmd_info_get_dumpit()
5202 mutex_lock(&devlink->lock); in devlink_nl_cmd_info_get_dumpit()
5203 err = devlink_nl_info_fill(msg, devlink, DEVLINK_CMD_INFO_GET, in devlink_nl_cmd_info_get_dumpit()
5207 mutex_unlock(&devlink->lock); in devlink_nl_cmd_info_get_dumpit()
5820 struct devlink *devlink; member
5858 devlink_health_reporter_find_by_name(struct devlink *devlink, in devlink_health_reporter_find_by_name() argument
5861 return __devlink_health_reporter_find_by_name(&devlink->reporter_list, in devlink_health_reporter_find_by_name()
5862 &devlink->reporters_lock, in devlink_health_reporter_find_by_name()
5876 __devlink_health_reporter_create(struct devlink *devlink, in __devlink_health_reporter_create() argument
5891 reporter->devlink = devlink; in __devlink_health_reporter_create()
5923 reporter = __devlink_health_reporter_create(port->devlink, ops, in devlink_port_health_reporter_create()
5945 devlink_health_reporter_create(struct devlink *devlink, in devlink_health_reporter_create() argument
5951 mutex_lock(&devlink->reporters_lock); in devlink_health_reporter_create()
5952 if (devlink_health_reporter_find_by_name(devlink, ops->name)) { in devlink_health_reporter_create()
5957 reporter = __devlink_health_reporter_create(devlink, ops, in devlink_health_reporter_create()
5962 list_add_tail(&reporter->list, &devlink->reporter_list); in devlink_health_reporter_create()
5964 mutex_unlock(&devlink->reporters_lock); in devlink_health_reporter_create()
6000 struct mutex *lock = &reporter->devlink->reporters_lock; in devlink_health_reporter_destroy()
6026 struct devlink *devlink, in devlink_nl_health_reporter_fill() argument
6038 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_health_reporter_fill()
6107 err = devlink_nl_health_reporter_fill(msg, reporter->devlink, in devlink_recover_notify()
6115 devlink_net(reporter->devlink), in devlink_recover_notify()
6204 struct devlink *devlink = reporter->devlink; in devlink_health_report() local
6209 trace_devlink_health_report(devlink, reporter->ops->name, msg); in devlink_health_report()
6222 trace_devlink_health_recover_aborted(devlink, in devlink_health_report()
6248 devlink_health_reporter_get_from_attrs(struct devlink *devlink, in devlink_health_reporter_get_from_attrs() argument
6259 devlink_port = devlink_port_get_from_attrs(devlink, attrs); in devlink_health_reporter_get_from_attrs()
6261 mutex_lock(&devlink->reporters_lock); in devlink_health_reporter_get_from_attrs()
6262 reporter = devlink_health_reporter_find_by_name(devlink, reporter_name); in devlink_health_reporter_get_from_attrs()
6265 mutex_unlock(&devlink->reporters_lock); in devlink_health_reporter_get_from_attrs()
6278 devlink_health_reporter_get_from_info(struct devlink *devlink, in devlink_health_reporter_get_from_info() argument
6281 return devlink_health_reporter_get_from_attrs(devlink, info->attrs); in devlink_health_reporter_get_from_info()
6290 struct devlink *devlink; in devlink_health_reporter_get_from_cb() local
6293 devlink = devlink_get_from_attrs(sock_net(cb->skb->sk), attrs); in devlink_health_reporter_get_from_cb()
6294 if (IS_ERR(devlink)) in devlink_health_reporter_get_from_cb()
6297 reporter = devlink_health_reporter_get_from_attrs(devlink, attrs); in devlink_health_reporter_get_from_cb()
6317 trace_devlink_health_reporter_state_update(reporter->devlink, in devlink_health_reporter_state_update()
6326 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_get_doit() local
6331 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_get_doit()
6341 err = devlink_nl_health_reporter_fill(msg, devlink, reporter, in devlink_nl_cmd_health_reporter_get_doit()
6362 struct devlink *devlink; in devlink_nl_cmd_health_reporter_get_dumpit() local
6368 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_health_reporter_get_dumpit()
6369 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_health_reporter_get_dumpit()
6371 mutex_lock(&devlink->reporters_lock); in devlink_nl_cmd_health_reporter_get_dumpit()
6372 list_for_each_entry(reporter, &devlink->reporter_list, in devlink_nl_cmd_health_reporter_get_dumpit()
6378 err = devlink_nl_health_reporter_fill(msg, devlink, in devlink_nl_cmd_health_reporter_get_dumpit()
6385 mutex_unlock(&devlink->reporters_lock); in devlink_nl_cmd_health_reporter_get_dumpit()
6390 mutex_unlock(&devlink->reporters_lock); in devlink_nl_cmd_health_reporter_get_dumpit()
6393 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_health_reporter_get_dumpit()
6394 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_health_reporter_get_dumpit()
6396 mutex_lock(&devlink->lock); in devlink_nl_cmd_health_reporter_get_dumpit()
6397 list_for_each_entry(port, &devlink->port_list, list) { in devlink_nl_cmd_health_reporter_get_dumpit()
6404 err = devlink_nl_health_reporter_fill(msg, devlink, reporter, in devlink_nl_cmd_health_reporter_get_dumpit()
6411 mutex_unlock(&devlink->lock); in devlink_nl_cmd_health_reporter_get_dumpit()
6418 mutex_unlock(&devlink->lock); in devlink_nl_cmd_health_reporter_get_dumpit()
6431 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_set_doit() local
6435 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_set_doit()
6473 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_recover_doit() local
6477 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_recover_doit()
6490 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_diagnose_doit() local
6495 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_diagnose_doit()
6573 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_dump_clear_doit() local
6576 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_dump_clear_doit()
6595 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_health_reporter_test_doit() local
6599 reporter = devlink_health_reporter_get_from_info(devlink, info); in devlink_nl_cmd_health_reporter_test_doit()
6676 devlink_trap_policer_item_lookup(struct devlink *devlink, u32 id) in devlink_trap_policer_item_lookup() argument
6680 list_for_each_entry(policer_item, &devlink->trap_policer_list, list) { in devlink_trap_policer_item_lookup()
6689 devlink_trap_item_lookup(struct devlink *devlink, const char *name) in devlink_trap_item_lookup() argument
6693 list_for_each_entry(trap_item, &devlink->trap_list, list) { in devlink_trap_item_lookup()
6702 devlink_trap_item_get_from_info(struct devlink *devlink, in devlink_trap_item_get_from_info() argument
6711 return devlink_trap_item_lookup(devlink, nla_data(attr)); in devlink_trap_item_get_from_info()
6811 static int devlink_nl_trap_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_trap_fill() argument
6824 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_trap_fill()
6865 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_get_doit() local
6870 if (list_empty(&devlink->trap_list)) in devlink_nl_cmd_trap_get_doit()
6873 trap_item = devlink_trap_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_get_doit()
6883 err = devlink_nl_trap_fill(msg, devlink, trap_item, in devlink_nl_cmd_trap_get_doit()
6900 struct devlink *devlink; in devlink_nl_cmd_trap_get_dumpit() local
6906 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_trap_get_dumpit()
6907 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_trap_get_dumpit()
6909 mutex_lock(&devlink->lock); in devlink_nl_cmd_trap_get_dumpit()
6910 list_for_each_entry(trap_item, &devlink->trap_list, list) { in devlink_nl_cmd_trap_get_dumpit()
6915 err = devlink_nl_trap_fill(msg, devlink, trap_item, in devlink_nl_cmd_trap_get_dumpit()
6921 mutex_unlock(&devlink->lock); in devlink_nl_cmd_trap_get_dumpit()
6926 mutex_unlock(&devlink->lock); in devlink_nl_cmd_trap_get_dumpit()
6935 static int __devlink_trap_action_set(struct devlink *devlink, in __devlink_trap_action_set() argument
6948 err = devlink->ops->trap_action_set(devlink, trap_item->trap, in __devlink_trap_action_set()
6958 static int devlink_trap_action_set(struct devlink *devlink, in devlink_trap_action_set() argument
6974 return __devlink_trap_action_set(devlink, trap_item, trap_action, in devlink_trap_action_set()
6982 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_set_doit() local
6986 if (list_empty(&devlink->trap_list)) in devlink_nl_cmd_trap_set_doit()
6989 trap_item = devlink_trap_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_set_doit()
6995 err = devlink_trap_action_set(devlink, trap_item, info); in devlink_nl_cmd_trap_set_doit()
7003 devlink_trap_group_item_lookup(struct devlink *devlink, const char *name) in devlink_trap_group_item_lookup() argument
7007 list_for_each_entry(group_item, &devlink->trap_group_list, list) { in devlink_trap_group_item_lookup()
7016 devlink_trap_group_item_lookup_by_id(struct devlink *devlink, u16 id) in devlink_trap_group_item_lookup_by_id() argument
7020 list_for_each_entry(group_item, &devlink->trap_group_list, list) { in devlink_trap_group_item_lookup_by_id()
7029 devlink_trap_group_item_get_from_info(struct devlink *devlink, in devlink_trap_group_item_get_from_info() argument
7038 return devlink_trap_group_item_lookup(devlink, name); in devlink_trap_group_item_get_from_info()
7042 devlink_nl_trap_group_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_trap_group_fill() argument
7054 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_trap_group_fill()
7087 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_group_get_doit() local
7092 if (list_empty(&devlink->trap_group_list)) in devlink_nl_cmd_trap_group_get_doit()
7095 group_item = devlink_trap_group_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_group_get_doit()
7105 err = devlink_nl_trap_group_fill(msg, devlink, group_item, in devlink_nl_cmd_trap_group_get_doit()
7124 struct devlink *devlink; in devlink_nl_cmd_trap_group_get_dumpit() local
7130 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_trap_group_get_dumpit()
7131 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_trap_group_get_dumpit()
7133 mutex_lock(&devlink->lock); in devlink_nl_cmd_trap_group_get_dumpit()
7134 list_for_each_entry(group_item, &devlink->trap_group_list, in devlink_nl_cmd_trap_group_get_dumpit()
7140 err = devlink_nl_trap_group_fill(msg, devlink, in devlink_nl_cmd_trap_group_get_dumpit()
7146 mutex_unlock(&devlink->lock); in devlink_nl_cmd_trap_group_get_dumpit()
7151 mutex_unlock(&devlink->lock); in devlink_nl_cmd_trap_group_get_dumpit()
7161 __devlink_trap_group_action_set(struct devlink *devlink, in __devlink_trap_group_action_set() argument
7170 if (devlink->ops->trap_group_action_set) { in __devlink_trap_group_action_set()
7171 err = devlink->ops->trap_group_action_set(devlink, group_item->group, in __devlink_trap_group_action_set()
7176 list_for_each_entry(trap_item, &devlink->trap_list, list) { in __devlink_trap_group_action_set()
7188 list_for_each_entry(trap_item, &devlink->trap_list, list) { in __devlink_trap_group_action_set()
7191 err = __devlink_trap_action_set(devlink, trap_item, in __devlink_trap_group_action_set()
7201 devlink_trap_group_action_set(struct devlink *devlink, in devlink_trap_group_action_set() argument
7217 err = __devlink_trap_group_action_set(devlink, group_item, trap_action, in devlink_trap_group_action_set()
7227 static int devlink_trap_group_set(struct devlink *devlink, in devlink_trap_group_set() argument
7240 if (!devlink->ops->trap_group_set) in devlink_trap_group_set()
7248 policer_item = devlink_trap_policer_item_lookup(devlink, in devlink_trap_group_set()
7257 err = devlink->ops->trap_group_set(devlink, group_item->group, policer, in devlink_trap_group_set()
7271 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_group_set_doit() local
7276 if (list_empty(&devlink->trap_group_list)) in devlink_nl_cmd_trap_group_set_doit()
7279 group_item = devlink_trap_group_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_group_set_doit()
7285 err = devlink_trap_group_action_set(devlink, group_item, info, in devlink_nl_cmd_trap_group_set_doit()
7290 err = devlink_trap_group_set(devlink, group_item, info); in devlink_nl_cmd_trap_group_set_doit()
7303 devlink_trap_policer_item_get_from_info(struct devlink *devlink, in devlink_trap_policer_item_get_from_info() argument
7312 return devlink_trap_policer_item_lookup(devlink, id); in devlink_trap_policer_item_get_from_info()
7316 devlink_trap_policer_stats_put(struct sk_buff *msg, struct devlink *devlink, in devlink_trap_policer_stats_put() argument
7323 if (!devlink->ops->trap_policer_counter_get) in devlink_trap_policer_stats_put()
7326 err = devlink->ops->trap_policer_counter_get(devlink, policer, &drops); in devlink_trap_policer_stats_put()
7348 devlink_nl_trap_policer_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_trap_policer_fill() argument
7360 if (devlink_nl_put_handle(msg, devlink)) in devlink_nl_trap_policer_fill()
7375 err = devlink_trap_policer_stats_put(msg, devlink, in devlink_nl_trap_policer_fill()
7394 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_policer_get_doit() local
7398 if (list_empty(&devlink->trap_policer_list)) in devlink_nl_cmd_trap_policer_get_doit()
7401 policer_item = devlink_trap_policer_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_policer_get_doit()
7411 err = devlink_nl_trap_policer_fill(msg, devlink, policer_item, in devlink_nl_cmd_trap_policer_get_doit()
7430 struct devlink *devlink; in devlink_nl_cmd_trap_policer_get_dumpit() local
7436 list_for_each_entry(devlink, &devlink_list, list) { in devlink_nl_cmd_trap_policer_get_dumpit()
7437 if (!net_eq(devlink_net(devlink), sock_net(msg->sk))) in devlink_nl_cmd_trap_policer_get_dumpit()
7439 mutex_lock(&devlink->lock); in devlink_nl_cmd_trap_policer_get_dumpit()
7440 list_for_each_entry(policer_item, &devlink->trap_policer_list, in devlink_nl_cmd_trap_policer_get_dumpit()
7446 err = devlink_nl_trap_policer_fill(msg, devlink, in devlink_nl_cmd_trap_policer_get_dumpit()
7452 mutex_unlock(&devlink->lock); in devlink_nl_cmd_trap_policer_get_dumpit()
7457 mutex_unlock(&devlink->lock); in devlink_nl_cmd_trap_policer_get_dumpit()
7467 devlink_trap_policer_set(struct devlink *devlink, in devlink_trap_policer_set() argument
7505 err = devlink->ops->trap_policer_set(devlink, policer_item->policer, in devlink_trap_policer_set()
7521 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_cmd_trap_policer_set_doit() local
7523 if (list_empty(&devlink->trap_policer_list)) in devlink_nl_cmd_trap_policer_set_doit()
7526 if (!devlink->ops->trap_policer_set) in devlink_nl_cmd_trap_policer_set_doit()
7529 policer_item = devlink_trap_policer_item_get_from_info(devlink, info); in devlink_nl_cmd_trap_policer_set_doit()
7535 return devlink_trap_policer_set(devlink, policer_item, info); in devlink_nl_cmd_trap_policer_set_doit()
7961 struct devlink *devlink_alloc(const struct devlink_ops *ops, size_t priv_size) in devlink_alloc()
7963 struct devlink *devlink; in devlink_alloc() local
7971 devlink = kzalloc(sizeof(*devlink) + priv_size, GFP_KERNEL); in devlink_alloc()
7972 if (!devlink) in devlink_alloc()
7974 devlink->ops = ops; in devlink_alloc()
7975 xa_init_flags(&devlink->snapshot_ids, XA_FLAGS_ALLOC); in devlink_alloc()
7976 __devlink_net_set(devlink, &init_net); in devlink_alloc()
7977 INIT_LIST_HEAD(&devlink->port_list); in devlink_alloc()
7978 INIT_LIST_HEAD(&devlink->sb_list); in devlink_alloc()
7979 INIT_LIST_HEAD_RCU(&devlink->dpipe_table_list); in devlink_alloc()
7980 INIT_LIST_HEAD(&devlink->resource_list); in devlink_alloc()
7981 INIT_LIST_HEAD(&devlink->param_list); in devlink_alloc()
7982 INIT_LIST_HEAD(&devlink->region_list); in devlink_alloc()
7983 INIT_LIST_HEAD(&devlink->reporter_list); in devlink_alloc()
7984 INIT_LIST_HEAD(&devlink->trap_list); in devlink_alloc()
7985 INIT_LIST_HEAD(&devlink->trap_group_list); in devlink_alloc()
7986 INIT_LIST_HEAD(&devlink->trap_policer_list); in devlink_alloc()
7987 mutex_init(&devlink->lock); in devlink_alloc()
7988 mutex_init(&devlink->reporters_lock); in devlink_alloc()
7989 return devlink; in devlink_alloc()
7999 int devlink_register(struct devlink *devlink, struct device *dev) in devlink_register() argument
8001 devlink->dev = dev; in devlink_register()
8002 devlink->registered = true; in devlink_register()
8004 list_add_tail(&devlink->list, &devlink_list); in devlink_register()
8005 devlink_notify(devlink, DEVLINK_CMD_NEW); in devlink_register()
8016 void devlink_unregister(struct devlink *devlink) in devlink_unregister() argument
8019 WARN_ON(devlink_reload_supported(devlink->ops) && in devlink_unregister()
8020 devlink->reload_enabled); in devlink_unregister()
8021 devlink_notify(devlink, DEVLINK_CMD_DEL); in devlink_unregister()
8022 list_del(&devlink->list); in devlink_unregister()
8035 void devlink_reload_enable(struct devlink *devlink) in devlink_reload_enable() argument
8038 devlink->reload_enabled = true; in devlink_reload_enable()
8051 void devlink_reload_disable(struct devlink *devlink) in devlink_reload_disable() argument
8057 devlink->reload_enabled = false; in devlink_reload_disable()
8067 void devlink_free(struct devlink *devlink) in devlink_free() argument
8069 mutex_destroy(&devlink->reporters_lock); in devlink_free()
8070 mutex_destroy(&devlink->lock); in devlink_free()
8071 WARN_ON(!list_empty(&devlink->trap_policer_list)); in devlink_free()
8072 WARN_ON(!list_empty(&devlink->trap_group_list)); in devlink_free()
8073 WARN_ON(!list_empty(&devlink->trap_list)); in devlink_free()
8074 WARN_ON(!list_empty(&devlink->reporter_list)); in devlink_free()
8075 WARN_ON(!list_empty(&devlink->region_list)); in devlink_free()
8076 WARN_ON(!list_empty(&devlink->param_list)); in devlink_free()
8077 WARN_ON(!list_empty(&devlink->resource_list)); in devlink_free()
8078 WARN_ON(!list_empty(&devlink->dpipe_table_list)); in devlink_free()
8079 WARN_ON(!list_empty(&devlink->sb_list)); in devlink_free()
8080 WARN_ON(!list_empty(&devlink->port_list)); in devlink_free()
8082 xa_destroy(&devlink->snapshot_ids); in devlink_free()
8084 kfree(devlink); in devlink_free()
8134 int devlink_port_register(struct devlink *devlink, in devlink_port_register() argument
8138 mutex_lock(&devlink->lock); in devlink_port_register()
8139 if (devlink_port_index_exists(devlink, port_index)) { in devlink_port_register()
8140 mutex_unlock(&devlink->lock); in devlink_port_register()
8143 devlink_port->devlink = devlink; in devlink_port_register()
8149 list_add_tail(&devlink_port->list, &devlink->port_list); in devlink_port_register()
8152 mutex_unlock(&devlink->lock); in devlink_port_register()
8167 struct devlink *devlink = devlink_port->devlink; in devlink_port_unregister() local
8171 mutex_lock(&devlink->lock); in devlink_port_unregister()
8173 mutex_unlock(&devlink->lock); in devlink_port_unregister()
8243 dev_warn(devlink_port->devlink->dev, in devlink_port_type_eth_set()
8424 int devlink_sb_register(struct devlink *devlink, unsigned int sb_index, in devlink_sb_register() argument
8432 mutex_lock(&devlink->lock); in devlink_sb_register()
8433 if (devlink_sb_index_exists(devlink, sb_index)) { in devlink_sb_register()
8449 list_add_tail(&devlink_sb->list, &devlink->sb_list); in devlink_sb_register()
8451 mutex_unlock(&devlink->lock); in devlink_sb_register()
8456 void devlink_sb_unregister(struct devlink *devlink, unsigned int sb_index) in devlink_sb_unregister() argument
8460 mutex_lock(&devlink->lock); in devlink_sb_unregister()
8461 devlink_sb = devlink_sb_get_by_index(devlink, sb_index); in devlink_sb_unregister()
8464 mutex_unlock(&devlink->lock); in devlink_sb_unregister()
8477 int devlink_dpipe_headers_register(struct devlink *devlink, in devlink_dpipe_headers_register() argument
8480 mutex_lock(&devlink->lock); in devlink_dpipe_headers_register()
8481 devlink->dpipe_headers = dpipe_headers; in devlink_dpipe_headers_register()
8482 mutex_unlock(&devlink->lock); in devlink_dpipe_headers_register()
8494 void devlink_dpipe_headers_unregister(struct devlink *devlink) in devlink_dpipe_headers_unregister() argument
8496 mutex_lock(&devlink->lock); in devlink_dpipe_headers_unregister()
8497 devlink->dpipe_headers = NULL; in devlink_dpipe_headers_unregister()
8498 mutex_unlock(&devlink->lock); in devlink_dpipe_headers_unregister()
8516 bool devlink_dpipe_table_counter_enabled(struct devlink *devlink, in devlink_dpipe_table_counter_enabled() argument
8523 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, in devlink_dpipe_table_counter_enabled()
8524 table_name, devlink); in devlink_dpipe_table_counter_enabled()
8542 int devlink_dpipe_table_register(struct devlink *devlink, in devlink_dpipe_table_register() argument
8553 mutex_lock(&devlink->lock); in devlink_dpipe_table_register()
8555 if (devlink_dpipe_table_find(&devlink->dpipe_table_list, table_name, in devlink_dpipe_table_register()
8556 devlink)) { in devlink_dpipe_table_register()
8572 list_add_tail_rcu(&table->list, &devlink->dpipe_table_list); in devlink_dpipe_table_register()
8574 mutex_unlock(&devlink->lock); in devlink_dpipe_table_register()
8585 void devlink_dpipe_table_unregister(struct devlink *devlink, in devlink_dpipe_table_unregister() argument
8590 mutex_lock(&devlink->lock); in devlink_dpipe_table_unregister()
8591 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, in devlink_dpipe_table_unregister()
8592 table_name, devlink); in devlink_dpipe_table_unregister()
8596 mutex_unlock(&devlink->lock); in devlink_dpipe_table_unregister()
8600 mutex_unlock(&devlink->lock); in devlink_dpipe_table_unregister()
8614 int devlink_resource_register(struct devlink *devlink, in devlink_resource_register() argument
8628 mutex_lock(&devlink->lock); in devlink_resource_register()
8629 resource = devlink_resource_find(devlink, NULL, resource_id); in devlink_resource_register()
8642 resource_list = &devlink->resource_list; in devlink_resource_register()
8646 parent_resource = devlink_resource_find(devlink, NULL, in devlink_resource_register()
8668 mutex_unlock(&devlink->lock); in devlink_resource_register()
8679 void devlink_resources_unregister(struct devlink *devlink, in devlink_resources_unregister() argument
8688 resource_list = &devlink->resource_list; in devlink_resources_unregister()
8691 mutex_lock(&devlink->lock); in devlink_resources_unregister()
8694 devlink_resources_unregister(devlink, child_resource); in devlink_resources_unregister()
8700 mutex_unlock(&devlink->lock); in devlink_resources_unregister()
8711 int devlink_resource_size_get(struct devlink *devlink, in devlink_resource_size_get() argument
8718 mutex_lock(&devlink->lock); in devlink_resource_size_get()
8719 resource = devlink_resource_find(devlink, NULL, resource_id); in devlink_resource_size_get()
8727 mutex_unlock(&devlink->lock); in devlink_resource_size_get()
8740 int devlink_dpipe_table_resource_set(struct devlink *devlink, in devlink_dpipe_table_resource_set() argument
8747 mutex_lock(&devlink->lock); in devlink_dpipe_table_resource_set()
8748 table = devlink_dpipe_table_find(&devlink->dpipe_table_list, in devlink_dpipe_table_resource_set()
8749 table_name, devlink); in devlink_dpipe_table_resource_set()
8758 mutex_unlock(&devlink->lock); in devlink_dpipe_table_resource_set()
8771 void devlink_resource_occ_get_register(struct devlink *devlink, in devlink_resource_occ_get_register() argument
8778 mutex_lock(&devlink->lock); in devlink_resource_occ_get_register()
8779 resource = devlink_resource_find(devlink, NULL, resource_id); in devlink_resource_occ_get_register()
8787 mutex_unlock(&devlink->lock); in devlink_resource_occ_get_register()
8797 void devlink_resource_occ_get_unregister(struct devlink *devlink, in devlink_resource_occ_get_unregister() argument
8802 mutex_lock(&devlink->lock); in devlink_resource_occ_get_unregister()
8803 resource = devlink_resource_find(devlink, NULL, resource_id); in devlink_resource_occ_get_unregister()
8811 mutex_unlock(&devlink->lock); in devlink_resource_occ_get_unregister()
8825 static int __devlink_params_register(struct devlink *devlink, in __devlink_params_register() argument
8837 mutex_lock(&devlink->lock); in __devlink_params_register()
8843 err = devlink_param_register_one(devlink, port_index, in __devlink_params_register()
8849 mutex_unlock(&devlink->lock); in __devlink_params_register()
8856 devlink_param_unregister_one(devlink, port_index, param_list, in __devlink_params_register()
8859 mutex_unlock(&devlink->lock); in __devlink_params_register()
8863 static void __devlink_params_unregister(struct devlink *devlink, in __devlink_params_unregister() argument
8873 mutex_lock(&devlink->lock); in __devlink_params_unregister()
8875 devlink_param_unregister_one(devlink, 0, param_list, param, in __devlink_params_unregister()
8877 mutex_unlock(&devlink->lock); in __devlink_params_unregister()
8889 int devlink_params_register(struct devlink *devlink, in devlink_params_register() argument
8893 return __devlink_params_register(devlink, 0, &devlink->param_list, in devlink_params_register()
8906 void devlink_params_unregister(struct devlink *devlink, in devlink_params_unregister() argument
8910 return __devlink_params_unregister(devlink, 0, &devlink->param_list, in devlink_params_unregister()
8923 void devlink_params_publish(struct devlink *devlink) in devlink_params_publish() argument
8927 list_for_each_entry(param_item, &devlink->param_list, list) { in devlink_params_publish()
8931 devlink_param_notify(devlink, 0, param_item, in devlink_params_publish()
8944 void devlink_params_unpublish(struct devlink *devlink) in devlink_params_unpublish() argument
8948 list_for_each_entry(param_item, &devlink->param_list, list) { in devlink_params_unpublish()
8952 devlink_param_notify(devlink, 0, param_item, in devlink_params_unpublish()
8971 return __devlink_params_register(devlink_port->devlink, in devlink_port_params_register()
8992 return __devlink_params_unregister(devlink_port->devlink, in devlink_port_params_unregister()
9024 __devlink_param_driverinit_value_set(struct devlink *devlink, in __devlink_param_driverinit_value_set() argument
9046 devlink_param_notify(devlink, port_index, param_item, cmd); in __devlink_param_driverinit_value_set()
9061 int devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id, in devlink_param_driverinit_value_get() argument
9064 if (!devlink_reload_supported(devlink->ops)) in devlink_param_driverinit_value_get()
9067 return __devlink_param_driverinit_value_get(&devlink->param_list, in devlink_param_driverinit_value_get()
9084 int devlink_param_driverinit_value_set(struct devlink *devlink, u32 param_id, in devlink_param_driverinit_value_set() argument
9087 return __devlink_param_driverinit_value_set(devlink, 0, in devlink_param_driverinit_value_set()
9088 &devlink->param_list, in devlink_param_driverinit_value_set()
9109 struct devlink *devlink = devlink_port->devlink; in devlink_port_param_driverinit_value_get() local
9111 if (!devlink_reload_supported(devlink->ops)) in devlink_port_param_driverinit_value_get()
9135 return __devlink_param_driverinit_value_set(devlink_port->devlink, in devlink_port_param_driverinit_value_set()
9155 void devlink_param_value_changed(struct devlink *devlink, u32 param_id) in devlink_param_value_changed() argument
9159 param_item = devlink_param_find_by_id(&devlink->param_list, param_id); in devlink_param_value_changed()
9162 devlink_param_notify(devlink, 0, param_item, DEVLINK_CMD_PARAM_NEW); in devlink_param_value_changed()
9188 devlink_param_notify(devlink_port->devlink, devlink_port->index, in devlink_port_param_value_changed()
9219 devlink_region_create(struct devlink *devlink, in devlink_region_create() argument
9229 mutex_lock(&devlink->lock); in devlink_region_create()
9231 if (devlink_region_get_by_name(devlink, ops->name)) { in devlink_region_create()
9242 region->devlink = devlink; in devlink_region_create()
9247 list_add_tail(®ion->list, &devlink->region_list); in devlink_region_create()
9250 mutex_unlock(&devlink->lock); in devlink_region_create()
9254 mutex_unlock(&devlink->lock); in devlink_region_create()
9272 struct devlink *devlink = port->devlink; in devlink_port_region_create() local
9279 mutex_lock(&devlink->lock); in devlink_port_region_create()
9292 region->devlink = devlink; in devlink_port_region_create()
9301 mutex_unlock(&devlink->lock); in devlink_port_region_create()
9305 mutex_unlock(&devlink->lock); in devlink_port_region_create()
9317 struct devlink *devlink = region->devlink; in devlink_region_destroy() local
9320 mutex_lock(&devlink->lock); in devlink_region_destroy()
9329 mutex_unlock(&devlink->lock); in devlink_region_destroy()
9349 int devlink_region_snapshot_id_get(struct devlink *devlink, u32 *id) in devlink_region_snapshot_id_get() argument
9353 mutex_lock(&devlink->lock); in devlink_region_snapshot_id_get()
9354 err = __devlink_region_snapshot_id_get(devlink, id); in devlink_region_snapshot_id_get()
9355 mutex_unlock(&devlink->lock); in devlink_region_snapshot_id_get()
9371 void devlink_region_snapshot_id_put(struct devlink *devlink, u32 id) in devlink_region_snapshot_id_put() argument
9373 mutex_lock(&devlink->lock); in devlink_region_snapshot_id_put()
9374 __devlink_snapshot_id_decrement(devlink, id); in devlink_region_snapshot_id_put()
9375 mutex_unlock(&devlink->lock); in devlink_region_snapshot_id_put()
9394 struct devlink *devlink = region->devlink; in devlink_region_snapshot_create() local
9397 mutex_lock(&devlink->lock); in devlink_region_snapshot_create()
9399 mutex_unlock(&devlink->lock); in devlink_region_snapshot_create()
9617 devlink_trap_group_notify(struct devlink *devlink, in devlink_trap_group_notify() argument
9631 err = devlink_nl_trap_group_fill(msg, devlink, group_item, cmd, 0, 0, in devlink_trap_group_notify()
9638 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_trap_group_notify()
9643 devlink_trap_item_group_link(struct devlink *devlink, in devlink_trap_item_group_link() argument
9649 group_item = devlink_trap_group_item_lookup_by_id(devlink, group_id); in devlink_trap_item_group_link()
9658 static void devlink_trap_notify(struct devlink *devlink, in devlink_trap_notify() argument
9672 err = devlink_nl_trap_fill(msg, devlink, trap_item, cmd, 0, 0, 0); in devlink_trap_notify()
9678 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_trap_notify()
9683 devlink_trap_register(struct devlink *devlink, in devlink_trap_register() argument
9689 if (devlink_trap_item_lookup(devlink, trap->name)) in devlink_trap_register()
9706 err = devlink_trap_item_group_link(devlink, trap_item); in devlink_trap_register()
9710 err = devlink->ops->trap_init(devlink, trap, trap_item); in devlink_trap_register()
9714 list_add_tail(&trap_item->list, &devlink->trap_list); in devlink_trap_register()
9715 devlink_trap_notify(devlink, trap_item, DEVLINK_CMD_TRAP_NEW); in devlink_trap_register()
9727 static void devlink_trap_unregister(struct devlink *devlink, in devlink_trap_unregister() argument
9732 trap_item = devlink_trap_item_lookup(devlink, trap->name); in devlink_trap_unregister()
9736 devlink_trap_notify(devlink, trap_item, DEVLINK_CMD_TRAP_DEL); in devlink_trap_unregister()
9738 if (devlink->ops->trap_fini) in devlink_trap_unregister()
9739 devlink->ops->trap_fini(devlink, trap, trap_item); in devlink_trap_unregister()
9744 static void devlink_trap_disable(struct devlink *devlink, in devlink_trap_disable() argument
9749 trap_item = devlink_trap_item_lookup(devlink, trap->name); in devlink_trap_disable()
9753 devlink->ops->trap_action_set(devlink, trap, DEVLINK_TRAP_ACTION_DROP, in devlink_trap_disable()
9767 int devlink_traps_register(struct devlink *devlink, in devlink_traps_register() argument
9773 if (!devlink->ops->trap_init || !devlink->ops->trap_action_set) in devlink_traps_register()
9776 mutex_lock(&devlink->lock); in devlink_traps_register()
9784 err = devlink_trap_register(devlink, trap, priv); in devlink_traps_register()
9788 mutex_unlock(&devlink->lock); in devlink_traps_register()
9795 devlink_trap_unregister(devlink, &traps[i]); in devlink_traps_register()
9796 mutex_unlock(&devlink->lock); in devlink_traps_register()
9807 void devlink_traps_unregister(struct devlink *devlink, in devlink_traps_unregister() argument
9813 mutex_lock(&devlink->lock); in devlink_traps_unregister()
9818 devlink_trap_disable(devlink, &traps[i]); in devlink_traps_unregister()
9821 devlink_trap_unregister(devlink, &traps[i]); in devlink_traps_unregister()
9822 mutex_unlock(&devlink->lock); in devlink_traps_unregister()
9864 void devlink_trap_report(struct devlink *devlink, struct sk_buff *skb, in devlink_trap_report() argument
9879 trace_devlink_trap_report(devlink, skb, &metadata); in devlink_trap_report()
9899 devlink_trap_group_item_policer_link(struct devlink *devlink, in devlink_trap_group_item_policer_link() argument
9908 policer_item = devlink_trap_policer_item_lookup(devlink, policer_id); in devlink_trap_group_item_policer_link()
9918 devlink_trap_group_register(struct devlink *devlink, in devlink_trap_group_register() argument
9924 if (devlink_trap_group_item_lookup(devlink, group->name)) in devlink_trap_group_register()
9939 err = devlink_trap_group_item_policer_link(devlink, group_item); in devlink_trap_group_register()
9943 if (devlink->ops->trap_group_init) { in devlink_trap_group_register()
9944 err = devlink->ops->trap_group_init(devlink, group); in devlink_trap_group_register()
9949 list_add_tail(&group_item->list, &devlink->trap_group_list); in devlink_trap_group_register()
9950 devlink_trap_group_notify(devlink, group_item, in devlink_trap_group_register()
9964 devlink_trap_group_unregister(struct devlink *devlink, in devlink_trap_group_unregister() argument
9969 group_item = devlink_trap_group_item_lookup(devlink, group->name); in devlink_trap_group_unregister()
9973 devlink_trap_group_notify(devlink, group_item, in devlink_trap_group_unregister()
9988 int devlink_trap_groups_register(struct devlink *devlink, in devlink_trap_groups_register() argument
9994 mutex_lock(&devlink->lock); in devlink_trap_groups_register()
10002 err = devlink_trap_group_register(devlink, group); in devlink_trap_groups_register()
10006 mutex_unlock(&devlink->lock); in devlink_trap_groups_register()
10013 devlink_trap_group_unregister(devlink, &groups[i]); in devlink_trap_groups_register()
10014 mutex_unlock(&devlink->lock); in devlink_trap_groups_register()
10025 void devlink_trap_groups_unregister(struct devlink *devlink, in devlink_trap_groups_unregister() argument
10031 mutex_lock(&devlink->lock); in devlink_trap_groups_unregister()
10033 devlink_trap_group_unregister(devlink, &groups[i]); in devlink_trap_groups_unregister()
10034 mutex_unlock(&devlink->lock); in devlink_trap_groups_unregister()
10039 devlink_trap_policer_notify(struct devlink *devlink, in devlink_trap_policer_notify() argument
10053 err = devlink_nl_trap_policer_fill(msg, devlink, policer_item, cmd, 0, in devlink_trap_policer_notify()
10060 genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), in devlink_trap_policer_notify()
10065 devlink_trap_policer_register(struct devlink *devlink, in devlink_trap_policer_register() argument
10071 if (devlink_trap_policer_item_lookup(devlink, policer->id)) in devlink_trap_policer_register()
10082 if (devlink->ops->trap_policer_init) { in devlink_trap_policer_register()
10083 err = devlink->ops->trap_policer_init(devlink, policer); in devlink_trap_policer_register()
10088 list_add_tail(&policer_item->list, &devlink->trap_policer_list); in devlink_trap_policer_register()
10089 devlink_trap_policer_notify(devlink, policer_item, in devlink_trap_policer_register()
10100 devlink_trap_policer_unregister(struct devlink *devlink, in devlink_trap_policer_unregister() argument
10105 policer_item = devlink_trap_policer_item_lookup(devlink, policer->id); in devlink_trap_policer_unregister()
10109 devlink_trap_policer_notify(devlink, policer_item, in devlink_trap_policer_unregister()
10112 if (devlink->ops->trap_policer_fini) in devlink_trap_policer_unregister()
10113 devlink->ops->trap_policer_fini(devlink, policer); in devlink_trap_policer_unregister()
10126 devlink_trap_policers_register(struct devlink *devlink, in devlink_trap_policers_register() argument
10132 mutex_lock(&devlink->lock); in devlink_trap_policers_register()
10143 err = devlink_trap_policer_register(devlink, policer); in devlink_trap_policers_register()
10147 mutex_unlock(&devlink->lock); in devlink_trap_policers_register()
10154 devlink_trap_policer_unregister(devlink, &policers[i]); in devlink_trap_policers_register()
10155 mutex_unlock(&devlink->lock); in devlink_trap_policers_register()
10167 devlink_trap_policers_unregister(struct devlink *devlink, in devlink_trap_policers_unregister() argument
10173 mutex_lock(&devlink->lock); in devlink_trap_policers_unregister()
10175 devlink_trap_policer_unregister(devlink, &policers[i]); in devlink_trap_policers_unregister()
10176 mutex_unlock(&devlink->lock); in devlink_trap_policers_unregister()
10180 static void __devlink_compat_running_version(struct devlink *devlink, in __devlink_compat_running_version() argument
10193 err = devlink->ops->info_get(devlink, &req, NULL); in __devlink_compat_running_version()
10219 struct devlink *devlink; in devlink_compat_running_version() local
10224 devlink = netdev_to_devlink(dev); in devlink_compat_running_version()
10225 if (!devlink || !devlink->ops->info_get) in devlink_compat_running_version()
10228 mutex_lock(&devlink->lock); in devlink_compat_running_version()
10229 __devlink_compat_running_version(devlink, buf, len); in devlink_compat_running_version()
10230 mutex_unlock(&devlink->lock); in devlink_compat_running_version()
10240 struct devlink *devlink; in devlink_compat_flash_update() local
10246 devlink = netdev_to_devlink(dev); in devlink_compat_flash_update()
10247 if (!devlink || !devlink->ops->flash_update) { in devlink_compat_flash_update()
10254 mutex_lock(&devlink->lock); in devlink_compat_flash_update()
10255 ret = devlink->ops->flash_update(devlink, ¶ms, NULL); in devlink_compat_flash_update()
10256 mutex_unlock(&devlink->lock); in devlink_compat_flash_update()
10303 struct devlink *devlink; in devlink_pernet_pre_exit() local
10311 list_for_each_entry(devlink, &devlink_list, list) { in devlink_pernet_pre_exit()
10312 if (net_eq(devlink_net(devlink), net)) { in devlink_pernet_pre_exit()
10313 if (WARN_ON(!devlink_reload_supported(devlink->ops))) in devlink_pernet_pre_exit()
10315 err = devlink_reload(devlink, &init_net, in devlink_pernet_pre_exit()