public inbox for linux-ia64@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] set_rte() should get iosapic_lock
@ 2004-04-12 12:36 Kenji Kaneshige
  2004-04-13  9:07 ` Liu, Benjamin
  2004-04-13 10:30 ` Kenji Kaneshige
  0 siblings, 2 replies; 3+ messages in thread
From: Kenji Kaneshige @ 2004-04-12 12:36 UTC (permalink / raw)
  To: linux-ia64

[-- Attachment #1: Type: text/plain, Size: 1965 bytes --]

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

[-- Attachment #2: fix_set_rte.patch --]
[-- Type: application/octet-stream, Size: 1260 bytes --]

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

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2004-04-13 10:30 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-04-12 12:36 [PATCH] set_rte() should get iosapic_lock Kenji Kaneshige
2004-04-13  9:07 ` Liu, Benjamin
2004-04-13 10:30 ` Kenji Kaneshige

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox