On 30 Sep 2013, at 13:45, Mike Day wrote: > I've applied this set to Paolo's rcu tree - I see a couple of routines > that appear to need the active_timers_lock: > > (line 137 of qemu-timer.c in my tree) > void qemu_clock_notify(QEMUClockType type) > { > QEMUTimerList *timer_list; > QEMUClock *clock = qemu_clock_ptr(type); > QLIST_FOREACH(timer_list, &clock->timerlists, list) { > timerlist_notify(timer_list); > } > } > > (line 228 of qemu-timer.c in my tree) > int64_t qemu_clock_deadline_ns_all(QEMUClockType type) > { > int64_t deadline = -1; > QEMUTimerList *timer_list; > QEMUClock *clock = qemu_clock_ptr(type); > QLIST_FOREACH(timer_list, &clock->timerlists, list) { > deadline = qemu_soonest_timeout(deadline, > timerlist_deadline_ns(timer_list)); > } > return deadline; > } > > I think these functions are always called now with the BQL held, so I > wonder if they are good candidates for RCU?
These routines iterate through the list of timerlists held by a clock. They do not iterate through the list of active timers in a timer list. I believe the latter is what active_timers_lock protects. The list of timers attached to a clock is only modified when timers are created and deleted which is (currently) under the BQL. -- Alex Bligh