Subject: Re: linux-next Regression: Unable to locate IOAPIC

From: "Yinghai Lu" <[email-masked]>
Date: Sat, 14 Jun 2008 01:26:41 -0700

On Sat, Jun 14, 2008 at 12:07 AM, Alexey Starikovskiy
<[email-masked]> wrote:
> Hi Ingo, Yinghai,
>
> It looks like the code introduced by
> 2944e16b25e7fb8b5ee0dd9dc7197a0f9e523cfd
> is causing this problem. At least it is new between -rc5 (working) and
> linux-next (not working).
>
> Regards,
> Alex.
>
>
> Daniel Exner wrote:
>>
>> Hi all,
>>
>> Alexey Starikovskiy wrote:
>>
>>>
>>> Hi Daniel,
>>>
>>> Could you please provide full dmesg and acpidump outputs?
>>>
>>
>> I attached dmesg and config , both from working 2.6.26-rc5 with git-acpi
>> patch below and from linux-next snapshot 20080604.
>> I also attached acpidump that was done while using stock 2.6.25-fw5 from
>> my distro. (But I think that doesnt matter, at least it shouldn't ;)
>>
>>
>>>
>>> Daniel Exner wrote:
>>>
>>>>
>>>> Andrew Morton wrote:
>>>>
>>>>>
>>>>> On Fri, 6 Jun 2008 19:30:28 +0200 Daniel Exner <[email-masked]>
>>>>>
>>
>> wrote:
>>
>>>>>>
>>>>>> Andrew Morton wrote:
>>>>>>
>>>>>>>
>>>>>>> (cc linux-acpi)
>>>>>>>
>>>>>>> On Thu, 5 Jun 2008 11:00:12 +0200 Daniel Exner <[email-masked]>
>>>>>>>
>>>>
>>>> wrote:
>>>>
>>>>>>>>
>>>>>>>> Hi!
>>>>>>>>
>>>>>>>> (Added myself to CC, because I'm not subscribed)
>>>>>>>>
>>>>>>>> with linux-next snapshot 20080604 my Laptop morphes into sitting
>>>>>>>> duck
>>>>>>>> and I think this is due to this:
>>>>>>>>
>>>>>>>
>>>>>>> I assume 2.6.26-rc5 is OK?
>>>>>>>
>>>>>>
>>>>>> Indeed.. just tried it with (nearly) the same config: no unable to
>>>>>> locate IOAPIC
>>>>>>
>>>>>> Will try todays next snapshot above -rc5 now.
>>>>>>
>>>>>
>>>>> OK, thanks.
>>>>>
>>>>> It would be great if you could test 2.6.26-rc5 plus
>>>>> http://userweb.kernel.org/~akpm/git-acpi.patch.  That'll allow us to
>>>>> confirm that the regression is due to changes in the acpi tree.
>>>>>
>>>>
>>>> Sorry for the delay.. real-life you know ;)
>>>>
>>>> I guess you'd expect me to confirm the behavior on rc5 with this patch
>>>> aplied, but .. well this Kernel works!
>>>>
>>
>> To clarify myself:
>> 2.6.25.5:  --> relatively fast no IOAPIC Errors in dmesg
>> 2.6.26-rc5:   --> relatively  no IOAPIC Errors in dmesg
>> 2.6.26-rc5 + git-acpi Patch:   --> relatively  no IOAPIC Errors in dmesg
>> 2.6.26-rc5 +  linux-next snapshot 20080604 --> even slower than before my
>> ide Patch many "unable to locate IOAPIC" Errors
>>
>>
>> So I think the problem lies not in the acpi tree but somewhre else.
>>
>> Is it possible to tell git to explicitly _exclude_ a specific tree while
>> bisecting?

can you check if the attached patch fix the problem?
it will not check entries before MP_intsrc_info...

YH
[PATCH] x86: keep MP_intsrc_info untouched if not update mptable

use enable_update_mptable to decide if need check before add mp_irqs array

Signed-off-by: Yinghai Lu <[email-masked]>

diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index f1d24bd..d2a4768 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -1170,6 +1170,9 @@ int mp_config_acpi_gsi(unsigned char number, unsigned int devfn, u8 pin,
 	struct mpc_config_intsrc intsrc;
 	int ioapic;
 
+	if (!enable_update_mptable)
+		return 0;
+
 	/* print the entry should happen on mptable identically */
 	intsrc.mpc_type = MP_INTSRC;
 	intsrc.mpc_irqtype = mp_INT;
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c
index 7ac1b68..1b041a5 100644
--- a/arch/x86/kernel/mpparse.c
+++ b/arch/x86/kernel/mpparse.c
@@ -34,6 +34,8 @@
 #include <mach_mpparse.h>
 #endif
 
+int enable_update_mptable;
+
 /*
  * Checksum an MP configuration block.
  */
@@ -295,10 +297,11 @@ void MP_intsrc_info(struct mpc_config_intsrc *m)
 
 	print_MP_intsrc_info(m);
 
-	for (i = 0; i < mp_irq_entries; i++) {
-		if (!mp_irq_mpc_intsrc_cmp(&mp_irqs[i], m))
-			return;
-	}
+	if (enable_update_mptable)
+		for (i = 0; i < mp_irq_entries; i++) {
+			if (!mp_irq_mpc_intsrc_cmp(&mp_irqs[i], m))
+				return;
+		}
 
 	assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);
 	if (++mp_irq_entries == MAX_IRQ_SOURCES)
@@ -1116,8 +1119,6 @@ out:
 	return 0;
 }
 
-int __initdata enable_update_mptable;
-
 static int __init update_mptable_setup(char *str)
 {
 	enable_update_mptable = 1;
diff --git a/include/asm-x86/mpspec.h b/include/asm-x86/mpspec.h
index b8ba374..f48dbca 100644
--- a/include/asm-x86/mpspec.h
+++ b/include/asm-x86/mpspec.h
@@ -61,6 +61,7 @@ extern void mp_config_acpi_legacy_irqs(void);
 extern int mp_register_gsi(u32 gsi, int edge_level, int active_high_low);
 extern void MP_intsrc_info(struct mpc_config_intsrc *m);
 #ifdef CONFIG_X86_IO_APIC
+extern int enable_update_mptable;
 extern int mp_config_acpi_gsi(unsigned char number, unsigned int devfn, u8 pin,
 				u32 gsi, int triggering, int polarity);
 #else