From: konrad.wilk@oracle.com (Konrad Rzeszutek Wilk)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 1/4] xen: move xen_setup_runstate_info and get_runstate_snapshot to drivers/xen/time.c
Date: Wed, 8 May 2013 13:54:44 -0400 [thread overview]
Message-ID: <20130508175444.GB2800@phenom.dumpdata.com> (raw)
In-Reply-To: <1368027714-14506-1-git-send-email-stefano.stabellini@eu.citrix.com>
On Wed, May 08, 2013 at 04:41:51PM +0100, Stefano Stabellini wrote:
> Changes in v2:
> - leave do_stolen_accounting in arch/x86/xen/time.c;
> - use the new common functions in arch/ia64/xen/time.c.
>
> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> Acked-by: Ian Campbell <ian.campbell@citrix.com>
> CC: konrad.wilk at oracle.com
On the generic and x86 side it looks OK to me. I presume you did a sanity
check on x86 to make sure nothing was off?
> ---
> arch/ia64/xen/time.c | 48 +++----------------------
> arch/x86/xen/time.c | 76 +----------------------------------------
> drivers/xen/Makefile | 2 +-
> drivers/xen/time.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++++
> include/xen/xen-ops.h | 5 +++
> 5 files changed, 104 insertions(+), 118 deletions(-)
> create mode 100644 drivers/xen/time.c
>
> diff --git a/arch/ia64/xen/time.c b/arch/ia64/xen/time.c
> index 1f8244a..79a0b8c 100644
> --- a/arch/ia64/xen/time.c
> +++ b/arch/ia64/xen/time.c
> @@ -34,53 +34,17 @@
>
> #include "../kernel/fsyscall_gtod_data.h"
>
> -static DEFINE_PER_CPU(struct vcpu_runstate_info, xen_runstate);
> static DEFINE_PER_CPU(unsigned long, xen_stolen_time);
> static DEFINE_PER_CPU(unsigned long, xen_blocked_time);
>
> /* taken from i386/kernel/time-xen.c */
> static void xen_init_missing_ticks_accounting(int cpu)
> {
> - struct vcpu_register_runstate_memory_area area;
> - struct vcpu_runstate_info *runstate = &per_cpu(xen_runstate, cpu);
> - int rc;
> + xen_setup_runstate_info(&runstate);
>
> - memset(runstate, 0, sizeof(*runstate));
> -
> - area.addr.v = runstate;
> - rc = HYPERVISOR_vcpu_op(VCPUOP_register_runstate_memory_area, cpu,
> - &area);
> - WARN_ON(rc && rc != -ENOSYS);
> -
> - per_cpu(xen_blocked_time, cpu) = runstate->time[RUNSTATE_blocked];
> - per_cpu(xen_stolen_time, cpu) = runstate->time[RUNSTATE_runnable]
> - + runstate->time[RUNSTATE_offline];
> -}
> -
> -/*
> - * Runstate accounting
> - */
> -/* stolen from arch/x86/xen/time.c */
> -static void get_runstate_snapshot(struct vcpu_runstate_info *res)
> -{
> - u64 state_time;
> - struct vcpu_runstate_info *state;
> -
> - BUG_ON(preemptible());
> -
> - state = &__get_cpu_var(xen_runstate);
> -
> - /*
> - * 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 = state->state_entry_time;
> - rmb();
> - *res = *state;
> - rmb();
> - } while (state->state_entry_time != state_time);
> + per_cpu(xen_blocked_time, cpu) = runstate.time[RUNSTATE_blocked];
> + per_cpu(xen_stolen_time, cpu) = runstate.time[RUNSTATE_runnable]
> + + runstate.time[RUNSTATE_offline];
> }
>
> #define NS_PER_TICK (1000000000LL/HZ)
> @@ -94,7 +58,7 @@ consider_steal_time(unsigned long new_itm)
> struct vcpu_runstate_info runstate;
> struct task_struct *p = current;
>
> - get_runstate_snapshot(&runstate);
> + xen_get_runstate_snapshot(&runstate);
>
> /*
> * Check for vcpu migration effect
> @@ -202,7 +166,7 @@ static unsigned long long xen_sched_clock(void)
> */
> now = ia64_native_sched_clock();
>
> - get_runstate_snapshot(&runstate);
> + xen_get_runstate_snapshot(&runstate);
>
> WARN_ON(runstate.state != RUNSTATE_running);
>
> diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c
> index 0296a95..18d0104 100644
> --- a/arch/x86/xen/time.c
> +++ b/arch/x86/xen/time.c
> @@ -30,9 +30,6 @@
> #define TIMER_SLOP 100000
> #define NS_PER_TICK (1000000000LL / HZ)
>
> -/* runstate info updated by Xen */
> -static DEFINE_PER_CPU(struct vcpu_runstate_info, xen_runstate);
> -
> /* snapshots of runstate info */
> static DEFINE_PER_CPU(struct vcpu_runstate_info, xen_runstate_snapshot);
>
> @@ -40,77 +37,6 @@ static DEFINE_PER_CPU(struct vcpu_runstate_info, xen_runstate_snapshot);
> static DEFINE_PER_CPU(u64, xen_residual_stolen);
> static DEFINE_PER_CPU(u64, xen_residual_blocked);
>
> -/* return an consistent snapshot of 64-bit time/counter value */
> -static u64 get64(const u64 *p)
> -{
> - u64 ret;
> -
> - if (BITS_PER_LONG < 64) {
> - u32 *p32 = (u32 *)p;
> - u32 h, l;
> -
> - /*
> - * Read high then low, and then make sure high is
> - * still the same; this will only loop if low wraps
> - * and carries into high.
> - * XXX some clean way to make this endian-proof?
> - */
> - do {
> - h = p32[1];
> - barrier();
> - l = p32[0];
> - barrier();
> - } while (p32[1] != h);
> -
> - ret = (((u64)h) << 32) | l;
> - } else
> - ret = *p;
> -
> - return ret;
> -}
> -
> -/*
> - * Runstate accounting
> - */
> -static void get_runstate_snapshot(struct vcpu_runstate_info *res)
> -{
> - u64 state_time;
> - struct vcpu_runstate_info *state;
> -
> - BUG_ON(preemptible());
> -
> - state = &__get_cpu_var(xen_runstate);
> -
> - /*
> - * 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);
> - barrier();
> - *res = *state;
> - barrier();
> - } while (get64(&state->state_entry_time) != state_time);
> -}
> -
> -/* return true when a vcpu could run but has no real cpu to run on */
> -bool xen_vcpu_stolen(int vcpu)
> -{
> - return per_cpu(xen_runstate, vcpu).state == RUNSTATE_runnable;
> -}
> -
> -void xen_setup_runstate_info(int cpu)
> -{
> - struct vcpu_register_runstate_memory_area area;
> -
> - area.addr.v = &per_cpu(xen_runstate, cpu);
> -
> - if (HYPERVISOR_vcpu_op(VCPUOP_register_runstate_memory_area,
> - cpu, &area))
> - BUG();
> -}
> -
> static void do_stolen_accounting(void)
> {
> struct vcpu_runstate_info state;
> @@ -118,7 +44,7 @@ static void do_stolen_accounting(void)
> s64 blocked, runnable, offline, stolen;
> cputime_t ticks;
>
> - get_runstate_snapshot(&state);
> + xen_get_runstate_snapshot(&state);
>
> WARN_ON(state.state != RUNSTATE_running);
>
> diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile
> index eabd0ee..2bf461a 100644
> --- a/drivers/xen/Makefile
> +++ b/drivers/xen/Makefile
> @@ -3,7 +3,7 @@ obj-y += manage.o
> obj-$(CONFIG_HOTPLUG_CPU) += cpu_hotplug.o
> endif
> obj-$(CONFIG_X86) += fallback.o
> -obj-y += grant-table.o features.o events.o balloon.o
> +obj-y += grant-table.o features.o events.o balloon.o time.o
> obj-y += xenbus/
>
> nostackp := $(call cc-option, -fno-stack-protector)
> diff --git a/drivers/xen/time.c b/drivers/xen/time.c
> new file mode 100644
> index 0000000..c2e39d3
> --- /dev/null
> +++ b/drivers/xen/time.c
> @@ -0,0 +1,91 @@
> +/*
> + * Xen stolen ticks accounting.
> + */
> +#include <linux/kernel.h>
> +#include <linux/kernel_stat.h>
> +#include <linux/math64.h>
> +#include <linux/gfp.h>
> +
> +#include <asm/xen/hypervisor.h>
> +#include <asm/xen/hypercall.h>
> +
> +#include <xen/events.h>
> +#include <xen/features.h>
> +#include <xen/interface/xen.h>
> +#include <xen/interface/vcpu.h>
> +#include <xen/xen-ops.h>
> +
> +/* runstate info updated by Xen */
> +static DEFINE_PER_CPU(struct vcpu_runstate_info, xen_runstate);
> +
> +/* return an consistent snapshot of 64-bit time/counter value */
> +static u64 get64(const u64 *p)
> +{
> + u64 ret;
> +
> + if (BITS_PER_LONG < 64) {
> + u32 *p32 = (u32 *)p;
> + u32 h, l;
> +
> + /*
> + * Read high then low, and then make sure high is
> + * still the same; this will only loop if low wraps
> + * and carries into high.
> + * XXX some clean way to make this endian-proof?
> + */
> + do {
> + h = p32[1];
> + barrier();
> + l = p32[0];
> + barrier();
> + } while (p32[1] != h);
> +
> + ret = (((u64)h) << 32) | l;
> + } else
> + ret = *p;
> +
> + return ret;
> +}
> +
> +/*
> + * Runstate accounting
> + */
> +void xen_get_runstate_snapshot(struct vcpu_runstate_info *res)
> +{
> + u64 state_time;
> + struct vcpu_runstate_info *state;
> +
> + BUG_ON(preemptible());
> +
> + state = &__get_cpu_var(xen_runstate);
> +
> + /*
> + * 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);
> + barrier();
> + *res = *state;
> + barrier();
> + } while (get64(&state->state_entry_time) != state_time);
> +}
> +
> +/* return true when a vcpu could run but has no real cpu to run on */
> +bool xen_vcpu_stolen(int vcpu)
> +{
> + return per_cpu(xen_runstate, vcpu).state == RUNSTATE_runnable;
> +}
> +
> +void xen_setup_runstate_info(int cpu)
> +{
> + struct vcpu_register_runstate_memory_area area;
> +
> + area.addr.v = &per_cpu(xen_runstate, cpu);
> +
> + if (HYPERVISOR_vcpu_op(VCPUOP_register_runstate_memory_area,
> + cpu, &area))
> + BUG();
> +}
> +
> diff --git a/include/xen/xen-ops.h b/include/xen/xen-ops.h
> index d6fe062..4fd4e47 100644
> --- a/include/xen/xen-ops.h
> +++ b/include/xen/xen-ops.h
> @@ -3,6 +3,7 @@
>
> #include <linux/percpu.h>
> #include <asm/xen/interface.h>
> +#include <xen/interface/vcpu.h>
>
> DECLARE_PER_CPU(struct vcpu_info *, xen_vcpu);
>
> @@ -16,6 +17,10 @@ void xen_mm_unpin_all(void);
> void xen_timer_resume(void);
> void xen_arch_resume(void);
>
> +bool xen_vcpu_stolen(int vcpu);
> +void xen_setup_runstate_info(int cpu);
> +void xen_get_runstate_snapshot(struct vcpu_runstate_info *res);
> +
> int xen_setup_shutdown_event(void);
>
> extern unsigned long *xen_contiguous_bitmap;
> --
> 1.7.2.5
>
WARNING: multiple messages have this Message-ID (diff)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Cc: xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org, marc.zyngier@arm.com,
will.deacon@arm.com
Subject: Re: [PATCH v3 1/4] xen: move xen_setup_runstate_info and get_runstate_snapshot to drivers/xen/time.c
Date: Wed, 8 May 2013 13:54:44 -0400 [thread overview]
Message-ID: <20130508175444.GB2800@phenom.dumpdata.com> (raw)
In-Reply-To: <1368027714-14506-1-git-send-email-stefano.stabellini@eu.citrix.com>
On Wed, May 08, 2013 at 04:41:51PM +0100, Stefano Stabellini wrote:
> Changes in v2:
> - leave do_stolen_accounting in arch/x86/xen/time.c;
> - use the new common functions in arch/ia64/xen/time.c.
>
> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> Acked-by: Ian Campbell <ian.campbell@citrix.com>
> CC: konrad.wilk@oracle.com
On the generic and x86 side it looks OK to me. I presume you did a sanity
check on x86 to make sure nothing was off?
> ---
> arch/ia64/xen/time.c | 48 +++----------------------
> arch/x86/xen/time.c | 76 +----------------------------------------
> drivers/xen/Makefile | 2 +-
> drivers/xen/time.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++++
> include/xen/xen-ops.h | 5 +++
> 5 files changed, 104 insertions(+), 118 deletions(-)
> create mode 100644 drivers/xen/time.c
>
> diff --git a/arch/ia64/xen/time.c b/arch/ia64/xen/time.c
> index 1f8244a..79a0b8c 100644
> --- a/arch/ia64/xen/time.c
> +++ b/arch/ia64/xen/time.c
> @@ -34,53 +34,17 @@
>
> #include "../kernel/fsyscall_gtod_data.h"
>
> -static DEFINE_PER_CPU(struct vcpu_runstate_info, xen_runstate);
> static DEFINE_PER_CPU(unsigned long, xen_stolen_time);
> static DEFINE_PER_CPU(unsigned long, xen_blocked_time);
>
> /* taken from i386/kernel/time-xen.c */
> static void xen_init_missing_ticks_accounting(int cpu)
> {
> - struct vcpu_register_runstate_memory_area area;
> - struct vcpu_runstate_info *runstate = &per_cpu(xen_runstate, cpu);
> - int rc;
> + xen_setup_runstate_info(&runstate);
>
> - memset(runstate, 0, sizeof(*runstate));
> -
> - area.addr.v = runstate;
> - rc = HYPERVISOR_vcpu_op(VCPUOP_register_runstate_memory_area, cpu,
> - &area);
> - WARN_ON(rc && rc != -ENOSYS);
> -
> - per_cpu(xen_blocked_time, cpu) = runstate->time[RUNSTATE_blocked];
> - per_cpu(xen_stolen_time, cpu) = runstate->time[RUNSTATE_runnable]
> - + runstate->time[RUNSTATE_offline];
> -}
> -
> -/*
> - * Runstate accounting
> - */
> -/* stolen from arch/x86/xen/time.c */
> -static void get_runstate_snapshot(struct vcpu_runstate_info *res)
> -{
> - u64 state_time;
> - struct vcpu_runstate_info *state;
> -
> - BUG_ON(preemptible());
> -
> - state = &__get_cpu_var(xen_runstate);
> -
> - /*
> - * 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 = state->state_entry_time;
> - rmb();
> - *res = *state;
> - rmb();
> - } while (state->state_entry_time != state_time);
> + per_cpu(xen_blocked_time, cpu) = runstate.time[RUNSTATE_blocked];
> + per_cpu(xen_stolen_time, cpu) = runstate.time[RUNSTATE_runnable]
> + + runstate.time[RUNSTATE_offline];
> }
>
> #define NS_PER_TICK (1000000000LL/HZ)
> @@ -94,7 +58,7 @@ consider_steal_time(unsigned long new_itm)
> struct vcpu_runstate_info runstate;
> struct task_struct *p = current;
>
> - get_runstate_snapshot(&runstate);
> + xen_get_runstate_snapshot(&runstate);
>
> /*
> * Check for vcpu migration effect
> @@ -202,7 +166,7 @@ static unsigned long long xen_sched_clock(void)
> */
> now = ia64_native_sched_clock();
>
> - get_runstate_snapshot(&runstate);
> + xen_get_runstate_snapshot(&runstate);
>
> WARN_ON(runstate.state != RUNSTATE_running);
>
> diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c
> index 0296a95..18d0104 100644
> --- a/arch/x86/xen/time.c
> +++ b/arch/x86/xen/time.c
> @@ -30,9 +30,6 @@
> #define TIMER_SLOP 100000
> #define NS_PER_TICK (1000000000LL / HZ)
>
> -/* runstate info updated by Xen */
> -static DEFINE_PER_CPU(struct vcpu_runstate_info, xen_runstate);
> -
> /* snapshots of runstate info */
> static DEFINE_PER_CPU(struct vcpu_runstate_info, xen_runstate_snapshot);
>
> @@ -40,77 +37,6 @@ static DEFINE_PER_CPU(struct vcpu_runstate_info, xen_runstate_snapshot);
> static DEFINE_PER_CPU(u64, xen_residual_stolen);
> static DEFINE_PER_CPU(u64, xen_residual_blocked);
>
> -/* return an consistent snapshot of 64-bit time/counter value */
> -static u64 get64(const u64 *p)
> -{
> - u64 ret;
> -
> - if (BITS_PER_LONG < 64) {
> - u32 *p32 = (u32 *)p;
> - u32 h, l;
> -
> - /*
> - * Read high then low, and then make sure high is
> - * still the same; this will only loop if low wraps
> - * and carries into high.
> - * XXX some clean way to make this endian-proof?
> - */
> - do {
> - h = p32[1];
> - barrier();
> - l = p32[0];
> - barrier();
> - } while (p32[1] != h);
> -
> - ret = (((u64)h) << 32) | l;
> - } else
> - ret = *p;
> -
> - return ret;
> -}
> -
> -/*
> - * Runstate accounting
> - */
> -static void get_runstate_snapshot(struct vcpu_runstate_info *res)
> -{
> - u64 state_time;
> - struct vcpu_runstate_info *state;
> -
> - BUG_ON(preemptible());
> -
> - state = &__get_cpu_var(xen_runstate);
> -
> - /*
> - * 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);
> - barrier();
> - *res = *state;
> - barrier();
> - } while (get64(&state->state_entry_time) != state_time);
> -}
> -
> -/* return true when a vcpu could run but has no real cpu to run on */
> -bool xen_vcpu_stolen(int vcpu)
> -{
> - return per_cpu(xen_runstate, vcpu).state == RUNSTATE_runnable;
> -}
> -
> -void xen_setup_runstate_info(int cpu)
> -{
> - struct vcpu_register_runstate_memory_area area;
> -
> - area.addr.v = &per_cpu(xen_runstate, cpu);
> -
> - if (HYPERVISOR_vcpu_op(VCPUOP_register_runstate_memory_area,
> - cpu, &area))
> - BUG();
> -}
> -
> static void do_stolen_accounting(void)
> {
> struct vcpu_runstate_info state;
> @@ -118,7 +44,7 @@ static void do_stolen_accounting(void)
> s64 blocked, runnable, offline, stolen;
> cputime_t ticks;
>
> - get_runstate_snapshot(&state);
> + xen_get_runstate_snapshot(&state);
>
> WARN_ON(state.state != RUNSTATE_running);
>
> diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile
> index eabd0ee..2bf461a 100644
> --- a/drivers/xen/Makefile
> +++ b/drivers/xen/Makefile
> @@ -3,7 +3,7 @@ obj-y += manage.o
> obj-$(CONFIG_HOTPLUG_CPU) += cpu_hotplug.o
> endif
> obj-$(CONFIG_X86) += fallback.o
> -obj-y += grant-table.o features.o events.o balloon.o
> +obj-y += grant-table.o features.o events.o balloon.o time.o
> obj-y += xenbus/
>
> nostackp := $(call cc-option, -fno-stack-protector)
> diff --git a/drivers/xen/time.c b/drivers/xen/time.c
> new file mode 100644
> index 0000000..c2e39d3
> --- /dev/null
> +++ b/drivers/xen/time.c
> @@ -0,0 +1,91 @@
> +/*
> + * Xen stolen ticks accounting.
> + */
> +#include <linux/kernel.h>
> +#include <linux/kernel_stat.h>
> +#include <linux/math64.h>
> +#include <linux/gfp.h>
> +
> +#include <asm/xen/hypervisor.h>
> +#include <asm/xen/hypercall.h>
> +
> +#include <xen/events.h>
> +#include <xen/features.h>
> +#include <xen/interface/xen.h>
> +#include <xen/interface/vcpu.h>
> +#include <xen/xen-ops.h>
> +
> +/* runstate info updated by Xen */
> +static DEFINE_PER_CPU(struct vcpu_runstate_info, xen_runstate);
> +
> +/* return an consistent snapshot of 64-bit time/counter value */
> +static u64 get64(const u64 *p)
> +{
> + u64 ret;
> +
> + if (BITS_PER_LONG < 64) {
> + u32 *p32 = (u32 *)p;
> + u32 h, l;
> +
> + /*
> + * Read high then low, and then make sure high is
> + * still the same; this will only loop if low wraps
> + * and carries into high.
> + * XXX some clean way to make this endian-proof?
> + */
> + do {
> + h = p32[1];
> + barrier();
> + l = p32[0];
> + barrier();
> + } while (p32[1] != h);
> +
> + ret = (((u64)h) << 32) | l;
> + } else
> + ret = *p;
> +
> + return ret;
> +}
> +
> +/*
> + * Runstate accounting
> + */
> +void xen_get_runstate_snapshot(struct vcpu_runstate_info *res)
> +{
> + u64 state_time;
> + struct vcpu_runstate_info *state;
> +
> + BUG_ON(preemptible());
> +
> + state = &__get_cpu_var(xen_runstate);
> +
> + /*
> + * 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);
> + barrier();
> + *res = *state;
> + barrier();
> + } while (get64(&state->state_entry_time) != state_time);
> +}
> +
> +/* return true when a vcpu could run but has no real cpu to run on */
> +bool xen_vcpu_stolen(int vcpu)
> +{
> + return per_cpu(xen_runstate, vcpu).state == RUNSTATE_runnable;
> +}
> +
> +void xen_setup_runstate_info(int cpu)
> +{
> + struct vcpu_register_runstate_memory_area area;
> +
> + area.addr.v = &per_cpu(xen_runstate, cpu);
> +
> + if (HYPERVISOR_vcpu_op(VCPUOP_register_runstate_memory_area,
> + cpu, &area))
> + BUG();
> +}
> +
> diff --git a/include/xen/xen-ops.h b/include/xen/xen-ops.h
> index d6fe062..4fd4e47 100644
> --- a/include/xen/xen-ops.h
> +++ b/include/xen/xen-ops.h
> @@ -3,6 +3,7 @@
>
> #include <linux/percpu.h>
> #include <asm/xen/interface.h>
> +#include <xen/interface/vcpu.h>
>
> DECLARE_PER_CPU(struct vcpu_info *, xen_vcpu);
>
> @@ -16,6 +17,10 @@ void xen_mm_unpin_all(void);
> void xen_timer_resume(void);
> void xen_arch_resume(void);
>
> +bool xen_vcpu_stolen(int vcpu);
> +void xen_setup_runstate_info(int cpu);
> +void xen_get_runstate_snapshot(struct vcpu_runstate_info *res);
> +
> int xen_setup_shutdown_event(void);
>
> extern unsigned long *xen_contiguous_bitmap;
> --
> 1.7.2.5
>
WARNING: multiple messages have this Message-ID (diff)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Cc: marc.zyngier@arm.com, xen-devel@lists.xensource.com,
will.deacon@arm.com, linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v3 1/4] xen: move xen_setup_runstate_info and get_runstate_snapshot to drivers/xen/time.c
Date: Wed, 8 May 2013 13:54:44 -0400 [thread overview]
Message-ID: <20130508175444.GB2800@phenom.dumpdata.com> (raw)
In-Reply-To: <1368027714-14506-1-git-send-email-stefano.stabellini@eu.citrix.com>
On Wed, May 08, 2013 at 04:41:51PM +0100, Stefano Stabellini wrote:
> Changes in v2:
> - leave do_stolen_accounting in arch/x86/xen/time.c;
> - use the new common functions in arch/ia64/xen/time.c.
>
> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> Acked-by: Ian Campbell <ian.campbell@citrix.com>
> CC: konrad.wilk@oracle.com
On the generic and x86 side it looks OK to me. I presume you did a sanity
check on x86 to make sure nothing was off?
> ---
> arch/ia64/xen/time.c | 48 +++----------------------
> arch/x86/xen/time.c | 76 +----------------------------------------
> drivers/xen/Makefile | 2 +-
> drivers/xen/time.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++++
> include/xen/xen-ops.h | 5 +++
> 5 files changed, 104 insertions(+), 118 deletions(-)
> create mode 100644 drivers/xen/time.c
>
> diff --git a/arch/ia64/xen/time.c b/arch/ia64/xen/time.c
> index 1f8244a..79a0b8c 100644
> --- a/arch/ia64/xen/time.c
> +++ b/arch/ia64/xen/time.c
> @@ -34,53 +34,17 @@
>
> #include "../kernel/fsyscall_gtod_data.h"
>
> -static DEFINE_PER_CPU(struct vcpu_runstate_info, xen_runstate);
> static DEFINE_PER_CPU(unsigned long, xen_stolen_time);
> static DEFINE_PER_CPU(unsigned long, xen_blocked_time);
>
> /* taken from i386/kernel/time-xen.c */
> static void xen_init_missing_ticks_accounting(int cpu)
> {
> - struct vcpu_register_runstate_memory_area area;
> - struct vcpu_runstate_info *runstate = &per_cpu(xen_runstate, cpu);
> - int rc;
> + xen_setup_runstate_info(&runstate);
>
> - memset(runstate, 0, sizeof(*runstate));
> -
> - area.addr.v = runstate;
> - rc = HYPERVISOR_vcpu_op(VCPUOP_register_runstate_memory_area, cpu,
> - &area);
> - WARN_ON(rc && rc != -ENOSYS);
> -
> - per_cpu(xen_blocked_time, cpu) = runstate->time[RUNSTATE_blocked];
> - per_cpu(xen_stolen_time, cpu) = runstate->time[RUNSTATE_runnable]
> - + runstate->time[RUNSTATE_offline];
> -}
> -
> -/*
> - * Runstate accounting
> - */
> -/* stolen from arch/x86/xen/time.c */
> -static void get_runstate_snapshot(struct vcpu_runstate_info *res)
> -{
> - u64 state_time;
> - struct vcpu_runstate_info *state;
> -
> - BUG_ON(preemptible());
> -
> - state = &__get_cpu_var(xen_runstate);
> -
> - /*
> - * 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 = state->state_entry_time;
> - rmb();
> - *res = *state;
> - rmb();
> - } while (state->state_entry_time != state_time);
> + per_cpu(xen_blocked_time, cpu) = runstate.time[RUNSTATE_blocked];
> + per_cpu(xen_stolen_time, cpu) = runstate.time[RUNSTATE_runnable]
> + + runstate.time[RUNSTATE_offline];
> }
>
> #define NS_PER_TICK (1000000000LL/HZ)
> @@ -94,7 +58,7 @@ consider_steal_time(unsigned long new_itm)
> struct vcpu_runstate_info runstate;
> struct task_struct *p = current;
>
> - get_runstate_snapshot(&runstate);
> + xen_get_runstate_snapshot(&runstate);
>
> /*
> * Check for vcpu migration effect
> @@ -202,7 +166,7 @@ static unsigned long long xen_sched_clock(void)
> */
> now = ia64_native_sched_clock();
>
> - get_runstate_snapshot(&runstate);
> + xen_get_runstate_snapshot(&runstate);
>
> WARN_ON(runstate.state != RUNSTATE_running);
>
> diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c
> index 0296a95..18d0104 100644
> --- a/arch/x86/xen/time.c
> +++ b/arch/x86/xen/time.c
> @@ -30,9 +30,6 @@
> #define TIMER_SLOP 100000
> #define NS_PER_TICK (1000000000LL / HZ)
>
> -/* runstate info updated by Xen */
> -static DEFINE_PER_CPU(struct vcpu_runstate_info, xen_runstate);
> -
> /* snapshots of runstate info */
> static DEFINE_PER_CPU(struct vcpu_runstate_info, xen_runstate_snapshot);
>
> @@ -40,77 +37,6 @@ static DEFINE_PER_CPU(struct vcpu_runstate_info, xen_runstate_snapshot);
> static DEFINE_PER_CPU(u64, xen_residual_stolen);
> static DEFINE_PER_CPU(u64, xen_residual_blocked);
>
> -/* return an consistent snapshot of 64-bit time/counter value */
> -static u64 get64(const u64 *p)
> -{
> - u64 ret;
> -
> - if (BITS_PER_LONG < 64) {
> - u32 *p32 = (u32 *)p;
> - u32 h, l;
> -
> - /*
> - * Read high then low, and then make sure high is
> - * still the same; this will only loop if low wraps
> - * and carries into high.
> - * XXX some clean way to make this endian-proof?
> - */
> - do {
> - h = p32[1];
> - barrier();
> - l = p32[0];
> - barrier();
> - } while (p32[1] != h);
> -
> - ret = (((u64)h) << 32) | l;
> - } else
> - ret = *p;
> -
> - return ret;
> -}
> -
> -/*
> - * Runstate accounting
> - */
> -static void get_runstate_snapshot(struct vcpu_runstate_info *res)
> -{
> - u64 state_time;
> - struct vcpu_runstate_info *state;
> -
> - BUG_ON(preemptible());
> -
> - state = &__get_cpu_var(xen_runstate);
> -
> - /*
> - * 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);
> - barrier();
> - *res = *state;
> - barrier();
> - } while (get64(&state->state_entry_time) != state_time);
> -}
> -
> -/* return true when a vcpu could run but has no real cpu to run on */
> -bool xen_vcpu_stolen(int vcpu)
> -{
> - return per_cpu(xen_runstate, vcpu).state == RUNSTATE_runnable;
> -}
> -
> -void xen_setup_runstate_info(int cpu)
> -{
> - struct vcpu_register_runstate_memory_area area;
> -
> - area.addr.v = &per_cpu(xen_runstate, cpu);
> -
> - if (HYPERVISOR_vcpu_op(VCPUOP_register_runstate_memory_area,
> - cpu, &area))
> - BUG();
> -}
> -
> static void do_stolen_accounting(void)
> {
> struct vcpu_runstate_info state;
> @@ -118,7 +44,7 @@ static void do_stolen_accounting(void)
> s64 blocked, runnable, offline, stolen;
> cputime_t ticks;
>
> - get_runstate_snapshot(&state);
> + xen_get_runstate_snapshot(&state);
>
> WARN_ON(state.state != RUNSTATE_running);
>
> diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile
> index eabd0ee..2bf461a 100644
> --- a/drivers/xen/Makefile
> +++ b/drivers/xen/Makefile
> @@ -3,7 +3,7 @@ obj-y += manage.o
> obj-$(CONFIG_HOTPLUG_CPU) += cpu_hotplug.o
> endif
> obj-$(CONFIG_X86) += fallback.o
> -obj-y += grant-table.o features.o events.o balloon.o
> +obj-y += grant-table.o features.o events.o balloon.o time.o
> obj-y += xenbus/
>
> nostackp := $(call cc-option, -fno-stack-protector)
> diff --git a/drivers/xen/time.c b/drivers/xen/time.c
> new file mode 100644
> index 0000000..c2e39d3
> --- /dev/null
> +++ b/drivers/xen/time.c
> @@ -0,0 +1,91 @@
> +/*
> + * Xen stolen ticks accounting.
> + */
> +#include <linux/kernel.h>
> +#include <linux/kernel_stat.h>
> +#include <linux/math64.h>
> +#include <linux/gfp.h>
> +
> +#include <asm/xen/hypervisor.h>
> +#include <asm/xen/hypercall.h>
> +
> +#include <xen/events.h>
> +#include <xen/features.h>
> +#include <xen/interface/xen.h>
> +#include <xen/interface/vcpu.h>
> +#include <xen/xen-ops.h>
> +
> +/* runstate info updated by Xen */
> +static DEFINE_PER_CPU(struct vcpu_runstate_info, xen_runstate);
> +
> +/* return an consistent snapshot of 64-bit time/counter value */
> +static u64 get64(const u64 *p)
> +{
> + u64 ret;
> +
> + if (BITS_PER_LONG < 64) {
> + u32 *p32 = (u32 *)p;
> + u32 h, l;
> +
> + /*
> + * Read high then low, and then make sure high is
> + * still the same; this will only loop if low wraps
> + * and carries into high.
> + * XXX some clean way to make this endian-proof?
> + */
> + do {
> + h = p32[1];
> + barrier();
> + l = p32[0];
> + barrier();
> + } while (p32[1] != h);
> +
> + ret = (((u64)h) << 32) | l;
> + } else
> + ret = *p;
> +
> + return ret;
> +}
> +
> +/*
> + * Runstate accounting
> + */
> +void xen_get_runstate_snapshot(struct vcpu_runstate_info *res)
> +{
> + u64 state_time;
> + struct vcpu_runstate_info *state;
> +
> + BUG_ON(preemptible());
> +
> + state = &__get_cpu_var(xen_runstate);
> +
> + /*
> + * 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);
> + barrier();
> + *res = *state;
> + barrier();
> + } while (get64(&state->state_entry_time) != state_time);
> +}
> +
> +/* return true when a vcpu could run but has no real cpu to run on */
> +bool xen_vcpu_stolen(int vcpu)
> +{
> + return per_cpu(xen_runstate, vcpu).state == RUNSTATE_runnable;
> +}
> +
> +void xen_setup_runstate_info(int cpu)
> +{
> + struct vcpu_register_runstate_memory_area area;
> +
> + area.addr.v = &per_cpu(xen_runstate, cpu);
> +
> + if (HYPERVISOR_vcpu_op(VCPUOP_register_runstate_memory_area,
> + cpu, &area))
> + BUG();
> +}
> +
> diff --git a/include/xen/xen-ops.h b/include/xen/xen-ops.h
> index d6fe062..4fd4e47 100644
> --- a/include/xen/xen-ops.h
> +++ b/include/xen/xen-ops.h
> @@ -3,6 +3,7 @@
>
> #include <linux/percpu.h>
> #include <asm/xen/interface.h>
> +#include <xen/interface/vcpu.h>
>
> DECLARE_PER_CPU(struct vcpu_info *, xen_vcpu);
>
> @@ -16,6 +17,10 @@ void xen_mm_unpin_all(void);
> void xen_timer_resume(void);
> void xen_arch_resume(void);
>
> +bool xen_vcpu_stolen(int vcpu);
> +void xen_setup_runstate_info(int cpu);
> +void xen_get_runstate_snapshot(struct vcpu_runstate_info *res);
> +
> int xen_setup_shutdown_event(void);
>
> extern unsigned long *xen_contiguous_bitmap;
> --
> 1.7.2.5
>
next prev parent reply other threads:[~2013-05-08 17:54 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-08 13:50 [PATCH v3 0/4] xen/arm: CONFIG_PARAVIRT and stolen ticks accounting Stefano Stabellini
2013-05-08 13:50 ` Stefano Stabellini
2013-05-08 15:41 ` [PATCH v3 1/4] xen: move xen_setup_runstate_info and get_runstate_snapshot to drivers/xen/time.c Stefano Stabellini
2013-05-08 15:41 ` Stefano Stabellini
2013-05-08 15:41 ` Stefano Stabellini
2013-05-08 17:54 ` Konrad Rzeszutek Wilk [this message]
2013-05-08 17:54 ` Konrad Rzeszutek Wilk
2013-05-08 17:54 ` Konrad Rzeszutek Wilk
2013-05-08 18:13 ` Stefano Stabellini
2013-05-08 18:13 ` Stefano Stabellini
2013-05-09 8:12 ` [Xen-devel] " Ian Campbell
2013-05-09 8:12 ` Ian Campbell
2013-05-08 15:41 ` [PATCH v3 2/4] kernel: missing include in cputime.c Stefano Stabellini
2013-05-08 15:41 ` Stefano Stabellini
2013-05-08 15:41 ` Stefano Stabellini
2013-05-08 15:41 ` [PATCH v3 3/4] arm: introduce CONFIG_PARAVIRT, PARAVIRT_TIME_ACCOUNTING and pv_time_ops Stefano Stabellini
2013-05-08 15:41 ` Stefano Stabellini
2013-05-08 15:41 ` Stefano Stabellini
2013-05-08 16:03 ` Marc Zyngier
2013-05-08 16:03 ` Marc Zyngier
2013-05-08 16:07 ` Stefano Stabellini
2013-05-08 16:07 ` Stefano Stabellini
2013-05-08 15:41 ` [PATCH v3 4/4] xen/arm: account for stolen ticks Stefano Stabellini
2013-05-08 15:41 ` Stefano Stabellini
2013-05-08 15:41 ` Stefano Stabellini
2013-05-08 16:07 ` Marc Zyngier
2013-05-08 16:07 ` Marc Zyngier
2013-05-08 17:03 ` Stefano Stabellini
2013-05-08 17:03 ` Stefano Stabellini
2013-05-09 8:12 ` [Xen-devel] " Ian Campbell
2013-05-09 8:12 ` Ian Campbell
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=20130508175444.GB2800@phenom.dumpdata.com \
--to=konrad.wilk@oracle.com \
--cc=linux-arm-kernel@lists.infradead.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 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.