From: Eric Dumazet <edumazet@google.com>
To: "David S . Miller" <davem@davemloft.net>,
Jakub Kicinski <kuba@kernel.org>,
Paolo Abeni <pabeni@redhat.com>
Cc: Simon Horman <horms@kernel.org>,
Jamal Hadi Salim <jhs@mojatatu.com>,
Jiri Pirko <jiri@resnulli.us>,
netdev@vger.kernel.org, eric.dumazet@gmail.com,
Eric Dumazet <edumazet@google.com>
Subject: [PATCH net-next] net/sched: speedup tc_dump_qdisc() when tcm_handle is provided
Date: Sun, 3 May 2026 11:45:15 +0000 [thread overview]
Message-ID: <20260503114515.2460477-1-edumazet@google.com> (raw)
"tc qdisc show ... handle xxx" filtering can be done by the kernel.
A followup patch can do the same for tcm_parent.
iproute2/tc needs a small companion patch.
Signed-off-by: Eric Dumazet <edumazet@google.com>
---
net/sched/sch_api.c | 27 +++++++++++++++++----------
1 file changed, 17 insertions(+), 10 deletions(-)
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c
index dd0edc9bd4610ec865fc97a81f801a7da020667b..6f7847c5536f16e6754954f0a606581e17257361 100644
--- a/net/sched/sch_api.c
+++ b/net/sched/sch_api.c
@@ -979,13 +979,17 @@ static int tc_fill_qdisc(struct sk_buff *skb, struct Qdisc *q, u32 clid,
return -EMSGSIZE;
}
-static bool tc_qdisc_dump_ignore(struct Qdisc *q, bool dump_invisible)
+static bool tc_qdisc_dump_ignore(struct Qdisc *q, bool dump_invisible,
+ const struct tcmsg *tcm)
{
if (q->flags & TCQ_F_BUILTIN)
return true;
if ((q->flags & TCQ_F_INVISIBLE) && !dump_invisible)
return true;
-
+ if (tcm) {
+ if (tcm->tcm_handle && tcm->tcm_handle != q->handle)
+ return true;
+ }
return false;
}
@@ -1000,7 +1004,7 @@ static int qdisc_get_notify(struct net *net, struct sk_buff *oskb,
if (!skb)
return -ENOBUFS;
- if (!tc_qdisc_dump_ignore(q, false)) {
+ if (!tc_qdisc_dump_ignore(q, false, NULL)) {
if (tc_fill_qdisc(skb, q, clid, portid, n->nlmsg_seq, 0,
RTM_NEWQDISC, extack) < 0)
goto err_out;
@@ -1030,12 +1034,12 @@ static int qdisc_notify(struct net *net, struct sk_buff *oskb,
if (!skb)
return -ENOBUFS;
- if (old && !tc_qdisc_dump_ignore(old, false)) {
+ if (old && !tc_qdisc_dump_ignore(old, false, NULL)) {
if (tc_fill_qdisc(skb, old, clid, portid, n->nlmsg_seq,
0, RTM_DELQDISC, extack) < 0)
goto err_out;
}
- if (new && !tc_qdisc_dump_ignore(new, false)) {
+ if (new && !tc_qdisc_dump_ignore(new, false, NULL)) {
if (tc_fill_qdisc(skb, new, clid, portid, n->nlmsg_seq,
old ? NLM_F_REPLACE : 0, RTM_NEWQDISC, extack) < 0)
goto err_out;
@@ -1825,21 +1829,24 @@ static int tc_dump_qdisc_root(struct Qdisc *root, struct sk_buff *skb,
int *q_idx_p, int s_q_idx, bool recur,
bool dump_invisible)
{
+ const struct nlmsghdr *nlh = cb->nlh;
int ret = 0, q_idx = *q_idx_p;
+ const struct tcmsg *tcm;
struct Qdisc *q;
int b;
if (!root)
return 0;
+ tcm = nlmsg_data(nlh);
q = root;
if (q_idx < s_q_idx) {
q_idx++;
} else {
- if (!tc_qdisc_dump_ignore(q, dump_invisible))
+ if (!tc_qdisc_dump_ignore(q, dump_invisible, tcm))
ret = tc_fill_qdisc(skb, q, q->parent,
NETLINK_CB(cb->skb).portid,
- cb->nlh->nlmsg_seq, NLM_F_MULTI,
+ nlh->nlmsg_seq, NLM_F_MULTI,
RTM_NEWQDISC, NULL);
if (ret < 0)
goto out;
@@ -1860,10 +1867,10 @@ static int tc_dump_qdisc_root(struct Qdisc *root, struct sk_buff *skb,
q_idx++;
continue;
}
- if (!tc_qdisc_dump_ignore(q, dump_invisible))
+ if (!tc_qdisc_dump_ignore(q, dump_invisible, tcm))
ret = tc_fill_qdisc(skb, q, q->parent,
NETLINK_CB(cb->skb).portid,
- cb->nlh->nlmsg_seq, NLM_F_MULTI,
+ nlh->nlmsg_seq, NLM_F_MULTI,
RTM_NEWQDISC, NULL);
if (ret < 0)
goto out;
@@ -2341,7 +2348,7 @@ static int tc_dump_tclass_qdisc(struct Qdisc *q, struct sk_buff *skb,
{
struct qdisc_dump_args arg;
- if (tc_qdisc_dump_ignore(q, false) ||
+ if (tc_qdisc_dump_ignore(q, false, NULL) ||
*t_p < s_t || !q->ops->cl_ops ||
(tcm->tcm_parent &&
TC_H_MAJ(tcm->tcm_parent) != q->handle)) {
--
2.54.0.545.g6539524ca2-goog
next reply other threads:[~2026-05-03 11:45 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-03 11:45 Eric Dumazet [this message]
2026-05-04 19:13 ` [PATCH net-next] net/sched: speedup tc_dump_qdisc() when tcm_handle is provided Jamal Hadi Salim
2026-05-04 19:20 ` Eric Dumazet
2026-05-04 19:34 ` Jamal Hadi Salim
2026-05-05 2:40 ` patchwork-bot+netdevbpf
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=20260503114515.2460477-1-edumazet@google.com \
--to=edumazet@google.com \
--cc=davem@davemloft.net \
--cc=eric.dumazet@gmail.com \
--cc=horms@kernel.org \
--cc=jhs@mojatatu.com \
--cc=jiri@resnulli.us \
--cc=kuba@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox