Commit hnyman's changes
[lede.git] / target / linux / generic / patches-4.4 / 037-sched-place-state-next_sched-and-gso_skb-in-same-cac.patch
diff --git a/target/linux/generic/patches-4.4/037-sched-place-state-next_sched-and-gso_skb-in-same-cac.patch b/target/linux/generic/patches-4.4/037-sched-place-state-next_sched-and-gso_skb-in-same-cac.patch
new file mode 100644 (file)
index 0000000..116b60e
--- /dev/null
@@ -0,0 +1,38 @@
+From: Florian Westphal <fw@strlen.de>
+Date: Thu, 9 Jun 2016 00:27:43 +0200
+Subject: [PATCH] sched: place state, next_sched and gso_skb in same cacheline
+ again
+
+Earlier commits removed two members from struct Qdisc which places
+next_sched/gso_skb into a different cacheline than ->state.
+
+This restores the struct layout to what it was before the removal.
+Move the two members, then add an annotation so they all reside in the
+same cacheline.
+
+This adds a 16 byte hole after cpu_qstats.
+
+The hole could be closed but as it doesn't decrease total struct size just
+do it this way.
+
+Reported-by: Eric Dumazet <edumazet@google.com>
+Signed-off-by: Florian Westphal <fw@strlen.de>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+---
+
+--- a/include/net/sch_generic.h
++++ b/include/net/sch_generic.h
+@@ -85,11 +85,11 @@ struct Qdisc {
+       struct gnet_stats_basic_cpu __percpu *cpu_bstats;
+       struct gnet_stats_queue __percpu *cpu_qstats;
+-      struct Qdisc            *next_sched;
+-      struct sk_buff          *gso_skb;
+       /*
+        * For performance sake on SMP, we put highly modified fields at the end
+        */
++      struct Qdisc            *next_sched ____cacheline_aligned_in_smp;
++      struct sk_buff          *gso_skb;
+       unsigned long           state;
+       struct sk_buff_head     q;
+       struct gnet_stats_basic_packed bstats;