From: Jakub Kicinski <kuba@kernel.org>
To: davem@davemloft.net
Cc: netdev@vger.kernel.org, edumazet@google.com, pabeni@redhat.com,
jiri@resnulli.us, jacob.e.keller@intel.com, leon@kernel.org,
Jakub Kicinski <kuba@kernel.org>
Subject: [RFC net-next 06/15] devlink: use an explicit structure for dump context
Date: Wed, 14 Dec 2022 18:01:46 -0800 [thread overview]
Message-ID: <20221215020155.1619839-7-kuba@kernel.org> (raw)
In-Reply-To: <20221215020155.1619839-1-kuba@kernel.org>
Create a dump context structure instead of using cb->args
as an unsigned long array. This is a pure conversion which
is intended to be as much of a noop as possible.
Subsequent changes will use this to simplify the code.
The two non-trivial parts are:
- devlink_nl_cmd_health_reporter_dump_get_dumpit() checks args[0]
to see if devlink_fmsg_dumpit() has already been called (whether
this is the first msg), but doesn't use the exact value, so we
can drop the local variable there already
- devlink_nl_cmd_region_read_dumpit() uses args[0] for address
but we'll use args[1] now, shouldn't matter
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
net/devlink/basic.c | 98 ++++++++++++++++++++++---------------
net/devlink/devl_internal.h | 23 +++++++++
2 files changed, 81 insertions(+), 40 deletions(-)
diff --git a/net/devlink/basic.c b/net/devlink/basic.c
index e01ba7999b91..bcc930b7cfcf 100644
--- a/net/devlink/basic.c
+++ b/net/devlink/basic.c
@@ -1222,9 +1222,10 @@ static void devlink_rate_notify(struct devlink_rate *devlink_rate,
static int devlink_nl_cmd_rate_get_dumpit(struct sk_buff *msg,
struct netlink_callback *cb)
{
+ struct devlink_nl_dump_state *dump = devl_dump_state(cb);
struct devlink_rate *devlink_rate;
struct devlink *devlink;
- int start = cb->args[0];
+ int start = dump->idx;
unsigned long index;
int idx = 0;
int err = 0;
@@ -1256,7 +1257,7 @@ static int devlink_nl_cmd_rate_get_dumpit(struct sk_buff *msg,
if (err != -EMSGSIZE)
return err;
- cb->args[0] = idx;
+ dump->idx = idx;
return msg->len;
}
@@ -1317,8 +1318,9 @@ static int devlink_nl_cmd_get_doit(struct sk_buff *skb, struct genl_info *info)
static int devlink_nl_cmd_get_dumpit(struct sk_buff *msg,
struct netlink_callback *cb)
{
+ struct devlink_nl_dump_state *dump = devl_dump_state(cb);
struct devlink *devlink;
- int start = cb->args[0];
+ int start = dump->idx;
unsigned long index;
int idx = 0;
int err;
@@ -1342,7 +1344,7 @@ static int devlink_nl_cmd_get_dumpit(struct sk_buff *msg,
idx++;
}
out:
- cb->args[0] = idx;
+ dump->idx = idx;
return msg->len;
}
@@ -1371,10 +1373,11 @@ static int devlink_nl_cmd_port_get_doit(struct sk_buff *skb,
static int devlink_nl_cmd_port_get_dumpit(struct sk_buff *msg,
struct netlink_callback *cb)
{
+ struct devlink_nl_dump_state *dump = devl_dump_state(cb);
struct devlink *devlink;
struct devlink_port *devlink_port;
unsigned long index, port_index;
- int start = cb->args[0];
+ int start = dump->idx;
int idx = 0;
int err;
@@ -1401,7 +1404,7 @@ static int devlink_nl_cmd_port_get_dumpit(struct sk_buff *msg,
devlink_put(devlink);
}
out:
- cb->args[0] = idx;
+ dump->idx = idx;
return msg->len;
}
@@ -2150,9 +2153,10 @@ static int devlink_nl_cmd_linecard_get_doit(struct sk_buff *skb,
static int devlink_nl_cmd_linecard_get_dumpit(struct sk_buff *msg,
struct netlink_callback *cb)
{
+ struct devlink_nl_dump_state *dump = devl_dump_state(cb);
struct devlink_linecard *linecard;
struct devlink *devlink;
- int start = cb->args[0];
+ int start = dump->idx;
unsigned long index;
int idx = 0;
int err;
@@ -2183,7 +2187,7 @@ static int devlink_nl_cmd_linecard_get_dumpit(struct sk_buff *msg,
devlink_put(devlink);
}
out:
- cb->args[0] = idx;
+ dump->idx = idx;
return msg->len;
}
@@ -2412,9 +2416,10 @@ static int devlink_nl_cmd_sb_get_doit(struct sk_buff *skb,
static int devlink_nl_cmd_sb_get_dumpit(struct sk_buff *msg,
struct netlink_callback *cb)
{
+ struct devlink_nl_dump_state *dump = devl_dump_state(cb);
struct devlink *devlink;
struct devlink_sb *devlink_sb;
- int start = cb->args[0];
+ int start = dump->idx;
unsigned long index;
int idx = 0;
int err;
@@ -2442,7 +2447,7 @@ static int devlink_nl_cmd_sb_get_dumpit(struct sk_buff *msg,
devlink_put(devlink);
}
out:
- cb->args[0] = idx;
+ dump->idx = idx;
return msg->len;
}
@@ -2554,9 +2559,10 @@ static int __sb_pool_get_dumpit(struct sk_buff *msg, int start, int *p_idx,
static int devlink_nl_cmd_sb_pool_get_dumpit(struct sk_buff *msg,
struct netlink_callback *cb)
{
+ struct devlink_nl_dump_state *dump = devl_dump_state(cb);
struct devlink *devlink;
struct devlink_sb *devlink_sb;
- int start = cb->args[0];
+ int start = dump->idx;
unsigned long index;
int idx = 0;
int err = 0;
@@ -2587,7 +2593,7 @@ static int devlink_nl_cmd_sb_pool_get_dumpit(struct sk_buff *msg,
if (err != -EMSGSIZE)
return err;
- cb->args[0] = idx;
+ dump->idx = idx;
return msg->len;
}
@@ -2769,9 +2775,10 @@ static int __sb_port_pool_get_dumpit(struct sk_buff *msg, int start, int *p_idx,
static int devlink_nl_cmd_sb_port_pool_get_dumpit(struct sk_buff *msg,
struct netlink_callback *cb)
{
+ struct devlink_nl_dump_state *dump = devl_dump_state(cb);
struct devlink *devlink;
struct devlink_sb *devlink_sb;
- int start = cb->args[0];
+ int start = dump->idx;
unsigned long index;
int idx = 0;
int err = 0;
@@ -2802,7 +2809,7 @@ static int devlink_nl_cmd_sb_port_pool_get_dumpit(struct sk_buff *msg,
if (err != -EMSGSIZE)
return err;
- cb->args[0] = idx;
+ dump->idx = idx;
return msg->len;
}
@@ -3012,9 +3019,10 @@ static int
devlink_nl_cmd_sb_tc_pool_bind_get_dumpit(struct sk_buff *msg,
struct netlink_callback *cb)
{
+ struct devlink_nl_dump_state *dump = devl_dump_state(cb);
struct devlink *devlink;
struct devlink_sb *devlink_sb;
- int start = cb->args[0];
+ int start = dump->idx;
unsigned long index;
int idx = 0;
int err = 0;
@@ -3046,7 +3054,7 @@ devlink_nl_cmd_sb_tc_pool_bind_get_dumpit(struct sk_buff *msg,
if (err != -EMSGSIZE)
return err;
- cb->args[0] = idx;
+ dump->idx = idx;
return msg->len;
}
@@ -4871,8 +4879,9 @@ static int devlink_nl_cmd_selftests_get_doit(struct sk_buff *skb,
static int devlink_nl_cmd_selftests_get_dumpit(struct sk_buff *msg,
struct netlink_callback *cb)
{
+ struct devlink_nl_dump_state *dump = devl_dump_state(cb);
struct devlink *devlink;
- int start = cb->args[0];
+ int start = dump->idx;
unsigned long index;
int idx = 0;
int err = 0;
@@ -4899,7 +4908,7 @@ static int devlink_nl_cmd_selftests_get_dumpit(struct sk_buff *msg,
if (err != -EMSGSIZE)
return err;
- cb->args[0] = idx;
+ dump->idx = idx;
return msg->len;
}
@@ -5351,9 +5360,10 @@ static void devlink_param_notify(struct devlink *devlink,
static int devlink_nl_cmd_param_get_dumpit(struct sk_buff *msg,
struct netlink_callback *cb)
{
+ struct devlink_nl_dump_state *dump = devl_dump_state(cb);
struct devlink_param_item *param_item;
struct devlink *devlink;
- int start = cb->args[0];
+ int start = dump->idx;
unsigned long index;
int idx = 0;
int err = 0;
@@ -5386,7 +5396,7 @@ static int devlink_nl_cmd_param_get_dumpit(struct sk_buff *msg,
if (err != -EMSGSIZE)
return err;
- cb->args[0] = idx;
+ dump->idx = idx;
return msg->len;
}
@@ -6095,8 +6105,9 @@ static int devlink_nl_cmd_region_get_devlink_dumpit(struct sk_buff *msg,
static int devlink_nl_cmd_region_get_dumpit(struct sk_buff *msg,
struct netlink_callback *cb)
{
+ struct devlink_nl_dump_state *dump = devl_dump_state(cb);
struct devlink *devlink;
- int start = cb->args[0];
+ int start = dump->idx;
unsigned long index;
int idx = 0;
int err = 0;
@@ -6109,7 +6120,7 @@ static int devlink_nl_cmd_region_get_dumpit(struct sk_buff *msg,
goto out;
}
out:
- cb->args[0] = idx;
+ dump->idx = idx;
return msg->len;
}
@@ -6394,6 +6405,7 @@ static int devlink_nl_cmd_region_read_dumpit(struct sk_buff *skb,
struct netlink_callback *cb)
{
const struct genl_dumpit_info *info = genl_dumpit_info(cb);
+ struct devlink_nl_dump_state *dump = devl_dump_state(cb);
struct nlattr *chunks_attr, *region_attr, *snapshot_attr;
u64 ret_offset, start_offset, end_offset = U64_MAX;
struct nlattr **attrs = info->attrs;
@@ -6407,7 +6419,7 @@ static int devlink_nl_cmd_region_read_dumpit(struct sk_buff *skb,
void *hdr;
int err;
- start_offset = *((u64 *)&cb->args[0]);
+ start_offset = dump->start_offset;
devlink = devlink_get_from_attrs(sock_net(cb->skb->sk), attrs);
if (IS_ERR(devlink))
@@ -6546,7 +6558,7 @@ static int devlink_nl_cmd_region_read_dumpit(struct sk_buff *skb,
goto nla_put_failure;
}
- *((u64 *)&cb->args[0]) = ret_offset;
+ dump->start_offset = ret_offset;
nla_nest_end(skb, chunks_attr);
genlmsg_end(skb, hdr);
@@ -6745,8 +6757,9 @@ static int devlink_nl_cmd_info_get_doit(struct sk_buff *skb,
static int devlink_nl_cmd_info_get_dumpit(struct sk_buff *msg,
struct netlink_callback *cb)
{
+ struct devlink_nl_dump_state *dump = devl_dump_state(cb);
struct devlink *devlink;
- int start = cb->args[0];
+ int start = dump->idx;
unsigned long index;
int idx = 0;
int err = 0;
@@ -6775,7 +6788,7 @@ static int devlink_nl_cmd_info_get_dumpit(struct sk_buff *msg,
if (err != -EMSGSIZE)
return err;
- cb->args[0] = idx;
+ dump->idx = idx;
return msg->len;
}
@@ -7344,7 +7357,8 @@ static int devlink_fmsg_dumpit(struct devlink_fmsg *fmsg, struct sk_buff *skb,
struct netlink_callback *cb,
enum devlink_command cmd)
{
- int index = cb->args[0];
+ struct devlink_nl_dump_state *dump = devl_dump_state(cb);
+ int index = dump->idx;
int tmp_index = index;
void *hdr;
int err;
@@ -7360,7 +7374,7 @@ static int devlink_fmsg_dumpit(struct devlink_fmsg *fmsg, struct sk_buff *skb,
if ((err && err != -EMSGSIZE) || tmp_index == index)
goto nla_put_failure;
- cb->args[0] = index;
+ dump->idx = index;
genlmsg_end(skb, hdr);
return skb->len;
@@ -7911,11 +7925,12 @@ static int
devlink_nl_cmd_health_reporter_get_dumpit(struct sk_buff *msg,
struct netlink_callback *cb)
{
+ struct devlink_nl_dump_state *dump = devl_dump_state(cb);
struct devlink_health_reporter *reporter;
unsigned long index, port_index;
struct devlink_port *port;
struct devlink *devlink;
- int start = cb->args[0];
+ int start = dump->idx;
int idx = 0;
int err;
@@ -7970,7 +7985,7 @@ devlink_nl_cmd_health_reporter_get_dumpit(struct sk_buff *msg,
devlink_put(devlink);
}
out:
- cb->args[0] = idx;
+ dump->idx = idx;
return msg->len;
}
@@ -8082,8 +8097,8 @@ static int
devlink_nl_cmd_health_reporter_dump_get_dumpit(struct sk_buff *skb,
struct netlink_callback *cb)
{
+ struct devlink_nl_dump_state *dump = devl_dump_state(cb);
struct devlink_health_reporter *reporter;
- u64 start = cb->args[0];
int err;
reporter = devlink_health_reporter_get_from_cb(cb);
@@ -8095,13 +8110,13 @@ devlink_nl_cmd_health_reporter_dump_get_dumpit(struct sk_buff *skb,
goto out;
}
mutex_lock(&reporter->dump_lock);
- if (!start) {
+ if (!dump->idx) {
err = devlink_health_do_dump(reporter, NULL, cb->extack);
if (err)
goto unlock;
- cb->args[1] = reporter->dump_ts;
+ dump->dump_ts = reporter->dump_ts;
}
- if (!reporter->dump_fmsg || cb->args[1] != reporter->dump_ts) {
+ if (!reporter->dump_fmsg || dump->dump_ts != reporter->dump_ts) {
NL_SET_ERR_MSG_MOD(cb->extack, "Dump trampled, please retry");
err = -EAGAIN;
goto unlock;
@@ -8495,9 +8510,10 @@ static int devlink_nl_cmd_trap_get_doit(struct sk_buff *skb,
static int devlink_nl_cmd_trap_get_dumpit(struct sk_buff *msg,
struct netlink_callback *cb)
{
+ struct devlink_nl_dump_state *dump = devl_dump_state(cb);
struct devlink_trap_item *trap_item;
struct devlink *devlink;
- int start = cb->args[0];
+ int start = dump->idx;
unsigned long index;
int idx = 0;
int err;
@@ -8525,7 +8541,7 @@ static int devlink_nl_cmd_trap_get_dumpit(struct sk_buff *msg,
devlink_put(devlink);
}
out:
- cb->args[0] = idx;
+ dump->idx = idx;
return msg->len;
}
@@ -8710,11 +8726,12 @@ static int devlink_nl_cmd_trap_group_get_doit(struct sk_buff *skb,
static int devlink_nl_cmd_trap_group_get_dumpit(struct sk_buff *msg,
struct netlink_callback *cb)
{
+ struct devlink_nl_dump_state *dump = devl_dump_state(cb);
enum devlink_command cmd = DEVLINK_CMD_TRAP_GROUP_NEW;
struct devlink_trap_group_item *group_item;
u32 portid = NETLINK_CB(cb->skb).portid;
struct devlink *devlink;
- int start = cb->args[0];
+ int start = dump->idx;
unsigned long index;
int idx = 0;
int err;
@@ -8743,7 +8760,7 @@ static int devlink_nl_cmd_trap_group_get_dumpit(struct sk_buff *msg,
devlink_put(devlink);
}
out:
- cb->args[0] = idx;
+ dump->idx = idx;
return msg->len;
}
@@ -9014,11 +9031,12 @@ static int devlink_nl_cmd_trap_policer_get_doit(struct sk_buff *skb,
static int devlink_nl_cmd_trap_policer_get_dumpit(struct sk_buff *msg,
struct netlink_callback *cb)
{
+ struct devlink_nl_dump_state *dump = devl_dump_state(cb);
enum devlink_command cmd = DEVLINK_CMD_TRAP_POLICER_NEW;
struct devlink_trap_policer_item *policer_item;
u32 portid = NETLINK_CB(cb->skb).portid;
struct devlink *devlink;
- int start = cb->args[0];
+ int start = dump->idx;
unsigned long index;
int idx = 0;
int err;
@@ -9047,7 +9065,7 @@ static int devlink_nl_cmd_trap_policer_get_dumpit(struct sk_buff *msg,
devlink_put(devlink);
}
out:
- cb->args[0] = idx;
+ dump->idx = idx;
return msg->len;
}
diff --git a/net/devlink/devl_internal.h b/net/devlink/devl_internal.h
index bc7df9b0f775..91059311f18d 100644
--- a/net/devlink/devl_internal.h
+++ b/net/devlink/devl_internal.h
@@ -107,6 +107,21 @@ enum devlink_multicast_groups {
DEVLINK_MCGRP_CONFIG,
};
+/* state held across netlink dumps */
+struct devlink_nl_dump_state {
+ int idx;
+ union {
+ /* DEVLINK_CMD_REGION_READ */
+ struct {
+ u64 start_offset;
+ };
+ /* DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET */
+ struct {
+ u64 dump_ts;
+ };
+ };
+};
+
extern const struct genl_small_ops devlink_nl_ops[56];
struct devlink *devlink_get_from_attrs(struct net *net, struct nlattr **attrs);
@@ -114,6 +129,14 @@ struct devlink *devlink_get_from_attrs(struct net *net, struct nlattr **attrs);
void devlink_notify_unregister(struct devlink *devlink);
void devlink_notify_register(struct devlink *devlink);
+static inline struct devlink_nl_dump_state *
+devl_dump_state(struct netlink_callback *cb)
+{
+ NL_ASSET_DUMP_CTX_FITS(struct devlink_nl_dump_state);
+
+ return (struct devlink_nl_dump_state *)cb->ctx;
+}
+
/* Ports */
int devlink_port_netdevice_event(struct notifier_block *nb,
unsigned long event, void *ptr);
--
2.38.1
next prev parent reply other threads:[~2022-12-15 2:02 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-15 2:01 [RFC net-next 00/15] devlink: code split and structured instance walk Jakub Kicinski
2022-12-15 2:01 ` [RFC net-next 01/15] devlink: move code to a dedicated directory Jakub Kicinski
2022-12-15 9:51 ` Jiri Pirko
2022-12-15 18:44 ` Jacob Keller
2022-12-15 19:13 ` Jakub Kicinski
2022-12-15 19:09 ` Jakub Kicinski
2022-12-15 19:29 ` Jacob Keller
2022-12-15 19:48 ` Jakub Kicinski
2022-12-16 9:09 ` Jiri Pirko
2022-12-16 9:10 ` Jiri Pirko
2022-12-16 18:32 ` Jakub Kicinski
2022-12-16 23:26 ` Jacob Keller
2022-12-15 2:01 ` [RFC net-next 02/15] devlink: split out core code Jakub Kicinski
2022-12-15 2:01 ` [RFC net-next 03/15] devlink: split out netlink code Jakub Kicinski
2022-12-15 18:45 ` Jacob Keller
2022-12-15 19:14 ` Jakub Kicinski
2022-12-15 19:35 ` Jacob Keller
2022-12-15 2:01 ` [RFC net-next 04/15] devlink: protect devlink dump by the instance lock Jakub Kicinski
2022-12-15 8:42 ` Jiri Pirko
2022-12-15 19:17 ` Jakub Kicinski
2022-12-15 2:01 ` [RFC net-next 05/15] netlink: add macro for checking dump ctx size Jakub Kicinski
2022-12-15 2:01 ` Jakub Kicinski [this message]
2022-12-15 9:52 ` [RFC net-next 06/15] devlink: use an explicit structure for dump context Jiri Pirko
2022-12-15 18:50 ` Jacob Keller
2022-12-15 19:18 ` Jakub Kicinski
2022-12-15 2:01 ` [RFC net-next 07/15] devlink: remove start variables from dumps Jakub Kicinski
2022-12-15 2:01 ` [RFC net-next 08/15] devlink: drop the filter argument from devlinks_xa_find_get Jakub Kicinski
2022-12-15 18:52 ` Jacob Keller
2022-12-15 2:01 ` [RFC net-next 09/15] devlink: health: combine loops in dump Jakub Kicinski
2022-12-15 2:01 ` [RFC net-next 10/15] devlink: restart dump based on devlink instance ids (simple) Jakub Kicinski
2022-12-15 18:59 ` Jacob Keller
2022-12-15 2:01 ` [RFC net-next 11/15] devlink: restart dump based on devlink instance ids (nested) Jakub Kicinski
2022-12-15 2:01 ` [RFC net-next 12/15] devlink: restart dump based on devlink instance ids (function) Jakub Kicinski
2022-12-15 2:01 ` [RFC net-next 13/15] devlink: uniformly take the devlink instance lock in the dump loop Jakub Kicinski
2022-12-15 2:01 ` [RFC net-next 14/15] devlink: add by-instance dump infra Jakub Kicinski
2022-12-15 9:11 ` Jiri Pirko
2022-12-15 19:24 ` Jacob Keller
2022-12-15 19:47 ` Jakub Kicinski
2022-12-16 9:23 ` Jiri Pirko
2022-12-15 19:03 ` Jacob Keller
2022-12-15 2:01 ` [RFC net-next 15/15] devlink: convert remaining dumps to the by-instance scheme Jakub Kicinski
2022-12-15 19:39 ` [RFC net-next 00/15] devlink: code split and structured instance walk Jacob Keller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221215020155.1619839-7-kuba@kernel.org \
--to=kuba@kernel.org \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=jacob.e.keller@intel.com \
--cc=jiri@resnulli.us \
--cc=leon@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.