From: Paolo Bonzini <pbonzini@redhat.com>
To: Wanpeng Li <kernellwp@gmail.com>,
linux-kernel@vger.kernel.org, kvm@vger.kernel.org
Cc: "Wanpeng Li" <wanpeng.li@hotmail.com>,
"Ingo Molnar" <mingo@kernel.org>,
"Peter Zijlstra (Intel)" <peterz@infradead.org>,
"Rik van Riel" <riel@redhat.com>,
"Thomas Gleixner" <tglx@linutronix.de>,
"Frederic Weisbecker" <fweisbec@gmail.com>,
"Radim Krčmář" <rkrcmar@redhat.com>
Subject: Re: [PATCH v5 3/3] sched/cputime: Add steal time support to full dynticks CPU time accounting
Date: Wed, 8 Jun 2016 12:14:36 +0200 [thread overview]
Message-ID: <b98499f1-6e4e-8997-4cd6-c694347f5d51@redhat.com> (raw)
In-Reply-To: <1465355110-21714-3-git-send-email-wanpeng.li@hotmail.com>
On 08/06/2016 05:05, Wanpeng Li wrote:
> From: Wanpeng Li <wanpeng.li@hotmail.com>
>
> This patch adds guest steal-time support to full dynticks CPU
> time accounting. After the following commit:
>
> ff9a9b4c4334 ("sched, time: Switch VIRT_CPU_ACCOUNTING_GEN to jiffy granularity")
>
> ... time sampling became jiffy based, even if it's still listened
> to ring boundaries, so steal_account_process_tick() is reused
> to account how many 'ticks' are stolen-time, after the last accumulation.
>
> Suggested-by: Rik van Riel <riel@redhat.com>
> Cc: Ingo Molnar <mingo@kernel.org>
> Cc: Peter Zijlstra (Intel) <peterz@infradead.org>
> Cc: Rik van Riel <riel@redhat.com>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: Frederic Weisbecker <fweisbec@gmail.com>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Cc: Radim Krčmář <rkrcmar@redhat.com>
> Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com>
> ---
> v4 -> v5:
> * apply same logic to account_idle_time, so change get_vtime_delta instead
> v3 -> v4:
> * fix grammar errors, thanks Ingo
> * cleanup fragile codes, thanks Ingo
> v2 -> v3:
> * convert steal time jiffies to cputime
> v1 -> v2:
> * fix divide zero bug, thanks Rik
>
> kernel/sched/cputime.c | 13 +++++++++----
> 1 file changed, 9 insertions(+), 4 deletions(-)
>
> diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c
> index 75f98c5..b62f9f8 100644
> --- a/kernel/sched/cputime.c
> +++ b/kernel/sched/cputime.c
> @@ -257,7 +257,7 @@ void account_idle_time(cputime_t cputime)
> cpustat[CPUTIME_IDLE] += (__force u64) cputime;
> }
>
> -static __always_inline bool steal_account_process_tick(void)
> +static __always_inline unsigned long steal_account_process_tick(void)
> {
> #ifdef CONFIG_PARAVIRT
> if (static_key_false(¶virt_steal_enabled)) {
> @@ -279,7 +279,7 @@ static __always_inline bool steal_account_process_tick(void)
> return steal_jiffies;
> }
> #endif
> - return false;
> + return 0;
> }
>
> /*
> @@ -681,12 +681,17 @@ static cputime_t vtime_delta(struct task_struct *tsk)
> static cputime_t get_vtime_delta(struct task_struct *tsk)
> {
> unsigned long now = READ_ONCE(jiffies);
> - unsigned long delta = now - tsk->vtime_snap;
> + cputime_t delta_time, steal_time;
>
> + steal_time = jiffies_to_cputime(steal_account_process_tick());
> + delta_time = jiffies_to_cputime(now - tsk->vtime_snap);
> WARN_ON_ONCE(tsk->vtime_snap_whence == VTIME_INACTIVE);
> tsk->vtime_snap = now;
>
> - return jiffies_to_cputime(delta);
> + if (steal_time < delta_time)
> + delta_time -= steal_time;
> +
> + return delta_time;
I think this is wrong. If you get more steal time than delta time
(which as Rik noticed can happen due to partial jiffies), you will end
up accounting things twice, once in steal_account_process_tick and once
here. In other words you'll get the exact bug you're trying to fix.
The right thing is to add a max_jiffies argument to
steal_account_process_tick. steal_account_process_tick will not attempt
to remove more than max_jiffies. Here you pass delta_jiffies (i.e. now
- tsk->vtime_snap) to steal_account_process_tick, existing callers can
pass ULONG_MAX. You can then
return jiffies_to_cputime(delta_jiffies - steal_jiffies);
in get_vtime_delta and not worry about underflow.
Paolo
> }
>
> static void __vtime_account_system(struct task_struct *tsk)
>
next prev parent reply other threads:[~2016-06-08 10:14 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-08 3:05 [PATCH v5 1/3] KVM: fix steal clock warp during guest cpu hotplug Wanpeng Li
2016-06-08 3:05 ` [PATCH v5 2/3] sched/cputime: Fix prev steal time accouting during " Wanpeng Li
2016-06-08 10:01 ` Paolo Bonzini
2016-06-08 10:59 ` Wanpeng Li
2016-06-08 3:05 ` [PATCH v5 3/3] sched/cputime: Add steal time support to full dynticks CPU time accounting Wanpeng Li
2016-06-08 7:22 ` Ingo Molnar
2016-06-08 7:27 ` Wanpeng Li
2016-06-08 7:52 ` Ingo Molnar
2016-06-08 8:04 ` Wanpeng Li
2016-06-08 8:12 ` Wanpeng Li
2016-06-08 10:14 ` Paolo Bonzini [this message]
2016-06-08 11:11 ` Wanpeng Li
2016-06-13 3:38 ` Wanpeng Li
2016-06-13 7:55 ` Paolo Bonzini
2016-06-13 8:09 ` Wanpeng Li
2016-06-08 19:05 ` Rik van Riel
2016-06-08 23:57 ` Wanpeng Li
2016-06-09 1:20 ` 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=b98499f1-6e4e-8997-4cd6-c694347f5d51@redhat.com \
--to=pbonzini@redhat.com \
--cc=fweisbec@gmail.com \
--cc=kernellwp@gmail.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=riel@redhat.com \
--cc=rkrcmar@redhat.com \
--cc=tglx@linutronix.de \
--cc=wanpeng.li@hotmail.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®