From: Glauber de Oliveira Costa <gcosta-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
To: Anthony Liguori <anthony-rdkfGonbjUSkNkDKm+mE6A@public.gmane.org>
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
jeremy-TSDbQ3PG+2Y@public.gmane.org,
avi-atKUWr5tajBWk0Htik3J/w@public.gmane.org
Subject: Re: [PATCH 1/2] kvmclock - the host part.
Date: Wed, 16 Jan 2008 22:18:31 -0200 [thread overview]
Message-ID: <478E9ED7.2070909@redhat.com> (raw)
In-Reply-To: <478E544C.4020603-rdkfGonbjUSkNkDKm+mE6A@public.gmane.org>
Anthony Liguori wrote:
> 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,
>> };
>>
>> static unsigned num_msrs_to_save;
>> @@ -467,6 +468,73 @@ static int do_set_msr(struct kvm_vcpu *vcpu,
>> unsigned index, u64 *data)
>> return kvm_set_msr(vcpu, index, *data);
>> }
>>
>> +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);
>>
>
> Can we get a comment explaining why we only write the version field and
> then immediately increment the version and write the whole struct? It's
> not at all obvious why the first write is needed to me.
If the comment is the only pending thing, can we add the comment in a
later commit?
>> +}
>> +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();
>> +
>> + 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);
>>
>
> Instead of doing a kmap/memcpy, I think it would be better to store the
> GPA of the time page and do a kvm_write_guest(). Otherwise, you're
> pinning this page in memory.
this functions end up being called from various contexts. Some with the
mmap_sem held, some uncontended. kvm_write_guest needs it held, so it
would turn the code into a big spaguetti. Using the kmap was avi's
suggestion to get around it, which I personally liked: we only grab the
semaphore when the msr is registered.
-------------------------------------------------------------------------
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-17 0:18 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 [this message]
2008-01-17 7:59 ` Gerd Hoffmann
2008-01-20 15:37 ` Avi Kivity
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=478E9ED7.2070909@redhat.com \
--to=gcosta-h+wxahxf7alqt0dzr+alfa@public.gmane.org \
--cc=anthony-rdkfGonbjUSkNkDKm+mE6A@public.gmane.org \
--cc=avi-atKUWr5tajBWk0Htik3J/w@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.