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:33 UTC

[nuttx] branch master updated (43d2c595b1 -> 23d1d4c42a)

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


    from 43d2c595b1 crypto:support crypto can handle streaming data
     new d2ef505684 pm: add lock for pm_auto_updatestate_cb()
     new 38c6f20d17 pm: add pm_domain_lock/unlock support
     new 23d1d4c42a power: avoid sem_wait called in IRQ handler

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 drivers/power/pm/activity_governor.c |  8 +++---
 drivers/power/pm/greedy_governor.c   |  8 +++---
 drivers/power/pm/pm.h                | 48 ++++++++++++++++++++++++++++++++----
 drivers/power/pm/pm_activity.c       | 16 ++++++------
 drivers/power/pm/pm_autoupdate.c     |  9 +++++--
 drivers/power/pm/pm_changestate.c    |  4 +--
 drivers/power/pm/pm_initialize.c     |  2 +-
 drivers/power/pm/pm_lock.c           | 40 +++++++++++-------------------
 drivers/power/pm/pm_procfs.c         |  8 +++---
 drivers/power/pm/pm_register.c       |  6 +++--
 drivers/power/pm/pm_unregister.c     |  6 +++--
 11 files changed, 95 insertions(+), 60 deletions(-)


[nuttx] 02/03: pm: add pm_domain_lock/unlock support

Posted by xi...@apache.org.
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 38c6f20d176c8c6651c1daaf426e904f0871adf3
Author: ligd <li...@xiaomi.com>
AuthorDate: Fri Dec 30 13:42:31 2022 +0800

    pm: add pm_domain_lock/unlock support
    
    Signed-off-by: ligd <li...@xiaomi.com>
---
 drivers/power/pm/activity_governor.c |  8 +++----
 drivers/power/pm/greedy_governor.c   |  8 +++----
 drivers/power/pm/pm.h                | 44 +++++++++++++++++++++++++++++++++---
 drivers/power/pm/pm_activity.c       | 16 ++++++-------
 drivers/power/pm/pm_autoupdate.c     |  8 +++----
 drivers/power/pm/pm_changestate.c    |  4 ++--
 drivers/power/pm/pm_lock.c           | 40 ++++++++++++--------------------
 drivers/power/pm/pm_procfs.c         |  8 +++----
 8 files changed, 81 insertions(+), 55 deletions(-)

diff --git a/drivers/power/pm/activity_governor.c b/drivers/power/pm/activity_governor.c
index 125aa95a45..64b8eb0fd1 100644
--- a/drivers/power/pm/activity_governor.c
+++ b/drivers/power/pm/activity_governor.c
@@ -235,7 +235,7 @@ static void governor_activity(int domain, int count)
     {
       /* Add the activity count to the accumulated counts. */
 
-      flags = pm_lock(domain);
+      flags = pm_domain_lock(domain);
       accum = (uint32_t)pdomstate->accum + count;
 
       /* Make sure that we do not overflow the underlying representation */
@@ -275,7 +275,7 @@ static void governor_activity(int domain, int count)
           governor_update(domain, tmp);
         }
 
-      pm_unlock(domain, flags);
+      pm_domain_unlock(domain, flags);
     }
 }
 
@@ -476,7 +476,7 @@ static enum pm_state_e governor_checkstate(int domain)
    * logic in governor_activity().
    */
 
-  flags = pm_lock(domain);
+  flags = pm_domain_lock(domain);
 
   /* Check the elapsed time.  In periods of low activity, time slicing is
    * controlled by IDLE loop polling; in periods of higher activity, time
@@ -515,7 +515,7 @@ static enum pm_state_e governor_checkstate(int domain)
         }
     }
 
-  pm_unlock(domain, flags);
+  pm_domain_unlock(domain, flags);
 
   return pdomstate->recommended;
 }
diff --git a/drivers/power/pm/greedy_governor.c b/drivers/power/pm/greedy_governor.c
index bd039ab0d7..d0eb25fc15 100644
--- a/drivers/power/pm/greedy_governor.c
+++ b/drivers/power/pm/greedy_governor.c
@@ -119,7 +119,7 @@ static enum pm_state_e greedy_governor_checkstate(int domain)
    * invoked, which modifies the stay count which we are about to read
    */
 
-  flags = pm_lock(domain);
+  flags = pm_domain_lock(domain);
 
   if (!WDOG_ISACTIVE(&pdomstate->wdog))
     {
@@ -131,7 +131,7 @@ static enum pm_state_e greedy_governor_checkstate(int domain)
         }
     }
 
-  pm_unlock(domain, flags);
+  pm_domain_unlock(domain, flags);
 
   /* Return the found state */
 
@@ -159,7 +159,7 @@ static void greedy_governor_activity(int domain, int count)
   pdomstate = &g_pm_greedy_governor.domain_states[domain];
   count = count ? count : 1;
 
-  flags = pm_lock(domain);
+  flags = pm_domain_lock(domain);
 
   if (TICK2SEC(wd_gettime(&pdomstate->wdog)) < count)
     {
@@ -167,7 +167,7 @@ static void greedy_governor_activity(int domain, int count)
                greedy_governor_timer_cb, (wdparm_t)domain);
     }
 
-  pm_unlock(domain, flags);
+  pm_domain_unlock(domain, flags);
 }
 
 /****************************************************************************
diff --git a/drivers/power/pm/pm.h b/drivers/power/pm/pm.h
index 6e91211ede..36998f2f71 100644
--- a/drivers/power/pm/pm.h
+++ b/drivers/power/pm/pm.h
@@ -133,11 +133,14 @@ EXTERN struct pm_global_s g_pmglobals;
  *   Lock the power management operation.
  *
  * Input Parameters:
- *   domain - The PM domain to lock
+ *   lock - The lock subjuct
+ *
+ * Returned Value:
+ *   Return current state
  *
  ****************************************************************************/
 
-irqstate_t pm_lock(int domain);
+irqstate_t pm_lock(FAR rmutex_t *lock);
 
 /****************************************************************************
  * Name: pm_unlock
@@ -146,11 +149,46 @@ irqstate_t pm_lock(int domain);
  *   Unlock the power management operation.
  *
  * Input Parameters:
+ *   lock - The lock subjuct
+ *
+ * Returned Value:
+ *   None
+ *
+ ****************************************************************************/
+
+void pm_unlock(FAR rmutex_t *lock, irqstate_t flags);
+
+/****************************************************************************
+ * Name: pm_domain_lock
+ *
+ * Description:
+ *   Lock the power management operation.
+ *
+ * Input Parameters:
+ *   domain - The PM domain to lock
+ *
+ * Returned Value:
+ *   Return current state
+ *
+ ****************************************************************************/
+
+irqstate_t pm_domain_lock(int domain);
+
+/****************************************************************************
+ * Name: pm_domain_unlock
+ *
+ * Description:
+ *   Unlock the power management operation.
+ *
+ * Input Parameters:
  *   domain - The PM domain to unlock
  *
+ * Returned Value:
+ *   None
+ *
  ****************************************************************************/
 
-void pm_unlock(int domain, irqstate_t flags);
+void pm_domain_unlock(int domain, irqstate_t flags);
 
 /****************************************************************************
  * Name: pm_wakelock_global_init
diff --git a/drivers/power/pm/pm_activity.c b/drivers/power/pm/pm_activity.c
index b3cb8b7424..ff6dab8adb 100644
--- a/drivers/power/pm/pm_activity.c
+++ b/drivers/power/pm/pm_activity.c
@@ -305,7 +305,7 @@ void pm_wakelock_uninit(FAR struct pm_wakelock_s *wakelock)
   dq     = &pdom->wakelock[wakelock->state];
   wdog   = &wakelock->wdog;
 
-  flags = pm_lock(domain);
+  flags = pm_domain_lock(domain);
 
   if (wakelock->count > 0)
     {
@@ -316,7 +316,7 @@ void pm_wakelock_uninit(FAR struct pm_wakelock_s *wakelock)
   wd_cancel(wdog);
   pm_wakelock_stats_rm(wakelock);
 
-  pm_unlock(domain, flags);
+  pm_domain_unlock(domain, flags);
 }
 
 /****************************************************************************
@@ -353,7 +353,7 @@ void pm_wakelock_stay(FAR struct pm_wakelock_s *wakelock)
   pdom   = &g_pmglobals.domain[domain];
   dq     = &pdom->wakelock[wakelock->state];
 
-  flags = pm_lock(domain);
+  flags = pm_domain_lock(domain);
 
   DEBUGASSERT(wakelock->count < UINT32_MAX);
   if (wakelock->count++ == 0)
@@ -362,7 +362,7 @@ void pm_wakelock_stay(FAR struct pm_wakelock_s *wakelock)
       pm_wakelock_stats(wakelock, true);
     }
 
-  pm_unlock(domain, flags);
+  pm_domain_unlock(domain, flags);
 
   pm_auto_updatestate(domain);
 }
@@ -400,7 +400,7 @@ void pm_wakelock_relax(FAR struct pm_wakelock_s *wakelock)
   pdom   = &g_pmglobals.domain[domain];
   dq     = &pdom->wakelock[wakelock->state];
 
-  flags = pm_lock(domain);
+  flags = pm_domain_lock(domain);
 
   DEBUGASSERT(wakelock->count > 0);
   if (--wakelock->count == 0)
@@ -409,7 +409,7 @@ void pm_wakelock_relax(FAR struct pm_wakelock_s *wakelock)
       pm_wakelock_stats(wakelock, false);
     }
 
-  pm_unlock(domain, flags);
+  pm_domain_unlock(domain, flags);
 
   pm_auto_updatestate(domain);
 }
@@ -452,7 +452,7 @@ void pm_wakelock_staytimeout(FAR struct pm_wakelock_s *wakelock, int ms)
   dq     = &pdom->wakelock[wakelock->state];
   wdog   = &wakelock->wdog;
 
-  flags = pm_lock(domain);
+  flags = pm_domain_lock(domain);
 
   if (!WDOG_ISACTIVE(wdog))
     {
@@ -469,7 +469,7 @@ void pm_wakelock_staytimeout(FAR struct pm_wakelock_s *wakelock, int ms)
       wd_start(wdog, MSEC2TICK(ms), pm_waklock_cb, (wdparm_t)wakelock);
     }
 
-  pm_unlock(domain, flags);
+  pm_domain_unlock(domain, flags);
 
   pm_auto_updatestate(domain);
 }
diff --git a/drivers/power/pm/pm_autoupdate.c b/drivers/power/pm/pm_autoupdate.c
index f017932dd3..5b8e9e0277 100644
--- a/drivers/power/pm/pm_autoupdate.c
+++ b/drivers/power/pm/pm_autoupdate.c
@@ -44,12 +44,12 @@ static void pm_auto_updatestate_cb(FAR void *arg)
   enum pm_state_e newstate;
   irqstate_t flags;
 
-  flags = pm_lock(domain);
+  flags = pm_domain_lock(domain);
 
   newstate = pm_checkstate(domain);
   pm_changestate(domain, newstate);
 
-  pm_unlock(domain, flags);
+  pm_domain_unlock(domain, flags);
 }
 
 /****************************************************************************
@@ -114,9 +114,9 @@ void pm_auto_update(int domain, bool auto_update)
   DEBUGASSERT(domain >= 0 && domain < CONFIG_PM_NDOMAINS);
   pdom = &g_pmglobals.domain[domain];
 
-  flags = pm_lock(domain);
+  flags = pm_domain_lock(domain);
   pdom->auto_update = auto_update;
-  pm_unlock(domain, flags);
+  pm_domain_unlock(domain, flags);
 }
 
 #endif /* CONFIG_PM */
diff --git a/drivers/power/pm/pm_changestate.c b/drivers/power/pm/pm_changestate.c
index 4c06b265a7..a6ed4702e6 100644
--- a/drivers/power/pm/pm_changestate.c
+++ b/drivers/power/pm/pm_changestate.c
@@ -242,7 +242,7 @@ int pm_changestate(int domain, enum pm_state_e newstate)
    * re-enabled.
    */
 
-  flags = pm_lock(domain);
+  flags = pm_domain_lock(domain);
 
   if (newstate != PM_RESTORE)
     {
@@ -286,7 +286,7 @@ int pm_changestate(int domain, enum pm_state_e newstate)
 
   /* Restore the interrupt state */
 
-  pm_unlock(domain, flags);
+  pm_domain_unlock(domain, flags);
   return ret;
 }
 
diff --git a/drivers/power/pm/pm_lock.c b/drivers/power/pm/pm_lock.c
index a59c2db9a7..54dff8410d 100644
--- a/drivers/power/pm/pm_lock.c
+++ b/drivers/power/pm/pm_lock.c
@@ -37,46 +37,34 @@
  * Public Functions
  ****************************************************************************/
 
-/****************************************************************************
- * Name: pm_lock
- *
- * Description:
- *   Lock the power management operation.
- *
- * Input Parameters:
- *   domain - The PM domain to lock
- *
- ****************************************************************************/
-
-irqstate_t pm_lock(int domain)
+irqstate_t pm_lock(FAR rmutex_t *lock)
 {
   if (!up_interrupt_context() && !sched_idletask())
     {
-      nxrmutex_lock(&g_pmglobals.domain[domain].lock);
+      nxrmutex_lock(lock);
     }
 
   return enter_critical_section();
 }
 
-/****************************************************************************
- * Name: pm_unlock
- *
- * Description:
- *   Unlock the power management operation.
- *
- * Input Parameters:
- *   domain - The PM domain to unlock
- *
- ****************************************************************************/
-
-void pm_unlock(int domain, irqstate_t flags)
+void pm_unlock(FAR rmutex_t *lock, irqstate_t flags)
 {
   leave_critical_section(flags);
 
   if (!up_interrupt_context() && !sched_idletask())
     {
-      nxrmutex_unlock(&g_pmglobals.domain[domain].lock);
+      nxrmutex_unlock(lock);
     }
 }
 
+irqstate_t pm_domain_lock(int domain)
+{
+  return pm_lock(&g_pmglobals.domain[domain].lock);
+}
+
+void pm_domain_unlock(int domain, irqstate_t flags)
+{
+  pm_unlock(&g_pmglobals.domain[domain].lock, flags);
+}
+
 #endif /* CONFIG_PM */
diff --git a/drivers/power/pm/pm_procfs.c b/drivers/power/pm/pm_procfs.c
index bd6ad8bb7a..d4b8585a19 100644
--- a/drivers/power/pm/pm_procfs.c
+++ b/drivers/power/pm/pm_procfs.c
@@ -268,7 +268,7 @@ static ssize_t pm_read_state(FAR struct file *filep, FAR char *buffer,
 
   totalsize += copysize;
 
-  flags = pm_lock(pmfile->domain);
+  flags = pm_domain_lock(pmfile->domain);
 
   for (state = 0; state < PM_COUNT; state++)
     {
@@ -300,7 +300,7 @@ static ssize_t pm_read_state(FAR struct file *filep, FAR char *buffer,
       totalsize += copysize;
     }
 
-  pm_unlock(pmfile->domain, flags);
+  pm_domain_unlock(pmfile->domain, flags);
 
   filep->f_pos += totalsize;
   return totalsize;
@@ -340,7 +340,7 @@ static ssize_t pm_read_wakelock(FAR struct file *filep, FAR char *buffer,
 
   totalsize += copysize;
 
-  flags = pm_lock(pmfile->domain);
+  flags = pm_domain_lock(pmfile->domain);
 
   entry = dq_peek(&dom->wakelockall);
   for (; entry && totalsize < buflen; entry = dq_next(entry))
@@ -374,7 +374,7 @@ static ssize_t pm_read_wakelock(FAR struct file *filep, FAR char *buffer,
       totalsize += copysize;
     }
 
-  pm_unlock(pmfile->domain, flags);
+  pm_domain_unlock(pmfile->domain, flags);
 
   filep->f_pos += totalsize;
   return totalsize;


[nuttx] 01/03: pm: add lock for pm_auto_updatestate_cb()

Posted by xi...@apache.org.
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 d2ef5056840e5bf008172a2ff691d2ec85ce16b0
Author: ligd <li...@xiaomi.com>
AuthorDate: Mon Jan 16 21:29:36 2023 +0800

    pm: add lock for pm_auto_updatestate_cb()
    
    Signed-off-by: ligd <li...@xiaomi.com>
---
 drivers/power/pm/pm_autoupdate.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/drivers/power/pm/pm_autoupdate.c b/drivers/power/pm/pm_autoupdate.c
index 58b310c85c..f017932dd3 100644
--- a/drivers/power/pm/pm_autoupdate.c
+++ b/drivers/power/pm/pm_autoupdate.c
@@ -42,9 +42,14 @@ static void pm_auto_updatestate_cb(FAR void *arg)
 {
   int domain = (uintptr_t)arg;
   enum pm_state_e newstate;
+  irqstate_t flags;
+
+  flags = pm_lock(domain);
 
   newstate = pm_checkstate(domain);
   pm_changestate(domain, newstate);
+
+  pm_unlock(domain, flags);
 }
 
 /****************************************************************************


[nuttx] 03/03: power: avoid sem_wait called in IRQ handler

Posted by xi...@apache.org.
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;
 }