You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2023/01/16 17:25:36 UTC
[nuttx] 03/03: power: avoid sem_wait called in IRQ handler
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 23d1d4c42ae1012efe149534bf679aa5dc6daeca
Author: ligd <li...@xiaomi.com>
AuthorDate: Fri Dec 30 12:34:52 2022 +0800
power: avoid sem_wait called in IRQ handler
error backrace:
_assert --- assert again
sem_wait
pm_unregister
wdog_notifier
panic_notifier_call_chain
_assert
dataabort
Signed-off-by: ligd <li...@xiaomi.com>
---
drivers/power/pm/pm.h | 4 ++--
drivers/power/pm/pm_initialize.c | 2 +-
drivers/power/pm/pm_register.c | 6 ++++--
drivers/power/pm/pm_unregister.c | 6 ++++--
4 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/drivers/power/pm/pm.h b/drivers/power/pm/pm.h
index 36998f2f71..6cff511cab 100644
--- a/drivers/power/pm/pm.h
+++ b/drivers/power/pm/pm.h
@@ -87,11 +87,11 @@ struct pm_domain_s
struct pm_global_s
{
- /* This mutex manages mutually exclusive access to the power management
+ /* This rmutex manages mutually exclusive access to the power management
* registry. It must be initialized to the value 1.
*/
- mutex_t reglock;
+ rmutex_t reglock;
/* registry is a doubly-linked list of registered power management
* callback structures. To ensure mutually exclusive access, this list
diff --git a/drivers/power/pm/pm_initialize.c b/drivers/power/pm/pm_initialize.c
index c8c5f87f2c..2149de1ba4 100644
--- a/drivers/power/pm/pm_initialize.c
+++ b/drivers/power/pm/pm_initialize.c
@@ -46,7 +46,7 @@
struct pm_global_s g_pmglobals =
{
- NXMUTEX_INITIALIZER
+ NXRMUTEX_INITIALIZER
};
/****************************************************************************
diff --git a/drivers/power/pm/pm_register.c b/drivers/power/pm/pm_register.c
index 6e7d80157a..6a0b8e9dcb 100644
--- a/drivers/power/pm/pm_register.c
+++ b/drivers/power/pm/pm_register.c
@@ -56,13 +56,15 @@
int pm_register(FAR struct pm_callback_s *callbacks)
{
+ irqstate_t flags;
+
DEBUGASSERT(callbacks);
/* Add the new entry to the end of the list of registered callbacks */
- nxmutex_lock(&g_pmglobals.reglock);
+ flags = pm_lock(&g_pmglobals.reglock);
dq_addlast(&callbacks->entry, &g_pmglobals.registry);
- nxmutex_unlock(&g_pmglobals.reglock);
+ pm_unlock(&g_pmglobals.reglock, flags);
return 0;
}
diff --git a/drivers/power/pm/pm_unregister.c b/drivers/power/pm/pm_unregister.c
index efd9a8117b..f591f1391b 100644
--- a/drivers/power/pm/pm_unregister.c
+++ b/drivers/power/pm/pm_unregister.c
@@ -55,13 +55,15 @@
int pm_unregister(FAR struct pm_callback_s *callbacks)
{
+ irqstate_t flags;
+
DEBUGASSERT(callbacks);
/* Remove entry from the list of registered callbacks. */
- nxmutex_lock(&g_pmglobals.reglock);
+ flags = pm_lock(&g_pmglobals.reglock);
dq_rem(&callbacks->entry, &g_pmglobals.registry);
- nxmutex_unlock(&g_pmglobals.reglock);
+ pm_unlock(&g_pmglobals.reglock, flags);
return 0;
}