mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Frederic Weisbecker <fweisbec@gmail.com>
To: LKML <linux-kernel@vger.kernel.org>, linaro-sched-sig@lists.linaro.org
Cc: Frederic Weisbecker <fweisbec@gmail.com>,
	Alessio Igor Bogani <abogani@kernel.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Avi Kivity <avi@redhat.com>, Chris Metcalf <cmetcalf@tilera.com>,
	Christoph Lameter <cl@linux.com>,
	Daniel Lezcano <daniel.lezcano@linaro.org>,
	Geoff Levand <geoff@infradead.org>,
	Gilad Ben Yossef <gilad@benyossef.com>,
	Hakan Akkan <hakanakkan@gmail.com>,
	Ingo Molnar <mingo@kernel.org>, Kevin Hilman <khilman@ti.com>,
	Max Krasnyansky <maxk@qualcomm.com>,
	"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Stephen Hemminger <shemminger@vyatta.com>,
	Steven Rostedt <rostedt@goodmis.org>,
	Sven-Thorsten Dietrich <thebigcorporation@gmail.com>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [PATCH 02/41] nohz: Make nohz API agnostic against idle ticks cputime accounting
Date: Tue,  1 May 2012 01:54:36 +0200	[thread overview]
Message-ID: <1335830115-14335-3-git-send-email-fweisbec@gmail.com> (raw)
In-Reply-To: <1335830115-14335-1-git-send-email-fweisbec@gmail.com>

When the timer tick fires, it accounts the new jiffy as either part
of system, user or idle time. This is how we record the cputime
statistics.

But when the tick is stopped from the idle task, we still need
to record the number of jiffies spent tickless until we restart
the tick and fall back to traditional tick-based cputime accounting.

To do this, we take a snapshot of jiffies when the tick is stopped
and compute the difference against the new value of jiffies when
the tick is restarted. Then we account this whole difference to
the idle cputime.

However we are preparing to be able to stop the tick from other places
than idle. So this idle time accounting needs to be performed from
the callers of nohz APIs, not from the nohz APIs because we now want
them to be agnostic against where we stop/restart tick.

Therefore, we pull the tickless idle time accounting out of generic
nohz helpers up to idle entry/exit callers.

Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Alessio Igor Bogani <abogani@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Avi Kivity <avi@redhat.com>
Cc: Chris Metcalf <cmetcalf@tilera.com>
Cc: Christoph Lameter <cl@linux.com>
Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
Cc: Geoff Levand <geoff@infradead.org>
Cc: Gilad Ben Yossef <gilad@benyossef.com>
Cc: Hakan Akkan <hakanakkan@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Kevin Hilman <khilman@ti.com>
Cc: Max Krasnyansky <maxk@qualcomm.com>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephen Hemminger <shemminger@vyatta.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Sven-Thorsten Dietrich <thebigcorporation@gmail.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
---
 kernel/time/tick-sched.c |   37 ++++++++++++++++++++++---------------
 1 files changed, 22 insertions(+), 15 deletions(-)

diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index a1ca479..9373f61 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -402,7 +402,6 @@ static void tick_nohz_stop_sched_tick(struct tick_sched *ts, ktime_t now)
 
 			ts->idle_tick = hrtimer_get_expires(&ts->sched_timer);
 			ts->tick_stopped = 1;
-			ts->idle_jiffies = last_jiffies;
 		}
 
 		ts->idle_sleeps++;
@@ -445,9 +444,13 @@ out:
 static void __tick_nohz_idle_enter(struct tick_sched *ts)
 {
 	ktime_t now;
+	int was_stopped = ts->tick_stopped;
 
 	now = tick_nohz_start_idle(smp_processor_id(), ts);
 	tick_nohz_stop_sched_tick(ts, now);
+
+	if (!was_stopped && ts->tick_stopped)
+		ts->idle_jiffies = ts->last_jiffies;
 }
 
 /**
@@ -548,14 +551,24 @@ static void tick_nohz_restart(struct tick_sched *ts, ktime_t now)
 
 static void tick_nohz_restart_sched_tick(struct tick_sched *ts, ktime_t now)
 {
-#ifndef CONFIG_VIRT_CPU_ACCOUNTING
-	unsigned long ticks;
-#endif
 	/* Update jiffies first */
 	select_nohz_load_balancer(0);
 	tick_do_update_jiffies64(now);
 
+	touch_softlockup_watchdog();
+	/*
+	 * Cancel the scheduled timer and restore the tick
+	 */
+	ts->tick_stopped  = 0;
+	ts->idle_exittime = now;
+
+	tick_nohz_restart(ts, now);
+}
+
+static void tick_nohz_account_idle_ticks(struct tick_sched *ts)
+{
 #ifndef CONFIG_VIRT_CPU_ACCOUNTING
+	unsigned long ticks;
 	/*
 	 * We stopped the tick in idle. Update process times would miss the
 	 * time we slept as update_process_times does only a 1 tick
@@ -568,15 +581,6 @@ static void tick_nohz_restart_sched_tick(struct tick_sched *ts, ktime_t now)
 	if (ticks && ticks < LONG_MAX)
 		account_idle_ticks(ticks);
 #endif
-
-	touch_softlockup_watchdog();
-	/*
-	 * Cancel the scheduled timer and restore the tick
-	 */
-	ts->tick_stopped  = 0;
-	ts->idle_exittime = now;
-
-	tick_nohz_restart(ts, now);
 }
 
 /**
@@ -605,8 +609,10 @@ void tick_nohz_idle_exit(void)
 	if (ts->idle_active)
 		tick_nohz_stop_idle(cpu, now);
 
-	if (ts->tick_stopped)
+	if (ts->tick_stopped) {
 		tick_nohz_restart_sched_tick(ts, now);
+		tick_nohz_account_idle_ticks(ts);
+	}
 
 	local_irq_enable();
 }
@@ -811,7 +817,8 @@ static enum hrtimer_restart tick_sched_timer(struct hrtimer *timer)
 		 */
 		if (ts->tick_stopped) {
 			touch_softlockup_watchdog();
-			ts->idle_jiffies++;
+			if (idle_cpu(cpu))
+				ts->idle_jiffies++;
 		}
 		update_process_times(user_mode(regs));
 		profile_tick(CPU_PROFILING);
-- 
1.7.5.4


  parent reply	other threads:[~2012-04-30 23:55 UTC|newest]

Thread overview: 96+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-04-30 23:54 [RFC][PATCH 00/41] Nohz cpusets v3 (adaptive tickless kernel) Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 01/41] nohz: Separate idle sleeping time accounting from nohz logic Frederic Weisbecker
2012-04-30 23:54 ` Frederic Weisbecker [this message]
2012-04-30 23:54 ` [PATCH 03/41] nohz: Rename ts->idle_tick to ts->last_tick Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 04/41] nohz: Move nohz load balancer selection into idle logic Frederic Weisbecker
2012-05-07 15:51   ` Christoph Lameter
2012-04-30 23:54 ` [PATCH 05/41] nohz: Move ts->idle_calls incrementation into strict " Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 06/41] nohz: Move next idle expiry time record into idle logic area Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 07/41] cpuset: Set up interface for nohz flag Frederic Weisbecker
2012-05-07 15:55   ` Christoph Lameter
2012-05-08 14:20     ` Frederic Weisbecker
2012-05-08 14:50       ` Peter Zijlstra
2012-05-08 15:18         ` Christoph Lameter
2012-05-08 15:27           ` Peter Zijlstra
2012-05-08 15:38             ` Christoph Lameter
2012-05-08 15:48               ` Peter Zijlstra
2012-05-08 15:57                 ` Christoph Lameter
2012-05-08 16:16                   ` Peter Zijlstra
2012-05-08 16:25                     ` Peter Zijlstra
2012-05-08 19:50                     ` Mike Galbraith
2012-05-08 20:45                       ` Christoph Lameter
2012-05-09  4:21                         ` Mike Galbraith
2012-05-09 11:02                           ` Frederic Weisbecker
2012-05-09 11:07                           ` Frederic Weisbecker
2012-05-09 14:23                             ` Christoph Lameter
2012-05-09 14:22                           ` Christoph Lameter
2012-05-09 14:47                             ` Mike Galbraith
2012-05-09 15:05                               ` Christoph Lameter
2012-05-09 15:33                                 ` Mike Galbraith
2012-05-09 15:40                                   ` Christoph Lameter
2012-05-08 15:16       ` Christoph Lameter
2012-04-30 23:54 ` [PATCH 08/41] nohz: Try not to give the timekeeping duty to an adaptive tickless cpu Frederic Weisbecker
2012-05-07 16:02   ` Christoph Lameter
2012-05-08 17:35     ` Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 09/41] x86: New cpuset nohz irq vector Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 10/41] nohz: Adaptive tick stop and restart on nohz cpuset Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 11/41] nohz/cpuset: Don't turn off the tick if rcu needs it Frederic Weisbecker
2012-05-22 17:16   ` Paul E. McKenney
2012-05-23 13:52     ` Frederic Weisbecker
2012-05-23 15:15       ` Paul E. McKenney
2012-05-23 16:06         ` Frederic Weisbecker
2012-05-23 16:27           ` Paul E. McKenney
2012-05-31 16:01             ` Frederic Weisbecker
2012-05-31 22:02               ` Paul E. McKenney
2012-04-30 23:54 ` [PATCH 12/41] nohz/cpuset: Wake up adaptive nohz CPU when a timer gets enqueued Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 13/41] nohz/cpuset: Don't stop the tick if posix cpu timers are running Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 14/41] nohz/cpuset: Restart tick when nohz flag is cleared on cpuset Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 15/41] nohz/cpuset: Restart the tick if printk needs it Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 16/41] rcu: Restart the tick on non-responding adaptive nohz CPUs Frederic Weisbecker
2012-05-22 17:20   ` Paul E. McKenney
2012-05-23 13:57     ` Frederic Weisbecker
2012-05-23 15:20       ` Paul E. McKenney
2012-05-23 15:57         ` Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 17/41] rcu: Restart tick if we enqueue a callback in a nohz/cpuset CPU Frederic Weisbecker
2012-05-22 17:27   ` Paul E. McKenney
2012-05-22 17:30     ` Paul E. McKenney
2012-05-23 14:03       ` Frederic Weisbecker
2012-05-23 16:15         ` Paul E. McKenney
2012-05-31 15:56           ` Frederic Weisbecker
2012-05-23 14:00     ` Frederic Weisbecker
2012-05-23 16:01       ` Paul E. McKenney
2012-04-30 23:54 ` [PATCH 18/41] nohz: Generalize tickless cpu time accounting Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 19/41] nohz/cpuset: Account user and system times in adaptive nohz mode Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 20/41] nohz/cpuset: New API to flush cputimes on nohz cpusets Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 21/41] nohz/cpuset: Flush cputime on threads in nohz cpusets when waiting leader Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 22/41] nohz/cpuset: Flush cputimes on procfs stat file read Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 23/41] nohz/cpuset: Flush cputimes for getrusage() and times() syscalls Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 24/41] x86: Syscall hooks for nohz cpusets Frederic Weisbecker
2012-04-30 23:54 ` [PATCH 25/41] x86: Exception " Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 26/41] x86: Add adaptive tickless hooks on do_notify_resume() Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 27/41] nohz/cpuset: enable addition&removal of cpus while in adaptive nohz mode Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 28/41] nohz: Don't restart the tick before scheduling to idle Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 29/41] sched: Comment on rq->clock correctness in ttwu_do_wakeup() in nohz Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 30/41] sched: Update rq clock on nohz CPU before migrating tasks Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 31/41] sched: Update rq clock on nohz CPU before setting fair group shares Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 32/41] sched: Update rq clock on tickless CPUs before calling check_preempt_curr() Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 33/41] sched: Update rq clock earlier in unthrottle_cfs_rq Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 34/41] sched: Update clock of nohz busiest rq before balancing Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 35/41] sched: Update rq clock before idle balancing Frederic Weisbecker
2012-05-02  3:36   ` Michael Wang
2012-05-02 10:55     ` Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 36/41] sched: Update nohz rq clock before searching busiest group on load balancing Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 37/41] rcu: New rcu_user_enter() and rcu_user_exit() APIs Frederic Weisbecker
2012-05-22 18:23   ` Paul E. McKenney
2012-05-23 14:22     ` Frederic Weisbecker
2012-05-23 16:28       ` Paul E. McKenney
2012-04-30 23:55 ` [PATCH 38/41] rcu: New rcu_user_enter_irq() and rcu_user_exit_irq() APIs Frederic Weisbecker
2012-05-22 18:33   ` Paul E. McKenney
2012-05-23 14:31     ` Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 39/41] rcu: Switch to extended quiescent state in userspace from nohz cpuset Frederic Weisbecker
2012-05-22 18:36   ` Paul E. McKenney
2012-05-22 23:04     ` Paul E. McKenney
2012-05-23 14:33     ` Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 40/41] nohz: Exit RCU idle mode when we schedule before resuming userspace Frederic Weisbecker
2012-04-30 23:55 ` [PATCH 41/41] nohz/cpuset: Disable under some configs Frederic Weisbecker
2012-05-07 22:10 ` [RFC][PATCH 00/41] Nohz cpusets v3 (adaptive tickless kernel) Geoff Levand

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1335830115-14335-3-git-send-email-fweisbec@gmail.com \
    --to=fweisbec@gmail.com \
    --cc=abogani@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=avi@redhat.com \
    --cc=cl@linux.com \
    --cc=cmetcalf@tilera.com \
    --cc=daniel.lezcano@linaro.org \
    --cc=geoff@infradead.org \
    --cc=gilad@benyossef.com \
    --cc=hakanakkan@gmail.com \
    --cc=khilman@ti.com \
    --cc=linaro-sched-sig@lists.linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maxk@qualcomm.com \
    --cc=mingo@kernel.org \
    --cc=paulmck@linux.vnet.ibm.com \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=shemminger@vyatta.com \
    --cc=tglx@linutronix.de \
    --cc=thebigcorporation@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®