Fix-Point opened a new issue, #17567: URL: https://github.com/apache/nuttx/issues/17567
### Description / Steps to reproduce the issue I fully-agree @anchao said in https://github.com/apache/nuttx/pull/17517#issuecomment-3670473362 >There are various implementation approaches for hrtimer, but the benefit it delivers to business users is a high-precision timer. We need to examine this issue from the perspective of applications and business stakeholders—otherwise, any implementation would merely be an exercise in self-indulgence for developers. HRtimer is intended to provide users with high-precision timer APIs. However, this HRtimer implemantation is completely unusable for users. In the words of @anchao, it is purely a **self-indulgent exercise** for developers. The HRTimer I used is from https://github.com/apache/nuttx/pull/17517. My configuration is `rv-virt:smp`, with `CONFIG_HRTIMER` and `CONFIG_SCHED_TICKLESS` enabled. The test case used is as follows. This test case simulates a very typical driver application scenario: a shared device driver uses a common timeout timer, which may be accessed by multiple threads and therefore should be protected by a spinlock or a big kernel lock. I attempted three approaches, and either the timer would crash inside the critical section, or it would sleep inside the critical section. The first approach: **hrtimer_cancel → hrtimer_start**. This failed because if the callback function is executing, the timer cannot be started, and the system crashes. The second approach: **hrtimer_cancel → loop hrtimer_start**. This was expected to succeed, but the system still crashed. Even if it succeeded, there would be a spinning issue within the critical section. The third approach: **hrtimer_cancel_sync → hrtimer_start**. This succeeded, but it calls sleep within the critical section, which is unacceptable. This problem stems from a fundamental flaw in the hrtimer state machine design. Minor modifications cannot fix it. Therefore, I strongly suggest this implementation should be removed and replaced with a better and completely different implementation (https://github.com/apache/nuttx/pull/17556). The test code and error report is showed as below. ```c /**************************************************************************** * apps/examples/hello/hello_main.c * * SPDX-License-Identifier: Apache-2.0 * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. The * ASF licenses this file to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. * ****************************************************************************/ /**************************************************************************** * Included Files ****************************************************************************/ #include <nuttx/config.h> #include <stdio.h> #include <nuttx/hrtimer.h> #define HRTIMER_TEST_THREAD_NR (CONFIG_SMP_NCPUS * 8) /**************************************************************************** * Public Functions ****************************************************************************/ static uint32_t test_callback(FAR struct hrtimer_s *hrtimer) { printf("."); return 0; } static void* test_thread(void *arg) { irqstate_t flags; hrtimer_t timer; spinlock_t lock = SP_UNLOCKED; hrtimer_init(&timer, test_callback, NULL); while (1) { uint64_t delay = rand() % NSEC_PER_MSEC; int ret; /* Simulate the usage of driver->wait_dog. */ flags = spin_lock_irqsave(&lock); /* The driver lock acquired */ /* First try, failed. Because hrtimer_start can not ensure the timer being started. */ ret = hrtimer_cancel(&timer); // ret = hrtimer_start(&timer, 10 * NSEC_PER_USEC, HRTIMER_MODE_REL); /* May fail */ /* This try-loop start should be OK. But it failed again. * Besides, we can not sleep or spin in the critical sections. */ while (hrtimer_start(&timer, 10 % NSEC_PER_USEC, HRTIMER_MODE_REL) != OK); ret = OK; /* Second try, Success, but we can not sleep or spin in the critical section. */ // ret = hrtimer_cancel_sync(&timer); /* Sleep in critical sections */ // ret = hrtimer_start(&timer, delay, HRTIMER_MODE_REL); spin_unlock_irqrestore(&lock, flags); if (ret != OK) { printf("hrtimer_start failed\n"); } up_ndelay(delay); } return NULL; } /**************************************************************************** * hello_main ****************************************************************************/ int main(int argc, FAR char *argv[]) { unsigned int thread_id; pthread_attr_t attr; pthread_t pthreads[HRTIMER_TEST_THREAD_NR]; printf("hrtimer_test start...\n"); ASSERT(pthread_attr_init(&attr) == 0); /* Create wdog test thread */ for (thread_id = 0; thread_id < HRTIMER_TEST_THREAD_NR; thread_id++) { ASSERT(pthread_create(&pthreads[thread_id], &attr, test_thread, NULL) == 0); } for (thread_id = 0; thread_id < HRTIMER_TEST_THREAD_NR; thread_id++) { pthread_join(pthreads[thread_id], NULL); } ASSERT(pthread_attr_destroy(&attr) == 0); printf("hrtimer_test end...\n"); return 0; } ``` ```bash ➜ qemu-system-riscv32 -semihosting -M virt,aclint=on -cpu rv32 -smp 8 -bios none -nographic -kernel nuttx -s NuttShell (NSH) NuttX-12.10.0 nsh> hello hrtimer_test start... ................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... ..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... ........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................[CPU0] EXCEPTION: Load access fault. MCAUSE: 00000005, EPC: 80005960, MTVAL: 00000000 [CPU0] PANIC!!! Exception = 00000005 [CPU0] Current Version: NuttX 12.10.0 3663e78f82e-dirty Dec 19 2025 10:56:02 risc-v [CPU0] Assertion failed panic: at file: :0 task(CPU0): hello process: hello 0x80016b7c [CPU0] EPC: 80005960 [CPU0] A0: 8002be34 A1: 80032c78 A2: 00000000 A3: 80032c78 [CPU0] A4: 00000001 A5: 00000000 A6: ee6b2800 A7: 00000002 [CPU0] T0: 80029530 T1: 80028d30 T2: 00000000 T3: 00000000 [CPU0] T4: 00000000 T5: 00000000 T6: 00000000 [CPU0] S0: 80032c78 S1: 80032c78 S2: 80033e38 S3: 8002be34 [CPU0] S4: 00000000 S5: 00000001 S6: 00000002 S7: 00000008 [CPU0] S8: 00000003 S9: acd2225e S10: 00000000 S11: 00000000 [CPU0] SP: 80029488 FP: 80032c78 TP: 00000000 RA: 80005a62 [CPU0] IRQ Stack: [CPU0] base: 0x80028d30 [CPU0] size: 00002048 [CPU0] sp: 0x80029488 [CPU0] 0x80029468: 8002c000 0000002e 8003114c 2e007d90 8002c000 0000002e 80031148 8001b4ce [CPU0] 0x80029488: 00000000 80007880 acd2696c 8002c000 8002c000 80007880 80033e38 800048cc [CPU0] 0x800294a8: 800253fc 00000100 00000000 00000017 8002bd54 00000000 00000000 00000000 [CPU0] 0x800294c8: 80025448 3597c6e4 00000000 00000017 8002bd54 00000000 80029bd0 80009e30 [CPU0] 0x800294e8: 8002bd54 00000000 80029bd0 80000f64 00000000 00000000 80029bd0 80036084 [CPU0] 0x80029508: 8000000b 0000000a 00000002 80036210 80000007 80009de4 80029530 80000196 [CPU0] 0x80029528: 80036084 80006574 00000000 00000000 00000000 00000000 00000000 00000000 [CPU0] ERROR: Stack pointer 80029488 is not within the stack [CPU0] User Stack: [CPU0] base: 0x80035ac0 [CPU0] size: 00002032 [CPU0] 0x80036084: 80009de4 80006574 80036210 deadbeef 00000000 00000000 000b3650 00000000 [CPU0] 0x800360a4: 00000000 fffe712c 01ba5bb3 00000000 00000017 00000000 0200bffc 0200bff8 [CPU0] 0x800360c4: ee6b2800 00000002 8002be3c 00000002 00000002 3597c6e4 80025448 00000000 [CPU0] 0x800360e4: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 [CPU0] 0x80036104: 80007880 00000000 00000000 00000000 00000000 00000000 00000000 00000000 [CPU0] 0x80036124: 00000000 00000000 00000000 00000000 80007880 00000000 00000000 00000000 [CPU0] 0x80036144: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 [CPU0] 0x80036164: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 [CPU0] 0x80036184: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 [CPU0] 0x800361a4: 00003880 00000000 00000000 00000000 00000000 00000000 00000000 00000000 [CPU0] 0x800361c4: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 [CPU0] 0x800361e4: 00000000 00000000 00000000 00000000 00000000 00000000 8002c000 80006080 [CPU0] 0x80036204: acc0949e 80036248 80004a30 00000000 00000000 00000002 358b009e 00000000 [CPU0] 0x80036224: 00000000 00000008 80006088 00000001 000f4240 000b3650 80016bee 00000000 [CPU0] 0x80036244: 00000000 00000000 00000000 80032398 00000000 00000000 80016bf6 00000000 [CPU0] 0x80036264: 00000000 acc0949e 00000000 00000000 00000000 00000000 00000000 00000000 [CPU0] 0x80036284: 00000000 800359d8 8001ab54 00000000 00000000 00000000 8001bec8 00000000 [CPU0] 0x800362a4: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 [CPU0] Dump CPU1: RUNNING [CPU0] Dump CPU2: RUNNING [CPU0] Dump CPU3: RUNNING [CPU0] Dump CPU4: RUNNING [CPU0] Dump CPU5: RUNNING [CPU0] Dump CPU6: RUNNING [CPU0] Dump CPU7: RUNNING [CPU0] PID GROUP CPU PRI POLICY TYPE NPX STATE EVENT SIGMASK STACKBASE STACKSIZE USED FILLED COMMAND [CPU0] ---- --- 0 --- -------- ------- --- ------- ---------- ---------------- 0x80028d30 2048 120 5.8% irq [CPU0] ---- --- 1 --- -------- ------- --- ------- ---------- ---------------- 0x80028530 2048 120 5.8% irq [CPU0] ---- --- 2 --- -------- ------- --- ------- ---------- ---------------- 0x80027d30 2048 120 5.8% irq [CPU0] ---- --- 3 --- -------- ------- --- ------- ---------- ---------------- 0x80027530 2048 120 5.8% irq [CPU0] ---- --- 4 --- -------- ------- --- ------- ---------- ---------------- 0x80026d30 2048 120 5.8% irq [CPU0] ---- --- 5 --- -------- ------- --- ------- ---------- ---------------- 0x80026530 2048 120 5.8% irq [CPU0] ---- --- 6 --- -------- ------- --- ------- ---------- ---------------- 0x80025d30 2048 120 5.8% irq [CPU0] ---- --- 7 --- -------- ------- --- ------- ---------- ---------------- 0x80025530 2048 120 5.8% irq [CPU0] 0 0 0 0 FIFO Kthread - Assigned 0000000000000000 0x8002bef0 2032 492 24.2% CPU0 IDLE [CPU0] 1 0 1 0 FIFO Kthread - Assigned 0000000000000000 0x8002c6f0 2032 828 40.7% CPU1 IDLE [CPU0] 2 0 2 0 FIFO Kthread - Assigned 0000000000000000 0x8002cef0 2032 828 40.7% CPU2 IDLE [CPU0] 3 0 3 0 FIFO Kthread - Assigned 0000000000000000 0x8002d6f0 2032 828 40.7% CPU3 IDLE [CPU0] 4 0 4 0 FIFO Kthread - Assigned 0000000000000000 0x8002def0 2032 828 40.7% CPU4 IDLE [CPU0] 5 0 5 0 FIFO Kthread - Assigned 0000000000000000 0x8002e6f0 2032 828 40.7% CPU5 IDLE [CPU0] 6 0 6 0 FIFO Kthread - Assigned 0000000000000000 0x8002eef0 2032 860 42.3% CPU6 IDLE [CPU0] 7 0 7 0 FIFO Kthread - Assigned 0000000000000000 0x8002f6f0 2032 828 40.7% CPU7 IDLE [CPU0] 8 8 0 100 RR Task - Waiting Semaphore 0000000000000000 0x800305d0 2000 1004 50.2% nsh_main [CPU0] 9 9 0 100 RR Task - Waiting Semaphore 0000000000000000 0x80031348 2008 924 46.0% hello [CPU0] 10 9 1 100 RR pthread - Running 0000000000000000 0x80031c18 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 11 9 2 100 RR pthread - Running 0000000000000000 0x800324f8 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 12 9 3 100 RR pthread - Running 0000000000000000 0x80032dd8 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 13 9 4 100 RR pthread - Running 0000000000000000 0x800336b8 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 14 9 5 100 RR pthread - Running 0000000000000000 0x80033f98 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 15 9 6 100 RR pthread - Running 0000000000000000 0x80034878 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 16 9 7 100 RR pthread - Running 0000000000000000 0x80035158 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 17 9 0 100 RR pthread - Running 0000000000000000 0x80035ac0 2032 556 27.3% hello 0x80016b7c 0 [CPU0] 18 9 0 100 RR pthread - Ready 0000000000000000 0x800363a0 2032 396 19.4% hello 0x80016b7c 0 [CPU0] 19 9 0 100 RR pthread - Ready 0000000000000000 0x80036c80 2032 396 19.4% hello 0x80016b7c 0 [CPU0] 20 9 0 100 RR pthread - Ready 0000000000000000 0x80037560 2032 396 19.4% hello 0x80016b7c 0 [CPU0] 21 9 0 100 RR pthread - Ready 0000000000000000 0x80037e40 2032 396 19.4% hello 0x80016b7c 0 [CPU0] 22 9 0 100 RR pthread - Ready 0000000000000000 0x80038720 2032 396 19.4% hello 0x80016b7c 0 [CPU0] 23 9 0 100 RR pthread - Ready 0000000000000000 0x80039000 2032 396 19.4% hello 0x80016b7c 0 [CPU0] 24 9 0 100 RR pthread - Ready 0000000000000000 0x800398e0 2032 396 19.4% hello 0x80016b7c 0 [CPU0] 25 9 0 100 RR pthread - Ready 0000000000000000 0x8003a1c0 2032 396 19.4% hello 0x80016b7c 0 [CPU0] 26 9 0 100 RR pthread - Ready 0000000000000000 0x8003aaa0 2032 396 19.4% hello 0x80016b7c 0 [CPU0] 27 9 0 100 RR pthread - Ready 0000000000000000 0x8003b380 2032 396 19.4% hello 0x80016b7c 0 [CPU0] 28 9 0 100 RR pthread - Ready 0000000000000000 0x8003bc60 2032 396 19.4% hello 0x80016b7c 0 [CPU0] 29 9 0 100 RR pthread - Ready 0000000000000000 0x8003c540 2032 396 19.4% hello 0x80016b7c 0 [CPU0] 30 9 0 100 RR pthread - Ready 0000000000000000 0x8003ce20 2032 396 19.4% hello 0x80016b7c 0 [CPU0] 31 9 0 100 RR pthread - Ready 0000000000000000 0x8003d700 2032 396 19.4% hello 0x80016b7c 0 [CPU0] 32 9 0 100 RR pthread - Ready 0000000000000000 0x8003dfe0 2032 396 19.4% hello 0x80016b7c 0 [CPU0] 33 9 0 100 RR pthread - Ready 0000000000000000 0x8003e9c8 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 34 9 0 100 RR pthread - Ready 0000000000000000 0x8003f2a8 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 35 9 0 100 RR pthread - Ready 0000000000000000 0x8003fb88 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 36 9 0 100 RR pthread - Ready 0000000000000000 0x80040468 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 37 9 0 100 RR pthread - Ready 0000000000000000 0x80040d48 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 38 9 0 100 RR pthread - Ready 0000000000000000 0x80041628 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 39 9 0 100 RR pthread - Ready 0000000000000000 0x80041f08 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 40 9 0 100 RR pthread - Ready 0000000000000000 0x800427e8 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 41 9 0 100 RR pthread - Ready 0000000000000000 0x800430c8 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 42 9 0 100 RR pthread - Ready 0000000000000000 0x800439a8 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 43 9 0 100 RR pthread - Ready 0000000000000000 0x80044288 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 44 9 0 100 RR pthread - Ready 0000000000000000 0x80044b68 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 45 9 0 100 RR pthread - Ready 0000000000000000 0x80045448 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 46 9 0 100 RR pthread - Ready 0000000000000000 0x80045d28 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 47 9 0 100 RR pthread - Ready 0000000000000000 0x80046608 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 48 9 0 100 RR pthread - Ready 0000000000000000 0x80046ee8 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 49 9 0 100 RR pthread - Ready 0000000000000000 0x800477c8 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 50 9 0 100 RR pthread - Ready 0000000000000000 0x800480a8 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 51 9 0 100 RR pthread - Ready 0000000000000000 0x80048988 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 52 9 0 100 RR pthread - Ready 0000000000000000 0x80049268 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 53 9 0 100 RR pthread - Ready 0000000000000000 0x80049b48 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 54 9 0 100 RR pthread - Ready 0000000000000000 0x8004a428 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 55 9 0 100 RR pthread - Ready 0000000000000000 0x8004ad08 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 56 9 0 100 RR pthread - Ready 0000000000000000 0x8004b5e8 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 57 9 0 100 RR pthread - Ready 0000000000000000 0x8004bec8 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 58 9 0 100 RR pthread - Ready 0000000000000000 0x8004c7a8 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 59 9 0 100 RR pthread - Ready 0000000000000000 0x8004d088 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 60 9 0 100 RR pthread - Ready 0000000000000000 0x8004d968 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 61 9 0 100 RR pthread - Ready 0000000000000000 0x8004e248 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 62 9 0 100 RR pthread - Ready 0000000000000000 0x8004eb28 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 63 9 0 100 RR pthread - Ready 0000000000000000 0x8004f408 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 64 9 0 100 RR pthread - Ready 0000000000000000 0x8004fce8 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 65 9 0 100 RR pthread - Ready 0000000000000000 0x800506f8 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 66 9 0 100 RR pthread - Ready 0000000000000000 0x80050fd8 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 67 9 0 100 RR pthread - Ready 0000000000000000 0x800518b8 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 68 9 0 100 RR pthread - Ready 0000000000000000 0x80052198 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 69 9 0 100 RR pthread - Ready 0000000000000000 0x80052a78 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 70 9 0 100 RR pthread - Ready 0000000000000000 0x80053358 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 71 9 0 100 RR pthread - Ready 0000000000000000 0x80053c38 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 72 9 0 100 RR pthread - Ready 0000000000000000 0x80054518 2024 396 19.5% hello 0x80016b7c 0 [CPU0] 73 9 0 100 RR pthread - Ready 0000000000000000 0x80054df8 2024 396 19.5% hello 0x80016b7c 0 ``` ### On which OS does this issue occur? [OS: Linux] ### What is the version of your OS? Ubuntu 22.04 ### NuttX Version 3663e78f82e26d6f42ee0c44f9b65f164449c6f0 ### Issue Architecture [Arch: risc-v] ### Issue Area [Area: OS Components] ### Host information _No response_ ### Verification - [x] I have verified before submitting the report. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
