]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - queue-5.0/sch_cake-simplify-logic-in-cake_select_tin.patch
5.0-stable patches
[thirdparty/kernel/stable-queue.git] / queue-5.0 / sch_cake-simplify-logic-in-cake_select_tin.patch
1 From foo@baz Sat Apr 20 16:43:09 CEST 2019
2 From: "Toke Høiland-Jørgensen" <toke@redhat.com>
3 Date: Fri, 5 Apr 2019 15:01:59 +0200
4 Subject: sch_cake: Simplify logic in cake_select_tin()
5
6 From: "Toke Høiland-Jørgensen" <toke@redhat.com>
7
8 [ Upstream commit 4976e3c683f328bc6f2edef555a4ffee6524486f ]
9
10 The logic in cake_select_tin() was getting a bit hairy, and it turns out we
11 can simplify it quite a bit. This also allows us to get rid of one of the
12 two diffserv parsing functions, which has the added benefit that
13 already-zeroed DSCP fields won't get re-written.
14
15 Suggested-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
16 Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
17 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
18 ---
19 net/sched/sch_cake.c | 44 ++++++++++++++++----------------------------
20 1 file changed, 16 insertions(+), 28 deletions(-)
21
22 --- a/net/sched/sch_cake.c
23 +++ b/net/sched/sch_cake.c
24 @@ -1508,20 +1508,6 @@ static unsigned int cake_drop(struct Qdi
25 return idx + (tin << 16);
26 }
27
28 -static void cake_wash_diffserv(struct sk_buff *skb)
29 -{
30 - switch (skb->protocol) {
31 - case htons(ETH_P_IP):
32 - ipv4_change_dsfield(ip_hdr(skb), INET_ECN_MASK, 0);
33 - break;
34 - case htons(ETH_P_IPV6):
35 - ipv6_change_dsfield(ipv6_hdr(skb), INET_ECN_MASK, 0);
36 - break;
37 - default:
38 - break;
39 - }
40 -}
41 -
42 static u8 cake_handle_diffserv(struct sk_buff *skb, u16 wash)
43 {
44 int wlen = skb_network_offset(skb);
45 @@ -1564,25 +1550,27 @@ static struct cake_tin_data *cake_select
46 {
47 struct cake_sched_data *q = qdisc_priv(sch);
48 u32 tin;
49 + u8 dscp;
50 +
51 + /* Tin selection: Default to diffserv-based selection, allow overriding
52 + * using firewall marks or skb->priority.
53 + */
54 + dscp = cake_handle_diffserv(skb,
55 + q->rate_flags & CAKE_FLAG_WASH);
56 +
57 + if (q->tin_mode == CAKE_DIFFSERV_BESTEFFORT)
58 + tin = 0;
59
60 - if (TC_H_MAJ(skb->priority) == sch->handle &&
61 - TC_H_MIN(skb->priority) > 0 &&
62 - TC_H_MIN(skb->priority) <= q->tin_cnt) {
63 + else if (TC_H_MAJ(skb->priority) == sch->handle &&
64 + TC_H_MIN(skb->priority) > 0 &&
65 + TC_H_MIN(skb->priority) <= q->tin_cnt)
66 tin = q->tin_order[TC_H_MIN(skb->priority) - 1];
67
68 - if (q->rate_flags & CAKE_FLAG_WASH)
69 - cake_wash_diffserv(skb);
70 - } else if (q->tin_mode != CAKE_DIFFSERV_BESTEFFORT) {
71 - /* extract the Diffserv Precedence field, if it exists */
72 - /* and clear DSCP bits if washing */
73 - tin = q->tin_index[cake_handle_diffserv(skb,
74 - q->rate_flags & CAKE_FLAG_WASH)];
75 + else {
76 + tin = q->tin_index[dscp];
77 +
78 if (unlikely(tin >= q->tin_cnt))
79 tin = 0;
80 - } else {
81 - tin = 0;
82 - if (q->rate_flags & CAKE_FLAG_WASH)
83 - cake_wash_diffserv(skb);
84 }
85
86 return &q->tins[tin];