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))
|