xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Stefano Stabellini <sstabellini@kernel.org>
To: Juergen Gross <jgross@suse.com>
Cc: xen-devel@lists.xenproject.org, boris.ostrovsky@oracle.com,
	sstabellini@kernel.org, linux-kernel@vger.kernel.org,
	david.vrabel@citrix.com
Subject: Re: [PATCH 3/3] xen: support runqueue steal time on xen
Date: Tue, 5 Jul 2016 16:23:23 +0100 (BST)	[thread overview]
Message-ID: <alpine.DEB.2.10.1607051610010.2575@sstabellini-ThinkPad-X260> (raw)
In-Reply-To: <1466579034-12113-4-git-send-email-jgross@suse.com>

On Wed, 22 Jun 2016, Juergen Gross wrote:
> Up to now reading the stolen time of a remote cpu was not possible in a
> performant way under Xen. This made support of runqueue steal time via
> paravirt_steal_rq_enabled impossible.
> 
> With the addition of an appropriate hypervisor interface this is now
> possible, so add the support.
> 
> Signed-off-by: Juergen Gross <jgross@suse.com>
> ---
>  drivers/xen/time.c | 42 +++++++++++++++++++++++++-----------------
>  1 file changed, 25 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/xen/time.c b/drivers/xen/time.c
> index 2257b66..65afbe9 100644
> --- a/drivers/xen/time.c
> +++ b/drivers/xen/time.c
> @@ -19,6 +19,9 @@
>  /* runstate info updated by Xen */
>  static DEFINE_PER_CPU(struct vcpu_runstate_info, xen_runstate);
>  
> +/* runstate info of remote cpu accessible */
> +static bool xen_runstate_remote;

Honestly I would rather have one global variable less if it means only
dropping one BUG_ON.


>  /* return an consistent snapshot of 64-bit time/counter value */
>  static u64 get64(const u64 *p)
>  {
> @@ -47,27 +50,31 @@ static u64 get64(const u64 *p)
>  	return ret;
>  }
>  
> -/*
> - * Runstate accounting
> - */
> -void xen_get_runstate_snapshot(struct vcpu_runstate_info *res)
> +static void xen_get_runstate_snapshot_cpu(struct vcpu_runstate_info *res,
> +					  unsigned int cpu)
>  {
>  	u64 state_time;
>  	struct vcpu_runstate_info *state;
>  
>  	BUG_ON(preemptible());
>  
> -	state = this_cpu_ptr(&xen_runstate);
> +	state = per_cpu_ptr(&xen_runstate, cpu);
>  
> -	/*
> -	 * The runstate info is always updated by the hypervisor on
> -	 * the current CPU, so there's no need to use anything
> -	 * stronger than a compiler barrier when fetching it.
> -	 */
>  	do {
>  		state_time = get64(&state->state_entry_time);
> +		rmb();	/* Hypervisor might update data. */
>  		*res = READ_ONCE(*state);
> -	} while (get64(&state->state_entry_time) != state_time);
> +		rmb();	/* Hypervisor might update data. */
> +	} while (get64(&state->state_entry_time) != state_time ||
> +		 (state_time & XEN_RUNSTATE_UPDATE));
> +}
> +
> +/*
> + * Runstate accounting
> + */
> +void xen_get_runstate_snapshot(struct vcpu_runstate_info *res)
> +{
> +	xen_get_runstate_snapshot_cpu(res, smp_processor_id());
>  }
>  
>  /* return true when a vcpu could run but has no real cpu to run on */
> @@ -80,8 +87,8 @@ static u64 xen_steal_clock(int cpu)
>  {
>  	struct vcpu_runstate_info state;
>  
> -	BUG_ON(cpu != smp_processor_id());
> -	xen_get_runstate_snapshot(&state);
> +	BUG_ON(!xen_runstate_remote && cpu != smp_processor_id());
> +	xen_get_runstate_snapshot_cpu(&state, cpu);
>  	return state.time[RUNSTATE_runnable] + state.time[RUNSTATE_offline];
>  }
>  
> @@ -98,11 +105,12 @@ void xen_setup_runstate_info(int cpu)
>  
>  void __init xen_time_setup_guest(void)
>  {
> +	xen_runstate_remote = !HYPERVISOR_vm_assist(VMASST_CMD_enable,
> +					VMASST_TYPE_runstate_update_flag);
> +
>  	pv_time_ops.steal_clock = xen_steal_clock;
>  
>  	static_key_slow_inc(&paravirt_steal_enabled);
> -	/*
> -	 * We can't set paravirt_steal_rq_enabled as this would require the
> -	 * capability to read another cpu's runstate info.
> -	 */
> +	if (xen_runstate_remote)
> +		static_key_slow_inc(&paravirt_steal_rq_enabled);
>  }

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

  reply	other threads:[~2016-07-05 15:23 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-22  7:03 [PATCH 0/3] xen: add full support for CONFIG_PARAVIRT_TIME_ACCOUNTING Juergen Gross
2016-06-22  7:03 ` [PATCH 1/3] xen: update xen headers Juergen Gross
2016-07-05 15:07   ` Stefano Stabellini
2016-06-22  7:03 ` [PATCH 2/3] arm/xen: add support for vm_assist hypercall Juergen Gross
2016-06-22  7:03 ` [PATCH 3/3] xen: support runqueue steal time on xen Juergen Gross
2016-07-05 15:23   ` Stefano Stabellini [this message]
2016-07-06  4:25     ` Juergen Gross
2016-06-22 15:48 ` [PATCH 0/3] xen: add full support for CONFIG_PARAVIRT_TIME_ACCOUNTING Boris Ostrovsky
     [not found] ` <1466579034-12113-3-git-send-email-jgross@suse.com>
2016-07-04  9:21   ` [PATCH 2/3] arm/xen: add support for vm_assist hypercall Juergen Gross
2016-07-04 11:20   ` Julien Grall
2016-07-05 15:03   ` Stefano Stabellini

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=alpine.DEB.2.10.1607051610010.2575@sstabellini-ThinkPad-X260 \
    --to=sstabellini@kernel.org \
    --cc=boris.ostrovsky@oracle.com \
    --cc=david.vrabel@citrix.com \
    --cc=jgross@suse.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=xen-devel@lists.xenproject.org \
    /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;
as well as URLs for NNTP newsgroup(s).