diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/sched/sch_gred.c | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/net/sched/sch_gred.c b/net/sched/sch_gred.c index 4ced47bf6089..db594b46a52f 100644 --- a/net/sched/sch_gred.c +++ b/net/sched/sch_gred.c | |||
@@ -93,6 +93,7 @@ struct gred_sched_data | |||
93 | 93 | ||
94 | enum { | 94 | enum { |
95 | GRED_WRED_MODE = 1, | 95 | GRED_WRED_MODE = 1, |
96 | GRED_RIO_MODE, | ||
96 | }; | 97 | }; |
97 | 98 | ||
98 | struct gred_sched | 99 | struct gred_sched |
@@ -102,7 +103,6 @@ struct gred_sched | |||
102 | u32 DPs; | 103 | u32 DPs; |
103 | u32 def; | 104 | u32 def; |
104 | u8 initd; | 105 | u8 initd; |
105 | u8 grio; | ||
106 | }; | 106 | }; |
107 | 107 | ||
108 | static inline int gred_wred_mode(struct gred_sched *table) | 108 | static inline int gred_wred_mode(struct gred_sched *table) |
@@ -120,6 +120,21 @@ static inline void gred_disable_wred_mode(struct gred_sched *table) | |||
120 | __clear_bit(GRED_WRED_MODE, &table->flags); | 120 | __clear_bit(GRED_WRED_MODE, &table->flags); |
121 | } | 121 | } |
122 | 122 | ||
123 | static inline int gred_rio_mode(struct gred_sched *table) | ||
124 | { | ||
125 | return test_bit(GRED_RIO_MODE, &table->flags); | ||
126 | } | ||
127 | |||
128 | static inline void gred_enable_rio_mode(struct gred_sched *table) | ||
129 | { | ||
130 | __set_bit(GRED_RIO_MODE, &table->flags); | ||
131 | } | ||
132 | |||
133 | static inline void gred_disable_rio_mode(struct gred_sched *table) | ||
134 | { | ||
135 | __clear_bit(GRED_RIO_MODE, &table->flags); | ||
136 | } | ||
137 | |||
123 | static inline int gred_wred_mode_check(struct Qdisc *sch) | 138 | static inline int gred_wred_mode_check(struct Qdisc *sch) |
124 | { | 139 | { |
125 | struct gred_sched *table = qdisc_priv(sch); | 140 | struct gred_sched *table = qdisc_priv(sch); |
@@ -173,7 +188,7 @@ gred_enqueue(struct sk_buff *skb, struct Qdisc* sch) | |||
173 | "general backlog %d\n",skb->tc_index&0xf,sch->handle,q->backlog, | 188 | "general backlog %d\n",skb->tc_index&0xf,sch->handle,q->backlog, |
174 | sch->qstats.backlog); | 189 | sch->qstats.backlog); |
175 | /* sum up all the qaves of prios <= to ours to get the new qave*/ | 190 | /* sum up all the qaves of prios <= to ours to get the new qave*/ |
176 | if (!gred_wred_mode(t) && t->grio) { | 191 | if (!gred_wred_mode(t) && gred_rio_mode(t)) { |
177 | for (i=0;i<t->DPs;i++) { | 192 | for (i=0;i<t->DPs;i++) { |
178 | if ((!t->tab[i]) || (i==q->DP)) | 193 | if ((!t->tab[i]) || (i==q->DP)) |
179 | continue; | 194 | continue; |
@@ -386,12 +401,12 @@ static int gred_change(struct Qdisc *sch, struct rtattr *opt) | |||
386 | table->def=sopt->def_DP; | 401 | table->def=sopt->def_DP; |
387 | 402 | ||
388 | if (sopt->grio) { | 403 | if (sopt->grio) { |
389 | table->grio = 1; | 404 | gred_enable_rio_mode(table); |
390 | gred_disable_wred_mode(table); | 405 | gred_disable_wred_mode(table); |
391 | if (gred_wred_mode_check(sch)) | 406 | if (gred_wred_mode_check(sch)) |
392 | gred_enable_wred_mode(table); | 407 | gred_enable_wred_mode(table); |
393 | } else { | 408 | } else { |
394 | table->grio = 0; | 409 | gred_disable_rio_mode(table); |
395 | gred_disable_wred_mode(table); | 410 | gred_disable_wred_mode(table); |
396 | } | 411 | } |
397 | 412 | ||
@@ -423,7 +438,7 @@ static int gred_change(struct Qdisc *sch, struct rtattr *opt) | |||
423 | } | 438 | } |
424 | q= table->tab[ctl->DP]; | 439 | q= table->tab[ctl->DP]; |
425 | 440 | ||
426 | if (table->grio) { | 441 | if (gred_rio_mode(table)) { |
427 | if (ctl->prio <=0) { | 442 | if (ctl->prio <=0) { |
428 | if (table->def && table->tab[table->def]) { | 443 | if (table->def && table->tab[table->def]) { |
429 | DPRINTK("\nGRED: DP %u does not have a prio" | 444 | DPRINTK("\nGRED: DP %u does not have a prio" |
@@ -463,7 +478,7 @@ static int gred_change(struct Qdisc *sch, struct rtattr *opt) | |||
463 | PSCHED_SET_PASTPERFECT(q->qidlestart); | 478 | PSCHED_SET_PASTPERFECT(q->qidlestart); |
464 | memcpy(q->Stab, RTA_DATA(tb[TCA_GRED_STAB-1]), 256); | 479 | memcpy(q->Stab, RTA_DATA(tb[TCA_GRED_STAB-1]), 256); |
465 | 480 | ||
466 | if (table->grio) { | 481 | if (gred_rio_mode(table)) { |
467 | gred_disable_wred_mode(table); | 482 | gred_disable_wred_mode(table); |
468 | if (gred_wred_mode_check(sch)) | 483 | if (gred_wred_mode_check(sch)) |
469 | gred_enable_wred_mode(table); | 484 | gred_enable_wred_mode(table); |
@@ -496,7 +511,7 @@ static int gred_change(struct Qdisc *sch, struct rtattr *opt) | |||
496 | q->qth_min = ctl->qth_min<<ctl->Wlog; | 511 | q->qth_min = ctl->qth_min<<ctl->Wlog; |
497 | q->qth_max = ctl->qth_max<<ctl->Wlog; | 512 | q->qth_max = ctl->qth_max<<ctl->Wlog; |
498 | 513 | ||
499 | if (table->grio) | 514 | if (gred_rio_mode(table)) |
500 | q->prio=table->tab[ctl->DP]->prio; | 515 | q->prio=table->tab[ctl->DP]->prio; |
501 | else | 516 | else |
502 | q->prio=8; | 517 | q->prio=8; |
@@ -528,7 +543,12 @@ static int gred_init(struct Qdisc *sch, struct rtattr *opt) | |||
528 | sopt = RTA_DATA(tb2[TCA_GRED_DPS-1]); | 543 | sopt = RTA_DATA(tb2[TCA_GRED_DPS-1]); |
529 | table->DPs=sopt->DPs; | 544 | table->DPs=sopt->DPs; |
530 | table->def=sopt->def_DP; | 545 | table->def=sopt->def_DP; |
531 | table->grio=sopt->grio; | 546 | |
547 | if (sopt->grio) | ||
548 | gred_enable_rio_mode(table); | ||
549 | else | ||
550 | gred_disable_rio_mode(table); | ||
551 | |||
532 | table->initd=0; | 552 | table->initd=0; |
533 | return 0; | 553 | return 0; |
534 | } | 554 | } |