Messages in this thread Patch in this message | | | From | Yunhong Jiang <> | Subject | [PATCH] nohz: make the idle_entrytime/idle_exittime correct | Date | Wed, 16 Sep 2015 16:19:43 -0700 |
| |
Currently the idle_entrytime is updated on idle_entry, idle_exit and get_cpu_idle/iowait_time_us() with non-NULL parameter. This makes the idle_entrytime not the real entrytime anymore. The idle_exittiime is updated when exit tickless state, which can be idle tickless or full tickless.
Change the idle_entrytime to be updated only when enter idle, the idle_exittime to be updated only when exit idle. Update the get_cpu_idle_iowait_time_us() accordingly.
Signed-off-by: Yunhong Jiang <yunhong.jiang@linux.intel.com> --- kernel/time/tick-sched.c | 44 ++++++++++++++++---------------------------- 1 file changed, 16 insertions(+), 28 deletions(-)
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index c792429e98c6..f8470ff20f77 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c @@ -448,7 +448,7 @@ static void tick_nohz_update_jiffies(ktime_t now) * Updates the per cpu time idle statistics counters */ static void -update_ts_time_stats(int cpu, struct tick_sched *ts, ktime_t now, u64 *last_update_time) +update_ts_time_stats(int cpu, struct tick_sched *ts, ktime_t now) { ktime_t delta; @@ -458,17 +458,13 @@ update_ts_time_stats(int cpu, struct tick_sched *ts, ktime_t now, u64 *last_upda ts->iowait_sleeptime = ktime_add(ts->iowait_sleeptime, delta); else ts->idle_sleeptime = ktime_add(ts->idle_sleeptime, delta); - ts->idle_entrytime = now; } - - if (last_update_time) - *last_update_time = ktime_to_us(now); - } static void tick_nohz_stop_idle(struct tick_sched *ts, ktime_t now) { - update_ts_time_stats(smp_processor_id(), ts, now, NULL); + update_ts_time_stats(smp_processor_id(), ts, now); + ts->idle_exittime = now; ts->idle_active = 0; sched_clock_idle_wakeup_event(0); @@ -507,21 +503,16 @@ u64 get_cpu_idle_time_us(int cpu, u64 *last_update_time) return -1; now = ktime_get(); - if (last_update_time) { - update_ts_time_stats(cpu, ts, now, last_update_time); - idle = ts->idle_sleeptime; - } else { - if (ts->idle_active && !nr_iowait_cpu(cpu)) { - ktime_t delta = ktime_sub(now, ts->idle_entrytime); + idle = ts->idle_sleeptime; + if (ts->idle_active && !nr_iowait_cpu(cpu)) { + ktime_t delta = ktime_sub(now, ts->idle_entrytime); - idle = ktime_add(ts->idle_sleeptime, delta); - } else { - idle = ts->idle_sleeptime; - } + idle = ktime_add(ts->idle_sleeptime, delta); } + if (last_update_time) + *last_update_time = ktime_to_us(now); return ktime_to_us(idle); - } EXPORT_SYMBOL_GPL(get_cpu_idle_time_us); @@ -548,19 +539,16 @@ u64 get_cpu_iowait_time_us(int cpu, u64 *last_update_time) return -1; now = ktime_get(); - if (last_update_time) { - update_ts_time_stats(cpu, ts, now, last_update_time); - iowait = ts->iowait_sleeptime; - } else { - if (ts->idle_active && nr_iowait_cpu(cpu) > 0) { - ktime_t delta = ktime_sub(now, ts->idle_entrytime); + iowait = ts->iowait_sleeptime; + if (ts->idle_active && nr_iowait_cpu(cpu) > 0) { + ktime_t delta = ktime_sub(now, ts->idle_entrytime); - iowait = ktime_add(ts->iowait_sleeptime, delta); - } else { - iowait = ts->iowait_sleeptime; - } + iowait = ktime_add(ts->iowait_sleeptime, delta); } + if (last_update_time) + *last_update_time = ktime_to_us(now); + return ktime_to_us(iowait); } EXPORT_SYMBOL_GPL(get_cpu_iowait_time_us); -- 1.8.3.1
| |