From: Stephen Hemminger Date: Wed, 8 Jun 2005 16:30:09 +0000 (-0700) Subject: [PATCH] netem: duplication fix X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=03cc725bc4846ac0f9ed6203b6ac150980763359;p=thirdparty%2Fkernel%2Fstable.git [PATCH] netem: duplication fix Netem duplication can cause infinite loop in qdisc_run because the qlen of the parent qdisc is not affected by the duplication. Signed-off-by: Stephen Hemminger Signed-off-by: Chris Wright Signed-off-by: Greg Kroah-Hartman --- diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c index c8259cbe652c3..05b4b83983614 100644 --- a/net/sched/sch_netem.c +++ b/net/sched/sch_netem.c @@ -184,10 +184,15 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) /* Random duplication */ if (q->duplicate && q->duplicate >= get_crandom(&q->dup_cor)) { struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC); - - pr_debug("netem_enqueue: dup %p\n", skb2); - if (skb2) - delay_skb(sch, skb2); + if (skb2) { + struct Qdisc *rootq = sch->dev->qdisc; + u32 dupsave = q->duplicate; + + /* prevent duplicating a dup... */ + q->duplicate = 0; + rootq->enqueue(skb2, rootq); + q->duplicate = dupsave; + } } /* If doing simple delay then gap == 0 so all packets