diff --git a/debian/changelog b/debian/changelog index 2cc2be6f3..f4b14552c 100644 --- a/debian/changelog +++ b/debian/changelog @@ -17,6 +17,7 @@ linux-2.6 (2.6.38-2) UNRELEASED; urgency=low 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 diff --git a/debian/patches/bugfix/x86/KVM-remove-isr_ack-logic-from-PIC.patch b/debian/patches/bugfix/x86/KVM-remove-isr_ack-logic-from-PIC.patch new file mode 100644 index 000000000..fd1033113 --- /dev/null +++ b/debian/patches/bugfix/x86/KVM-remove-isr_ack-logic-from-PIC.patch @@ -0,0 +1,120 @@ +From: Gleb Natapov +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 +Reported-and-tested-by: Jonathan Nieder +Signed-off-by: Avi Kivity +--- + 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 + diff --git a/debian/patches/series/2 b/debian/patches/series/2 index ddb1b685a..e9deb791c 100644 --- a/debian/patches/series/2 +++ b/debian/patches/series/2 @@ -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