openwrtv3/target/linux/generic/patches-4.0/657-qdisc_reduce_truesize.patch
Felix Fietkau d0ba3bb1e2 kernel: finally remove layer7 filter support
it has been non-functional for years and caused numerous memleaks and
crashes for people that tried to enable it.
it has no maintained upstream source, and it does not look like it's
going to be fixed any time soon

Signed-off-by: Felix Fietkau <nbd@openwrt.org>

SVN-Revision: 45423
2015-04-13 22:23:14 +00:00

63 lines
1.9 KiB
Diff

From bc9fec2f87d57bdbff30d296605e24504513f65c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dave=20T=C3=A4ht?= <dave.taht@bufferbloat.net>
Date: Mon, 17 Sep 2012 19:20:22 -0700
Subject: [PATCH 4/7] net: add skb_reduce_truesize support to common qdiscs
Reduce skb size under load when queues begin to fill on the
commont qdiscs.
---
net/sched/sch_codel.c | 2 ++
net/sched/sch_fifo.c | 12 ++++++++----
net/sched/sch_fq_codel.c | 2 ++
3 files changed, 12 insertions(+), 4 deletions(-)
--- a/net/sched/sch_codel.c
+++ b/net/sched/sch_codel.c
@@ -96,6 +96,8 @@ static int codel_qdisc_enqueue(struct sk
struct codel_sched_data *q;
if (likely(qdisc_qlen(sch) < sch->limit)) {
+ if(qdisc_qlen(sch) > 128)
+ skb = skb_reduce_truesize(skb);
codel_set_enqueue_time(skb);
return qdisc_enqueue_tail(skb, sch);
}
--- a/net/sched/sch_fifo.c
+++ b/net/sched/sch_fifo.c
@@ -29,17 +29,21 @@ static int bfifo_enqueue(struct sk_buff
static int pfifo_enqueue(struct sk_buff *skb, struct Qdisc *sch)
{
- if (likely(skb_queue_len(&sch->q) < sch->limit))
+ if (likely(skb_queue_len(&sch->q) < sch->limit)) {
+ if (skb_queue_len(&sch->q) > 128)
+ skb = skb_reduce_truesize(skb);
return qdisc_enqueue_tail(skb, sch);
-
+ }
return qdisc_reshape_fail(skb, sch);
}
static int pfifo_tail_enqueue(struct sk_buff *skb, struct Qdisc *sch)
{
- if (likely(skb_queue_len(&sch->q) < sch->limit))
+ if (likely(skb_queue_len(&sch->q) < sch->limit)) {
+ if (skb_queue_len(&sch->q) > 128)
+ skb = skb_reduce_truesize(skb);
return qdisc_enqueue_tail(skb, sch);
-
+ }
/* queue full, remove one skb to fulfill the limit */
__qdisc_queue_drop_head(sch, &sch->q);
qdisc_qstats_drop(sch);
--- a/net/sched/sch_fq_codel.c
+++ b/net/sched/sch_fq_codel.c
@@ -185,6 +185,8 @@ static int fq_codel_enqueue(struct sk_bu
return ret;
}
idx--;
+ if (sch->q.qlen > 128)
+ skb = skb_reduce_truesize(skb);
codel_set_enqueue_time(skb);
flow = &q->flows[idx];