Skip to contentSkip to conversation

FAILED: patch "[PATCH] KVM: x86: fix interrupt window handling in split IRQ chip" failed to apply to 4.3-stable tree

PATCH [email protected] 3 participants 4 messages Dec 7, 2015 – Dec 9, 2015

Subsystems (3)
lore
Share & tools
lore

[email protected]

author maintainer
#0 lore raw

The patch below does not apply to the 4.3-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.

thanks,

greg k-h

------------------ original commit in Linus's tree ------------------

Quoted 1 line

From 127a457acb2131fdb31c68c98cf11eda8ba7b380 Mon Sep 17 00:00:00 2001

From: Matt Gingell <[email protected]>
Date: Tue, 17 Nov 2015 17:32:05 +0100
Subject: [PATCH] KVM: x86: fix interrupt window handling in split IRQ chip
case

This patch ensures that dm_request_for_irq_injection and post_kvm_run_save are in sync, avoiding that an endless ping-pong between userspace (who correctly notices that IF=0) and the kernel (who insists that userspace handles its request for the interrupt window).

To synchronize them, it also adds checks for kvm_arch_interrupt_allowed and !kvm_event_needs_reinjection. These are always needed, not just for in-kernel LAPIC.

[A collage of two patches from Matt. - Paolo]
Fixes 1c1a9ce973a7863dd46767226bce2a5f12d48bc6
arch/x86/kvm/x86.c +19 -14
index 00462bd63129..46ed8edad793 100644
@@ -2763,6 +2763,12 @@ static int kvm_vcpu_ioctl_set_lapic(struct kvm_vcpu *vcpu,
 	return 0;
 }
 
+static int kvm_cpu_accept_dm_intr(struct kvm_vcpu *vcpu)
+{
+	return (!lapic_in_kernel(vcpu) ||
+		kvm_apic_accept_pic_intr(vcpu));
+}
+
 static int kvm_vcpu_ioctl_interrupt(struct kvm_vcpu *vcpu,
 				    struct kvm_interrupt *irq)
 {
@@ -5921,12 +5927,16 @@ static int dm_request_for_irq_injection(struct kvm_vcpu *vcpu)
 	if (!vcpu->run->request_interrupt_window || pic_in_kernel(vcpu->kvm))
 		return false;
 
+	if (!kvm_arch_interrupt_allowed(vcpu))
+		return false;
+
 	if (kvm_cpu_has_interrupt(vcpu))
 		return false;
 
-	return (irqchip_split(vcpu->kvm)
-		? kvm_apic_accept_pic_intr(vcpu)
-		: kvm_arch_interrupt_allowed(vcpu));
+	if (kvm_event_needs_reinjection(vcpu))
+		return false;
+
+	return kvm_cpu_accept_dm_intr(vcpu);
 }
 
 static void post_kvm_run_save(struct kvm_vcpu *vcpu)
@@ -5937,17 +5947,12 @@ static void post_kvm_run_save(struct kvm_vcpu *vcpu)
 	kvm_run->flags = is_smm(vcpu) ? KVM_RUN_X86_SMM : 0;
 	kvm_run->cr8 = kvm_get_cr8(vcpu);
 	kvm_run->apic_base = kvm_get_apic_base(vcpu);
-	if (!irqchip_in_kernel(vcpu->kvm))
-		kvm_run->ready_for_interrupt_injection =
-			kvm_arch_interrupt_allowed(vcpu) &&
-			!kvm_cpu_has_interrupt(vcpu) &&
-			!kvm_event_needs_reinjection(vcpu);
-	else if (!pic_in_kernel(vcpu->kvm))
-		kvm_run->ready_for_interrupt_injection =
-			kvm_apic_accept_pic_intr(vcpu) &&
-			!kvm_cpu_has_interrupt(vcpu);
-	else
-		kvm_run->ready_for_interrupt_injection = 1;
+	kvm_run->ready_for_interrupt_injection =
+		pic_in_kernel(vcpu->kvm) ||
+		(kvm_arch_interrupt_allowed(vcpu) &&
+		 !kvm_cpu_has_interrupt(vcpu) &&
+		 !kvm_event_needs_reinjection(vcpu) &&
+		 kvm_cpu_accept_dm_intr(vcpu));
 }
 
 static void update_cr8_intercept(struct kvm_vcpu *vcpu)
#1 lore raw

These can wait for 4.4.

Thanks,
Matt

Quoted 98 lines · On Dec 6, 2015, at 11:37 PM, <[email protected]>…

The patch below does not apply to the 4.3-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.

thanks,

greg k-h

------------------ original commit in Linus's tree ------------------

From 127a457acb2131fdb31c68c98cf11eda8ba7b380 Mon Sep 17 00:00:00 2001
From: Matt Gingell <[email protected]>
Date: Tue, 17 Nov 2015 17:32:05 +0100
Subject: [PATCH] KVM: x86: fix interrupt window handling in split IRQ chip case

This patch ensures that dm_request_for_irq_injection and post_kvm_run_save are in sync, avoiding that an endless ping-pong between userspace (who correctly notices that IF=0) and the kernel (who insists that userspace handles its request for the interrupt window).

To synchronize them, it also adds checks for kvm_arch_interrupt_allowed and !kvm_event_needs_reinjection. These are always needed, not just for in-kernel LAPIC.

[A collage of two patches from Matt. - Paolo]
Fixes 1c1a9ce973a7863dd46767226bce2a5f12d48bc6
arch/x86/kvm/x86.c +19 -14
index 00462bd63129..46ed8edad793 100644
@@ -2763,6 +2763,12 @@ static int kvm_vcpu_ioctl_set_lapic(struct kvm_vcpu *vcpu,
 	return 0;
 }
 
+static int kvm_cpu_accept_dm_intr(struct kvm_vcpu *vcpu)
+{
+	return (!lapic_in_kernel(vcpu) ||
+		kvm_apic_accept_pic_intr(vcpu));
+}
+
 static int kvm_vcpu_ioctl_interrupt(struct kvm_vcpu *vcpu,
 				    struct kvm_interrupt *irq)
 {
@@ -5921,12 +5927,16 @@ static int dm_request_for_irq_injection(struct kvm_vcpu *vcpu)
 	if (!vcpu->run->request_interrupt_window || pic_in_kernel(vcpu->kvm))
 		return false;
 
+	if (!kvm_arch_interrupt_allowed(vcpu))
+		return false;
+
 	if (kvm_cpu_has_interrupt(vcpu))
 		return false;
 
-	return (irqchip_split(vcpu->kvm)
-		? kvm_apic_accept_pic_intr(vcpu)
-		: kvm_arch_interrupt_allowed(vcpu));
+	if (kvm_event_needs_reinjection(vcpu))
+		return false;
+
+	return kvm_cpu_accept_dm_intr(vcpu);
 }
 
 static void post_kvm_run_save(struct kvm_vcpu *vcpu)
@@ -5937,17 +5947,12 @@ static void post_kvm_run_save(struct kvm_vcpu *vcpu)
 	kvm_run->flags = is_smm(vcpu) ? KVM_RUN_X86_SMM : 0;
 	kvm_run->cr8 = kvm_get_cr8(vcpu);
 	kvm_run->apic_base = kvm_get_apic_base(vcpu);
-	if (!irqchip_in_kernel(vcpu->kvm))
-		kvm_run->ready_for_interrupt_injection =
-			kvm_arch_interrupt_allowed(vcpu) &&
-			!kvm_cpu_has_interrupt(vcpu) &&
-			!kvm_event_needs_reinjection(vcpu);
-	else if (!pic_in_kernel(vcpu->kvm))
-		kvm_run->ready_for_interrupt_injection =
-			kvm_apic_accept_pic_intr(vcpu) &&
-			!kvm_cpu_has_interrupt(vcpu);
-	else
-		kvm_run->ready_for_interrupt_injection = 1;
+	kvm_run->ready_for_interrupt_injection =
+		pic_in_kernel(vcpu->kvm) ||
+		(kvm_arch_interrupt_allowed(vcpu) &&
+		 !kvm_cpu_has_interrupt(vcpu) &&
+		 !kvm_event_needs_reinjection(vcpu) &&
+		 kvm_cpu_accept_dm_intr(vcpu));
 }
 
 static void update_cr8_intercept(struct kvm_vcpu *vcpu)
author maintainer
#2 lore raw
Quoted 1 line · Matt Gingell

These can wait for 4.4.

Then why were they marked for stable?

maintainer
#3 lore raw
Quoted 4 lines · Greg KH
Quoted 1 line · Matt Gingell

These can wait for 4.4.

Then why were they marked for stable?

Even though the bugs were found while testing a new feature in 4.4, the bug exists in 4.3 as well. The patches don't apply because of the context changes caused by the new feature.

I'll do the backport and post them to [email protected].

Paolo