From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753094AbbIPX1x (ORCPT ); Wed, 16 Sep 2015 19:27:53 -0400 Received: from mga01.intel.com ([192.55.52.88]:30169 "EHLO mga01.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752892AbbIPX1H (ORCPT ); Wed, 16 Sep 2015 19:27:07 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.17,542,1437462000"; d="scan'208";a="563117612" From: Yunhong Jiang To: tglx@linutronix.de Cc: linux-kernel@vger.kernel.org Subject: [PATCH] nohz: make the idle_entrytime/idle_exittime correct Date: Wed, 16 Sep 2015 16:19:43 -0700 Message-Id: <1442445583-10240-1-git-send-email-yunhong.jiang@linux.intel.com> X-Mailer: git-send-email 1.8.3.1 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- 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