diff options
author | Andrew Cooper <andrew.cooper3@citrix.com> | 2012-02-23 09:58:47 +0000 |
---|---|---|
committer | Andrew Cooper <andrew.cooper3@citrix.com> | 2012-02-23 09:58:47 +0000 |
commit | 23c3c39665e641c17bc02a411e1a483554393610 (patch) | |
tree | 774fe4a42bcfe64ab7e62abc849cc1be1b862713 | |
parent | d77aed8fdabdf67f6af144d90ed791d56ec1b85f (diff) | |
download | xen-23c3c39665e641c17bc02a411e1a483554393610.tar.gz xen-23c3c39665e641c17bc02a411e1a483554393610.tar.bz2 xen-23c3c39665e641c17bc02a411e1a483554393610.zip |
IO-APIC: Prevent using EOI broadcast suppression if user specified ioapic_ack=new on the command line.
Currently, if EOI broadcast suppression is advertised on the BSP
LAPIC, Xen will discard any user specified option regarding IO-APIC
ack mode.
This patch introduces a check which prevents EOI Broadcast suppression
from forcing the IO-APIC ack mode to old if the user has explicitly
asked for the new ack mode on the command line.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Committed-by: Keir Fraser <keir@xen.org>
-rw-r--r-- | xen/arch/x86/apic.c | 12 | ||||
-rw-r--r-- | xen/arch/x86/io_apic.c | 7 | ||||
-rw-r--r-- | xen/include/asm-x86/io_apic.h | 1 |
3 files changed, 17 insertions, 3 deletions
diff --git a/xen/arch/x86/apic.c b/xen/arch/x86/apic.c index f3f1781880..42802b43c0 100644 --- a/xen/arch/x86/apic.c +++ b/xen/arch/x86/apic.c @@ -424,9 +424,15 @@ int __init verify_local_APIC(void) */ if ( reg0 & APIC_LVR_DIRECTED_EOI ) { - ioapic_ack_new = 0; - directed_eoi_enabled = 1; - printk("Enabled directed EOI with ioapic_ack_old on!\n"); + if ( ioapic_ack_new == 1 && ioapic_ack_forced == 1 ) + printk("Not enabling directed EOI because ioapic_ack_new has been " + "forced on the command line\n"); + else + { + ioapic_ack_new = 0; + directed_eoi_enabled = 1; + printk("Enabled directed EOI with ioapic_ack_old on!\n"); + } } /* diff --git a/xen/arch/x86/io_apic.c b/xen/arch/x86/io_apic.c index 1c8334924a..31f1541aea 100644 --- a/xen/arch/x86/io_apic.c +++ b/xen/arch/x86/io_apic.c @@ -44,6 +44,7 @@ static DEFINE_SPINLOCK(ioapic_lock); bool_t __read_mostly skip_ioapic_setup; bool_t __read_mostly ioapic_ack_new = 1; +bool_t __read_mostly ioapic_ack_forced = 0; #ifndef sis_apic_bug /* @@ -1543,9 +1544,15 @@ static unsigned int startup_level_ioapic_irq(struct irq_desc *desc) static void __init setup_ioapic_ack(char *s) { if ( !strcmp(s, "old") ) + { ioapic_ack_new = 0; + ioapic_ack_forced = 1; + } else if ( !strcmp(s, "new") ) + { ioapic_ack_new = 1; + ioapic_ack_forced = 1; + } else printk("Unknown ioapic_ack value specified: '%s'\n", s); } diff --git a/xen/include/asm-x86/io_apic.h b/xen/include/asm-x86/io_apic.h index a6d16f6c25..cee283ebe7 100644 --- a/xen/include/asm-x86/io_apic.h +++ b/xen/include/asm-x86/io_apic.h @@ -180,6 +180,7 @@ static inline void io_apic_modify(unsigned int apic, unsigned int reg, unsigned /* 1 if "noapic" boot option passed */ extern bool_t skip_ioapic_setup; extern bool_t ioapic_ack_new; +extern bool_t ioapic_ack_forced; #ifdef CONFIG_ACPI_BOOT extern int io_apic_get_unique_id (int ioapic, int apic_id); |