aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Westphal <fw@strlen.de>2011-08-09 02:04:43 +0000
committerGreg Kroah-Hartman <gregkh@suse.de>2011-10-03 11:40:53 -0700
commit621ad27ca68f318db0d416e5c1401d35c95c6d91 (patch)
tree47e1b58900fe6cf69ba890a0a5fe7749d783b3a9
parent018660661b23526bbc9ebcd2dc260453ed1f49d5 (diff)
downloadkernel_samsung_smdk4412-621ad27ca68f318db0d416e5c1401d35c95c6d91.tar.gz
kernel_samsung_smdk4412-621ad27ca68f318db0d416e5c1401d35c95c6d91.tar.bz2
kernel_samsung_smdk4412-621ad27ca68f318db0d416e5c1401d35c95c6d91.zip
net_sched: prio: use qdisc_dequeue_peeked
[ Upstream commit 3557619f0f6f7496ed453d4825e24958ab1884e0 ] commit 07bd8df5df4369487812bf85a237322ff3569b77 (sch_sfq: fix peek() implementation) changed sfq to use generic peek helper. This makes HFSC complain about a non-work-conserving child qdisc, if prio with sfq child is used within hfsc: hfsc peeks into prio qdisc, which will then peek into sfq. returned skb is stashed in sch->gso_skb. Next, hfsc tries to dequeue from prio, but prio will call sfq dequeue directly, which may return NULL instead of previously peeked-at skb. Have prio call qdisc_dequeue_peeked, so sfq->dequeue() is not called in this case. Cc: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--net/sched/sch_prio.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c
index 2a318f2dc3e..b5d56a22b1d 100644
--- a/net/sched/sch_prio.c
+++ b/net/sched/sch_prio.c
@@ -112,7 +112,7 @@ static struct sk_buff *prio_dequeue(struct Qdisc *sch)
for (prio = 0; prio < q->bands; prio++) {
struct Qdisc *qdisc = q->queues[prio];
- struct sk_buff *skb = qdisc->dequeue(qdisc);
+ struct sk_buff *skb = qdisc_dequeue_peeked(qdisc);
if (skb) {
qdisc_bstats_update(sch, skb);
sch->q.qlen--;