This is an automated email from the ASF dual-hosted git repository. acassis pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit ecd64e04c0e15218e1c518781d55f9674a4b380b Author: guanyi3 <[email protected]> AuthorDate: Mon Nov 17 11:57:26 2025 +0800 drivers/devfreq: replace mutex to spinlock we may call devfreq_find_by_name() in pm_callback, and shouldn't call nxmutex_lock() in idle_loop, so replace mutex to spinlock. Signed-off-by: guanyi3 <[email protected]> --- drivers/devfreq/devfreq.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c index ee9a28de5d9..906fac4c5c6 100644 --- a/drivers/devfreq/devfreq.c +++ b/drivers/devfreq/devfreq.c @@ -27,6 +27,7 @@ #include <nuttx/devfreq.h> #include <nuttx/kmalloc.h> #include <nuttx/sched.h> +#include <nuttx/spinlock.h> /**************************************************************************** * Pre-processor Definitions @@ -37,7 +38,7 @@ ****************************************************************************/ static struct list_node g_devfreq_list = LIST_INITIAL_VALUE(g_devfreq_list); -static mutex_t g_devfreq_list_lock = NXMUTEX_INITIALIZER; +static spinlock_t g_devfreq_list_lock = SP_UNLOCKED; /**************************************************************************** * Private Function Prototypes @@ -464,6 +465,7 @@ FAR struct devfreq_s *devfreq_register( FAR void *priv) { FAR struct devfreq_s *devfreq = devfreq_find_by_name(name); + irqstate_t flags; if (devfreq || !driver) { @@ -512,9 +514,9 @@ FAR struct devfreq_s *devfreq_register( devfreq_start_governor(devfreq); - nxmutex_lock(&g_devfreq_list_lock); + flags = spin_lock_irqsave(&g_devfreq_list_lock); list_add_tail(&g_devfreq_list, &devfreq->node); - nxmutex_unlock(&g_devfreq_list_lock); + spin_unlock_irqrestore(&g_devfreq_list_lock, flags); return devfreq; @@ -541,14 +543,16 @@ out: int devfreq_unregister(FAR struct devfreq_s *devfreq) { + irqstate_t flags; + if (!devfreq) { return -EINVAL; } - nxmutex_lock(&g_devfreq_list_lock); + flags = spin_lock_irqsave(&g_devfreq_list_lock); list_delete(&devfreq->node); - nxmutex_unlock(&g_devfreq_list_lock); + spin_unlock_irqrestore(&g_devfreq_list_lock, flags); devfreq_stop_governor(devfreq); devfreq_exit_governor(devfreq); @@ -836,24 +840,25 @@ int devfreq_qos_remove_request(FAR struct devfreq_s *devfreq, FAR struct devfreq_s *devfreq_find_by_name(FAR const char *name) { FAR struct devfreq_s *devfreq; + irqstate_t flags; if (!name) { return NULL; } - nxmutex_lock(&g_devfreq_list_lock); + flags = spin_lock_irqsave(&g_devfreq_list_lock); list_for_every_entry(&g_devfreq_list, devfreq, struct devfreq_s, node) { if (!strcmp(devfreq->name, name)) { - nxmutex_unlock(&g_devfreq_list_lock); + spin_unlock_irqrestore(&g_devfreq_list_lock, flags); return devfreq; } } - nxmutex_unlock(&g_devfreq_list_lock); + spin_unlock_irqrestore(&g_devfreq_list_lock, flags); return NULL; } @@ -874,19 +879,20 @@ FAR struct devfreq_s *devfreq_find_by_name(FAR const char *name) FAR struct devfreq_s *devfreq_find_by_index(size_t index) { FAR struct devfreq_s *devfreq; + irqstate_t flags; size_t i = 0; - nxmutex_lock(&g_devfreq_list_lock); + flags = spin_lock_irqsave(&g_devfreq_list_lock); list_for_every_entry(&g_devfreq_list, devfreq, struct devfreq_s, node) { if (index == i++) { - nxmutex_unlock(&g_devfreq_list_lock); + spin_unlock_irqrestore(&g_devfreq_list_lock, flags); return devfreq; } } - nxmutex_unlock(&g_devfreq_list_lock); + spin_unlock_irqrestore(&g_devfreq_list_lock, flags); return NULL; }
