فهرست منبع

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()
Linus Torvalds 11 سال پیش
والد
کامیت
87a54cae0b
2فایلهای تغییر یافته به همراه5 افزوده شده و 2 حذف شده
  1. 1 1
      kernel/time/tick-common.c
  2. 4 1
      kernel/time/tick-sched.c

+ 1 - 1
kernel/time/tick-common.c

@@ -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);

+ 4 - 1
kernel/time/tick-sched.c

@@ -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)
 	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();