commit a790fb8873f1cbe8b9cb48cb368851e30d3ec172 Author: Patrick McHardy Date: Tue Jul 14 10:19:47 2009 +0200 net-sched: sch_cbq: fix locking in cbq_undelay() The hrtimer callback cbq_undelay() is not serialized against cbq_ovl_delay(). That affects at least q->pmask and q->delay_timer. Lock it proper. Based on patch by Thomas Gleixner Signed-off-by: Patrick McHardy diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c index 23a1676..7c659c6 100644 --- a/net/sched/sch_cbq.c +++ b/net/sched/sch_cbq.c @@ -593,12 +593,16 @@ static enum hrtimer_restart cbq_undelay(struct hrtimer *timer) struct cbq_sched_data *q = container_of(timer, struct cbq_sched_data, delay_timer); struct Qdisc *sch = q->watchdog.qdisc; + spinlock_t *root_lock; psched_time_t now; psched_tdiff_t delay = 0; unsigned pmask; now = psched_get_time(); + root_lock = qdisc_lock(qdisc_root(sch)); + spin_lock(root_lock); + pmask = q->pmask; q->pmask = 0; @@ -615,6 +619,7 @@ static enum hrtimer_restart cbq_undelay(struct hrtimer *timer) delay = tmp; } } + spin_unlock(root_lock); if (delay) { ktime_t time;