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:
parent
4a591834cf
commit
7051703b99
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user