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 a50364d..8dbc008 100644 (file)
@@ -611,7 +611,7 @@ static void internal_add_timer(struct timer_base *base, struct timer_list *timer
 
 #ifdef CONFIG_DEBUG_OBJECTS_TIMERS
 
-static struct debug_obj_descr timer_debug_descr;
+static const struct debug_obj_descr timer_debug_descr;
 
 static void *timer_debug_hint(void *addr)
 {
@@ -707,7 +707,7 @@ static bool timer_fixup_assert_init(void *addr, enum debug_obj_state state)
        }
 }
 
-static struct debug_obj_descr timer_debug_descr = {
+static const struct debug_obj_descr timer_debug_descr = {
        .name                   = "timer_list",
        .debug_hint             = timer_debug_hint,
        .is_static_object       = timer_is_static_object,
@@ -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);
@@ -794,6 +789,8 @@ static void do_init_timer(struct timer_list *timer,
 {
        timer->entry.pprev = NULL;
        timer->function = func;
+       if (WARN_ON_ONCE(flags & ~TIMER_INIT_FLAGS))
+               flags &= TIMER_INIT_FLAGS;
        timer->flags = flags | raw_smp_processor_id();
        lockdep_init_map(&timer->lockdep_map, name, key, 0);
 }
@@ -1286,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);
 
                /*
@@ -1370,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);
 
@@ -1696,34 +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;
-
-       /* 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();
-
-       /* The current CPU might make use of net randoms without receiving IRQs
-        * to renew them often enough. Let's update the net_rand_state from a
-        * non-constant value that's not affine to the number of calls to make
-        * sure it's updated when there's some activity (we don't care in idle).
-        */
-       this_cpu_add(net_rand_state.s1, rol32(jiffies, 24) + user_tick);
-}
-
 /**
  * __run_timers - run all expired timers (if any) on this CPU.
  * @base: the timer vector to be processed.
@@ -1773,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]);
 
@@ -1790,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.