x86: fully honor "nolapic"
authorJan Beulich <jbeulich@novell.com>
Wed, 14 Jan 2009 12:27:35 +0000 (12:27 +0000)
committerIngo Molnar <mingo@elte.hu>
Thu, 15 Jan 2009 11:04:40 +0000 (12:04 +0100)
Impact: widen the effect of the 'nolapic' boot parameter

"nolapic" should not only suppress SMP and use of the LAPIC, but it
also ought to have the effect of disabling all IO-APIC related activity
as well as PCI MSI and HT-IRQs.

Signed-off-by: Jan Beulich <jbeulich@novell.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/kernel/apic.c
arch/x86/kernel/io_apic.c
arch/x86/kernel/smpboot.c

index 0f830e4f56751d0d8499ac64d549b72ee12203a2..c3dd64fabcf3fe6b66e5a986383b95baac09e190 100644 (file)
@@ -1126,6 +1126,11 @@ void __cpuinit setup_local_APIC(void)
        unsigned int value;
        int i, j;
 
+       if (disable_apic) {
+               disable_ioapic_setup();
+               return;
+       }
+
 #ifdef CONFIG_X86_32
        /* Pound the ESR really hard over the head with a big hammer - mbligh */
        if (lapic_is_integrated() && esr_disable) {
@@ -1566,11 +1571,11 @@ int apic_version[MAX_APICS];
 
 int __init APIC_init_uniprocessor(void)
 {
-#ifdef CONFIG_X86_64
        if (disable_apic) {
                pr_info("Apic disabled\n");
                return -1;
        }
+#ifdef CONFIG_X86_64
        if (!cpu_has_apic) {
                disable_apic = 1;
                pr_info("Apic disabled by BIOS\n");
index 1c4a1302536c692dc935acecad4720dbe2395fa9..40747e58f3056e78f7228bcad6ae9eb550388bc8 100644 (file)
@@ -3258,6 +3258,9 @@ static int msi_compose_msg(struct pci_dev *pdev, unsigned int irq, struct msi_ms
        int err;
        unsigned dest;
 
+       if (disable_apic)
+               return -ENXIO;
+
        cfg = irq_cfg(irq);
        err = assign_irq_vector(irq, cfg, TARGET_CPUS);
        if (err)
@@ -3726,6 +3729,9 @@ int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev)
        struct irq_cfg *cfg;
        int err;
 
+       if (disable_apic)
+               return -ENXIO;
+
        cfg = irq_cfg(irq);
        err = assign_irq_vector(irq, cfg, TARGET_CPUS);
        if (!err) {
index bb1a3b1fc87faeb43baa876f725a3454673abcdc..31f99ec2e0fd95e10a5a25f58870a2f3a4446f62 100644 (file)
@@ -1125,6 +1125,7 @@ static int __init smp_sanity_check(unsigned max_cpus)
                printk(KERN_ERR "... forcing use of dummy APIC emulation."
                                "(tell your hw vendor)\n");
                smpboot_clear_io_apic();
+               disable_ioapic_setup();
                return -1;
        }