All of lore.kernel.org
 help / color / mirror / Atom feed
From: Avi Kivity <avi@qumranet.com>
To: Gerd Hoffmann <kraxel@redhat.com>
Cc: kvm-devel@lists.sourceforge.net, virtualization@lists.osdl.org
Subject: Re: [kvm-devel] [PATCH 3/4] kvm/host: fix paravirt clocksource to be	compatible with xen.
Date: Tue, 13 May 2008 11:03:39 +0300	[thread overview]
Message-ID: <48294B5B.8020706@qumranet.com> (raw)
In-Reply-To: <1210247315-20472-4-git-send-email-kraxel@redhat.com>

Gerd Hoffmann wrote:
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
>  arch/x86/kvm/x86.c |   63 +++++++++++++++++++++++++++++++++++++++++++--------
>  1 files changed, 53 insertions(+), 10 deletions(-)
>
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index 979f983..6906d54 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -493,7 +493,7 @@ static void kvm_write_wall_clock(struct kvm *kvm, gpa_t wall_clock)
>  {
>  	static int version;
>  	struct kvm_wall_clock wc;
> -	struct timespec wc_ts;
> +	struct timespec now,sys,boot;
>   

Add spaces.

>  
>  	if (!wall_clock)
>  		return;
> @@ -502,9 +502,16 @@ static void kvm_write_wall_clock(struct kvm *kvm, gpa_t wall_clock)
>  
>  	kvm_write_guest(kvm, wall_clock, &version, sizeof(version));
>  
> -	wc_ts = current_kernel_time();
> -	wc.wc_sec = wc_ts.tv_sec;
> -	wc.wc_nsec = wc_ts.tv_nsec;
> +#if 0
> +	/* Hmm, getboottime() isn't exported to modules ... */
> +	getboottime(&boot);
> +#else
> +	now = current_kernel_time();
> +	ktime_get_ts(&sys);
> +	boot = ns_to_timespec(timespec_to_ns(&now) - timespec_to_ns(&sys));
> +#endif
> +	wc.wc_sec = boot.tv_sec;
> +	wc.wc_nsec = boot.tv_nsec;
>   

Please drop the #if 0.

>  	wc.wc_version = version;
>  
>  	kvm_write_guest(kvm, wall_clock, &wc, sizeof(wc));
> @@ -537,20 +544,58 @@ static void kvm_write_guest_time(struct kvm_vcpu *v)
>  	/*
>  	 * The interface expects us to write an even number signaling that the
>  	 * update is finished. Since the guest won't see the intermediate
> -	 * state, we just write "2" at the end
> +	 * state, we just increase by 2 at the end.
>  	 */
> -	vcpu->hv_clock.version = 2;
> +	vcpu->hv_clock.version += 2;
>  
>  	shared_kaddr = kmap_atomic(vcpu->time_page, KM_USER0);
>  
>  	memcpy(shared_kaddr + vcpu->time_offset, &vcpu->hv_clock,
> -		sizeof(vcpu->hv_clock));
> +	       sizeof(vcpu->hv_clock));
>  
>  	kunmap_atomic(shared_kaddr, KM_USER0);
>  
>  	mark_page_dirty(v->kvm, vcpu->time >> PAGE_SHIFT);
>  }
>  
> +static uint32_t div_frac(uint32_t dividend, uint32_t divisor)
> +{
> +	uint32_t quotient, remainder;
> +
> +	__asm__ ( "divl %4"
> +		  : "=a" (quotient), "=d" (remainder)
> +		  : "0" (0), "1" (dividend), "r" (divisor) );
> +	return quotient;	
> +}
>   

do_div()?

> +
> +static void kvm_set_time_scale(uint32_t tsc_khz, struct kvm_vcpu_time_info *hv_clock)
> +{
> +	uint64_t nsecs = 1000000000LL;
> +	int32_t  shift = 0;
> +	uint64_t tps64;
> +	uint32_t tps32;
> +
> +	tps64 = tsc_khz * 1000LL;
> +	while (tps64 > nsecs*2) {
> +		tps64 >>= 1;
> +		shift--;
> +	}
> +
> +	tps32 = (uint32_t)tps64;
> +	while (tps32 <= (uint32_t)nsecs) {
> +		tps32 <<= 1;
> +		shift++;
> +	}
> +
> +	hv_clock->tsc_shift = shift;
> +	hv_clock->tsc_to_system_mul = div_frac(nsecs, tps32);
> +
> +#if 0
> +	printk(KERN_DEBUG "%s: tsc_khz %u, tsc_shift %d, tsc_mul %u\n",
> +	       __FUNCTION__, tsc_khz, hv_clock->tsc_shift,
> +	       hv_clock->tsc_to_system_mul);
> +#endif
> +}
>   

pr_debug() or something?

>  
>  int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data)
>  {
> @@ -599,9 +644,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data)
>  		/* ...but clean it before doing the actual write */
>  		vcpu->arch.time_offset = data & ~(PAGE_MASK | 1);
>  
> -		vcpu->arch.hv_clock.tsc_to_system_mul =
> -					clocksource_khz2mult(tsc_khz, 22);
> -		vcpu->arch.hv_clock.tsc_shift = 22;
> +		kvm_set_time_scale(tsc_khz, &vcpu->arch.hv_clock);
>  
What if the tsc frequency changes later on?  we need to adjust the 
multiplier, no?

-- 
error compiling committee.c: too many arguments to function

  reply	other threads:[~2008-05-13  8:03 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-05-08 11:48 [PATCH 0/4] paravirt clock series Gerd Hoffmann
2008-05-08 11:48 ` [PATCH 1/4] Add helper functions for paravirtual clocksources Gerd Hoffmann
2008-05-08 11:48 ` [PATCH 2/4] Make xen use the generic paravirt clocksource code Gerd Hoffmann
2008-05-08 11:48 ` [PATCH 3/4] kvm/host: fix paravirt clocksource to be compatible with xen Gerd Hoffmann
2008-05-13  8:03   ` Avi Kivity [this message]
2008-05-16  7:47     ` Gerd Hoffmann
2008-05-18  6:05       ` [kvm-devel] " Avi Kivity
2008-05-21 15:24       ` Avi Kivity
2008-05-08 11:48 ` [PATCH 4/4] kvm/guest: fix paravirt clocksource to be compartible " Gerd Hoffmann

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=48294B5B.8020706@qumranet.com \
    --to=avi@qumranet.com \
    --cc=kraxel@redhat.com \
    --cc=kvm-devel@lists.sourceforge.net \
    --cc=virtualization@lists.osdl.org \
    /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.