| From 5c8919db1dfbcda93d73fa38f876350c4489f572 Mon Sep 17 00:00:00 2001 |
| From: David Ward <david.ward@ll.mit.edu> |
| Date: Sun, 15 Apr 2012 12:31:45 +0000 |
| Subject: [PATCH] net_sched: gred: Fix oops in gred_dump() in WRED mode |
| |
| commit 244b65dbfede788f2fa3fe2463c44d0809e97c6b upstream. |
| |
| A parameter set exists for WRED mode, called wred_set, to hold the same |
| values for qavg and qidlestart across all VQs. The WRED mode values had |
| been previously held in the VQ for the default DP. After these values |
| were moved to wred_set, the VQ for the default DP was no longer created |
| automatically (so that it could be omitted on purpose, to have packets |
| in the default DP enqueued directly to the device without using RED). |
| |
| However, gred_dump() was overlooked during that change; in WRED mode it |
| still reads qavg/qidlestart from the VQ for the default DP, which might |
| not even exist. As a result, this command sequence will cause an oops: |
| |
| tc qdisc add dev $DEV handle $HANDLE parent $PARENT gred setup \ |
| DPs 3 default 2 grio |
| tc qdisc change dev $DEV handle $HANDLE gred DP 0 prio 8 $RED_OPTIONS |
| tc qdisc change dev $DEV handle $HANDLE gred DP 1 prio 8 $RED_OPTIONS |
| |
| This fixes gred_dump() in WRED mode to use the values held in wred_set. |
| |
| Signed-off-by: David Ward <david.ward@ll.mit.edu> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| [PG: in 2.6.34 it is tab[]->parms vs. tab[]->vars of 3.4 baseline] |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| --- |
| net/sched/sch_gred.c | 7 ++----- |
| 1 file changed, 2 insertions(+), 5 deletions(-) |
| |
| diff --git a/net/sched/sch_gred.c b/net/sched/sch_gred.c |
| index 51dcc2aa5c92..7d97904c7dae 100644 |
| --- a/net/sched/sch_gred.c |
| +++ b/net/sched/sch_gred.c |
| @@ -545,11 +545,8 @@ static int gred_dump(struct Qdisc *sch, struct sk_buff *skb) |
| opt.packets = q->packetsin; |
| opt.bytesin = q->bytesin; |
| |
| - if (gred_wred_mode(table)) { |
| - q->parms.qidlestart = |
| - table->tab[table->def]->parms.qidlestart; |
| - q->parms.qavg = table->tab[table->def]->parms.qavg; |
| - } |
| + if (gred_wred_mode(table)) |
| + gred_load_wred_set(table, q); |
| |
| opt.qave = red_calc_qavg(&q->parms, q->parms.qavg); |
| |
| -- |
| 1.8.5.2 |
| |