lkml.org 
[lkml]   [2010]   [Mar]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [Xen-devel] [PATCH][v9 6/6] xen: Enable PV clocksource for HVM
    On 03/11/2010 06:57 PM, Sheng Yang wrote:
    > PV clocksource can provide a reliable clocksource for HVM running on Xen.
    >
    > To enable it, put following line to the HVM configure file:
    >
    > cpuid = [ '0x40000002:edx=0x3' ]
    >
    > It would set bit 0 and bit 1 in 0x40000002:edx, which enable PV extension
    > framework and PV clocksource.
    >

    I guess my previous comment would be better made here. I don't see any
    reason to make the Xen pv clocksource conditional at runtime. If the
    user wants to disable/override it, then they can either boot with a
    clocksource= parameter on the kernel command line, or change it on the
    fly via /sys.

    J

    > Signed-off-by: Sheng Yang<sheng@linux.intel.com>
    > ---
    > arch/x86/xen/hvmpv.c | 24 ++++++++++++++++++++++++
    > arch/x86/xen/time.c | 12 +++++++++++-
    > arch/x86/xen/xen-ops.h | 1 +
    > 3 files changed, 36 insertions(+), 1 deletions(-)
    >
    > diff --git a/arch/x86/xen/hvmpv.c b/arch/x86/xen/hvmpv.c
    > index a24a1e9..1961cf0 100644
    > --- a/arch/x86/xen/hvmpv.c
    > +++ b/arch/x86/xen/hvmpv.c
    > @@ -42,6 +42,8 @@ static void __init xen_hvm_pv_banner(void)
    > pv_info.name);
    > printk(KERN_INFO "Xen version: %d.%d%s\n",
    > version>> 16, version& 0xffff, extra.extraversion);
    > + if (xen_hvm_pv_clock_enabled())
    > + printk(KERN_INFO "PV feature: PV clocksource enabled\n");
    > }
    >
    > static int __init xen_para_available(void)
    > @@ -80,6 +82,9 @@ static int __init init_hvm_pv_info(void)
    > if (!(edx& XEN_CPUID_FEAT2_HVM_PV))
    > return -ENODEV;
    >
    > + if (edx& XEN_CPUID_FEAT2_HVM_PV_CLOCK)
    > + xen_hvm_pv_features |= XEN_HVM_PV_CLOCK_ENABLED;
    > +
    > if (pages< 1)
    > return -ENODEV;
    >
    > @@ -110,6 +115,23 @@ static int __init init_shared_info(void)
    > return 0;
    > }
    >
    > +static void __init init_pv_clocksource(void)
    > +{
    > + if (!xen_hvm_pv_clock_enabled())
    > + return;
    > +
    > + if (enable_hvm_pv(HVM_PV_CLOCK))
    > + BUG();
    > +
    > + pv_time_ops.sched_clock = xen_sched_clock;
    > +
    > + x86_platform.calibrate_tsc = xen_tsc_khz;
    > + x86_platform.get_wallclock = xen_get_wallclock;
    > + x86_platform.set_wallclock = xen_set_wallclock;
    > +
    > + xen_register_clocksource();
    > +}
    > +
    > void __init xen_guest_init(void)
    > {
    > int r;
    > @@ -132,4 +154,6 @@ void __init xen_guest_init(void)
    > pv_info = xen_hvm_pv_info;
    >
    > xen_domain_type = XEN_HVM_DOMAIN;
    > +
    > + init_pv_clocksource();
    > }
    > diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c
    > index 0a5aa44..d1c1c50 100644
    > --- a/arch/x86/xen/time.c
    > +++ b/arch/x86/xen/time.c
    > @@ -474,11 +474,21 @@ void xen_timer_resume(void)
    > }
    > }
    >
    > +static bool xen_clocksource_enabled;
    > +
    > +void xen_register_clocksource(void)
    > +{
    > + if (!xen_clocksource_enabled) {
    > + clocksource_register(&xen_clocksource);
    > + xen_clocksource_enabled = 1;
    > + }
    > +}
    > +
    > __init void xen_time_init(void)
    > {
    > int cpu = smp_processor_id();
    >
    > - clocksource_register(&xen_clocksource);
    > + xen_register_clocksource();
    >
    > if (HYPERVISOR_vcpu_op(VCPUOP_stop_periodic_timer, cpu, NULL) == 0) {
    > /* Successfully turned off 100Hz tick, so we have the
    > diff --git a/arch/x86/xen/xen-ops.h b/arch/x86/xen/xen-ops.h
    > index 355fa6b..2aeaf51 100644
    > --- a/arch/x86/xen/xen-ops.h
    > +++ b/arch/x86/xen/xen-ops.h
    > @@ -46,6 +46,7 @@ cycle_t xen_clocksource_read(void);
    > void xen_setup_cpu_clockevents(void);
    > unsigned long xen_tsc_khz(void);
    > void __init xen_time_init(void);
    > +void xen_register_clocksource(void);
    > unsigned long xen_get_wallclock(void);
    > int xen_set_wallclock(unsigned long time);
    > unsigned long long xen_sched_clock(void);
    >



    \
     
     \ /
      Last update: 2010-03-12 21:41    [W:0.044 / U:0.752 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site