KVM: nVMX: Fix injection of PENDING_INTERRUPT and NMI_WINDOW exits to L1
PATCH 1/1 KVM: nVMX: Fix injection of PENDING_INTERRUPT and NMI_WINDOW exits to L1
From: Jan Kiszka <[email protected]>
The comment was wrong: enable_irq_window might be called after prepare_vmcs02 when we left L2 to prepare IRQ injecting for L1. Same for NMIs.
--- arch/x86/kvm/vmx.c | 10 +++------- 1 files changed, 3 insertions(+), 7 deletions(-)
arch/x86/kvm/vmx.c +3 -7
@@ -6113,14 +6113,10 @@ static bool nested_vmx_exit_handled(struct kvm_vcpu *vcpu)case EXIT_REASON_TRIPLE_FAULT :return 1 ;case EXIT_REASON_PENDING_INTERRUPT : +return nested_cpu_has (vmcs12,CPU_BASED_VIRTUAL_INTR_PENDING );case EXIT_REASON_NMI_WINDOW : -/* -* prepare_vmcs02() set the CPU_BASED_VIRTUAL_INTR_PENDING bit -* (aka Interrupt Window Exiting) only when L1 turned it on, -* so if we got a PENDING_INTERRUPT exit, this must be for L1. -* Same for NMI Window Exiting. -*/ -return 1 ; +return vmcs12->pin_based_vm_exec_control & +PIN_BASED_NMI_EXITING ;case EXIT_REASON_TASK_SWITCH :return 1 ;case EXIT_REASON_CPUID :
Signature · 1 line
1.7.3.4
Quoted 24 lines · Jan Kiszka
From: Jan Kiszka <[email protected]>
The comment was wrong:
enable_irq_windowmight be called afterprepare_vmcs02when we left L2 to prepare IRQ injecting for L1. Same for NMIs.Signed-off-by Jan Kiszka <[email protected]>--- arch/x86/kvm/vmx.c | 10 +++------- 1 files changed, 3 insertions(+), 7 deletions(-)arch/x86/kvm/vmx.c +1
-2@@ -6113,14 +6113,10 @@ static bool nested_vmx_exit_handled(struct kvm_vcpu *vcpu)case EXIT_REASON_TRIPLE_FAULT :return 1 ;case EXIT_REASON_PENDING_INTERRUPT : +return nested_cpu_has (vmcs12,CPU_BASED_VIRTUAL_INTR_PENDING );case EXIT_REASON_NMI_WINDOW : -/* -* prepare_vmcs02() set the CPU_BASED_VIRTUAL_INTR_PENDING bit
arch/x86/kvm/vmx.c static bool nested_vmx_exit_handled(struct kvm_vcpu *vcpu) · line 6122
Quoted 10 lines
arch/x86/kvm/vmx.c +2
-5-* (aka Interrupt Window Exiting) only when L1 turned it on, -* so if we got a PENDING_INTERRUPT exit, this must be for L1. -* Same for NMI Window Exiting. -*/ -return 1 ; +return vmcs12->pin_based_vm_exec_control & +PIN_BASED_NMI_EXITING ;case EXIT_REASON_TASK_SWITCH :return 1 ;case EXIT_REASON_CPUID :
No, this is wrong. I first wrote a patch that ignored enable_irq_window when the guest is not interested in external IRQs. But then I thought that wasn't correct. I tend to believe now my first idea was better.
Need to rethink.
Jan
On Sat, Feb 16, 2013, Jan Kiszka wrote about "Re: [PATCH] KVM: nVMX: Fix injection of PENDING_INTERRUPT and NMI_WINDOW exits to L1":
Quoted 3 lines
No, this is wrong. I first wrote a patch that ignored
enable_irq_windowwhen the guest is not interested in external IRQs. But then I thought that wasn't correct. I tend to believe now my first idea was better.
If you want to make the !PIN_BASED_EXT_INTR_MASK case work correctly, please also see:
https://bugzilla.kernel.org/show_bug.cgi?id=53711
Nadav.
Signature · 4 lines
Nadav Har'El | Saturday, Feb 16 2013, 6 Adar 5773 [email protected] |----------------------------------------- Phone +972-523-790466, ICQ 13349191 |Always keep your words soft and sweet, http://nadav.harel.org.il |just in case you have to eat them.
Quoted 9 lines · Nadav Har'El
On Sat, Feb 16, 2013, Jan Kiszka wrote about "Re: [PATCH] KVM: nVMX: Fix injection of
PENDING_INTERRUPTandNMI_WINDOWexits to L1":Quoted 3 lines
No, this is wrong. I first wrote a patch that ignored
enable_irq_windowwhen the guest is not interested in external IRQs. But then I thought that wasn't correct. I tend to believe now my first idea was better.If you want to make the !PIN_BASED_EXT_INTR_MASK case work correctly, please also see:
Yes, I already realized that there is more broken. Trying to find a way to fix this ATM. That specifically means deciding when to execute vmx_complete/cancel_interrupts and when not.
This patch seems correct now, just insufficient to make direct injection from L0 to L2 work.
Jan