On Wed, 13 Feb 2013, John Kacur wrote: > > Thanks Steven. That looks way better than the previous revert. I can't tell as I haven't seen the previous revert. And looks good is not really a good review criteria. The patch is converting _all_ the spin_locks in acpi to raw spinlocks, which will give you a nice bunch of "BUG: sleeping function called from invalid context" splats depending on the ACPI functionality of your machine. The lock which is related to this splat is: acpi_gbl_hardware_lock and that's the only lock which can be safely converted to a raw spinlock. Untested patch below. Thanks, tglx Index: linux-stable/drivers/acpi/acpica/acglobal.h =================================================================== --- linux-stable.orig/drivers/acpi/acpica/acglobal.h +++ linux-stable/drivers/acpi/acpica/acglobal.h @@ -251,7 +251,7 @@ ACPI_EXTERN u8 acpi_gbl_global_lock_pend * interrupt level */ ACPI_EXTERN acpi_spinlock acpi_gbl_gpe_lock; /* For GPE data structs and registers */ -ACPI_EXTERN acpi_spinlock acpi_gbl_hardware_lock; /* For ACPI H/W except GPE registers */ +ACPI_EXTERN acpi_raw_spinlock acpi_gbl_hardware_lock; /* For ACPI H/W except GPE registers */ /***************************************************************************** * Index: linux-stable/drivers/acpi/acpica/hwregs.c =================================================================== --- linux-stable.orig/drivers/acpi/acpica/hwregs.c +++ linux-stable/drivers/acpi/acpica/hwregs.c @@ -271,14 +271,14 @@ acpi_status acpi_hw_clear_acpi_status(vo ACPI_BITMASK_ALL_FIXED_STATUS, ACPI_FORMAT_UINT64(acpi_gbl_xpm1a_status.address))); - lock_flags = acpi_os_acquire_lock(acpi_gbl_hardware_lock); + raw_spin_lock_irqsave(acpi_gbl_hardware_lock, lock_flags); /* Clear the fixed events in PM1 A/B */ status = acpi_hw_register_write(ACPI_REGISTER_PM1_STATUS, ACPI_BITMASK_ALL_FIXED_STATUS); - acpi_os_release_lock(acpi_gbl_hardware_lock, lock_flags); + raw_spin_unlock_irqrestore(acpi_gbl_hardware_lock, lock_flags); if (ACPI_FAILURE(status)) goto exit; Index: linux-stable/drivers/acpi/acpica/hwxface.c =================================================================== --- linux-stable.orig/drivers/acpi/acpica/hwxface.c +++ linux-stable/drivers/acpi/acpica/hwxface.c @@ -366,7 +366,7 @@ acpi_status acpi_write_bit_register(u32 return_ACPI_STATUS(AE_BAD_PARAMETER); } - lock_flags = acpi_os_acquire_lock(acpi_gbl_hardware_lock); + raw_spin_lock_irqsave(acpi_gbl_hardware_lock, lock_flags); /* * At this point, we know that the parent register is one of the @@ -427,7 +427,7 @@ acpi_status acpi_write_bit_register(u32 unlock_and_exit: - acpi_os_release_lock(acpi_gbl_hardware_lock, lock_flags); + raw_spin_unlock_irqrestore(acpi_gbl_hardware_lock, lock_flags); return_ACPI_STATUS(status); } Index: linux-stable/drivers/acpi/acpica/utmutex.c =================================================================== --- linux-stable.orig/drivers/acpi/acpica/utmutex.c +++ linux-stable/drivers/acpi/acpica/utmutex.c @@ -88,7 +88,7 @@ acpi_status acpi_ut_mutex_initialize(voi return_ACPI_STATUS (status); } - status = acpi_os_create_lock (&acpi_gbl_hardware_lock); + status = acpi_os_create_raw_lock (&acpi_gbl_hardware_lock); if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); } @@ -135,7 +135,7 @@ void acpi_ut_mutex_terminate(void) /* Delete the spinlocks */ acpi_os_delete_lock(acpi_gbl_gpe_lock); - acpi_os_delete_lock(acpi_gbl_hardware_lock); + acpi_os_delete_raw_lock(acpi_gbl_hardware_lock); /* Delete the reader/writer lock */ Index: linux-stable/include/acpi/platform/aclinux.h =================================================================== --- linux-stable.orig/include/acpi/platform/aclinux.h +++ linux-stable/include/acpi/platform/aclinux.h @@ -72,6 +72,7 @@ #define acpi_cache_t struct kmem_cache #define acpi_spinlock spinlock_t * +#define acpi_raw_spinlock raw_spinlock_t * #define acpi_cpu_flags unsigned long #else /* !__KERNEL__ */ @@ -175,6 +176,19 @@ static inline void *acpi_os_acquire_obje lock ? AE_OK : AE_NO_MEMORY; \ }) +#define acpi_os_create_raw_lock(__handle) \ +({ \ + raw_spinlock_t *lock = ACPI_ALLOCATE(sizeof(*lock)); \ + \ + if (lock) { \ + *(__handle) = lock; \ + raw_spin_lock_init(*(__handle)); \ + } \ + lock ? AE_OK : AE_NO_MEMORY; \ +}) + +#define acpi_os_delete_raw_lock(__handle) kfree(__handle) + #endif /* __KERNEL__ */ #endif /* __ACLINUX_H__ */ -- To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html