mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Frederic Weisbecker <fweisbec@gmail.com>
To: Ingo Molnar <mingo@kernel.org>, Thomas Gleixner <tglx@linutronix.de>
Cc: LKML <linux-kernel@vger.kernel.org>,
	Frederic Weisbecker <fweisbec@gmail.com>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Peter Zijlstra <peterz@infradead.org>
Subject: [PATCH 4/6] cputime: Fix jiffies based cputime assumption on steal accounting
Date: Wed, 12 Mar 2014 03:10:00 +0100	[thread overview]
Message-ID: <1394590202-772-5-git-send-email-fweisbec@gmail.com> (raw)
In-Reply-To: <1394590202-772-1-git-send-email-fweisbec@gmail.com>

The steal guest time accounting code assumes that cputime_t is based on
jiffies. So when CONFIG_NO_HZ_FULL=y, which implies that cputime_t
is based on nsecs, steal_account_process_tick() passes the delta in
jiffies to account_steal_time() which then accounts it as if it's a
value in nsecs.

As a result, accounting 1 second of steal time (with HZ=100 that would
be 100 jiffies) is spuriously accounted as 100 nsecs.

As such /proc/stat may report 0 values of steal time even when two
guests have run concurrently for a few seconds on the same host and
same CPU.

In order to fix this, lets convert the nsecs based steal delta to
cputime instead of jiffies by using the right conversion API.

Given that the steal time is stored in cputime_t and this type can have
a smaller granularity than nsecs, we only account the rounded converted
value and leave the remaining nsecs for the next deltas.

Reported-by: Huiqingding <huding@redhat.com>
Reported-by: Marcelo Tosatti <mtosatti@redhat.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Marcelo Tosatti <mtosatti@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Rik van Riel <riel@redhat.com>
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
---
 kernel/sched/cputime.c | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c
index 9994791..c91b097 100644
--- a/kernel/sched/cputime.c
+++ b/kernel/sched/cputime.c
@@ -258,16 +258,22 @@ static __always_inline bool steal_account_process_tick(void)
 {
 #ifdef CONFIG_PARAVIRT
 	if (static_key_false(&paravirt_steal_enabled)) {
-		u64 steal, st = 0;
+		u64 steal;
+		cputime_t steal_ct;
 
 		steal = paravirt_steal_clock(smp_processor_id());
 		steal -= this_rq()->prev_steal_time;
 
-		st = steal_ticks(steal);
-		this_rq()->prev_steal_time += st * TICK_NSEC;
+		/*
+		 * cputime_t may be less precise than nsecs (eg: if it's
+		 * based on jiffies). Lets cast the result to cputime
+		 * granularity and account the rest on the next rounds.
+		 */
+		steal_ct = nsecs_to_cputime(steal);
+		this_rq()->prev_steal_time += cputime_to_nsecs(steal_ct);
 
-		account_steal_time(st);
-		return st;
+		account_steal_time(steal_ct);
+		return steal_ct;
 	}
 #endif
 	return false;
-- 
1.8.3.1


  parent reply	other threads:[~2014-03-12  2:10 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-03-12  2:09 [GIT PULL] timers updates for 3.15 Frederic Weisbecker
2014-03-12  2:09 ` [PATCH 1/6] cputime: Fix nsecs_to_cputime() return type cast Frederic Weisbecker
2014-03-12  2:09 ` [PATCH 2/6] cputime: Default implementation of nsecs -> cputime conversion Frederic Weisbecker
2014-03-12  2:09 ` [PATCH 3/6] cputime: Bring cputime -> nsecs conversion Frederic Weisbecker
2014-03-12  2:10 ` Frederic Weisbecker [this message]
2014-03-12  2:10 ` [PATCH 5/6] sched: Remove needless round trip nsecs <-> tick conversion of steal time Frederic Weisbecker
2014-03-12  2:10 ` [PATCH 6/6] arch: Remove stub cputime.h headers Frederic Weisbecker
2014-03-12  9:44   ` Peter Zijlstra
2014-03-12 15:23     ` Frederic Weisbecker
2014-03-12 15:26       ` Peter Zijlstra
2014-03-12 15:47         ` Frederic Weisbecker
2014-03-12 16:23     ` [PATCH v2] " Frederic Weisbecker
  -- strict thread matches above, loose matches on Subject: below --
2014-03-06 17:56 [PATCH 0/6] cputime: Fixes and cleanups on steal time accounting Frederic Weisbecker
2014-03-06 17:56 ` [PATCH 4/6] cputime: Fix jiffies based cputime assumption on steal accounting Frederic Weisbecker
2014-03-06 19:36   ` Rik van Riel

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=1394590202-772-5-git-send-email-fweisbec@gmail.com \
    --to=fweisbec@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=mtosatti@redhat.com \
    --cc=peterz@infradead.org \
    --cc=tglx@linutronix.de \
    /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

Powered by JetHome