Re: oops in ioapic_write_entry

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Yinghai Lu
Date: Wednesday, August 4, 2010 - 1:59 am

On 08/03/2010 02:38 PM, Eric W. Biederman wrote:

ok, how about this one?

it will try to add entries to mp_irqs[] with some checking.

Yinghai

---
 arch/x86/kernel/mpparse.c |   44 +++++++++++++++++++++++++++++++++++++-------
 1 file changed, 37 insertions(+), 7 deletions(-)

Index: linux-2.6/arch/x86/kernel/mpparse.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/mpparse.c
+++ linux-2.6/arch/x86/kernel/mpparse.c
@@ -173,17 +173,17 @@ static int __init mp_irq_mpc_intsrc_cmp(
 {
 	if (mp_irq->dstapic != m->dstapic)
 		return 1;
-	if (mp_irq->type != m->type)
+	if (mp_irq->dstirq != m->dstirq)
 		return 2;
-	if (mp_irq->irqtype != m->irqtype)
+	if (mp_irq->srcbus != m->srcbus)
 		return 3;
-	if (mp_irq->irqflag != m->irqflag)
+	if (mp_irq->type != m->type)
 		return 4;
-	if (mp_irq->srcbus != m->srcbus)
+	if (mp_irq->irqtype != m->irqtype)
 		return 5;
-	if (mp_irq->srcbusirq != m->srcbusirq)
+	if (mp_irq->irqflag != m->irqflag)
 		return 6;
-	if (mp_irq->dstirq != m->dstirq)
+	if (mp_irq->srcbusirq != m->srcbusirq)
 		return 7;
 
 	return 0;
@@ -195,9 +195,39 @@ static void __init MP_intsrc_info(struct
 
 	print_MP_intsrc_info(m);
 
+	/*
+	 *  Assume BUS, and IOAPIC entries come first all before
+	 *    INTSRC entries
+	 */
+
+	/* check if dstapic is right */
+	for (i = 0; i < nr_ioapics; i++) {
+		if (mp_ioapics[idx].apicid == m->dstapic)
+			break;
+	}
+	if (i == nr_ioapics)
+		return;
+
 	for (i = 0; i < mp_irq_entries; i++) {
-		if (!mp_irq_mpc_intsrc_cmp(&mp_irqs[i], m))
+		int ret = mp_irq_mpc_intsrc_cmp(&mp_irqs[i], m);
+
+		/* duplicated entries ? */
+		if (!ret)
 			return;
+
+		/* same apic/pin, but different bus */
+		if (ret == 3) {
+			/* overwrite wrong legacy one */
+			if (test_bit(mp_irqs[i].srcbus, mp_bus_not_pci) &&
+			    !test_bit(m->srcbus, mp_bus_not_pci)) {
+				assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);
+				return;
+			}
+			/* dump this legacy one */
+			if (!test_bit(mp_irqs[i].srcbus, mp_bus_not_pci) &&
+			    test_bit(m->srcbus, mp_bus_not_pci))
+				return;
+		}
 	}
 
 	assign_to_mp_irq(m, &mp_irqs[mp_irq_entries]);
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
oops in ioapic_write_entry, Dave Airlie, (Sun Aug 1, 10:28 pm)
Re: oops in ioapic_write_entry, Yinghai Lu, (Sun Aug 1, 11:49 pm)
Re: oops in ioapic_write_entry, Dave Airlie, (Mon Aug 2, 4:17 pm)
Re: oops in ioapic_write_entry, Yinghai Lu, (Mon Aug 2, 6:32 pm)
Re: oops in ioapic_write_entry, Yinghai Lu, (Mon Aug 2, 6:34 pm)
Re: oops in ioapic_write_entry, Eric W. Biederman, (Mon Aug 2, 8:13 pm)
Re: oops in ioapic_write_entry, Eric W. Biederman, (Mon Aug 2, 8:26 pm)
Re: oops in ioapic_write_entry, Eric W. Biederman, (Mon Aug 2, 11:00 pm)
Re: oops in ioapic_write_entry, Yinghai Lu, (Tue Aug 3, 12:19 am)
Re: oops in ioapic_write_entry, Eric W. Biederman, (Tue Aug 3, 1:00 am)
Re: oops in ioapic_write_entry, Yinghai Lu, (Tue Aug 3, 1:00 am)
Re: oops in ioapic_write_entry, Yinghai Lu, (Tue Aug 3, 1:04 am)
Re: oops in ioapic_write_entry, Eric W. Biederman, (Tue Aug 3, 1:27 am)
Re: oops in ioapic_write_entry, Eric W. Biederman, (Tue Aug 3, 1:56 am)
Re: oops in ioapic_write_entry, Yinghai Lu, (Tue Aug 3, 2:01 am)
Re: oops in ioapic_write_entry, Eric W. Biederman, (Tue Aug 3, 2:15 am)
Re: oops in ioapic_write_entry, Yinghai Lu, (Tue Aug 3, 2:36 am)
Re: oops in ioapic_write_entry, Eric W. Biederman, (Tue Aug 3, 4:08 am)
Re: oops in ioapic_write_entry, Yinghai Lu, (Tue Aug 3, 12:45 pm)
Re: oops in ioapic_write_entry, Yinghai Lu, (Tue Aug 3, 1:02 pm)
Re: oops in ioapic_write_entry, Eric W. Biederman, (Tue Aug 3, 2:38 pm)
Re: oops in ioapic_write_entry, Dave Airlie, (Tue Aug 3, 4:12 pm)
Re: oops in ioapic_write_entry, Yinghai Lu, (Tue Aug 3, 5:00 pm)
Re: oops in ioapic_write_entry, Eric W. Biederman, (Tue Aug 3, 6:19 pm)
Re: oops in ioapic_write_entry, Ingo Molnar, (Wed Aug 4, 12:33 am)
Re: oops in ioapic_write_entry, Yinghai Lu, (Wed Aug 4, 1:59 am)
Re: oops in ioapic_write_entry, Ingo Molnar, (Wed Aug 4, 2:26 am)
Re: oops in ioapic_write_entry, Eric W. Biederman, (Wed Aug 4, 5:12 am)
Re: oops in ioapic_write_entry, Yinghai Lu, (Wed Aug 4, 12:22 pm)
Re: oops in ioapic_write_entry, Eric W. Biederman, (Wed Aug 4, 1:34 pm)
Re: oops in ioapic_write_entry, Yinghai Lu, (Wed Aug 4, 3:06 pm)