mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-01 10:42:11 +00:00
devlink: introduce couple of dumpit callbacks for split ops
Introduce couple of dumpit callbacks for generated split ops. Have them as a thin wrapper around iteration function and allow to pass dump_one() function pointer directly without need to store in devlink_cmd structs. Signed-off-by: Jiri Pirko <jiri@nvidia.com> Reviewed-by: Jakub Kicinski <kuba@kernel.org> Link: https://lore.kernel.org/r/20230803111340.1074067-8-jiri@resnulli.us Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
d61aedcf62
commit
491a24872a
@ -217,17 +217,18 @@ int devlink_nl_get_doit(struct sk_buff *skb, struct genl_info *info)
|
||||
}
|
||||
|
||||
static int
|
||||
devlink_nl_cmd_get_dump_one(struct sk_buff *msg, struct devlink *devlink,
|
||||
struct netlink_callback *cb)
|
||||
devlink_nl_get_dump_one(struct sk_buff *msg, struct devlink *devlink,
|
||||
struct netlink_callback *cb)
|
||||
{
|
||||
return devlink_nl_fill(msg, devlink, DEVLINK_CMD_NEW,
|
||||
NETLINK_CB(cb->skb).portid,
|
||||
cb->nlh->nlmsg_seq, NLM_F_MULTI);
|
||||
}
|
||||
|
||||
const struct devlink_cmd devl_cmd_get = {
|
||||
.dump_one = devlink_nl_cmd_get_dump_one,
|
||||
};
|
||||
int devlink_nl_get_dumpit(struct sk_buff *msg, struct netlink_callback *cb)
|
||||
{
|
||||
return devlink_nl_dumpit(msg, cb, devlink_nl_get_dump_one);
|
||||
}
|
||||
|
||||
static void devlink_reload_failed_set(struct devlink *devlink,
|
||||
bool reload_failed)
|
||||
@ -826,8 +827,8 @@ int devlink_nl_info_get_doit(struct sk_buff *skb, struct genl_info *info)
|
||||
}
|
||||
|
||||
static int
|
||||
devlink_nl_cmd_info_get_dump_one(struct sk_buff *msg, struct devlink *devlink,
|
||||
struct netlink_callback *cb)
|
||||
devlink_nl_info_get_dump_one(struct sk_buff *msg, struct devlink *devlink,
|
||||
struct netlink_callback *cb)
|
||||
{
|
||||
int err;
|
||||
|
||||
@ -840,9 +841,10 @@ devlink_nl_cmd_info_get_dump_one(struct sk_buff *msg, struct devlink *devlink,
|
||||
return err;
|
||||
}
|
||||
|
||||
const struct devlink_cmd devl_cmd_info_get = {
|
||||
.dump_one = devlink_nl_cmd_info_get_dump_one,
|
||||
};
|
||||
int devlink_nl_info_get_dumpit(struct sk_buff *msg, struct netlink_callback *cb)
|
||||
{
|
||||
return devlink_nl_dumpit(msg, cb, devlink_nl_info_get_dump_one);
|
||||
}
|
||||
|
||||
static int devlink_nl_flash_update_fill(struct sk_buff *msg,
|
||||
struct devlink *devlink,
|
||||
|
@ -114,9 +114,12 @@ struct devlink_nl_dump_state {
|
||||
};
|
||||
};
|
||||
|
||||
typedef int devlink_nl_dump_one_func_t(struct sk_buff *msg,
|
||||
struct devlink *devlink,
|
||||
struct netlink_callback *cb);
|
||||
|
||||
struct devlink_cmd {
|
||||
int (*dump_one)(struct sk_buff *msg, struct devlink *devlink,
|
||||
struct netlink_callback *cb);
|
||||
devlink_nl_dump_one_func_t *dump_one;
|
||||
};
|
||||
|
||||
extern const struct genl_small_ops devlink_nl_small_ops[56];
|
||||
@ -127,8 +130,9 @@ devlink_get_from_attrs_lock(struct net *net, struct nlattr **attrs);
|
||||
void devlink_notify_unregister(struct devlink *devlink);
|
||||
void devlink_notify_register(struct devlink *devlink);
|
||||
|
||||
int devlink_nl_instance_iter_dumpit(struct sk_buff *msg,
|
||||
struct netlink_callback *cb);
|
||||
int devlink_nl_dumpit(struct sk_buff *msg, struct netlink_callback *cb,
|
||||
devlink_nl_dump_one_func_t *dump_one);
|
||||
int devlink_nl_instance_iter_dumpit(struct sk_buff *msg, struct netlink_callback *cb);
|
||||
|
||||
static inline struct devlink_nl_dump_state *
|
||||
devlink_dump_state(struct netlink_callback *cb)
|
||||
@ -149,7 +153,6 @@ devlink_nl_put_handle(struct sk_buff *msg, struct devlink *devlink)
|
||||
}
|
||||
|
||||
/* Commands */
|
||||
extern const struct devlink_cmd devl_cmd_get;
|
||||
extern const struct devlink_cmd devl_cmd_port_get;
|
||||
extern const struct devlink_cmd devl_cmd_sb_get;
|
||||
extern const struct devlink_cmd devl_cmd_sb_pool_get;
|
||||
@ -157,7 +160,6 @@ extern const struct devlink_cmd devl_cmd_sb_port_pool_get;
|
||||
extern const struct devlink_cmd devl_cmd_sb_tc_pool_bind_get;
|
||||
extern const struct devlink_cmd devl_cmd_param_get;
|
||||
extern const struct devlink_cmd devl_cmd_region_get;
|
||||
extern const struct devlink_cmd devl_cmd_info_get;
|
||||
extern const struct devlink_cmd devl_cmd_health_reporter_get;
|
||||
extern const struct devlink_cmd devl_cmd_trap_get;
|
||||
extern const struct devlink_cmd devl_cmd_trap_group_get;
|
||||
@ -215,10 +217,13 @@ devlink_rate_node_get_from_info(struct devlink *devlink,
|
||||
struct genl_info *info);
|
||||
/* Devlink nl cmds */
|
||||
int devlink_nl_get_doit(struct sk_buff *skb, struct genl_info *info);
|
||||
int devlink_nl_get_dumpit(struct sk_buff *skb, struct netlink_callback *cb);
|
||||
int devlink_nl_cmd_reload(struct sk_buff *skb, struct genl_info *info);
|
||||
int devlink_nl_cmd_eswitch_get_doit(struct sk_buff *skb, struct genl_info *info);
|
||||
int devlink_nl_cmd_eswitch_set_doit(struct sk_buff *skb, struct genl_info *info);
|
||||
int devlink_nl_info_get_doit(struct sk_buff *skb, struct genl_info *info);
|
||||
int devlink_nl_info_get_dumpit(struct sk_buff *skb,
|
||||
struct netlink_callback *cb);
|
||||
int devlink_nl_cmd_flash_update(struct sk_buff *skb, struct genl_info *info);
|
||||
int devlink_nl_cmd_selftests_get_doit(struct sk_buff *skb, struct genl_info *info);
|
||||
int devlink_nl_cmd_selftests_run(struct sk_buff *skb, struct genl_info *info);
|
||||
|
@ -6283,7 +6283,7 @@ const struct genl_small_ops devlink_nl_small_ops[56] = {
|
||||
.cmd = DEVLINK_CMD_GET,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.doit = devlink_nl_get_doit,
|
||||
.dumpit = devlink_nl_instance_iter_dumpit,
|
||||
.dumpit = devlink_nl_get_dumpit,
|
||||
/* can be retrieved by unprivileged users */
|
||||
},
|
||||
{
|
||||
@ -6537,7 +6537,7 @@ const struct genl_small_ops devlink_nl_small_ops[56] = {
|
||||
.cmd = DEVLINK_CMD_INFO_GET,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
.doit = devlink_nl_info_get_doit,
|
||||
.dumpit = devlink_nl_instance_iter_dumpit,
|
||||
.dumpit = devlink_nl_info_get_dumpit,
|
||||
/* can be retrieved by unprivileged users */
|
||||
},
|
||||
{
|
||||
|
@ -178,7 +178,6 @@ static void devlink_nl_post_doit(const struct genl_split_ops *ops,
|
||||
}
|
||||
|
||||
static const struct devlink_cmd *devl_cmds[] = {
|
||||
[DEVLINK_CMD_GET] = &devl_cmd_get,
|
||||
[DEVLINK_CMD_PORT_GET] = &devl_cmd_port_get,
|
||||
[DEVLINK_CMD_SB_GET] = &devl_cmd_sb_get,
|
||||
[DEVLINK_CMD_SB_POOL_GET] = &devl_cmd_sb_pool_get,
|
||||
@ -186,7 +185,6 @@ static const struct devlink_cmd *devl_cmds[] = {
|
||||
[DEVLINK_CMD_SB_TC_POOL_BIND_GET] = &devl_cmd_sb_tc_pool_bind_get,
|
||||
[DEVLINK_CMD_PARAM_GET] = &devl_cmd_param_get,
|
||||
[DEVLINK_CMD_REGION_GET] = &devl_cmd_region_get,
|
||||
[DEVLINK_CMD_INFO_GET] = &devl_cmd_info_get,
|
||||
[DEVLINK_CMD_HEALTH_REPORTER_GET] = &devl_cmd_health_reporter_get,
|
||||
[DEVLINK_CMD_TRAP_GET] = &devl_cmd_trap_get,
|
||||
[DEVLINK_CMD_TRAP_GROUP_GET] = &devl_cmd_trap_group_get,
|
||||
@ -196,23 +194,19 @@ static const struct devlink_cmd *devl_cmds[] = {
|
||||
[DEVLINK_CMD_SELFTESTS_GET] = &devl_cmd_selftests_get,
|
||||
};
|
||||
|
||||
int devlink_nl_instance_iter_dumpit(struct sk_buff *msg,
|
||||
struct netlink_callback *cb)
|
||||
int devlink_nl_dumpit(struct sk_buff *msg, struct netlink_callback *cb,
|
||||
devlink_nl_dump_one_func_t *dump_one)
|
||||
{
|
||||
const struct genl_dumpit_info *info = genl_dumpit_info(cb);
|
||||
struct devlink_nl_dump_state *state = devlink_dump_state(cb);
|
||||
const struct devlink_cmd *cmd;
|
||||
struct devlink *devlink;
|
||||
int err = 0;
|
||||
|
||||
cmd = devl_cmds[info->op.cmd];
|
||||
|
||||
while ((devlink = devlinks_xa_find_get(sock_net(msg->sk),
|
||||
&state->instance))) {
|
||||
devl_lock(devlink);
|
||||
|
||||
if (devl_is_registered(devlink))
|
||||
err = cmd->dump_one(msg, devlink, cb);
|
||||
err = dump_one(msg, devlink, cb);
|
||||
else
|
||||
err = 0;
|
||||
|
||||
@ -233,6 +227,15 @@ int devlink_nl_instance_iter_dumpit(struct sk_buff *msg,
|
||||
return msg->len;
|
||||
}
|
||||
|
||||
int devlink_nl_instance_iter_dumpit(struct sk_buff *msg,
|
||||
struct netlink_callback *cb)
|
||||
{
|
||||
const struct genl_dumpit_info *info = genl_dumpit_info(cb);
|
||||
const struct devlink_cmd *cmd = devl_cmds[info->op.cmd];
|
||||
|
||||
return devlink_nl_dumpit(msg, cb, cmd->dump_one);
|
||||
}
|
||||
|
||||
struct genl_family devlink_nl_family __ro_after_init = {
|
||||
.name = DEVLINK_GENL_NAME,
|
||||
.version = DEVLINK_GENL_VERSION,
|
||||
|
Loading…
Reference in New Issue
Block a user