On Wednesday, August 06, 2014 10:22:45 AM Lan Tianyu wrote: > On 2014年08月06日 09:24, Rafael J. Wysocki wrote: > > On Monday, August 04, 2014 04:40:08 PM Lan Tianyu wrote: [cut] > >> @@ -298,29 +298,29 @@ void __iomem *acpi_os_get_iomem(acpi_physical_address phys, unsigned int size) > >> { > >> struct acpi_ioremap *map; > >> void __iomem *virt = NULL; > >> + unsigned long flags; > >> > >> - mutex_lock(&acpi_ioremap_lock); > >> + spin_lock_irqsave(&acpi_ioremap_lock, flags); > > > > Why do you need to do _irqsave here? It was a mutex before, after all, > > so it can't be called from interrupt context. > > > > In other places below too. > > Original code uses RCU lock to protect acpi_ioremaps list in the > acpi_os_read/write_memory() which will be called in apei_read/write(). > apei_read/write() will be called in the interrupt from APEI comments. But acpi_os_get_iomem() won't be called from interrupt context and should use spin_lock_irq() instead of _irqsave. This also applies to the other places that use the mutex. > Now replace RCU with acpi_ioremap_lock and the lock will be called in > the interrupt. So redefine it to spin lock. From history, > acpi_ioremap_lock was spin lock before adding RCU support. And it had scalability problems IIRC. Did you consider using SRCU instead of going back to the spinlock? Rafael -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html