static void expire_timers(struct timer_base *base)
{
struct hlist_head *head;
+ int expCount = base->expired_count;
- while (base->expired_count--) {
- head = base->expired_lists + base->expired_count;
+ while (expCount--) {
+ head = base->expired_lists + expCount;
__expire_timers(base, head);
}
base->expired_count = 0;
}
On Fri, 26 May 2017, Haris Okanovic wrote:
Anna-Maria,
Look-ahead is implemented by tick_find_expired() and expiry by __run_timers(),
both of which hold timer_base::lock (raw spin lock) while running. Those two
routines shouldn't be able to run simultaneously on the same timer_base. Are
you sure the race isn't in another code path?
It happens when softirq runs and drops the spinlock to call the timer
function. And from there stuff goes down the drain.
Anna-Maria will send you the test case on monday.
Thanks,
tglx