[PATCH] set_rte() should get iosapic_lock

From: Kenji Kaneshige <kaneshige.kenji_at_jp.fujitsu.com>
Date: 2004-04-12 22:36:34
Hi,

Currently set_rte() changes RTE without iosapic_lock held. I guess it
assumes to be called only at the boot time. But set_rte() can be
called by PCI driver not only at the boot time. So I think set_rte()
should get iosapic_lock.

pci_enable_device(drivers/pci/pci.c)
|
+-> pci_enable_device_bars(drivers/pci/pci.c)
    |
    +-> pcibios_enable_device(arch/ia64/pci/pci.c)
        |
        +-> acpi_pci_irq_enable (drivers/acpi/pci_irq.c)
            |
            +-> iosapic_enable_intr (arch/ia64/kernel/iosapic.c)
                |
                +-> set_rte (arch_ia64/kernel/iosapic.c)

A following patch fixes this issue.  I'm also attaching this patch
because my mailer replace all tabs with blanks.

Thanks,
Kenji Kaneshige

diff -Naur linux-2.6.5/arch/ia64/kernel/iosapic.c
linux-2.6.5-changed/arch/ia64/kernel/iosapic.c
--- linux-2.6.5/arch/ia64/kernel/iosapic.c	2004-04-04 12:37:06.000000000
+0900
+++ linux-2.6.5-changed/arch/ia64/kernel/iosapic.c	2004-04-12
21:08:48.491220447 +0900
@@ -172,7 +172,7 @@
 static void
 set_rte (unsigned int vector, unsigned int dest, int mask)
 {
-	unsigned long pol, trigger, dmode;
+	unsigned long pol, trigger, dmode, flags;
 	u32 low32, high32;
 	char *addr;
 	int rte_index;
@@ -211,11 +211,15 @@
 	/* dest contains both id and eid */
 	high32 = (dest << IOSAPIC_DEST_SHIFT);

-	writel(IOSAPIC_RTE_HIGH(rte_index), addr + IOSAPIC_REG_SELECT);
-	writel(high32, addr + IOSAPIC_WINDOW);
-	writel(IOSAPIC_RTE_LOW(rte_index), addr + IOSAPIC_REG_SELECT);
-	writel(low32, addr + IOSAPIC_WINDOW);
-	iosapic_intr_info[vector].low32 = low32;
+	spin_lock_irqsave(&iosapic_lock, flags);
+	{
+		writel(IOSAPIC_RTE_HIGH(rte_index), addr + IOSAPIC_REG_SELECT);
+		writel(high32, addr + IOSAPIC_WINDOW);
+		writel(IOSAPIC_RTE_LOW(rte_index), addr + IOSAPIC_REG_SELECT);
+		writel(low32, addr + IOSAPIC_WINDOW);
+		iosapic_intr_info[vector].low32 = low32;
+	}
+	spin_unlock_irqrestore(&iosapic_lock, flags);
 }

 static void


-
To unsubscribe from this list: send the line "unsubscribe linux-ia64" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Received on Mon Apr 12 08:33:34 2004

This archive was generated by hypermail 2.1.8 : 2005-08-02 09:20:25 EST