lkml.org 
[lkml]   [2007]   [Nov]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/3] kvmclock - the host part.
    Date
    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.

    Signed-off-by: Glauber de Oliveira Costa <gcosta@redhat.com>
    ---
    drivers/kvm/kvm_main.c | 1 +
    drivers/kvm/x86.c | 32 ++++++++++++++++++++++++++++++++
    drivers/kvm/x86.h | 4 ++++
    3 files changed, 37 insertions(+), 0 deletions(-)

    diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c
    index d095002..c2c79b8 100644
    --- a/drivers/kvm/kvm_main.c
    +++ b/drivers/kvm/kvm_main.c
    @@ -1243,6 +1243,7 @@ static long kvm_dev_ioctl(struct file *filp,
    case KVM_CAP_MMU_SHADOW_CACHE_CONTROL:
    case KVM_CAP_USER_MEMORY:
    case KVM_CAP_SET_TSS_ADDR:
    + case KVM_CAP_CLOCKSOURCE:
    r = 1;
    break;
    default:
    diff --git a/drivers/kvm/x86.c b/drivers/kvm/x86.c
    index e905d46..ef31fed 100644
    --- a/drivers/kvm/x86.c
    +++ b/drivers/kvm/x86.c
    @@ -19,6 +19,7 @@
    #include "segment_descriptor.h"
    #include "irq.h"

    +#include <linux/clocksource.h>
    #include <linux/kvm.h>
    #include <linux/fs.h>
    #include <linux/vmalloc.h>
    @@ -1628,6 +1629,28 @@ int kvm_emulate_halt(struct kvm_vcpu *vcpu)
    }
    EXPORT_SYMBOL_GPL(kvm_emulate_halt);

    +static void kvm_write_guest_time(struct kvm_vcpu *vcpu)
    +{
    + struct timespec ts;
    + int r;
    +
    + if (!vcpu->clock_gpa)
    + return;
    +
    + /* Updates version to the next odd number, indicating we're writing */
    + vcpu->hv_clock.version++;
    + kvm_write_guest(vcpu->kvm, vcpu->clock_gpa, &vcpu->hv_clock, PAGE_SIZE);
    +
    + kvm_get_msr(vcpu, MSR_IA32_TIME_STAMP_COUNTER,
    + &vcpu->hv_clock.last_tsc);
    +
    + ktime_get_ts(&ts);
    + vcpu->hv_clock.now_ns = ts.tv_nsec + (NSEC_PER_SEC * (u64)ts.tv_sec);
    + vcpu->hv_clock.wc_sec = get_seconds();
    + vcpu->hv_clock.version++;
    + kvm_write_guest(vcpu->kvm, vcpu->clock_gpa, &vcpu->hv_clock, PAGE_SIZE);
    +}
    +
    int kvm_emulate_hypercall(struct kvm_vcpu *vcpu)
    {
    unsigned long nr, a0, a1, a2, a3, ret;
    @@ -1648,7 +1671,15 @@ int kvm_emulate_hypercall(struct kvm_vcpu *vcpu)
    a3 &= 0xFFFFFFFF;
    }

    + ret = 0;
    switch (nr) {
    + case KVM_HCALL_REGISTER_CLOCK:
    +
    + vcpu->clock_gpa = a0 << PAGE_SHIFT;
    + vcpu->hv_clock.tsc_mult = clocksource_khz2mult(tsc_khz, 22);
    +
    + break;
    +
    default:
    ret = -KVM_ENOSYS;
    break;
    @@ -1924,6 +1955,7 @@ out:
    goto preempted;
    }

    + kvm_write_guest_time(vcpu);
    post_kvm_run_save(vcpu, kvm_run);

    return r;
    diff --git a/drivers/kvm/x86.h b/drivers/kvm/x86.h
    index 663b822..fd77b66 100644
    --- a/drivers/kvm/x86.h
    +++ b/drivers/kvm/x86.h
    @@ -83,6 +83,10 @@ struct kvm_vcpu {
    /* emulate context */

    struct x86_emulate_ctxt emulate_ctxt;
    +
    + struct kvm_hv_clock_s hv_clock;
    + gpa_t clock_gpa; /* guest frame number, physical addr */
    +
    };

    int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gva_t gva, u32 error_code);
    --
    1.5.0.6
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-11-08 22:43    [W:0.026 / U:31.488 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site