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;
 }