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 1/2] kvmclock - the host part.
Date: Sun, 20 Jan 2008 17:37:10 +0200 [thread overview]
Message-ID: <47936AA6.2050509@qumranet.com> (raw)
In-Reply-To: <12005010761561-git-send-email-gcosta-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Glauber de Oliveira Costa wrote:
> This is the host part of kvm clocksource implementation. As it does
> not include clockevents, it is a fairly simple implementation. We
> only have to register a per-vcpu area, and start writting to it periodically.
>
> The area is binary compatible with xen, as we use the same shadow_info structure.
>
> Signed-off-by: Glauber de Oliveira Costa <gcosta-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
> ---
> arch/x86/kvm/x86.c | 98 +++++++++++++++++++++++++++++++++++++++++++-
> include/asm-x86/kvm_host.h | 6 +++
> include/asm-x86/kvm_para.h | 24 +++++++++++
> include/linux/kvm.h | 1 +
> 4 files changed, 128 insertions(+), 1 deletions(-)
>
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index 8a90403..fd69aa1 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -19,6 +19,7 @@
> #include "irq.h"
> #include "mmu.h"
>
> +#include <linux/clocksource.h>
> #include <linux/kvm.h>
> #include <linux/fs.h>
> #include <linux/vmalloc.h>
> @@ -412,7 +413,7 @@ static u32 msrs_to_save[] = {
> #ifdef CONFIG_X86_64
> MSR_CSTAR, MSR_KERNEL_GS_BASE, MSR_SYSCALL_MASK, MSR_LSTAR,
> #endif
> - MSR_IA32_TIME_STAMP_COUNTER,
> + MSR_IA32_TIME_STAMP_COUNTER, MSR_KVM_SYSTEM_TIME,
>
Missing second MSR here.
>
> +static void kvm_write_wall_clock(struct kvm_vcpu *v, gpa_t wall_clock)
> +{
> + int version = 1;
> + struct wall_clock wc;
> + unsigned long flags;
> + struct timespec wc_ts;
> +
> + local_irq_save(flags);
> + kvm_get_msr(v, MSR_IA32_TIME_STAMP_COUNTER,
> + &v->arch.hv_clock.tsc_timestamp);
> + wc_ts = current_kernel_time();
> + local_irq_restore(flags);
> +
> + down_write(¤t->mm->mmap_sem);
> + kvm_write_guest(v->kvm, wall_clock, &version, sizeof(version));
> + up_write(¤t->mm->mmap_sem);
> +
> + /* With all the info we got, fill in the values */
> + wc.wc_sec = wc_ts.tv_sec;
> + wc.wc_nsec = wc_ts.tv_nsec;
> + wc.wc_version = ++version;
> +
> + down_write(¤t->mm->mmap_sem);
> + kvm_write_guest(v->kvm, wall_clock, &wc, sizeof(wc));
> + up_write(¤t->mm->mmap_sem);
> +}
>
missing blank line
> +static void kvm_write_guest_time(struct kvm_vcpu *v)
> +{
> + struct timespec ts;
> + unsigned long flags;
> + struct kvm_vcpu_arch *vcpu = &v->arch;
> + void *shared_kaddr;
> +
> + if ((!vcpu->time_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);
> + ktime_get_ts(&ts);
> + local_irq_restore(flags);
> +
> + /* With all the info we got, fill in the values */
> +
> + 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
> + */
> + vcpu->hv_clock.version = 2;
> +
> + preempt_disable();
>
vcpu_load() is not preemptible anyway (and cannot be).
> +
> + shared_kaddr = kmap_atomic(vcpu->time_page, KM_USER0);
> +
> + memcpy(shared_kaddr + vcpu->time_offset, &vcpu->hv_clock,
> + sizeof(vcpu->hv_clock));
> +
> + kunmap_atomic(shared_kaddr, KM_USER0);
> + preempt_enable();
> +
> + mark_page_dirty(v->kvm, vcpu->time >> PAGE_SHIFT);
> +}
> +
>
> int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data)
> {
> @@ -494,6 +562,25 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data)
> case MSR_IA32_MISC_ENABLE:
> vcpu->arch.ia32_misc_enable_msr = data;
> break;
> + case MSR_KVM_WALL_CLOCK:
> + vcpu->arch.wall_clock = data;
>
This better be a global msr (in kvm->, not vcpu->). There is precedent;
some msrs in hyperthreading-capable processors are global to a core.
We need some notification to update wall clock as a result of
time-of-day step changes, due to ntp or the user setting the date.
Hopefully such a notifier exists.
--
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/
next prev parent reply other threads:[~2008-01-20 15:37 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-01-16 16:31 [PATCH 0/2] kvm clock - xen compatible by accident Glauber de Oliveira Costa
[not found] ` <1200501067774-git-send-email-gcosta-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2008-01-16 16:31 ` [PATCH 1/2] kvmclock - the host part Glauber de Oliveira Costa
[not found] ` <12005010761561-git-send-email-gcosta-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2008-01-16 16:31 ` [PATCH 2/2] kvmclock implementation, the guest part Glauber de Oliveira Costa
[not found] ` <1200501082989-git-send-email-gcosta-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2008-01-17 8:03 ` Gerd Hoffmann
[not found] ` <478F0BBE.1010507-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2008-01-17 12:52 ` Glauber de Oliveira Costa
2008-01-16 19:00 ` [PATCH 1/2] kvmclock - the host part Anthony Liguori
[not found] ` <478E544C.4020603-rdkfGonbjUSkNkDKm+mE6A@public.gmane.org>
2008-01-17 0:18 ` Glauber de Oliveira Costa
2008-01-17 7:59 ` Gerd Hoffmann
2008-01-20 15:37 ` Avi Kivity [this message]
2008-01-20 15:38 ` Avi Kivity
-- strict thread matches above, loose matches on Subject: below --
2008-02-11 18:07 [PATCH 0/2] kvm clock - merge last comments Glauber de Oliveira Costa
2008-02-11 18:07 ` [PATCH 1/2] kvmclock - the host part Glauber de Oliveira Costa
2008-02-13 10:49 ` Avi Kivity
2008-02-13 21:45 ` Glauber Costa
2008-02-14 9:21 ` Avi Kivity
2008-02-18 14:06 ` Marcelo Tosatti
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=47936AA6.2050509@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 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.