On Tue, 2026-05-19 at 09:49 +0200, Nam Cao wrote:
> CLOCK_REALTIME is the only clock that often is misused in real-time
> applications. The other clocks either are safe for real-time uses
> (CLOCK_TAI, CLOCK_MONOTONIC, CLOCK_BOOTTIME) or are unlikely to be misused
> (CLOCK_AUX, CLOCK_PROCESS_CPUTIME_ID).
> 
> The rtapp monitor's purpose is warning people about common mistakes with
> real-time design. However, warning about all clock types generates too much
> false positives.

I'm fine with the change, but are those really false positives?

>From what I understand before this change we would report any non-rt-friendly
clock type, now only realtime.
What we are skipping would still be true positives, just so uncommon not to
justify the extra complexity, right?

Or do you mean an RT task using CLOCK_AUX is a false positive because likely the
users weren't even trying to do real-time?

Thanks,
Gabriele

> 
> Update the monitor to only warn about CLOCK_REALTIME.
> 
> Signed-off-by: Nam Cao <[email protected]>
> ---
>  kernel/trace/rv/monitors/sleep/sleep.c    | 10 ++---
>  kernel/trace/rv/monitors/sleep/sleep.h    | 52 +++++++++++------------
>  tools/verification/models/rtapp/sleep.ltl |  2 +-
>  3 files changed, 28 insertions(+), 36 deletions(-)
> 
> diff --git a/kernel/trace/rv/monitors/sleep/sleep.c
> b/kernel/trace/rv/monitors/sleep/sleep.c
> index 0a36f5519e6b..e01ac56b3f4a 100644
> --- a/kernel/trace/rv/monitors/sleep/sleep.c
> +++ b/kernel/trace/rv/monitors/sleep/sleep.c
> @@ -43,9 +43,7 @@ static void ltl_atoms_init(struct task_struct *task, struct
> ltl_monitor *mon, bo
>       ltl_atom_set(mon, LTL_WOKEN_BY_EQUAL_OR_HIGHER_PRIO, false);
>  
>       if (task_creation) {
> -             ltl_atom_set(mon, LTL_KTHREAD_SHOULD_STOP, false);
> -             ltl_atom_set(mon, LTL_NANOSLEEP_CLOCK_MONOTONIC, false);
> -             ltl_atom_set(mon, LTL_NANOSLEEP_CLOCK_TAI, false);
> +             ltl_atom_set(mon, LTL_NANOSLEEP_CLOCK_REALTIME, false);
>               ltl_atom_set(mon, LTL_NANOSLEEP_TIMER_ABSTIME, false);
>               ltl_atom_set(mon, LTL_CLOCK_NANOSLEEP, false);
>               ltl_atom_set(mon, LTL_FUTEX_WAIT, false);
> @@ -136,8 +134,7 @@ static void handle_sys_enter(void *data, struct pt_regs
> *regs, long id)
>       case __NR_clock_nanosleep_time64:
>  #endif
>               syscall_get_arguments(current, regs, args);
> -             ltl_atom_set(mon, LTL_NANOSLEEP_CLOCK_MONOTONIC, args[0] ==
> CLOCK_MONOTONIC);
> -             ltl_atom_set(mon, LTL_NANOSLEEP_CLOCK_TAI, args[0] ==
> CLOCK_TAI);
> +             ltl_atom_set(mon, LTL_NANOSLEEP_CLOCK_REALTIME, args[0] ==
> CLOCK_REALTIME);
>               ltl_atom_set(mon, LTL_NANOSLEEP_TIMER_ABSTIME, args[1] ==
> TIMER_ABSTIME);
>               ltl_atom_update(current, LTL_CLOCK_NANOSLEEP, true);
>               break;
> @@ -178,8 +175,7 @@ static void handle_sys_exit(void *data, struct pt_regs
> *regs, long ret)
>  
>       ltl_atom_set(mon, LTL_FUTEX_LOCK_PI, false);
>       ltl_atom_set(mon, LTL_FUTEX_WAIT, false);
> -     ltl_atom_set(mon, LTL_NANOSLEEP_CLOCK_MONOTONIC, false);
> -     ltl_atom_set(mon, LTL_NANOSLEEP_CLOCK_TAI, false);
> +     ltl_atom_set(mon, LTL_NANOSLEEP_CLOCK_REALTIME, false);
>       ltl_atom_set(mon, LTL_NANOSLEEP_TIMER_ABSTIME, false);
>       ltl_atom_set(mon, LTL_EPOLL_WAIT, false);
>       ltl_atom_update(current, LTL_CLOCK_NANOSLEEP, false);
> diff --git a/kernel/trace/rv/monitors/sleep/sleep.h
> b/kernel/trace/rv/monitors/sleep/sleep.h
> index 95dc2727c059..ed1ac7ad008e 100644
> --- a/kernel/trace/rv/monitors/sleep/sleep.h
> +++ b/kernel/trace/rv/monitors/sleep/sleep.h
> @@ -20,8 +20,7 @@ enum ltl_atom {
>       LTL_FUTEX_WAIT,
>       LTL_KERNEL_THREAD,
>       LTL_KTHREAD_SHOULD_STOP,
> -     LTL_NANOSLEEP_CLOCK_MONOTONIC,
> -     LTL_NANOSLEEP_CLOCK_TAI,
> +     LTL_NANOSLEEP_CLOCK_REALTIME,
>       LTL_NANOSLEEP_TIMER_ABSTIME,
>       LTL_RT,
>       LTL_SLEEP,
> @@ -46,8 +45,7 @@ static const char *ltl_atom_str(enum ltl_atom atom)
>               "fu_wa",
>               "ker_th",
>               "kth_sh_st",
> -             "na_cl_mo",
> -             "na_cl_ta",
> +             "na_cl_re",
>               "na_ti_ab",
>               "rt",
>               "sl",
> @@ -87,8 +85,7 @@ static void ltl_start(struct task_struct *task, struct
> ltl_monitor *mon)
>       bool sleep = test_bit(LTL_SLEEP, mon->atoms);
>       bool rt = test_bit(LTL_RT, mon->atoms);
>       bool nanosleep_timer_abstime = test_bit(LTL_NANOSLEEP_TIMER_ABSTIME,
> mon->atoms);
> -     bool nanosleep_clock_tai = test_bit(LTL_NANOSLEEP_CLOCK_TAI, mon-
> >atoms);
> -     bool nanosleep_clock_monotonic =
> test_bit(LTL_NANOSLEEP_CLOCK_MONOTONIC, mon->atoms);
> +     bool nanosleep_clock_realtime =
> test_bit(LTL_NANOSLEEP_CLOCK_REALTIME, mon->atoms);
>       bool kthread_should_stop = test_bit(LTL_KTHREAD_SHOULD_STOP, mon-
> >atoms);
>       bool kernel_thread = test_bit(LTL_KERNEL_THREAD, mon->atoms);
>       bool futex_wait = test_bit(LTL_FUTEX_WAIT, mon->atoms);
> @@ -97,17 +94,17 @@ static void ltl_start(struct task_struct *task, struct
> ltl_monitor *mon)
>       bool clock_nanosleep = test_bit(LTL_CLOCK_NANOSLEEP, mon->atoms);
>       bool block_on_rt_mutex = test_bit(LTL_BLOCK_ON_RT_MUTEX, mon->atoms);
>       bool abort_sleep = test_bit(LTL_ABORT_SLEEP, mon->atoms);
> -     bool val42 = task_is_rcu || task_is_migration;
> -     bool val43 = futex_lock_pi || val42;
> -     bool val5 = block_on_rt_mutex || val43;
> -     bool val34 = abort_sleep || kthread_should_stop;
> -     bool val35 = woken_by_nmi || val34;
> -     bool val36 = woken_by_hardirq || val35;
> -     bool val14 = woken_by_equal_or_higher_prio || val36;
> +     bool val41 = task_is_rcu || task_is_migration;
> +     bool val42 = futex_lock_pi || val41;
> +     bool val5 = block_on_rt_mutex || val42;
> +     bool val33 = abort_sleep || kthread_should_stop;
> +     bool val34 = woken_by_nmi || val33;
> +     bool val35 = woken_by_hardirq || val34;
> +     bool val14 = woken_by_equal_or_higher_prio || val35;
>       bool val13 = !wake;
> -     bool val26 = nanosleep_clock_monotonic || nanosleep_clock_tai;
> -     bool val27 = nanosleep_timer_abstime && val26;
> -     bool val18 = clock_nanosleep && val27;
> +     bool val25 = !nanosleep_clock_realtime;
> +     bool val26 = nanosleep_timer_abstime && val25;
> +     bool val18 = clock_nanosleep && val26;
>       bool val20 = val18 || epoll_wait;
>       bool val9 = futex_wait || val20;
>       bool val11 = val9 || kernel_thread;
> @@ -138,8 +135,7 @@ ltl_possible_next_states(struct ltl_monitor *mon, unsigned
> int state, unsigned l
>       bool sleep = test_bit(LTL_SLEEP, mon->atoms);
>       bool rt = test_bit(LTL_RT, mon->atoms);
>       bool nanosleep_timer_abstime = test_bit(LTL_NANOSLEEP_TIMER_ABSTIME,
> mon->atoms);
> -     bool nanosleep_clock_tai = test_bit(LTL_NANOSLEEP_CLOCK_TAI, mon-
> >atoms);
> -     bool nanosleep_clock_monotonic =
> test_bit(LTL_NANOSLEEP_CLOCK_MONOTONIC, mon->atoms);
> +     bool nanosleep_clock_realtime =
> test_bit(LTL_NANOSLEEP_CLOCK_REALTIME, mon->atoms);
>       bool kthread_should_stop = test_bit(LTL_KTHREAD_SHOULD_STOP, mon-
> >atoms);
>       bool kernel_thread = test_bit(LTL_KERNEL_THREAD, mon->atoms);
>       bool futex_wait = test_bit(LTL_FUTEX_WAIT, mon->atoms);
> @@ -148,17 +144,17 @@ ltl_possible_next_states(struct ltl_monitor *mon,
> unsigned int state, unsigned l
>       bool clock_nanosleep = test_bit(LTL_CLOCK_NANOSLEEP, mon->atoms);
>       bool block_on_rt_mutex = test_bit(LTL_BLOCK_ON_RT_MUTEX, mon->atoms);
>       bool abort_sleep = test_bit(LTL_ABORT_SLEEP, mon->atoms);
> -     bool val42 = task_is_rcu || task_is_migration;
> -     bool val43 = futex_lock_pi || val42;
> -     bool val5 = block_on_rt_mutex || val43;
> -     bool val34 = abort_sleep || kthread_should_stop;
> -     bool val35 = woken_by_nmi || val34;
> -     bool val36 = woken_by_hardirq || val35;
> -     bool val14 = woken_by_equal_or_higher_prio || val36;
> +     bool val41 = task_is_rcu || task_is_migration;
> +     bool val42 = futex_lock_pi || val41;
> +     bool val5 = block_on_rt_mutex || val42;
> +     bool val33 = abort_sleep || kthread_should_stop;
> +     bool val34 = woken_by_nmi || val33;
> +     bool val35 = woken_by_hardirq || val34;
> +     bool val14 = woken_by_equal_or_higher_prio || val35;
>       bool val13 = !wake;
> -     bool val26 = nanosleep_clock_monotonic || nanosleep_clock_tai;
> -     bool val27 = nanosleep_timer_abstime && val26;
> -     bool val18 = clock_nanosleep && val27;
> +     bool val25 = !nanosleep_clock_realtime;
> +     bool val26 = nanosleep_timer_abstime && val25;
> +     bool val18 = clock_nanosleep && val26;
>       bool val20 = val18 || epoll_wait;
>       bool val9 = futex_wait || val20;
>       bool val11 = val9 || kernel_thread;
> diff --git a/tools/verification/models/rtapp/sleep.ltl
> b/tools/verification/models/rtapp/sleep.ltl
> index 6f26c4810f78..2637bc48a620 100644
> --- a/tools/verification/models/rtapp/sleep.ltl
> +++ b/tools/verification/models/rtapp/sleep.ltl
> @@ -9,7 +9,7 @@ RT_VALID_SLEEP_REASON = FUTEX_WAIT
>  
>  RT_FRIENDLY_NANOSLEEP = CLOCK_NANOSLEEP
>                      and NANOSLEEP_TIMER_ABSTIME
> -                    and (NANOSLEEP_CLOCK_MONOTONIC or NANOSLEEP_CLOCK_TAI)
> +                    and not NANOSLEEP_CLOCK_REALTIME
>  
>  RT_FRIENDLY_WAKE = WOKEN_BY_EQUAL_OR_HIGHER_PRIO
>                  or WOKEN_BY_HARDIRQ


Reply via email to