From: Scott Wood <scottwood@freescale.com>
To: Bharat Bhushan <r65777@freescale.com>
Cc: kvm-ppc@vger.kernel.org, kvm@vger.kernel.org,
Bharat Bhushan <bharat.bhushan@freescale.com>,
linuxppc-dev@lists.ozlabs.org
Subject: Re: [PATCH] Use clockevent multiplier and shifter for decrementer
Date: Fri, 06 Apr 2012 19:10:14 +0000 [thread overview]
Message-ID: <4F7F3F96.5070905@freescale.com> (raw)
In-Reply-To: <1333522311-1390-1-git-send-email-bharat.bhushan@freescale.com>
On 04/04/2012 01:51 AM, 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.bhushan@freescale.com>
> ---
> arch/powerpc/include/asm/time.h | 2 ++
> arch/powerpc/kernel/time.c | 6 ++++++
> arch/powerpc/kvm/emulate.c | 5 +++--
> 3 files changed, 11 insertions(+), 2 deletions(-)
Changes to arch/powerpc outside arch/powerpc/kvm need to
Cc: linuxppc-dev@lists.ozlabs.org
> diff --git a/arch/powerpc/include/asm/time.h b/arch/powerpc/include/asm/time.h
> index 7eb10fb..6d631b2 100644
> --- a/arch/powerpc/include/asm/time.h
> +++ b/arch/powerpc/include/asm/time.h
> @@ -202,6 +202,8 @@ extern u64 mulhdu(u64, u64);
> extern void div128_by_32(u64 dividend_high, u64 dividend_low,
> unsigned divisor, struct div_result *dr);
>
> +extern void get_clockevent_mult(u64 *multi, u64 *shift);
> +
> /* Used to store Processor Utilization register (purr) values */
>
> struct cpu_usage {
> diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
> index 567dd7c..d229edd 100644
> --- a/arch/powerpc/kernel/time.c
> +++ b/arch/powerpc/kernel/time.c
> @@ -910,6 +910,12 @@ static void __init init_decrementer_clockevent(void)
> register_decrementer_clockevent(cpu);
> }
>
> +void get_clockevent_mult(u64 *multi, u64 *shift)
> +{
> + *multi = decrementer_clockevent.mult;
> + *shift = decrementer_clockevent.shift;
> +}
Maybe just make decrmenter_clockevent non-static?
> diff --git a/arch/powerpc/kvm/emulate.c b/arch/powerpc/kvm/emulate.c
> index afc9154..4bfcaa1 100644
> --- a/arch/powerpc/kvm/emulate.c
> +++ b/arch/powerpc/kvm/emulate.c
> @@ -76,6 +76,7 @@ void kvmppc_emulate_dec(struct kvm_vcpu *vcpu)
> {
> unsigned long dec_nsec;
> unsigned long long dec_time;
> + u64 mult, shift;
>
> pr_debug("mtDEC: %x\n", vcpu->arch.dec);
> hrtimer_try_to_cancel(&vcpu->arch.dec_timer);
> @@ -103,9 +104,9 @@ void kvmppc_emulate_dec(struct kvm_vcpu *vcpu)
> * host ticks.
> */
>
> + get_clockevent_mult(&mult,&shift);
> dec_time = vcpu->arch.dec;
> - dec_time *= 1000;
> - do_div(dec_time, tb_ticks_per_usec);
> + dec_time = (dec_time<< shift) / mult;
> dec_nsec = do_div(dec_time, NSEC_PER_SEC);
> hrtimer_start(&vcpu->arch.dec_timer,
> ktime_set(dec_time, dec_nsec), HRTIMER_MODE_REL);
-Scott
WARNING: multiple messages have this Message-ID (diff)
From: Scott Wood <scottwood@freescale.com>
To: Bharat Bhushan <r65777@freescale.com>
Cc: Bharat Bhushan <bharat.bhushan@freescale.com>,
linuxppc-dev@lists.ozlabs.org, kvm@vger.kernel.org,
kvm-ppc@vger.kernel.org
Subject: Re: [PATCH] Use clockevent multiplier and shifter for decrementer
Date: Fri, 6 Apr 2012 14:10:14 -0500 [thread overview]
Message-ID: <4F7F3F96.5070905@freescale.com> (raw)
In-Reply-To: <1333522311-1390-1-git-send-email-bharat.bhushan@freescale.com>
On 04/04/2012 01:51 AM, 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.bhushan@freescale.com>
> ---
> arch/powerpc/include/asm/time.h | 2 ++
> arch/powerpc/kernel/time.c | 6 ++++++
> arch/powerpc/kvm/emulate.c | 5 +++--
> 3 files changed, 11 insertions(+), 2 deletions(-)
Changes to arch/powerpc outside arch/powerpc/kvm need to
Cc: linuxppc-dev@lists.ozlabs.org
> diff --git a/arch/powerpc/include/asm/time.h b/arch/powerpc/include/asm/time.h
> index 7eb10fb..6d631b2 100644
> --- a/arch/powerpc/include/asm/time.h
> +++ b/arch/powerpc/include/asm/time.h
> @@ -202,6 +202,8 @@ extern u64 mulhdu(u64, u64);
> extern void div128_by_32(u64 dividend_high, u64 dividend_low,
> unsigned divisor, struct div_result *dr);
>
> +extern void get_clockevent_mult(u64 *multi, u64 *shift);
> +
> /* Used to store Processor Utilization register (purr) values */
>
> struct cpu_usage {
> diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
> index 567dd7c..d229edd 100644
> --- a/arch/powerpc/kernel/time.c
> +++ b/arch/powerpc/kernel/time.c
> @@ -910,6 +910,12 @@ static void __init init_decrementer_clockevent(void)
> register_decrementer_clockevent(cpu);
> }
>
> +void get_clockevent_mult(u64 *multi, u64 *shift)
> +{
> + *multi = decrementer_clockevent.mult;
> + *shift = decrementer_clockevent.shift;
> +}
Maybe just make decrmenter_clockevent non-static?
> diff --git a/arch/powerpc/kvm/emulate.c b/arch/powerpc/kvm/emulate.c
> index afc9154..4bfcaa1 100644
> --- a/arch/powerpc/kvm/emulate.c
> +++ b/arch/powerpc/kvm/emulate.c
> @@ -76,6 +76,7 @@ void kvmppc_emulate_dec(struct kvm_vcpu *vcpu)
> {
> unsigned long dec_nsec;
> unsigned long long dec_time;
> + u64 mult, shift;
>
> pr_debug("mtDEC: %x\n", vcpu->arch.dec);
> hrtimer_try_to_cancel(&vcpu->arch.dec_timer);
> @@ -103,9 +104,9 @@ void kvmppc_emulate_dec(struct kvm_vcpu *vcpu)
> * host ticks.
> */
>
> + get_clockevent_mult(&mult,&shift);
> dec_time = vcpu->arch.dec;
> - dec_time *= 1000;
> - do_div(dec_time, tb_ticks_per_usec);
> + dec_time = (dec_time<< shift) / mult;
> dec_nsec = do_div(dec_time, NSEC_PER_SEC);
> hrtimer_start(&vcpu->arch.dec_timer,
> ktime_set(dec_time, dec_nsec), HRTIMER_MODE_REL);
-Scott
WARNING: multiple messages have this Message-ID (diff)
From: Scott Wood <scottwood@freescale.com>
To: Bharat Bhushan <r65777@freescale.com>
Cc: <kvm-ppc@vger.kernel.org>, <kvm@vger.kernel.org>,
Bharat Bhushan <bharat.bhushan@freescale.com>,
<linuxppc-dev@lists.ozlabs.org>
Subject: Re: [PATCH] Use clockevent multiplier and shifter for decrementer
Date: Fri, 6 Apr 2012 14:10:14 -0500 [thread overview]
Message-ID: <4F7F3F96.5070905@freescale.com> (raw)
In-Reply-To: <1333522311-1390-1-git-send-email-bharat.bhushan@freescale.com>
On 04/04/2012 01:51 AM, 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.bhushan@freescale.com>
> ---
> arch/powerpc/include/asm/time.h | 2 ++
> arch/powerpc/kernel/time.c | 6 ++++++
> arch/powerpc/kvm/emulate.c | 5 +++--
> 3 files changed, 11 insertions(+), 2 deletions(-)
Changes to arch/powerpc outside arch/powerpc/kvm need to
Cc: linuxppc-dev@lists.ozlabs.org
> diff --git a/arch/powerpc/include/asm/time.h b/arch/powerpc/include/asm/time.h
> index 7eb10fb..6d631b2 100644
> --- a/arch/powerpc/include/asm/time.h
> +++ b/arch/powerpc/include/asm/time.h
> @@ -202,6 +202,8 @@ extern u64 mulhdu(u64, u64);
> extern void div128_by_32(u64 dividend_high, u64 dividend_low,
> unsigned divisor, struct div_result *dr);
>
> +extern void get_clockevent_mult(u64 *multi, u64 *shift);
> +
> /* Used to store Processor Utilization register (purr) values */
>
> struct cpu_usage {
> diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
> index 567dd7c..d229edd 100644
> --- a/arch/powerpc/kernel/time.c
> +++ b/arch/powerpc/kernel/time.c
> @@ -910,6 +910,12 @@ static void __init init_decrementer_clockevent(void)
> register_decrementer_clockevent(cpu);
> }
>
> +void get_clockevent_mult(u64 *multi, u64 *shift)
> +{
> + *multi = decrementer_clockevent.mult;
> + *shift = decrementer_clockevent.shift;
> +}
Maybe just make decrmenter_clockevent non-static?
> diff --git a/arch/powerpc/kvm/emulate.c b/arch/powerpc/kvm/emulate.c
> index afc9154..4bfcaa1 100644
> --- a/arch/powerpc/kvm/emulate.c
> +++ b/arch/powerpc/kvm/emulate.c
> @@ -76,6 +76,7 @@ void kvmppc_emulate_dec(struct kvm_vcpu *vcpu)
> {
> unsigned long dec_nsec;
> unsigned long long dec_time;
> + u64 mult, shift;
>
> pr_debug("mtDEC: %x\n", vcpu->arch.dec);
> hrtimer_try_to_cancel(&vcpu->arch.dec_timer);
> @@ -103,9 +104,9 @@ void kvmppc_emulate_dec(struct kvm_vcpu *vcpu)
> * host ticks.
> */
>
> + get_clockevent_mult(&mult,&shift);
> dec_time = vcpu->arch.dec;
> - dec_time *= 1000;
> - do_div(dec_time, tb_ticks_per_usec);
> + dec_time = (dec_time<< shift) / mult;
> dec_nsec = do_div(dec_time, NSEC_PER_SEC);
> hrtimer_start(&vcpu->arch.dec_timer,
> ktime_set(dec_time, dec_nsec), HRTIMER_MODE_REL);
-Scott
next prev parent reply other threads:[~2012-04-06 19:10 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-04-04 6:38 [PATCH] Use clockevent multiplier and shifter for decrementer Bharat Bhushan
2012-04-04 6:51 ` Bharat Bhushan
2012-04-06 19:10 ` Scott Wood [this message]
2012-04-06 19:10 ` Scott Wood
2012-04-06 19:10 ` Scott Wood
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4F7F3F96.5070905@freescale.com \
--to=scottwood@freescale.com \
--cc=bharat.bhushan@freescale.com \
--cc=kvm-ppc@vger.kernel.org \
--cc=kvm@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=r65777@freescale.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.