]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net/sched: tc_dump_qdisc_root() refactor
authorEric Dumazet <edumazet@google.com>
Thu, 30 Apr 2026 02:36:26 +0000 (02:36 +0000)
committerJakub Kicinski <kuba@kernel.org>
Fri, 1 May 2026 03:54:27 +0000 (20:54 -0700)
Change tc_fill_qdisc() to return -EMSGSIZE when skb is too small.

Change tc_dump_qdisc_root() to propagate tc_fill_qdisc() error to its callers.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20260430023628.3216283-3-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/sched/sch_api.c

index 32ccd4672083aa19340520155aeba6d8b6ff546c..029e0f87ea9c61cc757432a07a6af92c90c551ef 100644 (file)
@@ -976,7 +976,7 @@ static int tc_fill_qdisc(struct sk_buff *skb, struct Qdisc *q, u32 clid,
 out_nlmsg_trim:
 nla_put_failure:
        nlmsg_trim(skb, b);
-       return -1;
+       return -EMSGSIZE;
 }
 
 static bool tc_qdisc_dump_ignore(struct Qdisc *q, bool dump_invisible)
@@ -1836,11 +1836,13 @@ static int tc_dump_qdisc_root(struct Qdisc *root, struct sk_buff *skb,
        if (q_idx < s_q_idx) {
                q_idx++;
        } else {
-               if (!tc_qdisc_dump_ignore(q, dump_invisible) &&
-                   tc_fill_qdisc(skb, q, q->parent, NETLINK_CB(cb->skb).portid,
-                                 cb->nlh->nlmsg_seq, NLM_F_MULTI,
-                                 RTM_NEWQDISC, NULL) <= 0)
-                       goto done;
+               if (!tc_qdisc_dump_ignore(q, dump_invisible))
+                   ret = tc_fill_qdisc(skb, q, q->parent,
+                                       NETLINK_CB(cb->skb).portid,
+                                       cb->nlh->nlmsg_seq, NLM_F_MULTI,
+                                       RTM_NEWQDISC, NULL);
+               if (ret < 0)
+                       goto out;
                q_idx++;
        }
 
@@ -1858,20 +1860,19 @@ static int tc_dump_qdisc_root(struct Qdisc *root, struct sk_buff *skb,
                        q_idx++;
                        continue;
                }
-               if (!tc_qdisc_dump_ignore(q, dump_invisible) &&
-                   tc_fill_qdisc(skb, q, q->parent, NETLINK_CB(cb->skb).portid,
-                                 cb->nlh->nlmsg_seq, NLM_F_MULTI,
-                                 RTM_NEWQDISC, NULL) <= 0)
-                       goto done;
+               if (!tc_qdisc_dump_ignore(q, dump_invisible))
+                       ret = tc_fill_qdisc(skb, q, q->parent,
+                                           NETLINK_CB(cb->skb).portid,
+                                           cb->nlh->nlmsg_seq, NLM_F_MULTI,
+                                           RTM_NEWQDISC, NULL);
+               if (ret < 0)
+                       goto out;
                q_idx++;
        }
 
 out:
        *q_idx_p = q_idx;
        return ret;
-done:
-       ret = -1;
-       goto out;
 }
 
 static int tc_dump_qdisc(struct sk_buff *skb, struct netlink_callback *cb)