Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm

Pull KVM fixes from Radim Krčmář:
"A bunch of small fixes for x86"

* tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm:
kvm: x86: hyperv: avoid livelock in oneshot SynIC timers
KVM: VMX: Fix invalid guest state detection after task-switch emulation
x86: add MULTIUSER dependency for KVM
KVM: nVMX: Disallow VM-entry in MOV-SS shadow
KVM: nVMX: track NMI blocking state separately for each VMCS
KVM: x86: masking out upper bits

+38 -21
+1 -1
arch/x86/kvm/Kconfig
··· 22 22 depends on HAVE_KVM 23 23 depends on HIGH_RES_TIMERS 24 24 # for TASKSTATS/TASK_DELAY_ACCT: 25 - depends on NET 25 + depends on NET && MULTIUSER 26 26 select PREEMPT_NOTIFIERS 27 27 select MMU_NOTIFIER 28 28 select ANON_INODES
+4 -3
arch/x86/kvm/hyperv.c
··· 649 649 } 650 650 651 651 if ((stimer->config & HV_STIMER_ENABLE) && 652 - stimer->count) 653 - stimer_start(stimer); 654 - else 652 + stimer->count) { 653 + if (!stimer->msg_pending) 654 + stimer_start(stimer); 655 + } else 655 656 stimer_cleanup(stimer); 656 657 } 657 658 }
+31 -15
arch/x86/kvm/vmx.c
··· 198 198 struct vmcs *vmcs; 199 199 struct vmcs *shadow_vmcs; 200 200 int cpu; 201 - int launched; 201 + bool launched; 202 + bool nmi_known_unmasked; 202 203 struct list_head loaded_vmcss_on_cpu_link; 203 204 }; 204 205 ··· 2327 2326 __vmx_load_host_state(to_vmx(vcpu)); 2328 2327 } 2329 2328 2329 + static bool emulation_required(struct kvm_vcpu *vcpu) 2330 + { 2331 + return emulate_invalid_guest_state && !guest_state_valid(vcpu); 2332 + } 2333 + 2330 2334 static void vmx_decache_cr0_guest_bits(struct kvm_vcpu *vcpu); 2331 2335 2332 2336 /* ··· 2369 2363 2370 2364 static void vmx_set_rflags(struct kvm_vcpu *vcpu, unsigned long rflags) 2371 2365 { 2366 + unsigned long old_rflags = vmx_get_rflags(vcpu); 2367 + 2372 2368 __set_bit(VCPU_EXREG_RFLAGS, (ulong *)&vcpu->arch.regs_avail); 2373 2369 to_vmx(vcpu)->rflags = rflags; 2374 2370 if (to_vmx(vcpu)->rmode.vm86_active) { ··· 2378 2370 rflags |= X86_EFLAGS_IOPL | X86_EFLAGS_VM; 2379 2371 } 2380 2372 vmcs_writel(GUEST_RFLAGS, rflags); 2373 + 2374 + if ((old_rflags ^ to_vmx(vcpu)->rflags) & X86_EFLAGS_VM) 2375 + to_vmx(vcpu)->emulation_required = emulation_required(vcpu); 2381 2376 } 2382 2377 2383 2378 static u32 vmx_get_pkru(struct kvm_vcpu *vcpu) ··· 3866 3855 per_cpu(vmxarea, cpu) = vmcs; 3867 3856 } 3868 3857 return 0; 3869 - } 3870 - 3871 - static bool emulation_required(struct kvm_vcpu *vcpu) 3872 - { 3873 - return emulate_invalid_guest_state && !guest_state_valid(vcpu); 3874 3858 } 3875 3859 3876 3860 static void fix_pmode_seg(struct kvm_vcpu *vcpu, int seg, ··· 5516 5510 { 5517 5511 struct vcpu_vmx *vmx = to_vmx(vcpu); 5518 5512 5519 - if (!is_guest_mode(vcpu)) { 5520 - ++vcpu->stat.nmi_injections; 5521 - vmx->nmi_known_unmasked = false; 5522 - } 5513 + ++vcpu->stat.nmi_injections; 5514 + vmx->loaded_vmcs->nmi_known_unmasked = false; 5523 5515 5524 5516 if (vmx->rmode.vm86_active) { 5525 5517 if (kvm_inject_realmode_interrupt(vcpu, NMI_VECTOR, 0) != EMULATE_DONE) ··· 5531 5527 5532 5528 static bool vmx_get_nmi_mask(struct kvm_vcpu *vcpu) 5533 5529 { 5534 - if (to_vmx(vcpu)->nmi_known_unmasked) 5530 + struct vcpu_vmx *vmx = to_vmx(vcpu); 5531 + bool masked; 5532 + 5533 + if (vmx->loaded_vmcs->nmi_known_unmasked) 5535 5534 return false; 5536 - return vmcs_read32(GUEST_INTERRUPTIBILITY_INFO) & GUEST_INTR_STATE_NMI; 5535 + masked = vmcs_read32(GUEST_INTERRUPTIBILITY_INFO) & GUEST_INTR_STATE_NMI; 5536 + vmx->loaded_vmcs->nmi_known_unmasked = !masked; 5537 + return masked; 5537 5538 } 5538 5539 5539 5540 static void vmx_set_nmi_mask(struct kvm_vcpu *vcpu, bool masked) 5540 5541 { 5541 5542 struct vcpu_vmx *vmx = to_vmx(vcpu); 5542 5543 5543 - vmx->nmi_known_unmasked = !masked; 5544 + vmx->loaded_vmcs->nmi_known_unmasked = !masked; 5544 5545 if (masked) 5545 5546 vmcs_set_bits(GUEST_INTERRUPTIBILITY_INFO, 5546 5547 GUEST_INTR_STATE_NMI); ··· 8745 8736 8746 8737 idtv_info_valid = vmx->idt_vectoring_info & VECTORING_INFO_VALID_MASK; 8747 8738 8748 - if (vmx->nmi_known_unmasked) 8739 + if (vmx->loaded_vmcs->nmi_known_unmasked) 8749 8740 return; 8750 8741 /* 8751 8742 * Can't use vmx->exit_intr_info since we're not sure what ··· 8769 8760 vmcs_set_bits(GUEST_INTERRUPTIBILITY_INFO, 8770 8761 GUEST_INTR_STATE_NMI); 8771 8762 else 8772 - vmx->nmi_known_unmasked = 8763 + vmx->loaded_vmcs->nmi_known_unmasked = 8773 8764 !(vmcs_read32(GUEST_INTERRUPTIBILITY_INFO) 8774 8765 & GUEST_INTR_STATE_NMI); 8775 8766 } ··· 10497 10488 { 10498 10489 struct vmcs12 *vmcs12; 10499 10490 struct vcpu_vmx *vmx = to_vmx(vcpu); 10491 + u32 interrupt_shadow = vmx_get_interrupt_shadow(vcpu); 10500 10492 u32 exit_qual; 10501 10493 int ret; 10502 10494 ··· 10522 10512 * for misconfigurations which will anyway be caught by the processor 10523 10513 * when using the merged vmcs02. 10524 10514 */ 10515 + if (interrupt_shadow & KVM_X86_SHADOW_INT_MOV_SS) { 10516 + nested_vmx_failValid(vcpu, 10517 + VMXERR_ENTRY_EVENTS_BLOCKED_BY_MOV_SS); 10518 + goto out; 10519 + } 10520 + 10525 10521 if (vmcs12->launch_state == launch) { 10526 10522 nested_vmx_failValid(vcpu, 10527 10523 launch ? VMXERR_VMLAUNCH_NONCLEAR_VMCS
+2 -2
arch/x86/kvm/x86.c
··· 597 597 (unsigned long *)&vcpu->arch.regs_avail)) 598 598 return true; 599 599 600 - gfn = (kvm_read_cr3(vcpu) & ~31u) >> PAGE_SHIFT; 601 - offset = (kvm_read_cr3(vcpu) & ~31u) & (PAGE_SIZE - 1); 600 + gfn = (kvm_read_cr3(vcpu) & ~31ul) >> PAGE_SHIFT; 601 + offset = (kvm_read_cr3(vcpu) & ~31ul) & (PAGE_SIZE - 1); 602 602 r = kvm_read_nested_guest_page(vcpu, gfn, pdpte, offset, sizeof(pdpte), 603 603 PFERR_USER_MASK | PFERR_WRITE_MASK); 604 604 if (r < 0)