Merge tag 'for-5.11/drivers-2020-12-14' of git://git.kernel.dk/linux-block
[linux-2.6-microblaze.git] / kernel / time / timer.c
index de37e33..8dbc008 100644 (file)
@@ -732,11 +732,6 @@ static inline void debug_timer_deactivate(struct timer_list *timer)
        debug_object_deactivate(timer, &timer_debug_descr);
 }
 
-static inline void debug_timer_free(struct timer_list *timer)
-{
-       debug_object_free(timer, &timer_debug_descr);
-}
-
 static inline void debug_timer_assert_init(struct timer_list *timer)
 {
        debug_object_assert_init(timer, &timer_debug_descr);
@@ -1288,7 +1283,7 @@ static void del_timer_wait_running(struct timer_list *timer)
        u32 tf;
 
        tf = READ_ONCE(timer->flags);
-       if (!(tf & TIMER_MIGRATING)) {
+       if (!(tf & (TIMER_MIGRATING | TIMER_IRQSAFE))) {
                struct timer_base *base = get_timer_base(tf);
 
                /*
@@ -1372,6 +1367,13 @@ int del_timer_sync(struct timer_list *timer)
         */
        WARN_ON(in_irq() && !(timer->flags & TIMER_IRQSAFE));
 
+       /*
+        * Must be able to sleep on PREEMPT_RT because of the slowpath in
+        * del_timer_wait_running().
+        */
+       if (IS_ENABLED(CONFIG_PREEMPT_RT) && !(timer->flags & TIMER_IRQSAFE))
+               lockdep_assert_preemption_enabled();
+
        do {
                ret = try_to_del_timer_sync(timer);
 
@@ -1698,29 +1700,6 @@ void timer_clear_idle(void)
 }
 #endif
 
-/*
- * Called from the timer interrupt handler to charge one tick to the current
- * process.  user_tick is 1 if the tick is user time, 0 for system.
- */
-void update_process_times(int user_tick)
-{
-       struct task_struct *p = current;
-
-       PRANDOM_ADD_NOISE(jiffies, user_tick, p, 0);
-
-       /* Note: this timer irq context must be accounted for as well. */
-       account_process_tick(p, user_tick);
-       run_local_timers();
-       rcu_sched_clock_irq(user_tick);
-#ifdef CONFIG_IRQ_WORK
-       if (in_irq())
-               irq_work_tick();
-#endif
-       scheduler_tick();
-       if (IS_ENABLED(CONFIG_POSIX_TIMERS))
-               run_posix_cpu_timers();
-}
-
 /**
  * __run_timers - run all expired timers (if any) on this CPU.
  * @base: the timer vector to be processed.
@@ -1770,7 +1749,7 @@ static __latent_entropy void run_timer_softirq(struct softirq_action *h)
 /*
  * Called by the local, per-CPU timer interrupt on SMP.
  */
-void run_local_timers(void)
+static void run_local_timers(void)
 {
        struct timer_base *base = this_cpu_ptr(&timer_bases[BASE_STD]);
 
@@ -1787,6 +1766,29 @@ void run_local_timers(void)
        raise_softirq(TIMER_SOFTIRQ);
 }
 
+/*
+ * Called from the timer interrupt handler to charge one tick to the current
+ * process.  user_tick is 1 if the tick is user time, 0 for system.
+ */
+void update_process_times(int user_tick)
+{
+       struct task_struct *p = current;
+
+       PRANDOM_ADD_NOISE(jiffies, user_tick, p, 0);
+
+       /* Note: this timer irq context must be accounted for as well. */
+       account_process_tick(p, user_tick);
+       run_local_timers();
+       rcu_sched_clock_irq(user_tick);
+#ifdef CONFIG_IRQ_WORK
+       if (in_irq())
+               irq_work_tick();
+#endif
+       scheduler_tick();
+       if (IS_ENABLED(CONFIG_POSIX_TIMERS))
+               run_posix_cpu_timers();
+}
+
 /*
  * Since schedule_timeout()'s timer is defined on the stack, it must store
  * the target task on the stack as well.