On 09.04.2012, at 06:33, Bharat Bhushan wrote:

> Time for which the hrtimer is started for decrementer emulation is calculated 
> using tb_ticks_per_usec. While hrtimer uses the clockevent for DEC 
> reprogramming (if needed) and which calculate timebase ticks using the 
> multiplier and shifter mechanism implemented within clockevent layer. It was 
> observed that this conversion (timebase->time->timebase) are not correct 
> because the mechanism are not consistent. In our setup it adds 2% jitter.
> 
> With this patch clockevent multiplier and shifter mechanism are used when 
> starting hrtimer for decrementer emulation. Now the jitter is < 0.5%.
> 
> Signed-off-by: Bharat Bhushan <bharat.bhus...@freescale.com>
> ---
> v2:
> - decrementer_clockevent is made non-static rather than a seprate API to get 
> mult/shift
> 
> arch/powerpc/include/asm/time.h |    1 +
> arch/powerpc/kernel/time.c      |    2 +-
> arch/powerpc/kvm/emulate.c      |    5 +++--
> 3 files changed, 5 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/time.h b/arch/powerpc/include/asm/time.h
> index 7eb10fb..b3c7959 100644
> --- a/arch/powerpc/include/asm/time.h
> +++ b/arch/powerpc/include/asm/time.h
> @@ -28,6 +28,7 @@
> extern unsigned long tb_ticks_per_jiffy;
> extern unsigned long tb_ticks_per_usec;
> extern unsigned long tb_ticks_per_sec;
> +extern struct clock_event_device decrementer_clockevent;
> 
> struct rtc_time;
> extern void to_tm(int tim, struct rtc_time * tm);
> diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
> index 567dd7c..e237225 100644
> --- a/arch/powerpc/kernel/time.c
> +++ b/arch/powerpc/kernel/time.c
> @@ -105,7 +105,7 @@ static int decrementer_set_next_event(unsigned long evt,
> static void decrementer_set_mode(enum clock_event_mode mode,
>                                struct clock_event_device *dev);
> 
> -static struct clock_event_device decrementer_clockevent = {
> +struct clock_event_device decrementer_clockevent = {

This one also needs a EXPORT_SYMBOL ...

>       .name           = "decrementer",
>       .rating         = 200,
>       .irq            = 0,
> diff --git a/arch/powerpc/kvm/emulate.c b/arch/powerpc/kvm/emulate.c
> index afc9154..c8b5206 100644
> --- a/arch/powerpc/kvm/emulate.c
> +++ b/arch/powerpc/kvm/emulate.c
> @@ -23,6 +23,7 @@
> #include <linux/types.h>
> #include <linux/string.h>
> #include <linux/kvm_host.h>
> +#include <linux/clockchips.h>
> 
> #include <asm/reg.h>
> #include <asm/time.h>
> @@ -104,8 +105,8 @@ void kvmppc_emulate_dec(struct kvm_vcpu *vcpu)
>        */
> 
>       dec_time = vcpu->arch.dec;
> -     dec_time *= 1000;
> -     do_div(dec_time, tb_ticks_per_usec);
> +     dec_time = dec_time << decrementer_clockevent.shift;
> +     do_div(dec_time, decrementer_clockevent.mult);

... because emulate.c can be built as a module.


Alex

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to