diff options
Diffstat (limited to 'arch/x86/kvm/x86.c')
-rw-r--r-- | arch/x86/kvm/x86.c | 80 |
1 files changed, 60 insertions, 20 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 292e6ca89f42..d21bce505315 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -1193,20 +1193,37 @@ void kvm_write_tsc(struct kvm_vcpu *vcpu, struct msr_data *msr) | |||
1193 | elapsed = ns - kvm->arch.last_tsc_nsec; | 1193 | elapsed = ns - kvm->arch.last_tsc_nsec; |
1194 | 1194 | ||
1195 | if (vcpu->arch.virtual_tsc_khz) { | 1195 | if (vcpu->arch.virtual_tsc_khz) { |
1196 | int faulted = 0; | ||
1197 | |||
1196 | /* n.b - signed multiplication and division required */ | 1198 | /* n.b - signed multiplication and division required */ |
1197 | usdiff = data - kvm->arch.last_tsc_write; | 1199 | usdiff = data - kvm->arch.last_tsc_write; |
1198 | #ifdef CONFIG_X86_64 | 1200 | #ifdef CONFIG_X86_64 |
1199 | usdiff = (usdiff * 1000) / vcpu->arch.virtual_tsc_khz; | 1201 | usdiff = (usdiff * 1000) / vcpu->arch.virtual_tsc_khz; |
1200 | #else | 1202 | #else |
1201 | /* do_div() only does unsigned */ | 1203 | /* do_div() only does unsigned */ |
1202 | asm("idivl %2; xor %%edx, %%edx" | 1204 | asm("1: idivl %[divisor]\n" |
1203 | : "=A"(usdiff) | 1205 | "2: xor %%edx, %%edx\n" |
1204 | : "A"(usdiff * 1000), "rm"(vcpu->arch.virtual_tsc_khz)); | 1206 | " movl $0, %[faulted]\n" |
1207 | "3:\n" | ||
1208 | ".section .fixup,\"ax\"\n" | ||
1209 | "4: movl $1, %[faulted]\n" | ||
1210 | " jmp 3b\n" | ||
1211 | ".previous\n" | ||
1212 | |||
1213 | _ASM_EXTABLE(1b, 4b) | ||
1214 | |||
1215 | : "=A"(usdiff), [faulted] "=r" (faulted) | ||
1216 | : "A"(usdiff * 1000), [divisor] "rm"(vcpu->arch.virtual_tsc_khz)); | ||
1217 | |||
1205 | #endif | 1218 | #endif |
1206 | do_div(elapsed, 1000); | 1219 | do_div(elapsed, 1000); |
1207 | usdiff -= elapsed; | 1220 | usdiff -= elapsed; |
1208 | if (usdiff < 0) | 1221 | if (usdiff < 0) |
1209 | usdiff = -usdiff; | 1222 | usdiff = -usdiff; |
1223 | |||
1224 | /* idivl overflow => difference is larger than USEC_PER_SEC */ | ||
1225 | if (faulted) | ||
1226 | usdiff = USEC_PER_SEC; | ||
1210 | } else | 1227 | } else |
1211 | usdiff = USEC_PER_SEC; /* disable TSC match window below */ | 1228 | usdiff = USEC_PER_SEC; /* disable TSC match window below */ |
1212 | 1229 | ||
@@ -1587,6 +1604,30 @@ static int kvm_guest_time_update(struct kvm_vcpu *v) | |||
1587 | return 0; | 1604 | return 0; |
1588 | } | 1605 | } |
1589 | 1606 | ||
1607 | /* | ||
1608 | * kvmclock updates which are isolated to a given vcpu, such as | ||
1609 | * vcpu->cpu migration, should not allow system_timestamp from | ||
1610 | * the rest of the vcpus to remain static. Otherwise ntp frequency | ||
1611 | * correction applies to one vcpu's system_timestamp but not | ||
1612 | * the others. | ||
1613 | * | ||
1614 | * So in those cases, request a kvmclock update for all vcpus. | ||
1615 | * The worst case for a remote vcpu to update its kvmclock | ||
1616 | * is then bounded by maximum nohz sleep latency. | ||
1617 | */ | ||
1618 | |||
1619 | static void kvm_gen_kvmclock_update(struct kvm_vcpu *v) | ||
1620 | { | ||
1621 | int i; | ||
1622 | struct kvm *kvm = v->kvm; | ||
1623 | struct kvm_vcpu *vcpu; | ||
1624 | |||
1625 | kvm_for_each_vcpu(i, vcpu, kvm) { | ||
1626 | set_bit(KVM_REQ_CLOCK_UPDATE, &vcpu->requests); | ||
1627 | kvm_vcpu_kick(vcpu); | ||
1628 | } | ||
1629 | } | ||
1630 | |||
1590 | static bool msr_mtrr_valid(unsigned msr) | 1631 | static bool msr_mtrr_valid(unsigned msr) |
1591 | { | 1632 | { |
1592 | switch (msr) { | 1633 | switch (msr) { |
@@ -1984,7 +2025,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info) | |||
1984 | kvmclock_reset(vcpu); | 2025 | kvmclock_reset(vcpu); |
1985 | 2026 | ||
1986 | vcpu->arch.time = data; | 2027 | vcpu->arch.time = data; |
1987 | kvm_make_request(KVM_REQ_CLOCK_UPDATE, vcpu); | 2028 | kvm_make_request(KVM_REQ_GLOBAL_CLOCK_UPDATE, vcpu); |
1988 | 2029 | ||
1989 | /* we verify if the enable bit is set... */ | 2030 | /* we verify if the enable bit is set... */ |
1990 | if (!(data & 1)) | 2031 | if (!(data & 1)) |
@@ -2701,7 +2742,7 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) | |||
2701 | * kvmclock on vcpu->cpu migration | 2742 | * kvmclock on vcpu->cpu migration |
2702 | */ | 2743 | */ |
2703 | if (!vcpu->kvm->arch.use_master_clock || vcpu->cpu == -1) | 2744 | if (!vcpu->kvm->arch.use_master_clock || vcpu->cpu == -1) |
2704 | kvm_make_request(KVM_REQ_CLOCK_UPDATE, vcpu); | 2745 | kvm_make_request(KVM_REQ_GLOBAL_CLOCK_UPDATE, vcpu); |
2705 | if (vcpu->cpu != cpu) | 2746 | if (vcpu->cpu != cpu) |
2706 | kvm_migrate_timers(vcpu); | 2747 | kvm_migrate_timers(vcpu); |
2707 | vcpu->cpu = cpu; | 2748 | vcpu->cpu = cpu; |
@@ -5238,7 +5279,13 @@ static void kvm_set_mmio_spte_mask(void) | |||
5238 | * Set the reserved bits and the present bit of an paging-structure | 5279 | * Set the reserved bits and the present bit of an paging-structure |
5239 | * entry to generate page fault with PFER.RSV = 1. | 5280 | * entry to generate page fault with PFER.RSV = 1. |
5240 | */ | 5281 | */ |
5241 | mask = ((1ull << (62 - maxphyaddr + 1)) - 1) << maxphyaddr; | 5282 | /* Mask the reserved physical address bits. */ |
5283 | mask = ((1ull << (51 - maxphyaddr + 1)) - 1) << maxphyaddr; | ||
5284 | |||
5285 | /* Bit 62 is always reserved for 32bit host. */ | ||
5286 | mask |= 0x3ull << 62; | ||
5287 | |||
5288 | /* Set the present bit. */ | ||
5242 | mask |= 1ull; | 5289 | mask |= 1ull; |
5243 | 5290 | ||
5244 | #ifdef CONFIG_X86_64 | 5291 | #ifdef CONFIG_X86_64 |
@@ -5498,13 +5545,6 @@ static int emulator_fix_hypercall(struct x86_emulate_ctxt *ctxt) | |||
5498 | char instruction[3]; | 5545 | char instruction[3]; |
5499 | unsigned long rip = kvm_rip_read(vcpu); | 5546 | unsigned long rip = kvm_rip_read(vcpu); |
5500 | 5547 | ||
5501 | /* | ||
5502 | * Blow out the MMU to ensure that no other VCPU has an active mapping | ||
5503 | * to ensure that the updated hypercall appears atomically across all | ||
5504 | * VCPUs. | ||
5505 | */ | ||
5506 | kvm_mmu_zap_all(vcpu->kvm); | ||
5507 | |||
5508 | kvm_x86_ops->patch_hypercall(vcpu, instruction); | 5548 | kvm_x86_ops->patch_hypercall(vcpu, instruction); |
5509 | 5549 | ||
5510 | return emulator_write_emulated(ctxt, rip, instruction, 3, NULL); | 5550 | return emulator_write_emulated(ctxt, rip, instruction, 3, NULL); |
@@ -5702,6 +5742,8 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) | |||
5702 | __kvm_migrate_timers(vcpu); | 5742 | __kvm_migrate_timers(vcpu); |
5703 | if (kvm_check_request(KVM_REQ_MASTERCLOCK_UPDATE, vcpu)) | 5743 | if (kvm_check_request(KVM_REQ_MASTERCLOCK_UPDATE, vcpu)) |
5704 | kvm_gen_update_masterclock(vcpu->kvm); | 5744 | kvm_gen_update_masterclock(vcpu->kvm); |
5745 | if (kvm_check_request(KVM_REQ_GLOBAL_CLOCK_UPDATE, vcpu)) | ||
5746 | kvm_gen_kvmclock_update(vcpu); | ||
5705 | if (kvm_check_request(KVM_REQ_CLOCK_UPDATE, vcpu)) { | 5747 | if (kvm_check_request(KVM_REQ_CLOCK_UPDATE, vcpu)) { |
5706 | r = kvm_guest_time_update(vcpu); | 5748 | r = kvm_guest_time_update(vcpu); |
5707 | if (unlikely(r)) | 5749 | if (unlikely(r)) |
@@ -6812,6 +6854,7 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) | |||
6812 | return -EINVAL; | 6854 | return -EINVAL; |
6813 | 6855 | ||
6814 | INIT_LIST_HEAD(&kvm->arch.active_mmu_pages); | 6856 | INIT_LIST_HEAD(&kvm->arch.active_mmu_pages); |
6857 | INIT_LIST_HEAD(&kvm->arch.zapped_obsolete_pages); | ||
6815 | INIT_LIST_HEAD(&kvm->arch.assigned_dev_head); | 6858 | INIT_LIST_HEAD(&kvm->arch.assigned_dev_head); |
6816 | 6859 | ||
6817 | /* Reserve bit 0 of irq_sources_bitmap for userspace irq source */ | 6860 | /* Reserve bit 0 of irq_sources_bitmap for userspace irq source */ |
@@ -7040,22 +7083,18 @@ void kvm_arch_commit_memory_region(struct kvm *kvm, | |||
7040 | * If memory slot is created, or moved, we need to clear all | 7083 | * If memory slot is created, or moved, we need to clear all |
7041 | * mmio sptes. | 7084 | * mmio sptes. |
7042 | */ | 7085 | */ |
7043 | if ((change == KVM_MR_CREATE) || (change == KVM_MR_MOVE)) { | 7086 | kvm_mmu_invalidate_mmio_sptes(kvm); |
7044 | kvm_mmu_zap_mmio_sptes(kvm); | ||
7045 | kvm_reload_remote_mmus(kvm); | ||
7046 | } | ||
7047 | } | 7087 | } |
7048 | 7088 | ||
7049 | void kvm_arch_flush_shadow_all(struct kvm *kvm) | 7089 | void kvm_arch_flush_shadow_all(struct kvm *kvm) |
7050 | { | 7090 | { |
7051 | kvm_mmu_zap_all(kvm); | 7091 | kvm_mmu_invalidate_zap_all_pages(kvm); |
7052 | kvm_reload_remote_mmus(kvm); | ||
7053 | } | 7092 | } |
7054 | 7093 | ||
7055 | void kvm_arch_flush_shadow_memslot(struct kvm *kvm, | 7094 | void kvm_arch_flush_shadow_memslot(struct kvm *kvm, |
7056 | struct kvm_memory_slot *slot) | 7095 | struct kvm_memory_slot *slot) |
7057 | { | 7096 | { |
7058 | kvm_arch_flush_shadow_all(kvm); | 7097 | kvm_mmu_invalidate_zap_all_pages(kvm); |
7059 | } | 7098 | } |
7060 | 7099 | ||
7061 | int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu) | 7100 | int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu) |
@@ -7263,3 +7302,4 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_nested_intr_vmexit); | |||
7263 | EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_invlpga); | 7302 | EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_invlpga); |
7264 | EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_skinit); | 7303 | EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_skinit); |
7265 | EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_nested_intercepts); | 7304 | EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_nested_intercepts); |
7305 | EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_write_tsc_offset); | ||