WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

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

To: Jan Beulich <JBeulich@xxxxxxxxxx>
Subject: RE: [Xen-devel] [PATCH] X86: Prefer TSC-deadline timer in Xen
From: "Wei, Gang" <gang.wei@xxxxxxxxx>
Date: Thu, 28 Oct 2010 21:54:49 +0800
Accept-language: zh-CN, en-US
Acceptlanguage: zh-CN, en-US
Cc: "Brown, Len" <len.brown@xxxxxxxxx>, "xen-devel@xxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxx>, Keir Fraser <keir.fraser@xxxxxxxxxxxxx>, "Wei, Gang" <gang.wei@xxxxxxxxx>
Delivery-date: Thu, 28 Oct 2010 06:56:36 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <4CC97DDF020000780001FBCA@xxxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <F26D193E20BBDC42A43B611D1BDEDE71218A98966A@xxxxxxxxxxxxxxxxxxxxxxxxxxxx> <4CC94671020000780001FA65@xxxxxxxxxxxxxxxxxx> <F26D193E20BBDC42A43B611D1BDEDE71218A98983A@xxxxxxxxxxxxxxxxxxxxxxxxxxxx> <4CC97DDF020000780001FBCA@xxxxxxxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
Thread-index: Act2lSSuS3xPX6WsRVm8RPqpMDnMUwAEAMgw
Thread-topic: [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