d59dc14515
From upstream: b8392808eb3f sch_cake: add RFC 8622 LE PHB support to CAKE diffserv handling 3f608f0c4136 sch_cake: fix a few style nits 8c95eca0bb8c sch_cake: don't call diffserv parsing code when it is not needed 9208d2863ac6 sch_cake: don't try to reallocate or unshare skb unconditionally From netdev not yet accepted: sch_cake: fix IP protocol handling in the presence of VLAN tags The VLAN tag handling is actually wider than just cake so upstream are working out how to fix it generically. We fix it here just for cake. Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
63 lines
2.2 KiB
Diff
63 lines
2.2 KiB
Diff
From 8c95eca0bb8c4bd2231a0d581f1ad0d50c90488c Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= <toke@redhat.com>
|
|
Date: Thu, 25 Jun 2020 22:12:08 +0200
|
|
Subject: [PATCH] sch_cake: don't call diffserv parsing code when it is not
|
|
needed
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
As a further optimisation of the diffserv parsing codepath, we can skip it
|
|
entirely if CAKE is configured to neither use diffserv-based
|
|
classification, nor to zero out the diffserv bits.
|
|
|
|
Fixes: c87b4ecdbe8d ("sch_cake: Make sure we can write the IP header before changing DSCP bits")
|
|
Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
|
|
---
|
|
net/sched/sch_cake.c | 13 +++++++++----
|
|
1 file changed, 9 insertions(+), 4 deletions(-)
|
|
|
|
--- a/net/sched/sch_cake.c
|
|
+++ b/net/sched/sch_cake.c
|
|
@@ -1551,7 +1551,7 @@ static unsigned int cake_drop(struct Qdi
|
|
return idx + (tin << 16);
|
|
}
|
|
|
|
-static u8 cake_handle_diffserv(struct sk_buff *skb, u16 wash)
|
|
+static u8 cake_handle_diffserv(struct sk_buff *skb, bool wash)
|
|
{
|
|
const int offset = skb_network_offset(skb);
|
|
u16 *buf, buf_;
|
|
@@ -1612,14 +1612,17 @@ static struct cake_tin_data *cake_select
|
|
{
|
|
struct cake_sched_data *q = qdisc_priv(sch);
|
|
u32 tin, mark;
|
|
+ bool wash;
|
|
u8 dscp;
|
|
|
|
/* Tin selection: Default to diffserv-based selection, allow overriding
|
|
- * using firewall marks or skb->priority.
|
|
+ * using firewall marks or skb->priority. Call DSCP parsing early if
|
|
+ * wash is enabled, otherwise defer to below to skip unneeded parsing.
|
|
*/
|
|
- dscp = cake_handle_diffserv(skb,
|
|
- q->rate_flags & CAKE_FLAG_WASH);
|
|
mark = (skb->mark & q->fwmark_mask) >> q->fwmark_shft;
|
|
+ wash = !!(q->rate_flags & CAKE_FLAG_WASH);
|
|
+ if (wash)
|
|
+ dscp = cake_handle_diffserv(skb, wash);
|
|
|
|
if (q->tin_mode == CAKE_DIFFSERV_BESTEFFORT)
|
|
tin = 0;
|
|
@@ -1630,6 +1633,8 @@ static struct cake_tin_data *cake_select
|
|
tin = q->tin_order[TC_H_MIN(skb->priority) - 1];
|
|
|
|
else {
|
|
+ if (!wash)
|
|
+ dscp = cake_handle_diffserv(skb, wash);
|
|
tin = q->tin_index[dscp];
|
|
|
|
if (unlikely(tin >= q->tin_cnt))
|