diff options
Diffstat (limited to 'kernel/timer.c')
-rw-r--r-- | kernel/timer.c | 46 |
1 files changed, 2 insertions, 44 deletions
diff --git a/kernel/timer.c b/kernel/timer.c index 2059f6b27595..34fd2dbba3e3 100644 --- a/kernel/timer.c +++ b/kernel/timer.c @@ -1464,6 +1464,8 @@ static void run_timer_softirq(struct softirq_action *h) { struct tvec_base *base = __this_cpu_read(tvec_bases); + hrtimer_run_pending(); + #if defined(CONFIG_IRQ_WORK) && defined(CONFIG_PREEMPT_RT_FULL) irq_work_run(); #endif @@ -1477,52 +1479,8 @@ static void run_timer_softirq(struct softirq_action *h) */ void run_local_timers(void) { - struct tvec_base *base = __this_cpu_read(tvec_bases); - hrtimer_run_queues(); - /* - * We can access this lockless as we are in the timer - * interrupt. If there are no timers queued, nothing to do in - * the timer softirq. - */ -#ifdef CONFIG_PREEMPT_RT_FULL - -#ifndef CONFIG_SMP - /* - * The spin_do_trylock() later may fail as the lock may be hold before - * the interrupt arrived. The spin-lock debugging code will raise a - * warning if the try_lock fails on UP. Since this is only an - * optimization for the FULL_NO_HZ case (not to run the timer softirq on - * an nohz_full CPU) we don't really care and shedule the softirq. - */ raise_softirq(TIMER_SOFTIRQ); - return; -#endif - - /* On RT, irq work runs from softirq */ - if (irq_work_needs_cpu()) { - raise_softirq(TIMER_SOFTIRQ); - return; - } - - if (!spin_do_trylock(&base->lock)) { - raise_softirq(TIMER_SOFTIRQ); - return; - } -#endif - - if (!base->active_timers) - goto out; - - /* Check whether the next pending timer has expired */ - if (time_before_eq(base->next_timer, jiffies)) - raise_softirq(TIMER_SOFTIRQ); -out: -#ifdef CONFIG_PREEMPT_RT_FULL - rt_spin_unlock_after_trylock_in_irq(&base->lock); -#endif - /* The ; ensures that gcc won't complain in the !RT case */ - ; } #ifdef __ARCH_WANT_SYS_ALARM |