[kernel] r17123 - in dists/sid/linux-2.6/debian: . patches/bugfix/x86 patches/series

Ben Hutchings benh at alioth.debian.org
Sat Mar 26 17:02:17 UTC 2011


Author: benh
Date: Sat Mar 26 17:02:15 2011
New Revision: 17123

Log:
[x86] KVM: remove isr_ack logic from PIC (Closes: #612105)

Added:
   dists/sid/linux-2.6/debian/patches/bugfix/x86/KVM-remove-isr_ack-logic-from-PIC.patch
Modified:
   dists/sid/linux-2.6/debian/changelog
   dists/sid/linux-2.6/debian/patches/series/2

Modified: dists/sid/linux-2.6/debian/changelog
==============================================================================
--- dists/sid/linux-2.6/debian/changelog	Sat Mar 26 16:43:25 2011	(r17122)
+++ dists/sid/linux-2.6/debian/changelog	Sat Mar 26 17:02:15 2011	(r17123)
@@ -17,6 +17,7 @@
      http://www.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.38.1
   * radeon: Add some sanity checks to obj info record parsing, thanks
     to John Lindgren (Closes: #618847)
+  * [x86] KVM: remove isr_ack logic from PIC (Closes: #612105)
 
   [ Jurij Smakov ]
   * Bump CONFIG_NR_CPUS on sparc to 256 to accomodate T2+ machines

Added: dists/sid/linux-2.6/debian/patches/bugfix/x86/KVM-remove-isr_ack-logic-from-PIC.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/bugfix/x86/KVM-remove-isr_ack-logic-from-PIC.patch	Sat Mar 26 17:02:15 2011	(r17123)
@@ -0,0 +1,120 @@
+From: Gleb Natapov <gleb at redhat.com>
+Date: Wed, 9 Feb 2011 12:09:46 +0200
+Subject: [PATCH] KVM: remove isr_ack logic from PIC
+
+commit 7049467b5383432e178cc4124e53aebd83638916 upstream.
+
+isr_ack logic was added by e48258009d to avoid unnecessary IPIs. Back
+then it made sense, but now the code checks that vcpu is ready to accept
+interrupt before sending IPI, so this logic is no longer needed. The
+patch removes it.
+
+Fixes a regression with Debian/Hurd.
+
+Signed-off-by: Gleb Natapov <gleb at redhat.com>
+Reported-and-tested-by: Jonathan Nieder <jrnieder at gmail.com>
+Signed-off-by: Avi Kivity <avi at redhat.com>
+---
+ arch/x86/kvm/i8259.c |   25 ++-----------------------
+ arch/x86/kvm/x86.c   |    4 ----
+ 2 files changed, 2 insertions(+), 27 deletions(-)
+
+diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c
+index 3cece05..19fe855 100644
+--- a/arch/x86/kvm/i8259.c
++++ b/arch/x86/kvm/i8259.c
+@@ -62,9 +62,6 @@ static void pic_unlock(struct kvm_pic *s)
+ 		}
+ 
+ 		if (!found)
+-			found = s->kvm->bsp_vcpu;
+-
+-		if (!found)
+ 			return;
+ 
+ 		kvm_make_request(KVM_REQ_EVENT, found);
+@@ -75,7 +72,6 @@ static void pic_unlock(struct kvm_pic *s)
+ static void pic_clear_isr(struct kvm_kpic_state *s, int irq)
+ {
+ 	s->isr &= ~(1 << irq);
+-	s->isr_ack |= (1 << irq);
+ 	if (s != &s->pics_state->pics[0])
+ 		irq += 8;
+ 	/*
+@@ -89,16 +85,6 @@ static void pic_clear_isr(struct kvm_kpic_state *s, int irq)
+ 	pic_lock(s->pics_state);
+ }
+ 
+-void kvm_pic_clear_isr_ack(struct kvm *kvm)
+-{
+-	struct kvm_pic *s = pic_irqchip(kvm);
+-
+-	pic_lock(s);
+-	s->pics[0].isr_ack = 0xff;
+-	s->pics[1].isr_ack = 0xff;
+-	pic_unlock(s);
+-}
+-
+ /*
+  * set irq level. If an edge is detected, then the IRR is set to 1
+  */
+@@ -281,7 +267,6 @@ void kvm_pic_reset(struct kvm_kpic_state *s)
+ 	s->irr = 0;
+ 	s->imr = 0;
+ 	s->isr = 0;
+-	s->isr_ack = 0xff;
+ 	s->priority_add = 0;
+ 	s->irq_base = 0;
+ 	s->read_reg_select = 0;
+@@ -545,15 +530,11 @@ static int picdev_read(struct kvm_io_device *this,
+  */
+ static void pic_irq_request(struct kvm *kvm, int level)
+ {
+-	struct kvm_vcpu *vcpu = kvm->bsp_vcpu;
+ 	struct kvm_pic *s = pic_irqchip(kvm);
+-	int irq = pic_get_irq(&s->pics[0]);
+ 
+-	s->output = level;
+-	if (vcpu && level && (s->pics[0].isr_ack & (1 << irq))) {
+-		s->pics[0].isr_ack &= ~(1 << irq);
++	if (!s->output)
+ 		s->wakeup_needed = true;
+-	}
++	s->output = level;
+ }
+ 
+ static const struct kvm_io_device_ops picdev_ops = {
+@@ -575,8 +556,6 @@ struct kvm_pic *kvm_create_pic(struct kvm *kvm)
+ 	s->pics[1].elcr_mask = 0xde;
+ 	s->pics[0].pics_state = s;
+ 	s->pics[1].pics_state = s;
+-	s->pics[0].isr_ack = 0xff;
+-	s->pics[1].isr_ack = 0xff;
+ 
+ 	/*
+ 	 * Initialize PIO device
+diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
+index d9855b8..9000829 100644
+--- a/arch/x86/kvm/x86.c
++++ b/arch/x86/kvm/x86.c
+@@ -2669,8 +2669,6 @@ static int kvm_vcpu_ioctl_x86_set_vcpu_events(struct kvm_vcpu *vcpu,
+ 	vcpu->arch.interrupt.pending = events->interrupt.injected;
+ 	vcpu->arch.interrupt.nr = events->interrupt.nr;
+ 	vcpu->arch.interrupt.soft = events->interrupt.soft;
+-	if (vcpu->arch.interrupt.pending && irqchip_in_kernel(vcpu->kvm))
+-		kvm_pic_clear_isr_ack(vcpu->kvm);
+ 	if (events->flags & KVM_VCPUEVENT_VALID_SHADOW)
+ 		kvm_x86_ops->set_interrupt_shadow(vcpu,
+ 						  events->interrupt.shadow);
+@@ -5621,8 +5619,6 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
+ 	if (pending_vec < max_bits) {
+ 		kvm_queue_interrupt(vcpu, pending_vec, false);
+ 		pr_debug("Set back pending irq %d\n", pending_vec);
+-		if (irqchip_in_kernel(vcpu->kvm))
+-			kvm_pic_clear_isr_ack(vcpu->kvm);
+ 	}
+ 
+ 	kvm_set_segment(vcpu, &sregs->cs, VCPU_SREG_CS);
+-- 
+1.7.4.1
+

Modified: dists/sid/linux-2.6/debian/patches/series/2
==============================================================================
--- dists/sid/linux-2.6/debian/patches/series/2	Sat Mar 26 16:43:25 2011	(r17122)
+++ dists/sid/linux-2.6/debian/patches/series/2	Sat Mar 26 17:02:15 2011	(r17123)
@@ -3,3 +3,4 @@
 - bugfix/x86/Correct-a-typo-in-xen_do_hypervisor_callback-label.patch
 + bugfix/all/stable/2.6.38.1.patch
 + bugfix/all/radeon-add-sanity-checks-to-obj-info-record-parsing.patch
++ bugfix/x86/KVM-remove-isr_ack-logic-from-PIC.patch



More information about the Kernel-svn-changes mailing list