diff options
author | David S. Miller <davem@davemloft.net> | 2018-06-03 09:31:58 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-06-03 09:31:58 -0400 |
commit | 9c54aeb03a6d65a5834bd92376e921cbac6dfb8f (patch) | |
tree | 70441095d58678711d68cfef4934765251425d1f /arch/x86/kvm/lapic.c | |
parent | eaf47b17a77fda841a1102d76c15161ee438b347 (diff) | |
parent | 918fe1b3157978ada4267468008c5f89ef101e7d (diff) | |
download | linux-9c54aeb03a6d65a5834bd92376e921cbac6dfb8f.tar.gz linux-9c54aeb03a6d65a5834bd92376e921cbac6dfb8f.tar.bz2 linux-9c54aeb03a6d65a5834bd92376e921cbac6dfb8f.zip |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Filling in the padding slot in the bpf structure as a bug fix in 'ne'
overlapped with actually using that padding area for something in
'net-next'.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/x86/kvm/lapic.c')
-rw-r--r-- | arch/x86/kvm/lapic.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index b74c9c1405b9..3773c4625114 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -1522,11 +1522,23 @@ static bool set_target_expiration(struct kvm_lapic *apic) static void advance_periodic_target_expiration(struct kvm_lapic *apic) { - apic->lapic_timer.tscdeadline += - nsec_to_cycles(apic->vcpu, apic->lapic_timer.period); + ktime_t now = ktime_get(); + u64 tscl = rdtsc(); + ktime_t delta; + + /* + * Synchronize both deadlines to the same time source or + * differences in the periods (caused by differences in the + * underlying clocks or numerical approximation errors) will + * cause the two to drift apart over time as the errors + * accumulate. + */ apic->lapic_timer.target_expiration = ktime_add_ns(apic->lapic_timer.target_expiration, apic->lapic_timer.period); + delta = ktime_sub(apic->lapic_timer.target_expiration, now); + apic->lapic_timer.tscdeadline = kvm_read_l1_tsc(apic->vcpu, tscl) + + nsec_to_cycles(apic->vcpu, delta); } static void start_sw_period(struct kvm_lapic *apic) |