summaryrefslogtreecommitdiff
path: root/net/ethtool/rss.c
diff options
context:
space:
mode:
authorJakub Kicinski <kuba@kernel.org>2024-08-09 22:37:26 -0700
committerDavid S. Miller <davem@davemloft.net>2024-08-12 14:16:24 +0100
commit3d50c66c0609c8b64fb22e9c188fca88f34e7c98 (patch)
tree68d20fe1f4a6d3aae74c62cd4b5f9d49a42c57f1 /net/ethtool/rss.c
parentf6122900f4e28bfcb8abc76e1f7b83a1e0d8afd3 (diff)
downloadlinux-3d50c66c0609c8b64fb22e9c188fca88f34e7c98.tar.gz
linux-3d50c66c0609c8b64fb22e9c188fca88f34e7c98.tar.bz2
linux-3d50c66c0609c8b64fb22e9c188fca88f34e7c98.zip
ethtool: rss: support skipping contexts during dump
Applications may want to deal with dynamic RSS contexts only. So dumping context 0 will be counter-productive for them. Support starting the dump from a given context ID. Alternative would be to implement a dump flag to skip just context 0, not sure which is better... Reviewed-by: Edward Cree <ecree.xilinx@gmail.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ethtool/rss.c')
-rw-r--r--net/ethtool/rss.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/net/ethtool/rss.c b/net/ethtool/rss.c
index 2865720ff583..e07386275e14 100644
--- a/net/ethtool/rss.c
+++ b/net/ethtool/rss.c
@@ -28,6 +28,7 @@ struct rss_reply_data {
const struct nla_policy ethnl_rss_get_policy[] = {
[ETHTOOL_A_RSS_HEADER] = NLA_POLICY_NESTED(ethnl_header_policy),
[ETHTOOL_A_RSS_CONTEXT] = { .type = NLA_U32 },
+ [ETHTOOL_A_RSS_START_CONTEXT] = { .type = NLA_U32 },
};
static int
@@ -38,6 +39,10 @@ rss_parse_request(struct ethnl_req_info *req_info, struct nlattr **tb,
if (tb[ETHTOOL_A_RSS_CONTEXT])
request->rss_context = nla_get_u32(tb[ETHTOOL_A_RSS_CONTEXT]);
+ if (tb[ETHTOOL_A_RSS_START_CONTEXT]) {
+ NL_SET_BAD_ATTR(extack, tb[ETHTOOL_A_RSS_START_CONTEXT]);
+ return -EINVAL;
+ }
return 0;
}
@@ -214,6 +219,7 @@ struct rss_nl_dump_ctx {
/* User wants to only dump contexts from given ifindex */
unsigned int match_ifindex;
+ unsigned int start_ctx;
};
static struct rss_nl_dump_ctx *rss_dump_ctx(struct netlink_callback *cb)
@@ -236,6 +242,10 @@ int ethnl_rss_dump_start(struct netlink_callback *cb)
NL_SET_BAD_ATTR(info->extack, tb[ETHTOOL_A_RSS_CONTEXT]);
return -EINVAL;
}
+ if (tb[ETHTOOL_A_RSS_START_CONTEXT]) {
+ ctx->start_ctx = nla_get_u32(tb[ETHTOOL_A_RSS_START_CONTEXT]);
+ ctx->ctx_idx = ctx->start_ctx;
+ }
ret = ethnl_parse_header_dev_get(&req_info,
tb[ETHTOOL_A_RSS_HEADER],
@@ -317,7 +327,7 @@ rss_dump_one_dev(struct sk_buff *skb, struct netlink_callback *cb,
if (ret)
return ret;
}
- ctx->ctx_idx = 0;
+ ctx->ctx_idx = ctx->start_ctx;
return 0;
}