]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net_sched: make room for (struct qdisc_skb_cb)->pkt_segs
authorEric Dumazet <edumazet@google.com>
Fri, 21 Nov 2025 08:32:43 +0000 (08:32 +0000)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 25 Nov 2025 15:10:31 +0000 (16:10 +0100)
Add a new u16 field, next to pkt_len : pkt_segs

This will cache shinfo->gso_segs to speed up qdisc deqeue().

Move slave_dev_queue_mapping at the end of qdisc_skb_cb,
and move three bits from tc_skb_cb :
- post_ct
- post_ct_snat
- post_ct_dnat

Signed-off-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20251121083256.674562-2-edumazet@google.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
include/net/sch_generic.h
net/core/dev.c
net/sched/act_ct.c
net/sched/cls_api.c
net/sched/cls_flower.c

index 94966692ccdf51db085c236319705aecba8c30cf..9cd8b5d4b23698fd8959ef40c303468e31c1d4af 100644 (file)
@@ -429,13 +429,16 @@ struct tcf_proto {
 };
 
 struct qdisc_skb_cb {
-       struct {
-               unsigned int            pkt_len;
-               u16                     slave_dev_queue_mapping;
-               u16                     tc_classid;
-       };
+       unsigned int            pkt_len;
+       u16                     pkt_segs;
+       u16                     tc_classid;
 #define QDISC_CB_PRIV_LEN 20
        unsigned char           data[QDISC_CB_PRIV_LEN];
+
+       u16                     slave_dev_queue_mapping;
+       u8                      post_ct:1;
+       u8                      post_ct_snat:1;
+       u8                      post_ct_dnat:1;
 };
 
 typedef void tcf_chain_head_change_t(struct tcf_proto *tp_head, void *priv);
@@ -1064,11 +1067,8 @@ struct tc_skb_cb {
        struct qdisc_skb_cb qdisc_cb;
        u32 drop_reason;
 
-       u16 zone; /* Only valid if post_ct = true */
+       u16 zone; /* Only valid if qdisc_skb_cb(skb)->post_ct = true */
        u16 mru;
-       u8 post_ct:1;
-       u8 post_ct_snat:1;
-       u8 post_ct_dnat:1;
 };
 
 static inline struct tc_skb_cb *tc_skb_cb(const struct sk_buff *skb)
index 69515edd17bc6a157046f31b3dd343a59ae192ab..46ce6c6107805132b1322128e86634eca91e3340 100644 (file)
@@ -4355,7 +4355,7 @@ static int tc_run(struct tcx_entry *entry, struct sk_buff *skb,
                return ret;
 
        tc_skb_cb(skb)->mru = 0;
-       tc_skb_cb(skb)->post_ct = false;
+       qdisc_skb_cb(skb)->post_ct = false;
        tcf_set_drop_reason(skb, *drop_reason);
 
        mini_qdisc_bstats_cpu_update(miniq, skb);
index 6749a4a9a9cd0a43897fcd20d228721ce057cb88..2b6ac7069dc168da2c534bddc5d4398e5e7a18c4 100644 (file)
@@ -948,9 +948,9 @@ static int tcf_ct_act_nat(struct sk_buff *skb,
                return err & NF_VERDICT_MASK;
 
        if (action & BIT(NF_NAT_MANIP_SRC))
-               tc_skb_cb(skb)->post_ct_snat = 1;
+               qdisc_skb_cb(skb)->post_ct_snat = 1;
        if (action & BIT(NF_NAT_MANIP_DST))
-               tc_skb_cb(skb)->post_ct_dnat = 1;
+               qdisc_skb_cb(skb)->post_ct_dnat = 1;
 
        return err;
 #else
@@ -986,7 +986,7 @@ TC_INDIRECT_SCOPE int tcf_ct_act(struct sk_buff *skb, const struct tc_action *a,
        tcf_action_update_bstats(&c->common, skb);
 
        if (clear) {
-               tc_skb_cb(skb)->post_ct = false;
+               qdisc_skb_cb(skb)->post_ct = false;
                ct = nf_ct_get(skb, &ctinfo);
                if (ct) {
                        nf_ct_put(ct);
@@ -1097,7 +1097,7 @@ do_nat:
 out_push:
        skb_push_rcsum(skb, nh_ofs);
 
-       tc_skb_cb(skb)->post_ct = true;
+       qdisc_skb_cb(skb)->post_ct = true;
        tc_skb_cb(skb)->zone = p->zone;
 out_clear:
        if (defrag)
index f751cd5eeac8d72b4c4d138f45d25a8ba62fb1bd..ebca4b926dcf76daa3abb8ffe221503e33de30e3 100644 (file)
@@ -1872,9 +1872,9 @@ int tcf_classify(struct sk_buff *skb,
                        }
                        ext->chain = last_executed_chain;
                        ext->mru = cb->mru;
-                       ext->post_ct = cb->post_ct;
-                       ext->post_ct_snat = cb->post_ct_snat;
-                       ext->post_ct_dnat = cb->post_ct_dnat;
+                       ext->post_ct = qdisc_skb_cb(skb)->post_ct;
+                       ext->post_ct_snat = qdisc_skb_cb(skb)->post_ct_snat;
+                       ext->post_ct_dnat = qdisc_skb_cb(skb)->post_ct_dnat;
                        ext->zone = cb->zone;
                }
        }
index 099ff6a3e1f516a50cfac578666f6d5f4fbe8f29..7669371c1354c27ede83c2c83aaea5c0402e6552 100644 (file)
@@ -326,7 +326,7 @@ TC_INDIRECT_SCOPE int fl_classify(struct sk_buff *skb,
                                  struct tcf_result *res)
 {
        struct cls_fl_head *head = rcu_dereference_bh(tp->root);
-       bool post_ct = tc_skb_cb(skb)->post_ct;
+       bool post_ct = qdisc_skb_cb(skb)->post_ct;
        u16 zone = tc_skb_cb(skb)->zone;
        struct fl_flow_key skb_key;
        struct fl_flow_mask *mask;