lkml.org 
[lkml]   [2017]   [Jan]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 1/3] KVM: x86: provide realtime host clock via vsyscall notifiers
    Expose the realtime host clock and save the TSC value
    used for the clock calculation.

    Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>

    ---
    arch/x86/kvm/x86.c | 38 ++++++++++++++++++++++++++++++++++++++
    1 file changed, 38 insertions(+)

    Index: kvm-ptpdriver/arch/x86/kvm/x86.c
    ===================================================================
    --- kvm-ptpdriver.orig/arch/x86/kvm/x86.c 2017-01-13 08:59:03.015895353 -0200
    +++ kvm-ptpdriver/arch/x86/kvm/x86.c 2017-01-13 09:04:46.581415259 -0200
    @@ -1139,6 +1139,8 @@

    u64 boot_ns;
    u64 nsec_base;
    + u64 wall_time_sec;
    + u64 wall_time_snsec;
    };

    static struct pvclock_gtod_data pvclock_gtod_data;
    @@ -1162,6 +1164,9 @@
    vdata->boot_ns = boot_ns;
    vdata->nsec_base = tk->tkr_mono.xtime_nsec;

    + vdata->wall_time_sec = tk->xtime_sec;
    + vdata->wall_time_snsec = tk->tkr_mono.xtime_nsec;
    +
    write_seqcount_end(&vdata->seq);
    }
    #endif
    @@ -1623,6 +1628,28 @@
    return mode;
    }

    +static int do_realtime(struct timespec *ts, cycle_t *cycle_now)
    +{
    + struct pvclock_gtod_data *gtod = &pvclock_gtod_data;
    + unsigned long seq;
    + int mode;
    + u64 ns;
    +
    + do {
    + seq = read_seqcount_begin(&gtod->seq);
    + mode = gtod->clock.vclock_mode;
    + ts->tv_sec = gtod->wall_time_sec;
    + ns = gtod->wall_time_snsec;
    + ns += vgettsc(cycle_now);
    + ns >>= gtod->clock.shift;
    + } while (unlikely(read_seqcount_retry(&gtod->seq, seq)));
    +
    + ts->tv_sec += __iter_div_u64_rem(ns, NSEC_PER_SEC, &ns);
    + ts->tv_nsec = ns;
    +
    + return mode;
    +}
    +
    /* returns true if host is using tsc clocksource */
    static bool kvm_get_time_and_clockread(s64 *kernel_ns, cycle_t *cycle_now)
    {
    @@ -1632,6 +1659,17 @@

    return do_monotonic_boot(kernel_ns, cycle_now) == VCLOCK_TSC;
    }
    +
    +/* returns true if host is using tsc clocksource */
    +static bool kvm_get_walltime_and_clockread(struct timespec *ts,
    + cycle_t *cycle_now)
    +{
    + /* checked again under seqlock below */
    + if (pvclock_gtod_data.clock.vclock_mode != VCLOCK_TSC)
    + return false;
    +
    + return do_realtime(ts, cycle_now) == VCLOCK_TSC;
    +}
    #endif

    /*

    \
     
     \ /
      Last update: 2017-01-13 13:11    [W:4.507 / U:0.452 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site