9a05aa7fc4
22707-x2apic-preenabled-check.patch - bnc#641419 - L3: Xen: qemu-dm reports "xc_map_foreign_batch: mmap failed: Cannot allocate memory" 7434-qemu-rlimit-as.patch - Additional or upstream patches from Jan 22693-fam10-mmio-conf-base-protect.patch 22694-x86_64-no-weak.patch 22708-xenctx-misc.patch 21432-4.0-cpu-boot-failure.patch 22645-amd-flush-filter.patch qemu-fix-7433.patch - Maintain compatibility with the extid flag even though it is deprecated for both legacy and sxp config files. hv_extid_compatibility.patch - bnc#649209-improve suspend eventchn lock suspend_evtchn_lock.patch - Removed the hyper-v shim patches in favor of using the upstream version. - bnc#641419 - L3: Xen: qemu-dm reports "xc_map_foreign_batch: mmap failed: Cannot allocate memory" qemu-rlimit-as.patch - Upstream c/s 7433 to replace qemu_altgr_more.patch 7433-qemu-altgr.patch OBS-URL: https://build.opensuse.org/package/show/Virtualization/xen?expand=0&rev=90
63 lines
2.0 KiB
Diff
63 lines
2.0 KiB
Diff
# HG changeset patch
|
|
# User Keir Fraser <keir@xen.org>
|
|
# Date 1291234227 0
|
|
# Node ID 62bf12040b0f4d802dc7e1cd61294776c8a41a89
|
|
# Parent 8420b82c22c2cad54860ffdbe8bcec21c65c86be
|
|
x86: fix IRQ migration when using directed EOI (broken with c/s 20465)
|
|
|
|
In directed-EOI mode, there is no chance to do the migration in
|
|
mask_and_ack_level_ioapic_irq(), as the remote IRR bit can't possibly
|
|
be clear after issuing the EOI to the LAPIC. Consequently, there's no
|
|
point to even try. Instead, migration must be done in
|
|
end_level_ioapic_irq(), and it requires masking the interrupt source
|
|
prior to issuing the EOI to the IO-APIC.
|
|
|
|
Signed-off-by: Jan Beulich <jbeulich@novell.com>
|
|
|
|
--- a/xen/arch/x86/io_apic.c
|
|
+++ b/xen/arch/x86/io_apic.c
|
|
@@ -1642,11 +1642,14 @@ static void mask_and_ack_level_ioapic_ir
|
|
|
|
ack_APIC_irq();
|
|
|
|
+ if ( directed_eoi_enabled )
|
|
+ return;
|
|
+
|
|
if ((irq_desc[irq].status & IRQ_MOVE_PENDING) &&
|
|
!io_apic_level_ack_pending(irq))
|
|
- move_native_irq(irq);
|
|
+ move_masked_irq(irq);
|
|
|
|
- if (!directed_eoi_enabled && !(v & (1 << (i & 0x1f)))) {
|
|
+ if ( !(v & (1 << (i & 0x1f))) ) {
|
|
atomic_inc(&irq_mis_count);
|
|
spin_lock(&ioapic_lock);
|
|
__edge_IO_APIC_irq(irq);
|
|
@@ -1662,12 +1665,22 @@ static void end_level_ioapic_irq (unsign
|
|
|
|
if ( !ioapic_ack_new )
|
|
{
|
|
- if ( irq_desc[irq].status & IRQ_DISABLED )
|
|
- return;
|
|
-
|
|
if ( directed_eoi_enabled )
|
|
+ {
|
|
+ if ( !(irq_desc[irq].status & (IRQ_DISABLED|IRQ_MOVE_PENDING)) )
|
|
+ {
|
|
+ eoi_IO_APIC_irq(irq);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ mask_IO_APIC_irq(irq);
|
|
eoi_IO_APIC_irq(irq);
|
|
- else
|
|
+ if ( (irq_desc[irq].status & IRQ_MOVE_PENDING) &&
|
|
+ !io_apic_level_ack_pending(irq) )
|
|
+ move_masked_irq(irq);
|
|
+ }
|
|
+
|
|
+ if ( !(irq_desc[irq].status & IRQ_DISABLED) )
|
|
unmask_IO_APIC_irq(irq);
|
|
|
|
return;
|