All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Zijlstra <peterz@infradead.org>
To: Glauber Costa <glommer@redhat.com>
Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
	Rik van Riel <riel@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Avi Kivity <avi@redhat.com>,
	Anthony Liguori <aliguori@us.ibm.com>,
	Eric B Munson <emunson@mgebm.net>,
	Venkatesh Pallipadi <venki@google.com>
Subject: Re: [PATCH v5 7/9] KVM-GST: KVM Steal time accounting
Date: Tue, 05 Jul 2011 11:11:39 +0200	[thread overview]
Message-ID: <1309857099.3282.46.camel@twins> (raw)
In-Reply-To: <1309793548-16714-8-git-send-email-glommer@redhat.com>

On Mon, 2011-07-04 at 11:32 -0400, Glauber Costa wrote:
> This patch accounts steal time time in account_process_tick.
> If one or more tick is considered stolen in the current
> accounting cycle, user/system accounting is skipped. Idle is fine,
> since the hypervisor does not report steal time if the guest
> is halted.
> 
> Accounting steal time from the core scheduler give us the
> advantage of direct acess to the runqueue data. In a later
> opportunity, it can be used to tweak cpu power and make
> the scheduler aware of the time it lost.
> 
> Signed-off-by: Glauber Costa <glommer@redhat.com>
> CC: Rik van Riel <riel@redhat.com>
> CC: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

Acked-by: Peter Zijlstra <peterz@infradead.org>

Venki, can you have a look at that irqtime_account_process_tick(), I
think adding the steal time up front like this is fine, because it
suffers from the same 'problem' as both irqtime thingies.

> CC: Avi Kivity <avi@redhat.com>
> CC: Anthony Liguori <aliguori@us.ibm.com>
> CC: Eric B Munson <emunson@mgebm.net>
> ---
>  kernel/sched.c |   41 +++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 41 insertions(+), 0 deletions(-)
> 
> diff --git a/kernel/sched.c b/kernel/sched.c
> index 3f2e502..aa6c030 100644
> --- a/kernel/sched.c
> +++ b/kernel/sched.c
> @@ -75,6 +75,7 @@
>  #include <asm/tlb.h>
>  #include <asm/irq_regs.h>
>  #include <asm/mutex.h>
> +#include <asm/paravirt.h>
>  
>  #include "sched_cpupri.h"
>  #include "workqueue_sched.h"
> @@ -528,6 +529,9 @@ struct rq {
>  #ifdef CONFIG_IRQ_TIME_ACCOUNTING
>  	u64 prev_irq_time;
>  #endif
> +#ifdef CONFIG_PARAVIRT
> +	u64 prev_steal_time;
> +#endif
>  
>  	/* calc_load related fields */
>  	unsigned long calc_load_update;
> @@ -1953,6 +1957,18 @@ void account_system_vtime(struct task_struct *curr)
>  }
>  EXPORT_SYMBOL_GPL(account_system_vtime);
>  
> +#endif /* CONFIG_IRQ_TIME_ACCOUNTING */
> +
> +#ifdef CONFIG_PARAVIRT
> +static inline u64 steal_ticks(u64 steal)
> +{
> +	if (unlikely(steal > NSEC_PER_SEC))
> +		return div_u64(steal, TICK_NSEC);
> +
> +	return __iter_div_u64_rem(steal, TICK_NSEC, &steal);
> +}
> +#endif
> +
>  static void update_rq_clock_task(struct rq *rq, s64 delta)
>  {
>  	s64 irq_delta;
> @@ -3845,6 +3861,25 @@ void account_idle_time(cputime_t cputime)
>  		cpustat->idle = cputime64_add(cpustat->idle, cputime64);
>  }
>  
> +static __always_inline bool steal_account_process_tick(void)
> +{
> +#ifdef CONFIG_PARAVIRT
> +	if (static_branch(&paravirt_steal_enabled)) {
> +		u64 steal, st = 0;
> +
> +		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;
> +
> +		account_steal_time(st);
> +		return st;
> +	}
> +#endif
> +	return false;
> +}
> +
>  #ifndef CONFIG_VIRT_CPU_ACCOUNTING
>  
>  #ifdef CONFIG_IRQ_TIME_ACCOUNTING
> @@ -3876,6 +3911,9 @@ static void irqtime_account_process_tick(struct task_struct *p, int user_tick,
>  	cputime64_t tmp = cputime_to_cputime64(cputime_one_jiffy);
>  	struct cpu_usage_stat *cpustat = &kstat_this_cpu.cpustat;
>  
> +	if (steal_account_process_tick())
> +		return;
> +
>  	if (irqtime_account_hi_update()) {
>  		cpustat->irq = cputime64_add(cpustat->irq, tmp);
>  	} else if (irqtime_account_si_update()) {
> @@ -3929,6 +3967,9 @@ void account_process_tick(struct task_struct *p, int user_tick)
>  		return;
>  	}
>  
> +	if (steal_account_process_tick())
> +		return;
> +
>  	if (user_tick)
>  		account_user_time(p, cputime_one_jiffy, one_jiffy_scaled);
>  	else if ((p != rq->idle) || (irq_count() != HARDIRQ_OFFSET))


  reply	other threads:[~2011-07-05  9:12 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-07-04 15:32 [PATCH v5 0/9] Steal time for KVM Glauber Costa
2011-07-04 15:32 ` [PATCH v5 1/9] introduce kvm_read_guest_cached Glauber Costa
2011-07-05 19:35   ` Eric B Munson
2011-07-06  3:45   ` Rik van Riel
2011-07-04 15:32 ` [PATCH v5 2/9] KVM-HDR Add constant to represent KVM MSRs enabled bit Glauber Costa
2011-07-05 19:36   ` Eric B Munson
2011-07-06  3:45   ` Rik van Riel
2011-07-04 15:32 ` [PATCH v5 3/9] KVM-HDR: KVM Steal time implementation Glauber Costa
2011-07-05 19:36   ` Eric B Munson
2011-07-06  3:46   ` Rik van Riel
2011-07-04 15:32 ` [PATCH v5 4/9] KVM-HV: " Glauber Costa
2011-07-05 19:36   ` Eric B Munson
2011-07-06 16:08   ` Rik van Riel
2011-07-07 10:51   ` Marcelo Tosatti
2011-07-07 17:07     ` Glauber Costa
2011-07-11 12:58       ` Avi Kivity
2011-07-11 14:05         ` Glauber Costa
2011-07-11 13:10   ` Avi Kivity
2011-07-11 13:11     ` Avi Kivity
2011-07-11 13:19       ` Glauber Costa
2011-07-04 15:32 ` [PATCH v5 5/9] KVM-GST: Add a pv_ops stub for steal time Glauber Costa
2011-07-05 19:36   ` Eric B Munson
2011-07-06 16:12   ` Rik van Riel
2011-07-04 15:32 ` [PATCH v5 6/9] add jump labels for ia64 paravirt Glauber Costa
2011-07-05 19:36   ` Eric B Munson
2011-07-06 16:35   ` Rik van Riel
2011-07-11 13:09   ` Avi Kivity
2011-07-11 13:24     ` Glauber Costa
2011-07-11 14:15       ` Isaku Yamahata
2011-07-13 18:01       ` Luck, Tony
2011-07-04 15:32 ` [PATCH v5 7/9] KVM-GST: KVM Steal time accounting Glauber Costa
2011-07-05  9:11   ` Peter Zijlstra [this message]
2011-07-05 19:37   ` Eric B Munson
2011-07-06 16:37   ` Rik van Riel
2011-07-04 15:32 ` [PATCH v5 8/9] KVM-GST: adjust scheduler cpu power Glauber Costa
2011-07-05  9:12   ` Peter Zijlstra
2011-07-05 19:37   ` Eric B Munson
2011-07-06 17:40   ` Rik van Riel
2011-07-04 15:32 ` [PATCH v5 9/9] KVM-GST: KVM Steal time registration Glauber Costa
2011-07-05 19:37   ` Eric B Munson
2011-07-06 17:42   ` 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=1309857099.3282.46.camel@twins \
    --to=peterz@infradead.org \
    --cc=aliguori@us.ibm.com \
    --cc=avi@redhat.com \
    --cc=emunson@mgebm.net \
    --cc=glommer@redhat.com \
    --cc=jeremy.fitzhardinge@citrix.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=riel@redhat.com \
    --cc=venki@google.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.