diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index c44da48de7dfddf32b81c1e062fc7747371d28b1..c9cd5086bd544e1be75b594fa34d8c5113f6526e 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h @@ -421,6 +421,11 @@ static inline struct Qdisc *qdisc_root(const struct Qdisc *qdisc) return q; } +static inline struct Qdisc *qdisc_root_bh(const struct Qdisc *qdisc) +{ + return rcu_dereference_bh(qdisc->dev_queue->qdisc); +} + static inline struct Qdisc *qdisc_root_sleeping(const struct Qdisc *qdisc) { return qdisc->dev_queue->qdisc_sleeping; diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c index 86350fe5cfc8f73ba93c32b053018c5e3bfdbada..15f8f24c190d4600a61f07a6acda86e29c433275 100644 --- a/net/sched/sch_netem.c +++ b/net/sched/sch_netem.c @@ -474,7 +474,7 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch, * skb will be queued. */ if (count > 1 && (skb2 = skb_clone(skb, GFP_ATOMIC)) != NULL) { - struct Qdisc *rootq = qdisc_root(sch); + struct Qdisc *rootq = qdisc_root_bh(sch); u32 dupsave = q->duplicate; /* prevent duplicating a dup... */ q->duplicate = 0;