[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-users] kernel panic on Gentoo kernel 3.3.1



Am 11.04.2012 12:05, schrieb Xi Shen:
My base system is Gentoo x86. I have both kernel 3.2.11, and 3.3.1 on
my system. With 3.2.11, the system can boot as native and xen dom0.
With 3.3.1, system can boot in native mode without any problem. But
when I try to boot as xen dom0, I got kernel panic, and the system got
reboot automatically.

The 3.3.1 kernel (any variant, i.e. either vanilla-sources or gentoo-sources) is broken wrt. being used as a Xen-Dom0 pv_ops-system; it has a bug stemming from incorrectly trying to validate the virtualized IOAPIC. In case you (reverse-)apply the attached patch, it will boot (and work) properly.

--
--- Heiko.
--- Begin Message ---
x86/ioapic: Add register level checks to detect bogus io-apic entries

With the recent changes to clear_IO_APIC_pin() which tries to
clear remoteIRR bit explicitly, some of the users started to see
"Unable to reset IRR for apic .." messages.

Close look shows that these are related to bogus IO-APIC entries
which return's all 1's for their io-apic registers. And the
above mentioned error messages are benign. But kernel should
have ignored such io-apic's in the first place.

Check if register 0, 1, 2 of the listed io-apic are all 1's and
ignore such io-apic.

Reported-by: Ã?lvaro Castillo <midgoon@xxxxxxxxx>
Tested-by: Jon Dufresne <jon@xxxxxxxxxxxxxxx>
Signed-off-by: Suresh Siddha <suresh.b.siddha@xxxxxxxxx>
Cc: yinghai@xxxxxxxxxx
Cc: kernel-team@xxxxxxxxxxxxxxxxx
Cc: Josh Boyer <jwboyer@xxxxxxxxxx>
Cc: <stable@xxxxxxxxxx>
Link: 
http://lkml.kernel.org/r/1331577393.31585.94.camel@xxxxxxxxxxxxxxxxxxxxxxxxxx
[ Performed minor cleanup of affected code. ]
Signed-off-by: Ingo Molnar <mingo@xxxxxxx>
---

diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index fb07275..6d10a66 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -3967,18 +3967,36 @@ int mp_find_ioapic_pin(int ioapic, u32 gsi)
 static __init int bad_ioapic(unsigned long address)
 {
        if (nr_ioapics >= MAX_IO_APICS) {
-               printk(KERN_WARNING "WARNING: Max # of I/O APICs (%d) exceeded "
-                      "(found %d), skipping\n", MAX_IO_APICS, nr_ioapics);
+               pr_warn("WARNING: Max # of I/O APICs (%d) exceeded (found %d), 
skipping\n",
+                       MAX_IO_APICS, nr_ioapics);
                return 1;
        }
        if (!address) {
-               printk(KERN_WARNING "WARNING: Bogus (zero) I/O APIC address"
-                      " found in table, skipping!\n");
+               pr_warn("WARNING: Bogus (zero) I/O APIC address found in table, 
skipping!\n");
                return 1;
        }
        return 0;
 }
 
+static __init int bad_ioapic_register(int idx)
+{
+       union IO_APIC_reg_00 reg_00;
+       union IO_APIC_reg_01 reg_01;
+       union IO_APIC_reg_02 reg_02;
+
+       reg_00.raw = io_apic_read(idx, 0);
+       reg_01.raw = io_apic_read(idx, 1);
+       reg_02.raw = io_apic_read(idx, 2);
+
+       if (reg_00.raw == -1 && reg_01.raw == -1 && reg_02.raw == -1) {
+               pr_warn("I/O APIC 0x%x registers return all ones, skipping!\n",
+                       mpc_ioapic_addr(idx));
+               return 1;
+       }
+
+       return 0;
+}
+
 void __init mp_register_ioapic(int id, u32 address, u32 gsi_base)
 {
        int idx = 0;
@@ -3995,6 +4013,12 @@ void __init mp_register_ioapic(int id, u32 address, u32 
gsi_base)
        ioapics[idx].mp_config.apicaddr = address;
 
        set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address);
+
+       if (bad_ioapic_register(idx)) {
+               clear_fixmap(FIX_IO_APIC_BASE_0 + idx);
+               return;
+       }
+
        ioapics[idx].mp_config.apicid = io_apic_unique_id(id);
        ioapics[idx].mp_config.apicver = io_apic_get_version(idx);
 
@@ -4015,10 +4039,10 @@ void __init mp_register_ioapic(int id, u32 address, u32 
gsi_base)
        if (gsi_cfg->gsi_end >= gsi_top)
                gsi_top = gsi_cfg->gsi_end + 1;
 
-       printk(KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%x, "
-              "GSI %d-%d\n", idx, mpc_ioapic_id(idx),
-              mpc_ioapic_ver(idx), mpc_ioapic_addr(idx),
-              gsi_cfg->gsi_base, gsi_cfg->gsi_end);
+       pr_info("IOAPIC[%d]: apic_id %d, version %d, address 0x%x, GSI %d-%d\n",
+               idx, mpc_ioapic_id(idx),
+               mpc_ioapic_ver(idx), mpc_ioapic_addr(idx),
+               gsi_cfg->gsi_base, gsi_cfg->gsi_end);
 
        nr_ioapics++;
 }

--- End Message ---
_______________________________________________
Xen-users mailing list
Xen-users@xxxxxxxxxxxxx
http://lists.xen.org/xen-users

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.