From: Thomas Gleixner <tglx@linutronix.de>
To: John Kacur <jkacur@redhat.com>
Cc: Steven Rostedt <rostedt@goodmis.org>,
LKML <linux-kernel@vger.kernel.org>,
RT <linux-rt-users@vger.kernel.org>,
John Kacur <jkacur@gmail.com>, Clark Williams <clark@redhat.com>
Subject: Re: [RFC][PATCH RT] acpi/rt: Convert acpi lock back to a raw_spinlock_t
Date: Wed, 13 Feb 2013 18:21:59 +0100 (CET) [thread overview]
Message-ID: <alpine.LFD.2.02.1302131755230.11905@ionos> (raw)
In-Reply-To: <alpine.LFD.2.03.1302131744590.13701@tycho>
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__ */
next prev parent reply other threads:[~2013-02-13 17:22 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
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 [this message]
2013-02-13 17:46 ` John Kacur
2013-02-13 17:51 ` Steven Rostedt
2013-02-13 18:05 ` Steven Rostedt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=alpine.LFD.2.02.1302131755230.11905@ionos \
--to=tglx@linutronix.de \
--cc=clark@redhat.com \
--cc=jkacur@gmail.com \
--cc=jkacur@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rt-users@vger.kernel.org \
--cc=rostedt@goodmis.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.