[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] Re: [PATCH 10/11] Support VIRQ_TIMER and pvclock on HVM
On 05/24/2010 11:27 AM, Stefano Stabellini wrote: > Use the paravirtualized timer (VIRQ_TIMER) as timer and the > paravirtualized clock (pvclock) as wallclock on HVM domains too. > That's not quite correct. There's the Xen clockevent driver, the Xen clocksource, and a distinct-but-related Xen notion of wallclock time. In general, clocksources and wallclock don't have much direct relationship to each other. > Any interaction with emulated hardware is not very fast, so using the > paravirtualized timer instead of the emulated hpet is defenitely a > "definitely" > performance improvement. > Are there accuracy/stability/precision improvements too? J > Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> > --- > arch/x86/xen/enlighten.c | 31 +++++++++++++++++++++++++++++++ > arch/x86/xen/suspend.c | 4 ++++ > include/xen/interface/features.h | 3 +++ > 3 files changed, 38 insertions(+), 0 deletions(-) > > diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c > index cb316b5..88e8a09 100644 > --- a/arch/x86/xen/enlighten.c > +++ b/arch/x86/xen/enlighten.c > @@ -1307,6 +1307,36 @@ static struct notifier_block __cpuinitdata > xen_hvm_cpu_notifier = { > .notifier_call = xen_hvm_cpu_notify, > }; > > +static void xen_hvm_setup_cpu_clockevents(void) > +{ > + int cpu = smp_processor_id(); > + xen_setup_runstate_info(cpu); > + xen_setup_timer(cpu); > + xen_setup_cpu_clockevents(); > +} > + > +static void init_hvm_time(void) > +{ > + /* vector callback is needed otherwise we cannot receive interrupts > + * on cpu > 0 */ > + if (!xen_have_vector_callback && num_present_cpus() > 1) > + return; > + if (!xen_feature(XENFEAT_hvm_safe_pvclock)) { > + printk(KERN_INFO "Xen doesn't support pvclock on HVM," > + "disable pv timer\n"); > + return; > + } > + > + pv_time_ops = xen_time_ops; > + x86_init.timers.timer_init = xen_time_init; > + x86_init.timers.setup_percpu_clockev = x86_init_noop; > + x86_cpuinit.setup_percpu_clockev = xen_hvm_setup_cpu_clockevents; > + > + x86_platform.calibrate_tsc = xen_tsc_khz; > + x86_platform.get_wallclock = xen_get_wallclock; > + x86_platform.set_wallclock = xen_set_wallclock; > +} > + > void __init xen_guest_init(void) > { > int r; > @@ -1326,4 +1356,5 @@ void __init xen_guest_init(void) > register_cpu_notifier(&xen_hvm_cpu_notifier); > have_vcpu_info_placement = 0; > x86_init.irqs.intr_init = xen_init_IRQ; > + init_hvm_time(); > } > diff --git a/arch/x86/xen/suspend.c b/arch/x86/xen/suspend.c > index ef517ee..02c3253 100644 > --- a/arch/x86/xen/suspend.c > +++ b/arch/x86/xen/suspend.c > @@ -28,8 +28,12 @@ void xen_pre_suspend(void) > > void xen_hvm_post_suspend(int suspend_cancelled) > { > + int cpu; > init_shared_info(); > xen_callback_vector(); > + for_each_online_cpu(cpu) { > + xen_setup_runstate_info(cpu); > + } > } > > void xen_post_suspend(int suspend_cancelled) > diff --git a/include/xen/interface/features.h > b/include/xen/interface/features.h > index 8ab08b9..70d2563 100644 > --- a/include/xen/interface/features.h > +++ b/include/xen/interface/features.h > @@ -44,6 +44,9 @@ > /* x86: Does this Xen host support the HVM callback vector type? */ > #define XENFEAT_hvm_callback_vector 8 > > +/* x86: pvclock algorithm is safe to use on HVM */ > +#define XENFEAT_hvm_safe_pvclock 9 > + > #define XENFEAT_NR_SUBMAPS 1 > > #endif /* __XEN_PUBLIC_FEATURES_H__ */ > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |