Commit 87a54cae authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull timer fixes from Thomas Gleixner:
 "Viresh unearthed the following three hickups in the timer/timekeeping
  code:

   - Negated check for the result of a clock event selection

   - A missing early exit in the jiffies update path which causes
     update_wall_time to be called for nothing causing lock contention
     and wasted cycles in the timer interrupt

   - Checking a variable in the NOHZ code enable code for true which can
     only be set by that very code after the check succeeds.  That
     results in a rock solid runtime disablement of that feature"

* 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  tick-sched: Check tick_nohz_enabled in tick_nohz_switch_to_nohz()
  tick-sched: Don't call update_wall_time() when delta is lesser than tick_period
  tick-common: Fix wrong check in tick_check_replacement()
parents 81cef0fe 27630532
...@@ -276,7 +276,7 @@ static bool tick_check_preferred(struct clock_event_device *curdev, ...@@ -276,7 +276,7 @@ static bool tick_check_preferred(struct clock_event_device *curdev,
bool tick_check_replacement(struct clock_event_device *curdev, bool tick_check_replacement(struct clock_event_device *curdev,
struct clock_event_device *newdev) struct clock_event_device *newdev)
{ {
if (tick_check_percpu(curdev, newdev, smp_processor_id())) if (!tick_check_percpu(curdev, newdev, smp_processor_id()))
return false; return false;
return tick_check_preferred(curdev, newdev); return tick_check_preferred(curdev, newdev);
......
...@@ -84,6 +84,9 @@ static void tick_do_update_jiffies64(ktime_t now) ...@@ -84,6 +84,9 @@ static void tick_do_update_jiffies64(ktime_t now)
/* Keep the tick_next_period variable up to date */ /* Keep the tick_next_period variable up to date */
tick_next_period = ktime_add(last_jiffies_update, tick_period); tick_next_period = ktime_add(last_jiffies_update, tick_period);
} else {
write_sequnlock(&jiffies_lock);
return;
} }
write_sequnlock(&jiffies_lock); write_sequnlock(&jiffies_lock);
update_wall_time(); update_wall_time();
...@@ -967,7 +970,7 @@ static void tick_nohz_switch_to_nohz(void) ...@@ -967,7 +970,7 @@ static void tick_nohz_switch_to_nohz(void)
struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched); struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
ktime_t next; ktime_t next;
if (!tick_nohz_active) if (!tick_nohz_enabled)
return; return;
local_irq_disable(); local_irq_disable();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment