sch_cake: don't call diffserv parsing code when it is not needed
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: c87b4ecdbe
("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>
This commit is contained in:
parent
9208d2863a
commit
8c95eca0bb
|
@ -1551,7 +1551,7 @@ static unsigned int cake_drop(struct Qdisc *sch, struct sk_buff **to_free)
|
||||||
return idx + (tin << 16);
|
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);
|
const int offset = skb_network_offset(skb);
|
||||||
u16 *buf, buf_;
|
u16 *buf, buf_;
|
||||||
|
@ -1612,14 +1612,17 @@ static struct cake_tin_data *cake_select_tin(struct Qdisc *sch,
|
||||||
{
|
{
|
||||||
struct cake_sched_data *q = qdisc_priv(sch);
|
struct cake_sched_data *q = qdisc_priv(sch);
|
||||||
u32 tin, mark;
|
u32 tin, mark;
|
||||||
|
bool wash;
|
||||||
u8 dscp;
|
u8 dscp;
|
||||||
|
|
||||||
/* Tin selection: Default to diffserv-based selection, allow overriding
|
/* 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;
|
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)
|
if (q->tin_mode == CAKE_DIFFSERV_BESTEFFORT)
|
||||||
tin = 0;
|
tin = 0;
|
||||||
|
@ -1633,6 +1636,8 @@ static struct cake_tin_data *cake_select_tin(struct Qdisc *sch,
|
||||||
tin = q->tin_order[TC_H_MIN(skb->priority) - 1];
|
tin = q->tin_order[TC_H_MIN(skb->priority) - 1];
|
||||||
|
|
||||||
else {
|
else {
|
||||||
|
if (!wash)
|
||||||
|
dscp = cake_handle_diffserv(skb, wash);
|
||||||
tin = q->tin_index[dscp];
|
tin = q->tin_index[dscp];
|
||||||
|
|
||||||
if (unlikely(tin >= q->tin_cnt))
|
if (unlikely(tin >= q->tin_cnt))
|
||||||
|
|
Loading…
Reference in New Issue