From: Greg Kroah-Hartman Date: Tue, 1 Dec 2020 15:47:05 +0000 (+0100) Subject: drop kvm-x86-fix-split-irqchip-vs-interrupt-injection-window-request.patch X-Git-Tag: v4.4.247~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5867e50993d6cb348031d670270e7ca29d16cbf1;p=thirdparty%2Fkernel%2Fstable-queue.git drop kvm-x86-fix-split-irqchip-vs-interrupt-injection-window-request.patch from 4.14, 4.9, and 4.4 queues --- diff --git a/queue-4.14/kvm-x86-fix-split-irqchip-vs-interrupt-injection-window-request.patch b/queue-4.14/kvm-x86-fix-split-irqchip-vs-interrupt-injection-window-request.patch deleted file mode 100644 index 2dd154ffa30..00000000000 --- a/queue-4.14/kvm-x86-fix-split-irqchip-vs-interrupt-injection-window-request.patch +++ /dev/null @@ -1,139 +0,0 @@ -From 71cc849b7093bb83af966c0e60cb11b7f35cd746 Mon Sep 17 00:00:00 2001 -From: Paolo Bonzini -Date: Fri, 27 Nov 2020 09:18:20 +0100 -Subject: KVM: x86: Fix split-irqchip vs interrupt injection window request - -From: Paolo Bonzini - -commit 71cc849b7093bb83af966c0e60cb11b7f35cd746 upstream. - -kvm_cpu_accept_dm_intr and kvm_vcpu_ready_for_interrupt_injection are -a hodge-podge of conditions, hacked together to get something that -more or less works. But what is actually needed is much simpler; -in both cases the fundamental question is, do we have a place to stash -an interrupt if userspace does KVM_INTERRUPT? - -In userspace irqchip mode, that is !vcpu->arch.interrupt.injected. -Currently kvm_event_needs_reinjection(vcpu) covers it, but it is -unnecessarily restrictive. - -In split irqchip mode it's a bit more complicated, we need to check -kvm_apic_accept_pic_intr(vcpu) (the IRQ window exit is basically an INTACK -cycle and thus requires ExtINTs not to be masked) as well as -!pending_userspace_extint(vcpu). However, there is no need to -check kvm_event_needs_reinjection(vcpu), since split irqchip keeps -pending ExtINT state separate from event injection state, and checking -kvm_cpu_has_interrupt(vcpu) is wrong too since ExtINT has higher -priority than APIC interrupts. In fact the latter fixes a bug: -when userspace requests an IRQ window vmexit, an interrupt in the -local APIC can cause kvm_cpu_has_interrupt() to be true and thus -kvm_vcpu_ready_for_interrupt_injection() to return false. When this -happens, vcpu_run does not exit to userspace but the interrupt window -vmexits keep occurring. The VM loops without any hope of making progress. - -Once we try to fix these with something like - - return kvm_arch_interrupt_allowed(vcpu) && -- !kvm_cpu_has_interrupt(vcpu) && -- !kvm_event_needs_reinjection(vcpu) && -- kvm_cpu_accept_dm_intr(vcpu); -+ (!lapic_in_kernel(vcpu) -+ ? !vcpu->arch.interrupt.injected -+ : (kvm_apic_accept_pic_intr(vcpu) -+ && !pending_userspace_extint(v))); - -we realize two things. First, thanks to the previous patch the complex -conditional can reuse !kvm_cpu_has_extint(vcpu). Second, the interrupt -window request in vcpu_enter_guest() - - bool req_int_win = - dm_request_for_irq_injection(vcpu) && - kvm_cpu_accept_dm_intr(vcpu); - -should be kept in sync with kvm_vcpu_ready_for_interrupt_injection(): -it is unnecessary to ask the processor for an interrupt window -if we would not be able to return to userspace. Therefore, -kvm_cpu_accept_dm_intr(vcpu) is basically !kvm_cpu_has_extint(vcpu) -ANDed with the existing check for masked ExtINT. It all makes sense: - -- we can accept an interrupt from userspace if there is a place - to stash it (and, for irqchip split, ExtINTs are not masked). - Interrupts from userspace _can_ be accepted even if right now - EFLAGS.IF=0. - -- in order to tell userspace we will inject its interrupt ("IRQ - window open" i.e. kvm_vcpu_ready_for_interrupt_injection), both - KVM and the vCPU need to be ready to accept the interrupt. - -... and this is what the patch implements. - -Reported-by: David Woodhouse -Analyzed-by: David Woodhouse -Cc: stable@vger.kernel.org -Signed-off-by: Paolo Bonzini -Reviewed-by: Nikos Tsironis -Reviewed-by: David Woodhouse -Tested-by: David Woodhouse -Signed-off-by: Greg Kroah-Hartman - ---- - arch/x86/include/asm/kvm_host.h | 1 + - arch/x86/kvm/irq.c | 2 +- - arch/x86/kvm/x86.c | 18 ++++++++++-------- - 3 files changed, 12 insertions(+), 9 deletions(-) - ---- a/arch/x86/include/asm/kvm_host.h -+++ b/arch/x86/include/asm/kvm_host.h -@@ -1395,6 +1395,7 @@ int kvm_test_age_hva(struct kvm *kvm, un - void kvm_set_spte_hva(struct kvm *kvm, unsigned long hva, pte_t pte); - int kvm_cpu_has_injectable_intr(struct kvm_vcpu *v); - int kvm_cpu_has_interrupt(struct kvm_vcpu *vcpu); -+int kvm_cpu_has_extint(struct kvm_vcpu *v); - int kvm_arch_interrupt_allowed(struct kvm_vcpu *vcpu); - int kvm_cpu_get_interrupt(struct kvm_vcpu *v); - void kvm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event); ---- a/arch/x86/kvm/irq.c -+++ b/arch/x86/kvm/irq.c -@@ -52,7 +52,7 @@ static int pending_userspace_extint(stru - * check if there is pending interrupt from - * non-APIC source without intack. - */ --static int kvm_cpu_has_extint(struct kvm_vcpu *v) -+int kvm_cpu_has_extint(struct kvm_vcpu *v) - { - u8 accept = kvm_apic_accept_pic_intr(v); - ---- a/arch/x86/kvm/x86.c -+++ b/arch/x86/kvm/x86.c -@@ -3144,21 +3144,23 @@ static int kvm_vcpu_ioctl_set_lapic(stru - - static int kvm_cpu_accept_dm_intr(struct kvm_vcpu *vcpu) - { -+ /* -+ * We can accept userspace's request for interrupt injection -+ * as long as we have a place to store the interrupt number. -+ * The actual injection will happen when the CPU is able to -+ * deliver the interrupt. -+ */ -+ if (kvm_cpu_has_extint(vcpu)) -+ return false; -+ -+ /* Acknowledging ExtINT does not happen if LINT0 is masked. */ - return (!lapic_in_kernel(vcpu) || - kvm_apic_accept_pic_intr(vcpu)); - } - --/* -- * if userspace requested an interrupt window, check that the -- * interrupt window is open. -- * -- * No need to exit to userspace if we already have an interrupt queued. -- */ - static int kvm_vcpu_ready_for_interrupt_injection(struct kvm_vcpu *vcpu) - { - return kvm_arch_interrupt_allowed(vcpu) && -- !kvm_cpu_has_interrupt(vcpu) && -- !kvm_event_needs_reinjection(vcpu) && - kvm_cpu_accept_dm_intr(vcpu); - } - diff --git a/queue-4.14/series b/queue-4.14/series index b2076770da6..c6b5af6dadf 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -6,7 +6,6 @@ pci-add-device-even-if-driver-attach-failed.patch btrfs-tree-checker-enhance-chunk-checker-to-validate-chunk-profile.patch btrfs-adjust-return-values-of-btrfs_inode_by_name.patch btrfs-inode-verify-inode-mode-to-avoid-null-pointer-dereference.patch -kvm-x86-fix-split-irqchip-vs-interrupt-injection-window-request.patch arm64-pgtable-fix-pte_accessible.patch arm64-pgtable-ensure-dirty-bit-is-preserved-across-pte_wrprotect.patch alsa-hda-hdmi-use-single-mutex-unlock-in-error-paths.patch diff --git a/queue-4.4/kvm-x86-fix-split-irqchip-vs-interrupt-injection-window-request.patch b/queue-4.4/kvm-x86-fix-split-irqchip-vs-interrupt-injection-window-request.patch deleted file mode 100644 index 8d7f9e353db..00000000000 --- a/queue-4.4/kvm-x86-fix-split-irqchip-vs-interrupt-injection-window-request.patch +++ /dev/null @@ -1,139 +0,0 @@ -From 71cc849b7093bb83af966c0e60cb11b7f35cd746 Mon Sep 17 00:00:00 2001 -From: Paolo Bonzini -Date: Fri, 27 Nov 2020 09:18:20 +0100 -Subject: KVM: x86: Fix split-irqchip vs interrupt injection window request - -From: Paolo Bonzini - -commit 71cc849b7093bb83af966c0e60cb11b7f35cd746 upstream. - -kvm_cpu_accept_dm_intr and kvm_vcpu_ready_for_interrupt_injection are -a hodge-podge of conditions, hacked together to get something that -more or less works. But what is actually needed is much simpler; -in both cases the fundamental question is, do we have a place to stash -an interrupt if userspace does KVM_INTERRUPT? - -In userspace irqchip mode, that is !vcpu->arch.interrupt.injected. -Currently kvm_event_needs_reinjection(vcpu) covers it, but it is -unnecessarily restrictive. - -In split irqchip mode it's a bit more complicated, we need to check -kvm_apic_accept_pic_intr(vcpu) (the IRQ window exit is basically an INTACK -cycle and thus requires ExtINTs not to be masked) as well as -!pending_userspace_extint(vcpu). However, there is no need to -check kvm_event_needs_reinjection(vcpu), since split irqchip keeps -pending ExtINT state separate from event injection state, and checking -kvm_cpu_has_interrupt(vcpu) is wrong too since ExtINT has higher -priority than APIC interrupts. In fact the latter fixes a bug: -when userspace requests an IRQ window vmexit, an interrupt in the -local APIC can cause kvm_cpu_has_interrupt() to be true and thus -kvm_vcpu_ready_for_interrupt_injection() to return false. When this -happens, vcpu_run does not exit to userspace but the interrupt window -vmexits keep occurring. The VM loops without any hope of making progress. - -Once we try to fix these with something like - - return kvm_arch_interrupt_allowed(vcpu) && -- !kvm_cpu_has_interrupt(vcpu) && -- !kvm_event_needs_reinjection(vcpu) && -- kvm_cpu_accept_dm_intr(vcpu); -+ (!lapic_in_kernel(vcpu) -+ ? !vcpu->arch.interrupt.injected -+ : (kvm_apic_accept_pic_intr(vcpu) -+ && !pending_userspace_extint(v))); - -we realize two things. First, thanks to the previous patch the complex -conditional can reuse !kvm_cpu_has_extint(vcpu). Second, the interrupt -window request in vcpu_enter_guest() - - bool req_int_win = - dm_request_for_irq_injection(vcpu) && - kvm_cpu_accept_dm_intr(vcpu); - -should be kept in sync with kvm_vcpu_ready_for_interrupt_injection(): -it is unnecessary to ask the processor for an interrupt window -if we would not be able to return to userspace. Therefore, -kvm_cpu_accept_dm_intr(vcpu) is basically !kvm_cpu_has_extint(vcpu) -ANDed with the existing check for masked ExtINT. It all makes sense: - -- we can accept an interrupt from userspace if there is a place - to stash it (and, for irqchip split, ExtINTs are not masked). - Interrupts from userspace _can_ be accepted even if right now - EFLAGS.IF=0. - -- in order to tell userspace we will inject its interrupt ("IRQ - window open" i.e. kvm_vcpu_ready_for_interrupt_injection), both - KVM and the vCPU need to be ready to accept the interrupt. - -... and this is what the patch implements. - -Reported-by: David Woodhouse -Analyzed-by: David Woodhouse -Cc: stable@vger.kernel.org -Signed-off-by: Paolo Bonzini -Reviewed-by: Nikos Tsironis -Reviewed-by: David Woodhouse -Tested-by: David Woodhouse -Signed-off-by: Greg Kroah-Hartman - ---- - arch/x86/include/asm/kvm_host.h | 1 + - arch/x86/kvm/irq.c | 2 +- - arch/x86/kvm/x86.c | 18 ++++++++++-------- - 3 files changed, 12 insertions(+), 9 deletions(-) - ---- a/arch/x86/include/asm/kvm_host.h -+++ b/arch/x86/include/asm/kvm_host.h -@@ -1220,6 +1220,7 @@ int kvm_test_age_hva(struct kvm *kvm, un - void kvm_set_spte_hva(struct kvm *kvm, unsigned long hva, pte_t pte); - int kvm_cpu_has_injectable_intr(struct kvm_vcpu *v); - int kvm_cpu_has_interrupt(struct kvm_vcpu *vcpu); -+int kvm_cpu_has_extint(struct kvm_vcpu *v); - int kvm_arch_interrupt_allowed(struct kvm_vcpu *vcpu); - int kvm_cpu_get_interrupt(struct kvm_vcpu *v); - void kvm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event); ---- a/arch/x86/kvm/irq.c -+++ b/arch/x86/kvm/irq.c -@@ -49,7 +49,7 @@ static int pending_userspace_extint(stru - * check if there is pending interrupt from - * non-APIC source without intack. - */ --static int kvm_cpu_has_extint(struct kvm_vcpu *v) -+int kvm_cpu_has_extint(struct kvm_vcpu *v) - { - u8 accept = kvm_apic_accept_pic_intr(v); - ---- a/arch/x86/kvm/x86.c -+++ b/arch/x86/kvm/x86.c -@@ -2866,21 +2866,23 @@ static int kvm_vcpu_ioctl_set_lapic(stru - - static int kvm_cpu_accept_dm_intr(struct kvm_vcpu *vcpu) - { -+ /* -+ * We can accept userspace's request for interrupt injection -+ * as long as we have a place to store the interrupt number. -+ * The actual injection will happen when the CPU is able to -+ * deliver the interrupt. -+ */ -+ if (kvm_cpu_has_extint(vcpu)) -+ return false; -+ -+ /* Acknowledging ExtINT does not happen if LINT0 is masked. */ - return (!lapic_in_kernel(vcpu) || - kvm_apic_accept_pic_intr(vcpu)); - } - --/* -- * if userspace requested an interrupt window, check that the -- * interrupt window is open. -- * -- * No need to exit to userspace if we already have an interrupt queued. -- */ - static int kvm_vcpu_ready_for_interrupt_injection(struct kvm_vcpu *vcpu) - { - return kvm_arch_interrupt_allowed(vcpu) && -- !kvm_cpu_has_interrupt(vcpu) && -- !kvm_event_needs_reinjection(vcpu) && - kvm_cpu_accept_dm_intr(vcpu); - } - diff --git a/queue-4.4/series b/queue-4.4/series index f5b15150b7b..fcb544b0b2c 100644 --- a/queue-4.4/series +++ b/queue-4.4/series @@ -1,6 +1,5 @@ btrfs-tree-checker-enhance-chunk-checker-to-validate-chunk-profile.patch btrfs-inode-verify-inode-mode-to-avoid-null-pointer-dereference.patch -kvm-x86-fix-split-irqchip-vs-interrupt-injection-window-request.patch hid-cypress-support-varmilo-keyboards-media-hotkeys.patch input-i8042-allow-insmod-to-succeed-on-devices-witho.patch hid-hid-sensor-hub-fix-issue-with-devices-with-no-re.patch diff --git a/queue-4.9/kvm-x86-fix-split-irqchip-vs-interrupt-injection-window-request.patch b/queue-4.9/kvm-x86-fix-split-irqchip-vs-interrupt-injection-window-request.patch deleted file mode 100644 index b0174a45389..00000000000 --- a/queue-4.9/kvm-x86-fix-split-irqchip-vs-interrupt-injection-window-request.patch +++ /dev/null @@ -1,139 +0,0 @@ -From 71cc849b7093bb83af966c0e60cb11b7f35cd746 Mon Sep 17 00:00:00 2001 -From: Paolo Bonzini -Date: Fri, 27 Nov 2020 09:18:20 +0100 -Subject: KVM: x86: Fix split-irqchip vs interrupt injection window request - -From: Paolo Bonzini - -commit 71cc849b7093bb83af966c0e60cb11b7f35cd746 upstream. - -kvm_cpu_accept_dm_intr and kvm_vcpu_ready_for_interrupt_injection are -a hodge-podge of conditions, hacked together to get something that -more or less works. But what is actually needed is much simpler; -in both cases the fundamental question is, do we have a place to stash -an interrupt if userspace does KVM_INTERRUPT? - -In userspace irqchip mode, that is !vcpu->arch.interrupt.injected. -Currently kvm_event_needs_reinjection(vcpu) covers it, but it is -unnecessarily restrictive. - -In split irqchip mode it's a bit more complicated, we need to check -kvm_apic_accept_pic_intr(vcpu) (the IRQ window exit is basically an INTACK -cycle and thus requires ExtINTs not to be masked) as well as -!pending_userspace_extint(vcpu). However, there is no need to -check kvm_event_needs_reinjection(vcpu), since split irqchip keeps -pending ExtINT state separate from event injection state, and checking -kvm_cpu_has_interrupt(vcpu) is wrong too since ExtINT has higher -priority than APIC interrupts. In fact the latter fixes a bug: -when userspace requests an IRQ window vmexit, an interrupt in the -local APIC can cause kvm_cpu_has_interrupt() to be true and thus -kvm_vcpu_ready_for_interrupt_injection() to return false. When this -happens, vcpu_run does not exit to userspace but the interrupt window -vmexits keep occurring. The VM loops without any hope of making progress. - -Once we try to fix these with something like - - return kvm_arch_interrupt_allowed(vcpu) && -- !kvm_cpu_has_interrupt(vcpu) && -- !kvm_event_needs_reinjection(vcpu) && -- kvm_cpu_accept_dm_intr(vcpu); -+ (!lapic_in_kernel(vcpu) -+ ? !vcpu->arch.interrupt.injected -+ : (kvm_apic_accept_pic_intr(vcpu) -+ && !pending_userspace_extint(v))); - -we realize two things. First, thanks to the previous patch the complex -conditional can reuse !kvm_cpu_has_extint(vcpu). Second, the interrupt -window request in vcpu_enter_guest() - - bool req_int_win = - dm_request_for_irq_injection(vcpu) && - kvm_cpu_accept_dm_intr(vcpu); - -should be kept in sync with kvm_vcpu_ready_for_interrupt_injection(): -it is unnecessary to ask the processor for an interrupt window -if we would not be able to return to userspace. Therefore, -kvm_cpu_accept_dm_intr(vcpu) is basically !kvm_cpu_has_extint(vcpu) -ANDed with the existing check for masked ExtINT. It all makes sense: - -- we can accept an interrupt from userspace if there is a place - to stash it (and, for irqchip split, ExtINTs are not masked). - Interrupts from userspace _can_ be accepted even if right now - EFLAGS.IF=0. - -- in order to tell userspace we will inject its interrupt ("IRQ - window open" i.e. kvm_vcpu_ready_for_interrupt_injection), both - KVM and the vCPU need to be ready to accept the interrupt. - -... and this is what the patch implements. - -Reported-by: David Woodhouse -Analyzed-by: David Woodhouse -Cc: stable@vger.kernel.org -Signed-off-by: Paolo Bonzini -Reviewed-by: Nikos Tsironis -Reviewed-by: David Woodhouse -Tested-by: David Woodhouse -Signed-off-by: Greg Kroah-Hartman - ---- - arch/x86/include/asm/kvm_host.h | 1 + - arch/x86/kvm/irq.c | 2 +- - arch/x86/kvm/x86.c | 18 ++++++++++-------- - 3 files changed, 12 insertions(+), 9 deletions(-) - ---- a/arch/x86/include/asm/kvm_host.h -+++ b/arch/x86/include/asm/kvm_host.h -@@ -1350,6 +1350,7 @@ int kvm_test_age_hva(struct kvm *kvm, un - void kvm_set_spte_hva(struct kvm *kvm, unsigned long hva, pte_t pte); - int kvm_cpu_has_injectable_intr(struct kvm_vcpu *v); - int kvm_cpu_has_interrupt(struct kvm_vcpu *vcpu); -+int kvm_cpu_has_extint(struct kvm_vcpu *v); - int kvm_arch_interrupt_allowed(struct kvm_vcpu *vcpu); - int kvm_cpu_get_interrupt(struct kvm_vcpu *v); - void kvm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event); ---- a/arch/x86/kvm/irq.c -+++ b/arch/x86/kvm/irq.c -@@ -52,7 +52,7 @@ static int pending_userspace_extint(stru - * check if there is pending interrupt from - * non-APIC source without intack. - */ --static int kvm_cpu_has_extint(struct kvm_vcpu *v) -+int kvm_cpu_has_extint(struct kvm_vcpu *v) - { - u8 accept = kvm_apic_accept_pic_intr(v); - ---- a/arch/x86/kvm/x86.c -+++ b/arch/x86/kvm/x86.c -@@ -3053,21 +3053,23 @@ static int kvm_vcpu_ioctl_set_lapic(stru - - static int kvm_cpu_accept_dm_intr(struct kvm_vcpu *vcpu) - { -+ /* -+ * We can accept userspace's request for interrupt injection -+ * as long as we have a place to store the interrupt number. -+ * The actual injection will happen when the CPU is able to -+ * deliver the interrupt. -+ */ -+ if (kvm_cpu_has_extint(vcpu)) -+ return false; -+ -+ /* Acknowledging ExtINT does not happen if LINT0 is masked. */ - return (!lapic_in_kernel(vcpu) || - kvm_apic_accept_pic_intr(vcpu)); - } - --/* -- * if userspace requested an interrupt window, check that the -- * interrupt window is open. -- * -- * No need to exit to userspace if we already have an interrupt queued. -- */ - static int kvm_vcpu_ready_for_interrupt_injection(struct kvm_vcpu *vcpu) - { - return kvm_arch_interrupt_allowed(vcpu) && -- !kvm_cpu_has_interrupt(vcpu) && -- !kvm_event_needs_reinjection(vcpu) && - kvm_cpu_accept_dm_intr(vcpu); - } - diff --git a/queue-4.9/series b/queue-4.9/series index e1c60ddcb6f..0cbb636c22c 100644 --- a/queue-4.9/series +++ b/queue-4.9/series @@ -4,7 +4,6 @@ btrfs-fix-lockdep-splat-when-reading-qgroup-config-on-mount.patch pci-add-device-even-if-driver-attach-failed.patch btrfs-tree-checker-enhance-chunk-checker-to-validate-chunk-profile.patch btrfs-inode-verify-inode-mode-to-avoid-null-pointer-dereference.patch -kvm-x86-fix-split-irqchip-vs-interrupt-injection-window-request.patch arm64-pgtable-fix-pte_accessible.patch alsa-hda-hdmi-use-single-mutex-unlock-in-error-paths.patch alsa-hda-hdmi-fix-incorrect-locking-in-hdmi_pcm_close.patch