2
0
mirror of https://github.com/edk2-porting/linux-next.git synced 2024-12-19 02:34:01 +08:00

[PKT_SCHED]: GRED: Dont abuse default VQ for equalizing

Introduces a new red parameter set for use in equalize mode,
although only the qavg variable and the idle period marker are
being used for now this makes it possible to allow a separate
parameter set to be used for equalize later on.

The use of this separate parameter set fixes a bogus start of
an idle period in gred_drop() which did start an idle period
on the default VQ even if equalize mode was disabled.

Signed-off-by: Thomas Graf <tgraf@suug.ch>
Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
This commit is contained in:
Thomas Graf 2005-11-05 21:14:23 +01:00 committed by Thomas Graf
parent 4a591834cf
commit 7051703b99

View File

@ -89,6 +89,7 @@ struct gred_sched
unsigned long flags; unsigned long flags;
u32 DPs; u32 DPs;
u32 def; u32 def;
struct red_parms wred_set;
}; };
static inline int gred_wred_mode(struct gred_sched *table) static inline int gred_wred_mode(struct gred_sched *table)
@ -158,6 +159,19 @@ static inline u16 tc_index_to_dp(struct sk_buff *skb)
return skb->tc_index & GRED_VQ_MASK; return skb->tc_index & GRED_VQ_MASK;
} }
static inline void gred_load_wred_set(struct gred_sched *table,
struct gred_sched_data *q)
{
q->parms.qavg = table->wred_set.qavg;
q->parms.qidlestart = table->wred_set.qidlestart;
}
static inline void gred_store_wred_set(struct gred_sched *table,
struct gred_sched_data *q)
{
table->wred_set.qavg = q->parms.qavg;
}
static int static int
gred_enqueue(struct sk_buff *skb, struct Qdisc* sch) gred_enqueue(struct sk_buff *skb, struct Qdisc* sch)
{ {
@ -204,8 +218,7 @@ gred_enqueue(struct sk_buff *skb, struct Qdisc* sch)
if (gred_wred_mode(t)) { if (gred_wred_mode(t)) {
qavg = 0; qavg = 0;
q->parms.qavg = t->tab[t->def]->parms.qavg; gred_load_wred_set(t, q);
q->parms.qidlestart = t->tab[t->def]->parms.qidlestart;
} }
q->parms.qavg = red_calc_qavg(&q->parms, gred_backlog(t, q, sch)); q->parms.qavg = red_calc_qavg(&q->parms, gred_backlog(t, q, sch));
@ -214,7 +227,7 @@ gred_enqueue(struct sk_buff *skb, struct Qdisc* sch)
red_end_of_idle_period(&q->parms); red_end_of_idle_period(&q->parms);
if (gred_wred_mode(t)) if (gred_wred_mode(t))
t->tab[t->def]->parms.qavg = q->parms.qavg; gred_store_wred_set(t, q);
switch (red_action(&q->parms, q->parms.qavg + qavg)) { switch (red_action(&q->parms, q->parms.qavg + qavg)) {
case RED_DONT_MARK: case RED_DONT_MARK:
@ -293,14 +306,8 @@ gred_dequeue(struct Qdisc* sch)
return skb; return skb;
} }
if (gred_wred_mode(t)) { if (gred_wred_mode(t))
q= t->tab[t->def]; red_start_of_idle_period(&t->wred_set);
if (!q)
D2PRINTK("no default VQ set: Results will be "
"screwed up\n");
else
red_start_of_idle_period(&q->parms);
}
return NULL; return NULL;
} }
@ -334,13 +341,9 @@ static unsigned int gred_drop(struct Qdisc* sch)
return len; return len;
} }
q=t->tab[t->def]; if (gred_wred_mode(t))
if (!q) { red_start_of_idle_period(&t->wred_set);
D2PRINTK("no default VQ set: Results might be screwed up\n");
return 0;
}
red_start_of_idle_period(&q->parms);
return 0; return 0;
} }