On Wed, Jul 31, 2019 at 12:33:55AM +0200, Thomas Gleixner wrote: > +static struct k_itimer *timer_wait_running(struct k_itimer *timer, > + unsigned long *flags) > +{ > + const struct k_clock *kc = READ_ONCE(timer->kclock); > + timer_t timer_id = READ_ONCE(timer->it_id); > + > + /* Prevent kfree(timer) after dropping the lock */ > + rcu_read_lock(); > + unlock_timer(timer, *flags); > + > + if (kc->timer_arm == common_hrtimer_arm) > + hrtimer_cancel_wait_running(&timer->it.real.timer); > + else if (kc == &alarm_clock) > + hrtimer_cancel_wait_running(&timer->it.alarm.alarmtimer.timer);
else WARN(); > + rcu_read_unlock(); > + > + /* Relock the timer. It might be not longer hashed. */ > + return lock_timer(timer_id, flags); > +}