|
@@ -361,8 +361,8 @@ void __init tick_nohz_init(void)
|
|
|
/*
|
|
|
* NO HZ enabled ?
|
|
|
*/
|
|
|
-int tick_nohz_enabled __read_mostly = 1;
|
|
|
-
|
|
|
+static int tick_nohz_enabled __read_mostly = 1;
|
|
|
+int tick_nohz_active __read_mostly;
|
|
|
/*
|
|
|
* Enable / Disable tickless mode
|
|
|
*/
|
|
@@ -465,7 +465,7 @@ u64 get_cpu_idle_time_us(int cpu, u64 *last_update_time)
|
|
|
struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);
|
|
|
ktime_t now, idle;
|
|
|
|
|
|
- if (!tick_nohz_enabled)
|
|
|
+ if (!tick_nohz_active)
|
|
|
return -1;
|
|
|
|
|
|
now = ktime_get();
|
|
@@ -506,7 +506,7 @@ u64 get_cpu_iowait_time_us(int cpu, u64 *last_update_time)
|
|
|
struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);
|
|
|
ktime_t now, iowait;
|
|
|
|
|
|
- if (!tick_nohz_enabled)
|
|
|
+ if (!tick_nohz_active)
|
|
|
return -1;
|
|
|
|
|
|
now = ktime_get();
|
|
@@ -711,8 +711,10 @@ static bool can_stop_idle_tick(int cpu, struct tick_sched *ts)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- if (unlikely(ts->nohz_mode == NOHZ_MODE_INACTIVE))
|
|
|
+ if (unlikely(ts->nohz_mode == NOHZ_MODE_INACTIVE)) {
|
|
|
+ ts->sleep_length = (ktime_t) { .tv64 = NSEC_PER_SEC/HZ };
|
|
|
return false;
|
|
|
+ }
|
|
|
|
|
|
if (need_resched())
|
|
|
return false;
|
|
@@ -799,11 +801,6 @@ void tick_nohz_idle_enter(void)
|
|
|
local_irq_disable();
|
|
|
|
|
|
ts = &__get_cpu_var(tick_cpu_sched);
|
|
|
- /*
|
|
|
- * set ts->inidle unconditionally. even if the system did not
|
|
|
- * switch to nohz mode the cpu frequency governers rely on the
|
|
|
- * update of the idle time accounting in tick_nohz_start_idle().
|
|
|
- */
|
|
|
ts->inidle = 1;
|
|
|
__tick_nohz_idle_enter(ts);
|
|
|
|
|
@@ -973,7 +970,7 @@ static void tick_nohz_switch_to_nohz(void)
|
|
|
struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
|
|
|
ktime_t next;
|
|
|
|
|
|
- if (!tick_nohz_enabled)
|
|
|
+ if (!tick_nohz_active)
|
|
|
return;
|
|
|
|
|
|
local_irq_disable();
|
|
@@ -981,7 +978,7 @@ static void tick_nohz_switch_to_nohz(void)
|
|
|
local_irq_enable();
|
|
|
return;
|
|
|
}
|
|
|
-
|
|
|
+ tick_nohz_active = 1;
|
|
|
ts->nohz_mode = NOHZ_MODE_LOWRES;
|
|
|
|
|
|
/*
|
|
@@ -1139,8 +1136,10 @@ void tick_setup_sched_timer(void)
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_NO_HZ_COMMON
|
|
|
- if (tick_nohz_enabled)
|
|
|
+ if (tick_nohz_enabled) {
|
|
|
ts->nohz_mode = NOHZ_MODE_HIGHRES;
|
|
|
+ tick_nohz_active = 1;
|
|
|
+ }
|
|
|
#endif
|
|
|
}
|
|
|
#endif /* HIGH_RES_TIMERS */
|