[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [Xen-devel] [PATCH] X86: Prefer TSC-deadline timer in Xen



> From: Jan Beulich [mailto:JBeulich@xxxxxxxxxx], October 28, 2010 7:43 PM
> >>> On 28.10.10 at 11:48, "Wei, Gang" <gang.wei@xxxxxxxxx> wrote:
> >>  From: Jan Beulich [mailto:JBeulich@xxxxxxxxxx], Thursday, October 28,
> 2010
> > 3:46 PM
> >> >>> On 28.10.10 at 07:45, "Wei, Gang" <gang.wei@xxxxxxxxx> wrote:
> >> > --- a/xen/arch/x86/apic.c        Wed Oct 20 17:26:51 2010 +0100
> >> > +++ b/xen/arch/x86/apic.c        Fri Oct 29 19:24:56 2010 +0800
> >> > @@ -37,6 +37,15 @@
> >> >  #include <asm/asm_defns.h> /* for BUILD_SMP_INTERRUPT */
> >> >  #include <mach_apic.h>
> >> >  #include <io_ports.h>
> >> > +
> >> > +#define APIC_TIMER_MODE_ONESHOT         (0 << 17)
> >> > +#define APIC_TIMER_MODE_PERIODIC        (1 << 17)
> >> > +#define APIC_TIMER_MODE_TSC_DEADLINE    (2 << 17)
> >> > +#define APIC_TIMER_MODE_MASK            (3 << 17)
> >> > +
> >> > +static int tdt_enabled;
> >> > +static int tdt_disable;
> >> > +boolean_param("tdt_off", tdt_disable);
> >>
> >> It would be more natural to call the parameter just "tdt", and
> >> use a non-zero initialized variable that gets set to zero when
> >> the user passes "tdt=off" (or another of the boolean false
> >> indicators). Perhaps you could even get away with just the
> >> single "tdt_enabled" variable then.
> >
> > Rename the parameter should be ok. But I prefer to keep two variable there
> > to avoid check both tdt_enabled &
> boot_cpu_has(X86_FEATURE_TSC_DEADLINE)
> > everywhere.
> 
> Why? Just clear tdt_enabled when you find
> !boot_cpu_has(X86_FEATURE_TSC_DEADLINE) during initialization.
> 
> And btw., this (or if you really want to keep them separate, both)
> variable(s) are pretty reasonable candidates for __read_mostly.

I still want to keep them because __setup_APIC_LVTT() will be called multiple 
times - the first call with tdt_enabled == false, and the following calls with 
tdt_enabled == true. I will add __read_mostly for the two variables.

> 
> >> > @@ -1360,12 +1382,24 @@ int reprogram_timer(s_time_t timeout)
> >> >      if ( !cpu_has_apic )
> >> >          return 1;
> >> >
> >> > -    if ( timeout && ((expire = timeout - NOW()) > 0) )
> >> > -        apic_tmict = min_t(u64, (bus_scale * expire) >> 18, UINT_MAX);
> >> > -
> >> > -    apic_write(APIC_TMICT, (unsigned long)apic_tmict);
> >> > -
> >> > -    return apic_tmict || !timeout;
> >> > +    if ( tdt_enabled )
> >> > +    {
> >> > +        u64 tsc = 0;
> >>
> >> Is zero really a proper "no-timeout" indicator here?
> >
> > Yes, it is. Writing zero to MSR_IA32_TSC_DEADLINE will disarm the tdt
> > according to SDM.
> 
> Okay, then (albeit unlikely) you should check that you don't
> unintentionally write zero into the MSR.

I am sure this MSR will only be written with zero while timeout is 0.

> 
> >> > +
> >> > +        if ( timeout )
> >> > +            tsc = stime2tsc(timeout);
> >> > +
> >> > +        wrmsrl(MSR_IA32_TSC_DEADLINE, tsc);
> >> > +    }
> >> > +    else
> >> > +    {
> >> > +        if ( timeout && ((expire = timeout - NOW()) > 0) )
> >> > +            apic_tmict = min_t(u64, (bus_scale * expire) >> 18,
> >> UINT_MAX);
> >> > +
> >> > +        apic_write(APIC_TMICT, (unsigned long)apic_tmict);
> >> > +    }
> >> > +
> >> > +    return apic_tmict || !timeout || tdt_enabled;
> >>
> >> How can this always be successful if tdt_enabled?
> >
> > If tdt_enabled, there are only three cases: 1st, timeout=0, then write 0 to
> > tdt msr to stop timer, return successful; 2nd, timeout <= NOW(), a tsc value
> > less than or equal current tsc will be written to tdt msr, then a expiring
> > interrupt will be generated right now, return successful; 3rd, timeout >
> > NOW(), a tsc value > current tsc will be written to tdt msr, also return
> > successful. No need to return failed if tdt_enabled.
> 
> Ah, okay - I should have fully read the doc first. Sorry for the
> noise. Now rather than extending the return expression, why
> don't you "return 1" inside the if()'s body (and in that case
> you could leave the original code mostly unchanged since then
> you also don't need an else).

Yes, this is also a good comment. I will take it even it has the side effect of 
adding a return point in the middle of the function.

Jimmy

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.