You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by li...@apache.org on 2026/01/08 14:47:24 UTC
(nuttx) 01/02: [EXPERIMENTAL] sched/hrtimer: separate SMP logic from hrtimer
This is an automated email from the ASF dual-hosted git repository.
ligd pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 6bffad62de8948d000a908fbc5be8107f7d1754b
Author: wangchengdong <wa...@lixiang.com>
AuthorDate: Wed Jan 7 10:36:48 2026 +0800
[EXPERIMENTAL] sched/hrtimer: separate SMP logic from hrtimer
Separate SMP-specific logic from the hrtimer core to improve
performance and maintainability.
Signed-off-by: Chengdong Wang <wa...@lixiang.com>
---
sched/hrtimer/hrtimer.h | 2 ++
sched/hrtimer/hrtimer_cancel.c | 19 ++++++++-----------
sched/hrtimer/hrtimer_initialize.c | 2 ++
sched/hrtimer/hrtimer_process.c | 7 ++++++-
4 files changed, 18 insertions(+), 12 deletions(-)
diff --git a/sched/hrtimer/hrtimer.h b/sched/hrtimer/hrtimer.h
index 09192ce65fd..99858415d29 100644
--- a/sched/hrtimer/hrtimer.h
+++ b/sched/hrtimer/hrtimer.h
@@ -62,7 +62,9 @@ extern struct hrtimer_tree_s g_hrtimer_tree;
* for each CPU in SMP configurations. Index corresponds to CPU ID.
*/
+#ifdef CONFIG_SMP
extern FAR hrtimer_t *g_hrtimer_running[CONFIG_SMP_NCPUS];
+#endif
/****************************************************************************
* Public Function Prototypes
diff --git a/sched/hrtimer/hrtimer_cancel.c b/sched/hrtimer/hrtimer_cancel.c
index c27c2a3a412..a2b4bc6e3f7 100644
--- a/sched/hrtimer/hrtimer_cancel.c
+++ b/sched/hrtimer/hrtimer_cancel.c
@@ -57,7 +57,7 @@
* true - The timer is active on at least one CPU.
* false - The timer is not active.
****************************************************************************/
-
+#ifdef CONFIG_SMP
static inline_function bool hrtimer_is_active(FAR hrtimer_t *hrtimer)
{
bool is_active = false;
@@ -73,6 +73,7 @@ static inline_function bool hrtimer_is_active(FAR hrtimer_t *hrtimer)
return is_active;
}
+#endif
/****************************************************************************
* Public Functions
@@ -177,16 +178,10 @@ int hrtimer_cancel(FAR hrtimer_t *hrtimer)
int hrtimer_cancel_sync(FAR hrtimer_t *hrtimer)
{
- int ret;
- bool cansleep;
+ int ret = OK;
DEBUGASSERT(hrtimer != NULL);
- /* Determine whether sleeping is permitted in the current context */
-
- cansleep = !up_interrupt_context() &&
- !is_idle_task(this_task());
-
/* Request cancellation of the timer */
ret = hrtimer_cancel(hrtimer);
@@ -201,14 +196,16 @@ int hrtimer_cancel_sync(FAR hrtimer_t *hrtimer)
* busy-waiting. Otherwise, spin until the callback completes
* and the state becomes inactive.
*/
-
+#ifdef CONFIG_SMP
while (hrtimer_is_active(hrtimer))
{
- if (cansleep)
+ if (!up_interrupt_context() &&
+ !is_idle_task(this_task()))
{
nxsched_msleep(HRTIMER_CANCEL_SYNC_DELAY_MS);
}
}
+#endif
- return OK;
+ return ret;
}
diff --git a/sched/hrtimer/hrtimer_initialize.c b/sched/hrtimer/hrtimer_initialize.c
index 0bde89d9c2f..51902011241 100644
--- a/sched/hrtimer/hrtimer_initialize.c
+++ b/sched/hrtimer/hrtimer_initialize.c
@@ -36,7 +36,9 @@
* for each CPU in SMP configurations. Index corresponds to CPU ID.
*/
+#ifdef CONFIG_SMP
FAR hrtimer_t *g_hrtimer_running[CONFIG_SMP_NCPUS];
+#endif
/* Global spinlock protecting the high-resolution timer subsystem.
*
diff --git a/sched/hrtimer/hrtimer_process.c b/sched/hrtimer/hrtimer_process.c
index d9a915d2a6f..f94f699aa9e 100644
--- a/sched/hrtimer/hrtimer_process.c
+++ b/sched/hrtimer/hrtimer_process.c
@@ -74,7 +74,9 @@ void hrtimer_process(uint64_t now)
hrtimer_entry_t func;
uint64_t expired;
uint64_t period;
+#ifdef CONFIG_SMP
int cpu = this_cpu();
+#endif
/* Lock the hrtimer RB-tree to protect access */
@@ -105,8 +107,9 @@ void hrtimer_process(uint64_t now)
hrtimer_remove(hrtimer);
+#ifdef CONFIG_SMP
g_hrtimer_running[cpu] = hrtimer;
-
+#endif
/* Leave critical section before invoking the callback */
spin_unlock_irqrestore(&g_hrtimer_spinlock, flags);
@@ -119,7 +122,9 @@ void hrtimer_process(uint64_t now)
flags = spin_lock_irqsave(&g_hrtimer_spinlock);
+#ifdef CONFIG_SMP
g_hrtimer_running[cpu] = NULL;
+#endif
/* If the timer is periodic and has not been rearmed or
* cancelled concurrently,