devlink: Split out dev get and dump code
Move devlink dev get and dump callbacks and related dev code to new file dev.c. This file shall include all callbacks that are specific on devlink dev object. No functional change in this patch. Signed-off-by: Moshe Shemesh <moshe@nvidia.com> Reviewed-by: Jiri Pirko <jiri@nvidia.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
d795527d50
commit
dbeeca81bd
|
@ -1,3 +1,3 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
obj-y := leftover.o core.o netlink.o
|
||||
obj-y := leftover.o core.o netlink.o dev.o
|
||||
|
|
|
@ -0,0 +1,99 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/*
|
||||
* Copyright (c) 2016 Mellanox Technologies. All rights reserved.
|
||||
* Copyright (c) 2016 Jiri Pirko <jiri@mellanox.com>
|
||||
*/
|
||||
|
||||
#include <net/genetlink.h>
|
||||
#include "devl_internal.h"
|
||||
|
||||
static int devlink_nl_fill(struct sk_buff *msg, struct devlink *devlink,
|
||||
enum devlink_command cmd, u32 portid,
|
||||
u32 seq, int flags)
|
||||
{
|
||||
struct nlattr *dev_stats;
|
||||
void *hdr;
|
||||
|
||||
hdr = genlmsg_put(msg, portid, seq, &devlink_nl_family, flags, cmd);
|
||||
if (!hdr)
|
||||
return -EMSGSIZE;
|
||||
|
||||
if (devlink_nl_put_handle(msg, devlink))
|
||||
goto nla_put_failure;
|
||||
if (nla_put_u8(msg, DEVLINK_ATTR_RELOAD_FAILED, devlink->reload_failed))
|
||||
goto nla_put_failure;
|
||||
|
||||
dev_stats = nla_nest_start(msg, DEVLINK_ATTR_DEV_STATS);
|
||||
if (!dev_stats)
|
||||
goto nla_put_failure;
|
||||
|
||||
if (devlink_reload_stats_put(msg, devlink, false))
|
||||
goto dev_stats_nest_cancel;
|
||||
if (devlink_reload_stats_put(msg, devlink, true))
|
||||
goto dev_stats_nest_cancel;
|
||||
|
||||
nla_nest_end(msg, dev_stats);
|
||||
genlmsg_end(msg, hdr);
|
||||
return 0;
|
||||
|
||||
dev_stats_nest_cancel:
|
||||
nla_nest_cancel(msg, dev_stats);
|
||||
nla_put_failure:
|
||||
genlmsg_cancel(msg, hdr);
|
||||
return -EMSGSIZE;
|
||||
}
|
||||
|
||||
void devlink_notify(struct devlink *devlink, enum devlink_command cmd)
|
||||
{
|
||||
struct sk_buff *msg;
|
||||
int err;
|
||||
|
||||
WARN_ON(cmd != DEVLINK_CMD_NEW && cmd != DEVLINK_CMD_DEL);
|
||||
WARN_ON(!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED));
|
||||
|
||||
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
|
||||
if (!msg)
|
||||
return;
|
||||
|
||||
err = devlink_nl_fill(msg, devlink, cmd, 0, 0, 0);
|
||||
if (err) {
|
||||
nlmsg_free(msg);
|
||||
return;
|
||||
}
|
||||
|
||||
genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink),
|
||||
msg, 0, DEVLINK_MCGRP_CONFIG, GFP_KERNEL);
|
||||
}
|
||||
|
||||
int devlink_nl_cmd_get_doit(struct sk_buff *skb, struct genl_info *info)
|
||||
{
|
||||
struct devlink *devlink = info->user_ptr[0];
|
||||
struct sk_buff *msg;
|
||||
int err;
|
||||
|
||||
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
|
||||
if (!msg)
|
||||
return -ENOMEM;
|
||||
|
||||
err = devlink_nl_fill(msg, devlink, DEVLINK_CMD_NEW,
|
||||
info->snd_portid, info->snd_seq, 0);
|
||||
if (err) {
|
||||
nlmsg_free(msg);
|
||||
return err;
|
||||
}
|
||||
|
||||
return genlmsg_reply(msg, info);
|
||||
}
|
||||
|
||||
static int
|
||||
devlink_nl_cmd_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,
|
||||
};
|
|
@ -139,6 +139,16 @@ devlink_dump_state(struct netlink_callback *cb)
|
|||
return (struct devlink_nl_dump_state *)cb->ctx;
|
||||
}
|
||||
|
||||
static inline int
|
||||
devlink_nl_put_handle(struct sk_buff *msg, struct devlink *devlink)
|
||||
{
|
||||
if (nla_put_string(msg, DEVLINK_ATTR_BUS_NAME, devlink->dev->bus->name))
|
||||
return -EMSGSIZE;
|
||||
if (nla_put_string(msg, DEVLINK_ATTR_DEV_NAME, dev_name(devlink->dev)))
|
||||
return -EMSGSIZE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Commands */
|
||||
extern const struct devlink_cmd devl_cmd_get;
|
||||
extern const struct devlink_cmd devl_cmd_port_get;
|
||||
|
@ -157,6 +167,9 @@ extern const struct devlink_cmd devl_cmd_rate_get;
|
|||
extern const struct devlink_cmd devl_cmd_linecard_get;
|
||||
extern const struct devlink_cmd devl_cmd_selftests_get;
|
||||
|
||||
/* Notify */
|
||||
void devlink_notify(struct devlink *devlink, enum devlink_command cmd);
|
||||
|
||||
/* Ports */
|
||||
int devlink_port_netdevice_event(struct notifier_block *nb,
|
||||
unsigned long event, void *ptr);
|
||||
|
@ -166,6 +179,8 @@ devlink_port_get_from_info(struct devlink *devlink, struct genl_info *info);
|
|||
|
||||
/* Reload */
|
||||
bool devlink_reload_actions_valid(const struct devlink_ops *ops);
|
||||
int devlink_reload_stats_put(struct sk_buff *msg, struct devlink *devlink,
|
||||
bool is_remote);
|
||||
int devlink_reload(struct devlink *devlink, struct net *dest_net,
|
||||
enum devlink_reload_action action,
|
||||
enum devlink_reload_limit limit,
|
||||
|
@ -188,3 +203,5 @@ devlink_rate_get_from_info(struct devlink *devlink, struct genl_info *info);
|
|||
struct devlink_rate *
|
||||
devlink_rate_node_get_from_info(struct devlink *devlink,
|
||||
struct genl_info *info);
|
||||
/* Devlink nl cmds */
|
||||
int devlink_nl_cmd_get_doit(struct sk_buff *skb, struct genl_info *info);
|
||||
|
|
|
@ -596,15 +596,6 @@ devlink_region_snapshot_get_by_id(struct devlink_region *region, u32 id)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static int devlink_nl_put_handle(struct sk_buff *msg, struct devlink *devlink)
|
||||
{
|
||||
if (nla_put_string(msg, DEVLINK_ATTR_BUS_NAME, devlink->dev->bus->name))
|
||||
return -EMSGSIZE;
|
||||
if (nla_put_string(msg, DEVLINK_ATTR_DEV_NAME, dev_name(devlink->dev)))
|
||||
return -EMSGSIZE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int devlink_nl_put_nested_handle(struct sk_buff *msg, struct devlink *devlink)
|
||||
{
|
||||
struct nlattr *nested_attr;
|
||||
|
@ -699,7 +690,7 @@ nla_put_failure:
|
|||
return -EMSGSIZE;
|
||||
}
|
||||
|
||||
static int devlink_reload_stats_put(struct sk_buff *msg, struct devlink *devlink, bool is_remote)
|
||||
int devlink_reload_stats_put(struct sk_buff *msg, struct devlink *devlink, bool is_remote)
|
||||
{
|
||||
struct nlattr *reload_stats_attr, *act_info, *act_stats;
|
||||
int i, j, stat_idx;
|
||||
|
@ -762,64 +753,6 @@ nla_put_failure:
|
|||
return -EMSGSIZE;
|
||||
}
|
||||
|
||||
static int devlink_nl_fill(struct sk_buff *msg, struct devlink *devlink,
|
||||
enum devlink_command cmd, u32 portid,
|
||||
u32 seq, int flags)
|
||||
{
|
||||
struct nlattr *dev_stats;
|
||||
void *hdr;
|
||||
|
||||
hdr = genlmsg_put(msg, portid, seq, &devlink_nl_family, flags, cmd);
|
||||
if (!hdr)
|
||||
return -EMSGSIZE;
|
||||
|
||||
if (devlink_nl_put_handle(msg, devlink))
|
||||
goto nla_put_failure;
|
||||
if (nla_put_u8(msg, DEVLINK_ATTR_RELOAD_FAILED, devlink->reload_failed))
|
||||
goto nla_put_failure;
|
||||
|
||||
dev_stats = nla_nest_start(msg, DEVLINK_ATTR_DEV_STATS);
|
||||
if (!dev_stats)
|
||||
goto nla_put_failure;
|
||||
|
||||
if (devlink_reload_stats_put(msg, devlink, false))
|
||||
goto dev_stats_nest_cancel;
|
||||
if (devlink_reload_stats_put(msg, devlink, true))
|
||||
goto dev_stats_nest_cancel;
|
||||
|
||||
nla_nest_end(msg, dev_stats);
|
||||
genlmsg_end(msg, hdr);
|
||||
return 0;
|
||||
|
||||
dev_stats_nest_cancel:
|
||||
nla_nest_cancel(msg, dev_stats);
|
||||
nla_put_failure:
|
||||
genlmsg_cancel(msg, hdr);
|
||||
return -EMSGSIZE;
|
||||
}
|
||||
|
||||
static void devlink_notify(struct devlink *devlink, enum devlink_command cmd)
|
||||
{
|
||||
struct sk_buff *msg;
|
||||
int err;
|
||||
|
||||
WARN_ON(cmd != DEVLINK_CMD_NEW && cmd != DEVLINK_CMD_DEL);
|
||||
WARN_ON(!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED));
|
||||
|
||||
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
|
||||
if (!msg)
|
||||
return;
|
||||
|
||||
err = devlink_nl_fill(msg, devlink, cmd, 0, 0, 0);
|
||||
if (err) {
|
||||
nlmsg_free(msg);
|
||||
return;
|
||||
}
|
||||
|
||||
genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink),
|
||||
msg, 0, DEVLINK_MCGRP_CONFIG, GFP_KERNEL);
|
||||
}
|
||||
|
||||
static int devlink_nl_port_attrs_put(struct sk_buff *msg,
|
||||
struct devlink_port *devlink_port)
|
||||
{
|
||||
|
@ -1274,39 +1207,6 @@ devlink_rate_is_parent_node(struct devlink_rate *devlink_rate,
|
|||
return false;
|
||||
}
|
||||
|
||||
static int devlink_nl_cmd_get_doit(struct sk_buff *skb, struct genl_info *info)
|
||||
{
|
||||
struct devlink *devlink = info->user_ptr[0];
|
||||
struct sk_buff *msg;
|
||||
int err;
|
||||
|
||||
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
|
||||
if (!msg)
|
||||
return -ENOMEM;
|
||||
|
||||
err = devlink_nl_fill(msg, devlink, DEVLINK_CMD_NEW,
|
||||
info->snd_portid, info->snd_seq, 0);
|
||||
if (err) {
|
||||
nlmsg_free(msg);
|
||||
return err;
|
||||
}
|
||||
|
||||
return genlmsg_reply(msg, info);
|
||||
}
|
||||
|
||||
static int
|
||||
devlink_nl_cmd_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,
|
||||
};
|
||||
|
||||
static int devlink_nl_cmd_port_get_doit(struct sk_buff *skb,
|
||||
struct genl_info *info)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue