diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c index 996b919d82c79..ab8263d97c5ba 100644 --- a/net/sched/sch_netem.c +++ b/net/sched/sch_netem.c @@ -506,6 +506,7 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) (skb->ip_summed == CHECKSUM_PARTIAL && skb_checksum_help(skb))) { rc = qdisc_drop(skb, sch); + skb = NULL; goto finish_segs; } @@ -576,9 +577,10 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) finish_segs: if (segs) { unsigned int len, last_len; - int nb = 0; + int nb; - len = skb->len; + len = skb ? skb->len : 0; + nb = skb ? 1 : 0; while (segs) { skb2 = segs->next; @@ -595,7 +597,8 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) } segs = skb2; } - qdisc_tree_reduce_backlog(sch, -nb, prev_len - len); + /* Parent qdiscs accounted for 1 skb of size @prev_len */ + qdisc_tree_reduce_backlog(sch, -(nb - 1), -(len - prev_len)); } return NET_XMIT_SUCCESS; }