Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
qdiscs: add reduce_truesize support to common qdiscs
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.
There are no files selected for viewing
73 changes: 73 additions & 0 deletions
73
.../linux/generic/patches-3.3/057-net-add-skb_reduce_truesize-support-to-common-qdiscs.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 | ||
|