d0ba3bb1e2
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
64 lines
1.9 KiB
Diff
64 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];
|