aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Graf <tgraf@suug.ch>2005-11-05 15:14:28 -0500
committerThomas Graf <tgr@axs.localdomain>2005-11-05 16:02:29 -0500
commitbdc450a0bb1d48144ced1f899cc8366ec8e85024 (patch)
tree77924b88ae2f9ddc702288e439756800a02988ab
parentb38c7eef7e536d12051cc3d5864032f2f907cdfe (diff)
[PKT_SCHED]: (G)RED: Introduce hard dropping
Introduces a new flag TC_RED_HARDDROP which specifies that if ECN marking is enabled packets should still be dropped once the average queue length exceeds the maximum threshold. This _may_ help to avoid global synchronisation during small bursts of peers advertising but not caring about ECN. Use this option very carefully, it does more harm than good if (qth_max - qth_min) does not cover at least two average burst cycles. The difference to the current behaviour, in which we'd run into the hard queue limit, is that due to the low pass filter of RED short bursts are less likely to cause a global synchronisation. Signed-off-by: Thomas Graf <tgraf@suug.ch> Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
-rw-r--r--include/linux/pkt_sched.h2
-rw-r--r--net/sched/sch_gred.c8
-rw-r--r--net/sched/sch_red.c8
3 files changed, 16 insertions, 2 deletions
diff --git a/include/linux/pkt_sched.h b/include/linux/pkt_sched.h
index 0ebe320223e2..e87b233615b3 100644
--- a/include/linux/pkt_sched.h
+++ b/include/linux/pkt_sched.h
@@ -93,6 +93,7 @@ struct tc_fifo_qopt
93/* PRIO section */ 93/* PRIO section */
94 94
95#define TCQ_PRIO_BANDS 16 95#define TCQ_PRIO_BANDS 16
96#define TCQ_MIN_PRIO_BANDS 2
96 97
97struct tc_prio_qopt 98struct tc_prio_qopt
98{ 99{
@@ -169,6 +170,7 @@ struct tc_red_qopt
169 unsigned char Scell_log; /* cell size for idle damping */ 170 unsigned char Scell_log; /* cell size for idle damping */
170 unsigned char flags; 171 unsigned char flags;
171#define TC_RED_ECN 1 172#define TC_RED_ECN 1
173#define TC_RED_HARDDROP 2
172}; 174};
173 175
174struct tc_red_xstats 176struct tc_red_xstats
diff --git a/net/sched/sch_gred.c b/net/sched/sch_gred.c
index 079b0a4ea1c2..29a2dd9f3029 100644
--- a/net/sched/sch_gred.c
+++ b/net/sched/sch_gred.c
@@ -146,6 +146,11 @@ static inline int gred_use_ecn(struct gred_sched *t)
146 return t->red_flags & TC_RED_ECN; 146 return t->red_flags & TC_RED_ECN;
147} 147}
148 148
149static inline int gred_use_harddrop(struct gred_sched *t)
150{
151 return t->red_flags & TC_RED_HARDDROP;
152}
153
149static int gred_enqueue(struct sk_buff *skb, struct Qdisc* sch) 154static int gred_enqueue(struct sk_buff *skb, struct Qdisc* sch)
150{ 155{
151 struct gred_sched_data *q=NULL; 156 struct gred_sched_data *q=NULL;
@@ -214,7 +219,8 @@ static int gred_enqueue(struct sk_buff *skb, struct Qdisc* sch)
214 219
215 case RED_HARD_MARK: 220 case RED_HARD_MARK:
216 sch->qstats.overlimits++; 221 sch->qstats.overlimits++;
217 if (!gred_use_ecn(t) || !INET_ECN_set_ce(skb)) { 222 if (gred_use_harddrop(t) || !gred_use_ecn(t) ||
223 !INET_ECN_set_ce(skb)) {
218 q->stats.forced_drop++; 224 q->stats.forced_drop++;
219 goto congestion_drop; 225 goto congestion_drop;
220 } 226 }
diff --git a/net/sched/sch_red.c b/net/sched/sch_red.c
index 0d89dee751a9..dccfa44c2d71 100644
--- a/net/sched/sch_red.c
+++ b/net/sched/sch_red.c
@@ -51,6 +51,11 @@ static inline int red_use_ecn(struct red_sched_data *q)
51 return q->flags & TC_RED_ECN; 51 return q->flags & TC_RED_ECN;
52} 52}
53 53
54static inline int red_use_harddrop(struct red_sched_data *q)
55{
56 return q->flags & TC_RED_HARDDROP;
57}
58
54static int red_enqueue(struct sk_buff *skb, struct Qdisc* sch) 59static int red_enqueue(struct sk_buff *skb, struct Qdisc* sch)
55{ 60{
56 struct red_sched_data *q = qdisc_priv(sch); 61 struct red_sched_data *q = qdisc_priv(sch);
@@ -76,7 +81,8 @@ static int red_enqueue(struct sk_buff *skb, struct Qdisc* sch)
76 81
77 case RED_HARD_MARK: 82 case RED_HARD_MARK:
78 sch->qstats.overlimits++; 83 sch->qstats.overlimits++;
79 if (!red_use_ecn(q) || !INET_ECN_set_ce(skb)) { 84 if (red_use_harddrop(q) || !red_use_ecn(q) ||
85 !INET_ECN_set_ce(skb)) {
80 q->stats.forced_drop++; 86 q->stats.forced_drop++;
81 goto congestion_drop; 87 goto congestion_drop;
82 } 88 }