]>
Commit | Line | Data |
---|---|---|
2fd8de32 GKH |
1 | From d65ba13406233f881bc212640b54bbb87c52141b Mon Sep 17 00:00:00 2001 |
2 | From: David Ward <david.ward@ll.mit.edu> | |
3 | Date: Sun, 15 Apr 2012 12:31:45 +0000 | |
4 | Subject: [PATCH 19/28] net_sched: gred: Fix oops in gred_dump() in WRED mode | |
5 | ||
6 | ||
7 | From: David Ward <david.ward@ll.mit.edu> | |
8 | ||
9 | [ Upstream commit 244b65dbfede788f2fa3fe2463c44d0809e97c6b ] | |
10 | ||
11 | A parameter set exists for WRED mode, called wred_set, to hold the same | |
12 | values for qavg and qidlestart across all VQs. The WRED mode values had | |
13 | been previously held in the VQ for the default DP. After these values | |
14 | were moved to wred_set, the VQ for the default DP was no longer created | |
15 | automatically (so that it could be omitted on purpose, to have packets | |
16 | in the default DP enqueued directly to the device without using RED). | |
17 | ||
18 | However, gred_dump() was overlooked during that change; in WRED mode it | |
19 | still reads qavg/qidlestart from the VQ for the default DP, which might | |
20 | not even exist. As a result, this command sequence will cause an oops: | |
21 | ||
22 | tc qdisc add dev $DEV handle $HANDLE parent $PARENT gred setup \ | |
23 | DPs 3 default 2 grio | |
24 | tc qdisc change dev $DEV handle $HANDLE gred DP 0 prio 8 $RED_OPTIONS | |
25 | tc qdisc change dev $DEV handle $HANDLE gred DP 1 prio 8 $RED_OPTIONS | |
26 | ||
27 | This fixes gred_dump() in WRED mode to use the values held in wred_set. | |
28 | ||
29 | Signed-off-by: David Ward <david.ward@ll.mit.edu> | |
30 | Signed-off-by: David S. Miller <davem@davemloft.net> | |
31 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | |
32 | --- | |
33 | net/sched/sch_gred.c | 7 ++----- | |
34 | 1 file changed, 2 insertions(+), 5 deletions(-) | |
35 | ||
36 | --- a/net/sched/sch_gred.c | |
37 | +++ b/net/sched/sch_gred.c | |
38 | @@ -565,11 +565,8 @@ static int gred_dump(struct Qdisc *sch, | |
39 | opt.packets = q->packetsin; | |
40 | opt.bytesin = q->bytesin; | |
41 | ||
42 | - if (gred_wred_mode(table)) { | |
43 | - q->vars.qidlestart = | |
44 | - table->tab[table->def]->vars.qidlestart; | |
45 | - q->vars.qavg = table->tab[table->def]->vars.qavg; | |
46 | - } | |
47 | + if (gred_wred_mode(table)) | |
48 | + gred_load_wred_set(table, q); | |
49 | ||
50 | opt.qave = red_calc_qavg(&q->parms, &q->vars, q->vars.qavg); | |
51 |