All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC][PATCH RT] acpi/rt: Convert acpi lock back to a raw_spinlock_t
@ 2013-02-13 14:26 Steven Rostedt
  2013-02-13 16:42 ` Thomas Gleixner
  2013-02-13 16:46 ` John Kacur
  0 siblings, 2 replies; 7+ messages in thread
From: Steven Rostedt @ 2013-02-13 14:26 UTC (permalink / raw)
  To: LKML, RT; +Cc: Thomas Gleixner, John Kacur, Clark Williams

We hit the following bug with 3.6-rt:

[    5.898990] BUG: scheduling while atomic: swapper/3/0/0x00000002 
[    5.898991] no locks held by swapper/3/0. 
[    5.898993] Modules linked in: 
[    5.898996] Pid: 0, comm: swapper/3 Not tainted 3.6.11-rt28.19.el6rt.x86_64.debug #1 
[    5.898997] Call Trace: 
[    5.899011]  [<ffffffff810804e7>] __schedule_bug+0x67/0x90 
[    5.899028]  [<ffffffff81577923>] __schedule+0x793/0x7a0 
[    5.899032]  [<ffffffff810b4e40>] ? debug_rt_mutex_print_deadlock+0x50/0x200 
[    5.899034]  [<ffffffff81577b89>] schedule+0x29/0x70 
[    5.899036] BUG: scheduling while atomic: swapper/7/0/0x00000002 
[    5.899037] no locks held by swapper/7/0. 
[    5.899039]  [<ffffffff81578525>] rt_spin_lock_slowlock+0xe5/0x2f0 
[    5.899040] Modules linked in: 
[    5.899041]  
[    5.899045]  [<ffffffff81579a58>] ? _raw_spin_unlock_irqrestore+0x38/0x90 
[    5.899046] Pid: 0, comm: swapper/7 Not tainted 3.6.11-rt28.19.el6rt.x86_64.debug #1 
[    5.899047] Call Trace: 
[    5.899049]  [<ffffffff81578bc6>] rt_spin_lock+0x16/0x40 
[    5.899052]  [<ffffffff810804e7>] __schedule_bug+0x67/0x90 
[    5.899054]  [<ffffffff8157d3f0>] ? notifier_call_chain+0x80/0x80 
[    5.899056]  [<ffffffff81577923>] __schedule+0x793/0x7a0 
[    5.899059]  [<ffffffff812f2034>] acpi_os_acquire_lock+0x1f/0x23 
[    5.899062]  [<ffffffff810b4e40>] ? debug_rt_mutex_print_deadlock+0x50/0x200 
[    5.899068]  [<ffffffff8130be64>] acpi_write_bit_register+0x33/0xb0 
[    5.899071]  [<ffffffff81577b89>] schedule+0x29/0x70 
[    5.899072]  [<ffffffff8130be13>] ? acpi_read_bit_register+0x33/0x51 
[    5.899074]  [<ffffffff81578525>] rt_spin_lock_slowlock+0xe5/0x2f0 
[    5.899077]  [<ffffffff8131d1fc>] acpi_idle_enter_bm+0x8a/0x28e 
[    5.899079]  [<ffffffff81579a58>] ? _raw_spin_unlock_irqrestore+0x38/0x90 
[    5.899081]  [<ffffffff8107e5da>] ? this_cpu_load+0x1a/0x30 
[    5.899083]  [<ffffffff81578bc6>] rt_spin_lock+0x16/0x40 
[    5.899087]  [<ffffffff8144c759>] cpuidle_enter+0x19/0x20 
[    5.899088]  [<ffffffff8157d3f0>] ? notifier_call_chain+0x80/0x80 
[    5.899090]  [<ffffffff8144c777>] cpuidle_enter_state+0x17/0x50 
[    5.899092]  [<ffffffff812f2034>] acpi_os_acquire_lock+0x1f/0x23 
[    5.899094]  [<ffffffff8144d1a1>] cpuidle899101]  [<ffffffff8130be13>] ? 

As the acpi code disables interrupts in acpi_idle_enter_bm, and calls
code that grabs the acpi lock, it causes issues as the lock is currently
in RT a sleeping lock.

The lock was converted from a raw to a sleeping lock due to some
previous issues, and tests that showed it didn't seem to matter.
Unfortunately, it did matter for one of our boxes.

This patch converts the lock back to a raw lock. I've run this code on a
few of my own machines, one being my laptop that uses the acpi quite
extensively. I've been able to suspend and resume without issues.

But as it may have issues still with other hardware, I'm posting this as
an RFC.

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>

diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
index 9eaf708..83d38ed 100644
--- a/drivers/acpi/osl.c
+++ b/drivers/acpi/osl.c
@@ -1432,7 +1432,7 @@ void acpi_os_delete_lock(acpi_spinlock handle)
 acpi_cpu_flags acpi_os_acquire_lock(acpi_spinlock lockp)
 {
 	acpi_cpu_flags flags;
-	spin_lock_irqsave(lockp, flags);
+	raw_spin_lock_irqsave(lockp, flags);
 	return flags;
 }
 
@@ -1442,7 +1442,7 @@ acpi_cpu_flags acpi_os_acquire_lock(acpi_spinlock lockp)
 
 void acpi_os_release_lock(acpi_spinlock lockp, acpi_cpu_flags flags)
 {
-	spin_unlock_irqrestore(lockp, flags);
+	raw_spin_unlock_irqrestore(lockp, flags);
 }
 
 #ifndef ACPI_USE_LOCAL_CACHE
diff --git a/include/acpi/platform/aclinux.h b/include/acpi/platform/aclinux.h
index 7509be3..484cf8c 100644
--- a/include/acpi/platform/aclinux.h
+++ b/include/acpi/platform/aclinux.h
@@ -71,7 +71,7 @@
 #define strtoul                     simple_strtoul
 
 #define acpi_cache_t                        struct kmem_cache
-#define acpi_spinlock                       spinlock_t *
+#define acpi_spinlock                       raw_spinlock_t *
 #define acpi_cpu_flags                      unsigned long
 
 #else /* !__KERNEL__ */
@@ -170,7 +170,7 @@ static inline void *acpi_os_acquire_object(acpi_cache_t * cache)
 								\
 	if (lock) {						\
 		*(__handle) = lock;				\
-		spin_lock_init(*(__handle));			\
+		raw_spin_lock_init(*(__handle));		\
 	}							\
 	lock ? AE_OK : AE_NO_MEMORY;				\
 })



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

* Re: [RFC][PATCH RT] acpi/rt: Convert acpi lock back to a raw_spinlock_t
  2013-02-13 14:26 [RFC][PATCH RT] acpi/rt: Convert acpi lock back to a raw_spinlock_t Steven Rostedt
@ 2013-02-13 16:42 ` Thomas Gleixner
  2013-02-13 16:46 ` John Kacur
  1 sibling, 0 replies; 7+ messages in thread
From: Thomas Gleixner @ 2013-02-13 16:42 UTC (permalink / raw)
  To: Steven Rostedt; +Cc: LKML, RT, John Kacur, Clark Williams

On Wed, 13 Feb 2013, Steven Rostedt wrote:
> The lock was converted from a raw to a sleeping lock due to some
> previous issues, and tests that showed it didn't seem to matter.
> Unfortunately, it did matter for one of our boxes.

Yep. The other issues are functions like kfree() called under that
lock. I'm auditing all callsites to see what needs to be done.

Thanks,

	tglx

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

* Re: [RFC][PATCH RT] acpi/rt: Convert acpi lock back to a raw_spinlock_t
  2013-02-13 14:26 [RFC][PATCH RT] acpi/rt: Convert acpi lock back to a raw_spinlock_t Steven Rostedt
  2013-02-13 16:42 ` Thomas Gleixner
@ 2013-02-13 16:46 ` John Kacur
  2013-02-13 17:21   ` Thomas Gleixner
  1 sibling, 1 reply; 7+ messages in thread
From: John Kacur @ 2013-02-13 16:46 UTC (permalink / raw)
  To: Steven Rostedt; +Cc: LKML, RT, Thomas Gleixner, John Kacur, Clark Williams



On Wed, 13 Feb 2013, Steven Rostedt wrote:

> We hit the following bug with 3.6-rt:
> 
> [    5.898990] BUG: scheduling while atomic: swapper/3/0/0x00000002 
> [    5.898991] no locks held by swapper/3/0. 
> [    5.898993] Modules linked in: 
> [    5.898996] Pid: 0, comm: swapper/3 Not tainted 3.6.11-rt28.19.el6rt.x86_64.debug #1 
> [    5.898997] Call Trace: 
> [    5.899011]  [<ffffffff810804e7>] __schedule_bug+0x67/0x90 
> [    5.899028]  [<ffffffff81577923>] __schedule+0x793/0x7a0 
> [    5.899032]  [<ffffffff810b4e40>] ? debug_rt_mutex_print_deadlock+0x50/0x200 
> [    5.899034]  [<ffffffff81577b89>] schedule+0x29/0x70 
> [    5.899036] BUG: scheduling while atomic: swapper/7/0/0x00000002 
> [    5.899037] no locks held by swapper/7/0. 
> [    5.899039]  [<ffffffff81578525>] rt_spin_lock_slowlock+0xe5/0x2f0 
> [    5.899040] Modules linked in: 
> [    5.899041]  
> [    5.899045]  [<ffffffff81579a58>] ? _raw_spin_unlock_irqrestore+0x38/0x90 
> [    5.899046] Pid: 0, comm: swapper/7 Not tainted 3.6.11-rt28.19.el6rt.x86_64.debug #1 
> [    5.899047] Call Trace: 
> [    5.899049]  [<ffffffff81578bc6>] rt_spin_lock+0x16/0x40 
> [    5.899052]  [<ffffffff810804e7>] __schedule_bug+0x67/0x90 
> [    5.899054]  [<ffffffff8157d3f0>] ? notifier_call_chain+0x80/0x80 
> [    5.899056]  [<ffffffff81577923>] __schedule+0x793/0x7a0 
> [    5.899059]  [<ffffffff812f2034>] acpi_os_acquire_lock+0x1f/0x23 
> [    5.899062]  [<ffffffff810b4e40>] ? debug_rt_mutex_print_deadlock+0x50/0x200 
> [    5.899068]  [<ffffffff8130be64>] acpi_write_bit_register+0x33/0xb0 
> [    5.899071]  [<ffffffff81577b89>] schedule+0x29/0x70 
> [    5.899072]  [<ffffffff8130be13>] ? acpi_read_bit_register+0x33/0x51 
> [    5.899074]  [<ffffffff81578525>] rt_spin_lock_slowlock+0xe5/0x2f0 
> [    5.899077]  [<ffffffff8131d1fc>] acpi_idle_enter_bm+0x8a/0x28e 
> [    5.899079]  [<ffffffff81579a58>] ? _raw_spin_unlock_irqrestore+0x38/0x90 
> [    5.899081]  [<ffffffff8107e5da>] ? this_cpu_load+0x1a/0x30 
> [    5.899083]  [<ffffffff81578bc6>] rt_spin_lock+0x16/0x40 
> [    5.899087]  [<ffffffff8144c759>] cpuidle_enter+0x19/0x20 
> [    5.899088]  [<ffffffff8157d3f0>] ? notifier_call_chain+0x80/0x80 
> [    5.899090]  [<ffffffff8144c777>] cpuidle_enter_state+0x17/0x50 
> [    5.899092]  [<ffffffff812f2034>] acpi_os_acquire_lock+0x1f/0x23 
> [    5.899094]  [<ffffffff8144d1a1>] cpuidle899101]  [<ffffffff8130be13>] ? 
> 
> As the acpi code disables interrupts in acpi_idle_enter_bm, and calls
> code that grabs the acpi lock, it causes issues as the lock is currently
> in RT a sleeping lock.
> 
> The lock was converted from a raw to a sleeping lock due to some
> previous issues, and tests that showed it didn't seem to matter.
> Unfortunately, it did matter for one of our boxes.
> 
> This patch converts the lock back to a raw lock. I've run this code on a
> few of my own machines, one being my laptop that uses the acpi quite
> extensively. I've been able to suspend and resume without issues.
> 
> But as it may have issues still with other hardware, I'm posting this as
> an RFC.
> 
> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
> 
> diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
> index 9eaf708..83d38ed 100644
> --- a/drivers/acpi/osl.c
> +++ b/drivers/acpi/osl.c
> @@ -1432,7 +1432,7 @@ void acpi_os_delete_lock(acpi_spinlock handle)
>  acpi_cpu_flags acpi_os_acquire_lock(acpi_spinlock lockp)
>  {
>  	acpi_cpu_flags flags;
> -	spin_lock_irqsave(lockp, flags);
> +	raw_spin_lock_irqsave(lockp, flags);
>  	return flags;
>  }
>  
> @@ -1442,7 +1442,7 @@ acpi_cpu_flags acpi_os_acquire_lock(acpi_spinlock lockp)
>  
>  void acpi_os_release_lock(acpi_spinlock lockp, acpi_cpu_flags flags)
>  {
> -	spin_unlock_irqrestore(lockp, flags);
> +	raw_spin_unlock_irqrestore(lockp, flags);
>  }
>  
>  #ifndef ACPI_USE_LOCAL_CACHE
> diff --git a/include/acpi/platform/aclinux.h b/include/acpi/platform/aclinux.h
> index 7509be3..484cf8c 100644
> --- a/include/acpi/platform/aclinux.h
> +++ b/include/acpi/platform/aclinux.h
> @@ -71,7 +71,7 @@
>  #define strtoul                     simple_strtoul
>  
>  #define acpi_cache_t                        struct kmem_cache
> -#define acpi_spinlock                       spinlock_t *
> +#define acpi_spinlock                       raw_spinlock_t *
>  #define acpi_cpu_flags                      unsigned long
>  
>  #else /* !__KERNEL__ */
> @@ -170,7 +170,7 @@ static inline void *acpi_os_acquire_object(acpi_cache_t * cache)
>  								\
>  	if (lock) {						\
>  		*(__handle) = lock;				\
> -		spin_lock_init(*(__handle));			\
> +		raw_spin_lock_init(*(__handle));		\
>  	}							\
>  	lock ? AE_OK : AE_NO_MEMORY;				\
>  })
> 
> 

Thanks Steven. That looks way better than the previous revert.
Applying to the latest RH testing queue, will let you know.

John

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

* Re: [RFC][PATCH RT] acpi/rt: Convert acpi lock back to a raw_spinlock_t
  2013-02-13 16:46 ` John Kacur
@ 2013-02-13 17:21   ` Thomas Gleixner
  2013-02-13 17:46     ` John Kacur
  2013-02-13 17:51     ` Steven Rostedt
  0 siblings, 2 replies; 7+ messages in thread
From: Thomas Gleixner @ 2013-02-13 17:21 UTC (permalink / raw)
  To: John Kacur; +Cc: Steven Rostedt, LKML, RT, John Kacur, Clark Williams

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__ */

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

* Re: [RFC][PATCH RT] acpi/rt: Convert acpi lock back to a raw_spinlock_t
  2013-02-13 17:21   ` Thomas Gleixner
@ 2013-02-13 17:46     ` John Kacur
  2013-02-13 17:51     ` Steven Rostedt
  1 sibling, 0 replies; 7+ messages in thread
From: John Kacur @ 2013-02-13 17:46 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: John Kacur, Steven Rostedt, LKML, RT, John Kacur, Clark Williams



On Wed, 13 Feb 2013, Thomas Gleixner wrote:

> 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.

Absolutely true, and I wasn't claiming to have reviewed it, just wanted to 
let everyone know that testing on it was to begin.
> 
> 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


Thank you Thomas, adding this version instead to our test queue.

John

-----------------SNIP

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

* Re: [RFC][PATCH RT] acpi/rt: Convert acpi lock back to a raw_spinlock_t
  2013-02-13 17:21   ` Thomas Gleixner
  2013-02-13 17:46     ` John Kacur
@ 2013-02-13 17:51     ` Steven Rostedt
  2013-02-13 18:05       ` Steven Rostedt
  1 sibling, 1 reply; 7+ messages in thread
From: Steven Rostedt @ 2013-02-13 17:51 UTC (permalink / raw)
  To: Thomas Gleixner; +Cc: John Kacur, LKML, RT, John Kacur, Clark Williams

On Wed, 2013-02-13 at 18:21 +0100, Thomas Gleixner wrote:
> 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.

I agreed, and warned John on IRC about that. This is why the patch had
RFC in the subject.

> 
> 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.

Yep, I asked to have this tested on a wide range of boxes with the debug
options enabled. Hoping to see if splats do happen.

> 
> 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.

I'll try this patch instead, and see what breaks ;-)

Thanks,

-- Steve

> 
> 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__ */



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

* Re: [RFC][PATCH RT] acpi/rt: Convert acpi lock back to a raw_spinlock_t
  2013-02-13 17:51     ` Steven Rostedt
@ 2013-02-13 18:05       ` Steven Rostedt
  0 siblings, 0 replies; 7+ messages in thread
From: Steven Rostedt @ 2013-02-13 18:05 UTC (permalink / raw)
  To: Thomas Gleixner; +Cc: John Kacur, LKML, RT, John Kacur, Clark Williams

On Wed, 2013-02-13 at 12:51 -0500, Steven Rostedt wrote:
> On Wed, 2013-02-13 at 18:21 +0100, Thomas Gleixner wrote:
> > 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.
> 
> I agreed, and warned John on IRC about that. This is why the patch had
> RFC in the subject.
> 

I should specify that I warned John before he emailed. He wasn't giving
his ack to the patch, as he already knew it was a test patch only. It
just looked as if he did, and my reply didn't help the perspective.

;-)

-- Steve



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

end of thread, other threads:[~2013-02-13 18:05 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-02-13 14:26 [RFC][PATCH RT] acpi/rt: Convert acpi lock back to a raw_spinlock_t Steven Rostedt
2013-02-13 16:42 ` Thomas Gleixner
2013-02-13 16:46 ` John Kacur
2013-02-13 17:21   ` Thomas Gleixner
2013-02-13 17:46     ` John Kacur
2013-02-13 17:51     ` Steven Rostedt
2013-02-13 18:05       ` Steven Rostedt

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.