Skip to content

Commit

Permalink
qdiscs: add reduce_truesize support to common qdiscs
Browse files Browse the repository at this point in the history
The reduce truesize patches help with memory lossage under load,
at the price of performance. Given a choice between slowing down
or running out of memory, I'd rather slow down.
  • Loading branch information
Dave Taht committed Sep 18, 2012
1 parent 13f9013 commit 9fc07c3
Showing 1 changed file with 73 additions and 0 deletions.
@@ -0,0 +1,73 @@
From 341cca736cb9a991069d6ad4f819241161936f47 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 711/712] 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(-)

diff --git a/net/sched/sch_codel.c b/net/sched/sch_codel.c
index 2f9ab17..12d9363c 100644
--- a/net/sched/sch_codel.c
+++ b/net/sched/sch_codel.c
@@ -96,6 +96,8 @@ static int codel_qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch)
struct codel_sched_data *q;

if (likely(qdisc_qlen(sch) < sch->limit)) {
+ if(qdisc_qlen(sch) > 64)
+ skb = skb_reduce_truesize(skb);
codel_set_enqueue_time(skb);
return qdisc_enqueue_tail(skb, sch);
}
diff --git a/net/sched/sch_fifo.c b/net/sched/sch_fifo.c
index 66effe2..2031a3e 100644
--- a/net/sched/sch_fifo.c
+++ b/net/sched/sch_fifo.c
@@ -29,17 +29,21 @@ static int bfifo_enqueue(struct sk_buff *skb, struct Qdisc *sch)

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) > 64)
+ 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) > 64)
+ 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);
sch->qstats.drops++;
diff --git a/net/sched/sch_fq_codel.c b/net/sched/sch_fq_codel.c
index ba944bd..136d2bc 100644
--- a/net/sched/sch_fq_codel.c
+++ b/net/sched/sch_fq_codel.c
@@ -182,6 +182,8 @@ static int fq_codel_enqueue(struct sk_buff *skb, struct Qdisc *sch)
return ret;
}
idx--;
+ if (sch->q.qlen > 64)
+ skb = skb_reduce_truesize(skb);

codel_set_enqueue_time(skb);
flow = &q->flows[idx];
--
1.7.9.5

0 comments on commit 9fc07c3

Please sign in to comment.