Commit b2a38f6d authored by Eric Dumazet's avatar Eric Dumazet Committed by Paolo Abeni
Browse files

net_sched: make room for (struct qdisc_skb_cb)->pkt_segs



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: default avatarEric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20251121083256.674562-2-edumazet@google.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent e3daf0e7
Loading
Loading
Loading
Loading
+9 −9
Original line number Diff line number Diff line
@@ -429,13 +429,16 @@ struct tcf_proto {
};

struct qdisc_skb_cb {
	struct {
	unsigned int		pkt_len;
		u16			slave_dev_queue_mapping;
	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)
+1 −1
Original line number Diff line number Diff line
@@ -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);
+4 −4
Original line number Diff line number Diff line
@@ -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 @@ TC_INDIRECT_SCOPE int tcf_ct_act(struct sk_buff *skb, const struct tc_action *a,
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)
+3 −3
Original line number Diff line number Diff line
@@ -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;
		}
	}
+1 −1
Original line number Diff line number Diff line
@@ -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;