public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
From: Avi Kivity <avi-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
To: Glauber de Oliveira Costa
	<gcosta-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
	jeremy-TSDbQ3PG+2Y@public.gmane.org
Subject: Re: [PATCH 2/3] kvmclock - the host part.
Date: Wed, 16 Jan 2008 10:39:43 +0200	[thread overview]
Message-ID: <478DC2CF.4040803@qumranet.com> (raw)
In-Reply-To: <12004098373625-git-send-email-gcosta-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>

Glauber de Oliveira Costa wrote:

> +static void kvm_write_guest_time(struct kvm_vcpu *v)
> +{
> +	struct timespec ts, wc_ts;
> +	int wc_args[3]; /* version, wc_sec, wc_nsec */
> +	unsigned long flags;
> +	struct kvm_vcpu_arch *vcpu = &v->arch;
> +	struct xen_shared_info *shared_kaddr;
> +
> +	if ((!vcpu->shared_page))
> +		return;
> +
> +	/* Keep irq disabled to prevent changes to the clock */
> +	local_irq_save(flags);
> +	kvm_get_msr(v, MSR_IA32_TIME_STAMP_COUNTER,
> +			  &vcpu->hv_clock.tsc_timestamp);
> +	wc_ts = current_kernel_time();
> +	ktime_get_ts(&ts);
> +	local_irq_restore(flags);
> +
> +	/* With all the info we got, fill in the values */
> +	wc_args[1] = wc_ts.tv_sec;
> +	wc_args[2] = wc_ts.tv_nsec;
> +
> +	vcpu->hv_clock.system_time = ts.tv_nsec +
> +				     (NSEC_PER_SEC * (u64)ts.tv_sec);
> +	/*
> +	 * The interface expects us to write an even number signaling that the
> +	 * update is finished. Since the guest won't see the intermediate states,
> +	 * we just write "2" at the end
> +	 */
> +	wc_args[0] = 2;
> +	vcpu->hv_clock.version = 2;
> +
> +	preempt_disable();
> +
> +	shared_kaddr = kmap_atomic(vcpu->shared_page, KM_USER0);
> +
> +	/*
> +	 * We could write everything at once, but it can break future
> +	 * implementations. We're just a tiny and lonely clock, so let's
> +	 * write only what matters here
> +	 */
> +	memcpy(&shared_kaddr->wc_version, wc_args, sizeof(wc_args));
>   


We want to avoid updating wall clock all the time.  As far as I 
understand, wall clock is just a base which doesn't change.  To get the 
real wall clock, you read the shared_info wall clock and add the current 
system time.  This means that you avoid writing to a shared global  
(which is expensive in cache lines).  The shared_info wall clock is only 
updated if the host clocked is moved (other than in the way you expect 
it to).

Also, when you write to the shared clock, you must respect the protocol 
since it can be read concurrently:

- increment the version
- smp_wmb()
- copy the goodies
- smp_wmb()
- increment the version again

[I think this is the protocol, but better read the sources to double-check]

>  		}
> diff --git a/include/asm-x86/kvm_host.h b/include/asm-x86/kvm_host.h
> index d6db0de..9a66b90 100644
> --- a/include/asm-x86/kvm_host.h
> +++ b/include/asm-x86/kvm_host.h
> @@ -261,6 +261,10 @@ struct kvm_vcpu_arch {
>  	/* emulate context */
>  
>  	struct x86_emulate_ctxt emulate_ctxt;
> +
> +	struct xen_vcpu_time_info hv_clock;
> +	gpa_t shared_info;
> +	struct page *shared_page;
>  };
>   

shared_{info,page} is too generic a name for just a clock.

>  
> +/* xen binary-compatible interfaces. See xen headers for details */
> +struct xen_vcpu_time_info {
> +	uint32_t version;
> +	uint32_t pad0;
> +	uint64_t tsc_timestamp;
> +	uint64_t system_time;
> +	uint32_t tsc_to_system_mul;
> +	int8_t   tsc_shift;
> +	int8_t   pad1[3];
> +};
> +
> +struct xen_vcpu_info {
> +	uint8_t  pad[32];
> +	struct xen_vcpu_time_info time;
> +};
>   

Please drop xen_vcpu_info...

> +
> +#define XEN_MAX_VIRT_CPUS	32
> +
> +struct xen_shared_info {
> +	struct xen_vcpu_info vcpu_info[XEN_MAX_VIRT_CPUS];
> +
> +	unsigned long evt[2];
> +
> +	uint32_t wc_version;      /* Version counter: see vcpu_time_info_t. */
> +	uint32_t wc_sec;          /* Secs  00:00:00 UTC, Jan 1, 1970.  */
> +	uint32_t wc_nsec;         /* Nsecs 00:00:00 UTC, Jan 1, 1970.  */
> +
> +	unsigned long pad[12];
> +};
>   

... and everything non-time-related in here.  Yes, in means we need two 
msrs (for wall clock and system time), but it also means we don't impose 
any layout upon the guest, and do not (for example) restrict the number 
of vcpus.  We could easily put the vcpu clock in a per_cpu() area.


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


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/

  parent reply	other threads:[~2008-01-16  8:39 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-01-15 15:10 [PATCH 0/3] kvm clock - with the patches this time Glauber de Oliveira Costa
     [not found] ` <1200409817411-git-send-email-gcosta-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2008-01-15 15:10   ` [PATCH 1/3] put kvm_para.h include outside __KERNEL__ Glauber de Oliveira Costa
     [not found]     ` <120040983179-git-send-email-gcosta-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2008-01-15 15:10       ` [PATCH 2/3] kvmclock - the host part Glauber de Oliveira Costa
     [not found]         ` <12004098373625-git-send-email-gcosta-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2008-01-15 15:10           ` [PATCH 3/3] [PATCH] kvmclock implementation, the guest part Glauber de Oliveira Costa
2008-01-16  8:39           ` Avi Kivity [this message]
     [not found]             ` <478DC2CF.4040803-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2008-01-16  8:54               ` [PATCH 2/3] kvmclock - the host part Gerd Hoffmann
     [not found]                 ` <478DC662.6010902-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2008-01-16  9:32                   ` Avi Kivity
2008-01-16  8:41       ` [PATCH 1/3] put kvm_para.h include outside __KERNEL__ Avi Kivity
  -- strict thread matches above, loose matches on Subject: below --
2007-11-08 22:39 [PATCH 0/3] Kvm clocksource, new spin Glauber de Oliveira Costa
2007-11-08 22:39 ` [PATCH 1/3] include files for kvmclock Glauber de Oliveira Costa
     [not found]   ` <11945615703593-git-send-email-gcosta-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2007-11-08 22:39     ` [PATCH 2/3] kvmclock - the host part Glauber de Oliveira Costa
     [not found]       ` <11945615751747-git-send-email-gcosta-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2007-11-11 10:17         ` Avi Kivity
     [not found]           ` <4736D6C0.8040408-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-11-13 11:28             ` Glauber de Oliveira Costa
     [not found]               ` <47398A68.8080009-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2007-11-13 14:44                 ` Avi Kivity
2007-11-13  5:00         ` Dong, Eddie
     [not found]           ` <10EA09EFD8728347A513008B6B0DA77A025DF8A2-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2007-11-13 11:54             ` Glauber de Oliveira Costa
     [not found]               ` <4739906B.2080103-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2007-11-13 12:08                 ` Izik Eidus
2007-11-13 14:47                 ` Avi Kivity
     [not found]                   ` <4739B916.4000405-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-11-13 15:23                     ` Dong, Eddie
     [not found]                       ` <10EA09EFD8728347A513008B6B0DA77A025DFB75-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2007-11-13 16:12                         ` Avi Kivity
     [not found]                           ` <4739CD03.90406-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-11-14  0:41                             ` Dong, Eddie

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=478DC2CF.4040803@qumranet.com \
    --to=avi-atkuwr5tajbwk0htik3j/w@public.gmane.org \
    --cc=gcosta-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
    --cc=jeremy-TSDbQ3PG+2Y@public.gmane.org \
    --cc=kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox