Skip to content

sched/tickless: Fix CLOCK_MONOTONIC always 0 by updating sched ticks#18486

Merged
linguini1 merged 1 commit intoapache:masterfrom
anchao:26030302
Mar 3, 2026
Merged

sched/tickless: Fix CLOCK_MONOTONIC always 0 by updating sched ticks#18486
linguini1 merged 1 commit intoapache:masterfrom
anchao:26030302

Conversation

@anchao
Copy link
Contributor

@anchao anchao commented Mar 3, 2026

Summary

sched/tickless: Fix CLOCK_MONOTONIC always 0 by updating sched ticks

Fix the issue where clock_gettime(CLOCK_MONOTONIC) always returns 0 in
tickless mode, caused by the scheduler tick counter (g_system_ticks) not
being updated with the actual timer ticks.

  1. Add clock_update_sched_ticks() function to sched/clock/clock_sched_ticks.c:
    a. This function directly sets the system tick counter to a specific value
    (vs incrementing in clock_increase_sched_ticks), with full documentation
    matching the existing code style.
    b. Uses seqlock to ensure thread-safe access to g_system_ticks.

  2. Call clock_update_sched_ticks() in nxsched_process_timer() (sched_processtickless.c):

a. Syncs the scheduler tick counter with the actual timer ticks retrieved via up_timer_gettick().

With this fix, g_system_ticks is properly updated in tickless mode,
and clock_gettime(CLOCK_MONOTONIC) returns the correct non-zero monotonic time.

Signed-off-by: chao an anchao.archer@bytedance.com

Impact

sched/tickless

Testing

sim/nsh:

enable config:
+CONFIG_SCHED_TICKLESS=y
+CONFIG_SYSLOG_TIMESTAMP=y

print syslog in exmaple hello:

$ git diff .
diff --git a/examples/hello/hello_main.c b/examples/hello/hello_main.c
index fd194a623..c92ec0788 100644
--- a/examples/hello/hello_main.c
+++ b/examples/hello/hello_main.c
@@ -38,5 +38,6 @@
 int main(int argc, FAR char *argv[])
 {
   printf("Hello, World!!\n");
+  syslog(0, "Hello, World!!\n");
   return 0;
 }

Before this patch:

nsh> hello
Hello, World!!
[    0.000000] Hello, World!!
nsh> hello
Hello, World!!
[    0.000000] Hello, World!!
nsh> 

after this patch:

nsh> hello
Hello, World!!
[    1.130000] Hello, World!!
nsh> hello
Hello, World!!
[    2.420000] Hello, World!!
nsh> 

@anchao anchao requested review from wangchdo and removed request for jerpelea and xiaoxiang781216 March 3, 2026 09:53
@anchao
Copy link
Contributor Author

anchao commented Mar 3, 2026

cc @wangchdo

@github-actions github-actions bot added Area: OS Components OS Components issues Size: M The size of the change in this PR is medium labels Mar 3, 2026
Fix the issue where clock_gettime(CLOCK_MONOTONIC) always returns 0 in
tickless mode, caused by the scheduler tick counter (g_system_ticks) not
being updated with the actual timer ticks.

1. Add clock_update_sched_ticks() function to sched/clock/clock_sched_ticks.c:
  a. This function directly sets the system tick counter to a specific value
     (vs incrementing in clock_increase_sched_ticks), with full documentation
     matching the existing code style.
  b. Uses seqlock to ensure thread-safe access to g_system_ticks.

2. Call clock_update_sched_ticks() in nxsched_process_timer() (sched_processtickless.c):

  a. Syncs the scheduler tick counter with the actual timer ticks retrieved via up_timer_gettick().

With this fix, g_system_ticks is properly updated in tickless mode,
and clock_gettime(CLOCK_MONOTONIC) returns the correct non-zero monotonic time.

Signed-off-by: chao an <anchao.archer@bytedance.com>
@linguini1 linguini1 merged commit d8b4d53 into apache:master Mar 3, 2026
40 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Area: OS Components OS Components issues Size: M The size of the change in this PR is medium

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants