diff options
Diffstat (limited to 'net/sched/sch_gred.c')
-rw-r--r-- | net/sched/sch_gred.c | 85 |
1 files changed, 42 insertions, 43 deletions
diff --git a/net/sched/sch_gred.c b/net/sched/sch_gred.c index 51dcc2aa5c92..b9493a09a870 100644 --- a/net/sched/sch_gred.c +++ b/net/sched/sch_gred.c | |||
@@ -32,8 +32,7 @@ | |||
32 | struct gred_sched_data; | 32 | struct gred_sched_data; |
33 | struct gred_sched; | 33 | struct gred_sched; |
34 | 34 | ||
35 | struct gred_sched_data | 35 | struct gred_sched_data { |
36 | { | ||
37 | u32 limit; /* HARD maximal queue length */ | 36 | u32 limit; /* HARD maximal queue length */ |
38 | u32 DP; /* the drop pramaters */ | 37 | u32 DP; /* the drop pramaters */ |
39 | u32 bytesin; /* bytes seen on virtualQ so far*/ | 38 | u32 bytesin; /* bytes seen on virtualQ so far*/ |
@@ -50,8 +49,7 @@ enum { | |||
50 | GRED_RIO_MODE, | 49 | GRED_RIO_MODE, |
51 | }; | 50 | }; |
52 | 51 | ||
53 | struct gred_sched | 52 | struct gred_sched { |
54 | { | ||
55 | struct gred_sched_data *tab[MAX_DPs]; | 53 | struct gred_sched_data *tab[MAX_DPs]; |
56 | unsigned long flags; | 54 | unsigned long flags; |
57 | u32 red_flags; | 55 | u32 red_flags; |
@@ -150,17 +148,18 @@ static inline int gred_use_harddrop(struct gred_sched *t) | |||
150 | return t->red_flags & TC_RED_HARDDROP; | 148 | return t->red_flags & TC_RED_HARDDROP; |
151 | } | 149 | } |
152 | 150 | ||
153 | static int gred_enqueue(struct sk_buff *skb, struct Qdisc* sch) | 151 | static int gred_enqueue(struct sk_buff *skb, struct Qdisc *sch) |
154 | { | 152 | { |
155 | struct gred_sched_data *q=NULL; | 153 | struct gred_sched_data *q = NULL; |
156 | struct gred_sched *t= qdisc_priv(sch); | 154 | struct gred_sched *t = qdisc_priv(sch); |
157 | unsigned long qavg = 0; | 155 | unsigned long qavg = 0; |
158 | u16 dp = tc_index_to_dp(skb); | 156 | u16 dp = tc_index_to_dp(skb); |
159 | 157 | ||
160 | if (dp >= t->DPs || (q = t->tab[dp]) == NULL) { | 158 | if (dp >= t->DPs || (q = t->tab[dp]) == NULL) { |
161 | dp = t->def; | 159 | dp = t->def; |
162 | 160 | ||
163 | if ((q = t->tab[dp]) == NULL) { | 161 | q = t->tab[dp]; |
162 | if (!q) { | ||
164 | /* Pass through packets not assigned to a DP | 163 | /* Pass through packets not assigned to a DP |
165 | * if no default DP has been configured. This | 164 | * if no default DP has been configured. This |
166 | * allows for DP flows to be left untouched. | 165 | * allows for DP flows to be left untouched. |
@@ -183,7 +182,7 @@ static int gred_enqueue(struct sk_buff *skb, struct Qdisc* sch) | |||
183 | for (i = 0; i < t->DPs; i++) { | 182 | for (i = 0; i < t->DPs; i++) { |
184 | if (t->tab[i] && t->tab[i]->prio < q->prio && | 183 | if (t->tab[i] && t->tab[i]->prio < q->prio && |
185 | !red_is_idling(&t->tab[i]->parms)) | 184 | !red_is_idling(&t->tab[i]->parms)) |
186 | qavg +=t->tab[i]->parms.qavg; | 185 | qavg += t->tab[i]->parms.qavg; |
187 | } | 186 | } |
188 | 187 | ||
189 | } | 188 | } |
@@ -203,28 +202,28 @@ static int gred_enqueue(struct sk_buff *skb, struct Qdisc* sch) | |||
203 | gred_store_wred_set(t, q); | 202 | gred_store_wred_set(t, q); |
204 | 203 | ||
205 | switch (red_action(&q->parms, q->parms.qavg + qavg)) { | 204 | switch (red_action(&q->parms, q->parms.qavg + qavg)) { |
206 | case RED_DONT_MARK: | 205 | case RED_DONT_MARK: |
207 | break; | 206 | break; |
208 | 207 | ||
209 | case RED_PROB_MARK: | 208 | case RED_PROB_MARK: |
210 | sch->qstats.overlimits++; | 209 | sch->qstats.overlimits++; |
211 | if (!gred_use_ecn(t) || !INET_ECN_set_ce(skb)) { | 210 | if (!gred_use_ecn(t) || !INET_ECN_set_ce(skb)) { |
212 | q->stats.prob_drop++; | 211 | q->stats.prob_drop++; |
213 | goto congestion_drop; | 212 | goto congestion_drop; |
214 | } | 213 | } |
215 | 214 | ||
216 | q->stats.prob_mark++; | 215 | q->stats.prob_mark++; |
217 | break; | 216 | break; |
218 | 217 | ||
219 | case RED_HARD_MARK: | 218 | case RED_HARD_MARK: |
220 | sch->qstats.overlimits++; | 219 | sch->qstats.overlimits++; |
221 | if (gred_use_harddrop(t) || !gred_use_ecn(t) || | 220 | if (gred_use_harddrop(t) || !gred_use_ecn(t) || |
222 | !INET_ECN_set_ce(skb)) { | 221 | !INET_ECN_set_ce(skb)) { |
223 | q->stats.forced_drop++; | 222 | q->stats.forced_drop++; |
224 | goto congestion_drop; | 223 | goto congestion_drop; |
225 | } | 224 | } |
226 | q->stats.forced_mark++; | 225 | q->stats.forced_mark++; |
227 | break; | 226 | break; |
228 | } | 227 | } |
229 | 228 | ||
230 | if (q->backlog + qdisc_pkt_len(skb) <= q->limit) { | 229 | if (q->backlog + qdisc_pkt_len(skb) <= q->limit) { |
@@ -241,7 +240,7 @@ congestion_drop: | |||
241 | return NET_XMIT_CN; | 240 | return NET_XMIT_CN; |
242 | } | 241 | } |
243 | 242 | ||
244 | static struct sk_buff *gred_dequeue(struct Qdisc* sch) | 243 | static struct sk_buff *gred_dequeue(struct Qdisc *sch) |
245 | { | 244 | { |
246 | struct sk_buff *skb; | 245 | struct sk_buff *skb; |
247 | struct gred_sched *t = qdisc_priv(sch); | 246 | struct gred_sched *t = qdisc_priv(sch); |
@@ -254,9 +253,9 @@ static struct sk_buff *gred_dequeue(struct Qdisc* sch) | |||
254 | 253 | ||
255 | if (dp >= t->DPs || (q = t->tab[dp]) == NULL) { | 254 | if (dp >= t->DPs || (q = t->tab[dp]) == NULL) { |
256 | if (net_ratelimit()) | 255 | if (net_ratelimit()) |
257 | printk(KERN_WARNING "GRED: Unable to relocate " | 256 | pr_warning("GRED: Unable to relocate VQ 0x%x " |
258 | "VQ 0x%x after dequeue, screwing up " | 257 | "after dequeue, screwing up " |
259 | "backlog.\n", tc_index_to_dp(skb)); | 258 | "backlog.\n", tc_index_to_dp(skb)); |
260 | } else { | 259 | } else { |
261 | q->backlog -= qdisc_pkt_len(skb); | 260 | q->backlog -= qdisc_pkt_len(skb); |
262 | 261 | ||
@@ -273,7 +272,7 @@ static struct sk_buff *gred_dequeue(struct Qdisc* sch) | |||
273 | return NULL; | 272 | return NULL; |
274 | } | 273 | } |
275 | 274 | ||
276 | static unsigned int gred_drop(struct Qdisc* sch) | 275 | static unsigned int gred_drop(struct Qdisc *sch) |
277 | { | 276 | { |
278 | struct sk_buff *skb; | 277 | struct sk_buff *skb; |
279 | struct gred_sched *t = qdisc_priv(sch); | 278 | struct gred_sched *t = qdisc_priv(sch); |
@@ -286,9 +285,9 @@ static unsigned int gred_drop(struct Qdisc* sch) | |||
286 | 285 | ||
287 | if (dp >= t->DPs || (q = t->tab[dp]) == NULL) { | 286 | if (dp >= t->DPs || (q = t->tab[dp]) == NULL) { |
288 | if (net_ratelimit()) | 287 | if (net_ratelimit()) |
289 | printk(KERN_WARNING "GRED: Unable to relocate " | 288 | pr_warning("GRED: Unable to relocate VQ 0x%x " |
290 | "VQ 0x%x while dropping, screwing up " | 289 | "while dropping, screwing up " |
291 | "backlog.\n", tc_index_to_dp(skb)); | 290 | "backlog.\n", tc_index_to_dp(skb)); |
292 | } else { | 291 | } else { |
293 | q->backlog -= len; | 292 | q->backlog -= len; |
294 | q->stats.other++; | 293 | q->stats.other++; |
@@ -308,7 +307,7 @@ static unsigned int gred_drop(struct Qdisc* sch) | |||
308 | 307 | ||
309 | } | 308 | } |
310 | 309 | ||
311 | static void gred_reset(struct Qdisc* sch) | 310 | static void gred_reset(struct Qdisc *sch) |
312 | { | 311 | { |
313 | int i; | 312 | int i; |
314 | struct gred_sched *t = qdisc_priv(sch); | 313 | struct gred_sched *t = qdisc_priv(sch); |
@@ -369,8 +368,8 @@ static inline int gred_change_table_def(struct Qdisc *sch, struct nlattr *dps) | |||
369 | 368 | ||
370 | for (i = table->DPs; i < MAX_DPs; i++) { | 369 | for (i = table->DPs; i < MAX_DPs; i++) { |
371 | if (table->tab[i]) { | 370 | if (table->tab[i]) { |
372 | printk(KERN_WARNING "GRED: Warning: Destroying " | 371 | pr_warning("GRED: Warning: Destroying " |
373 | "shadowed VQ 0x%x\n", i); | 372 | "shadowed VQ 0x%x\n", i); |
374 | gred_destroy_vq(table->tab[i]); | 373 | gred_destroy_vq(table->tab[i]); |
375 | table->tab[i] = NULL; | 374 | table->tab[i] = NULL; |
376 | } | 375 | } |