Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

rv: Allow epoll in rtapp-sleep monitor

Since commit 0c43094f8cc9 ("eventpoll: Replace rwlock with spinlock"),
epoll_wait is real-time-safe syscall for sleeping.

Add epoll_wait to the list of rt-safe sleeping APIs.

Signed-off-by: Nam Cao <namcao@linutronix.de>
Reviewed-by: Gabriele Monaco <gmonaco@redhat.com>
Link: https://lore.kernel.org/r/20260401130828.3115428-1-namcao@linutronix.de
Signed-off-by: Gabriele Monaco <gmonaco@redhat.com>

authored by

Nam Cao and committed by
Gabriele Monaco
00f0dadd bf860598

+61 -46
+8
kernel/trace/rv/monitors/sleep/sleep.c
··· 49 49 ltl_atom_set(mon, LTL_NANOSLEEP_TIMER_ABSTIME, false); 50 50 ltl_atom_set(mon, LTL_CLOCK_NANOSLEEP, false); 51 51 ltl_atom_set(mon, LTL_FUTEX_WAIT, false); 52 + ltl_atom_set(mon, LTL_EPOLL_WAIT, false); 52 53 ltl_atom_set(mon, LTL_FUTEX_LOCK_PI, false); 53 54 ltl_atom_set(mon, LTL_BLOCK_ON_RT_MUTEX, false); 54 55 } ··· 64 63 ltl_atom_set(mon, LTL_NANOSLEEP_CLOCK_TAI, false); 65 64 ltl_atom_set(mon, LTL_NANOSLEEP_TIMER_ABSTIME, false); 66 65 ltl_atom_set(mon, LTL_CLOCK_NANOSLEEP, false); 66 + ltl_atom_set(mon, LTL_EPOLL_WAIT, false); 67 67 68 68 if (strstarts(task->comm, "migration/")) 69 69 ltl_atom_set(mon, LTL_TASK_IS_MIGRATION, true); ··· 164 162 break; 165 163 } 166 164 break; 165 + #ifdef __NR_epoll_wait 166 + case __NR_epoll_wait: 167 + ltl_atom_update(current, LTL_EPOLL_WAIT, true); 168 + break; 169 + #endif 167 170 } 168 171 } 169 172 ··· 181 174 ltl_atom_set(mon, LTL_NANOSLEEP_CLOCK_MONOTONIC, false); 182 175 ltl_atom_set(mon, LTL_NANOSLEEP_CLOCK_TAI, false); 183 176 ltl_atom_set(mon, LTL_NANOSLEEP_TIMER_ABSTIME, false); 177 + ltl_atom_set(mon, LTL_EPOLL_WAIT, false); 184 178 ltl_atom_update(current, LTL_CLOCK_NANOSLEEP, false); 185 179 } 186 180
+52 -46
kernel/trace/rv/monitors/sleep/sleep.h
··· 15 15 LTL_ABORT_SLEEP, 16 16 LTL_BLOCK_ON_RT_MUTEX, 17 17 LTL_CLOCK_NANOSLEEP, 18 + LTL_EPOLL_WAIT, 18 19 LTL_FUTEX_LOCK_PI, 19 20 LTL_FUTEX_WAIT, 20 21 LTL_KERNEL_THREAD, ··· 41 40 "ab_sl", 42 41 "bl_on_rt_mu", 43 42 "cl_na", 43 + "ep_wa", 44 44 "fu_lo_pi", 45 45 "fu_wa", 46 46 "ker_th", ··· 77 75 78 76 static void ltl_start(struct task_struct *task, struct ltl_monitor *mon) 79 77 { 80 - bool task_is_migration = test_bit(LTL_TASK_IS_MIGRATION, mon->atoms); 81 - bool task_is_rcu = test_bit(LTL_TASK_IS_RCU, mon->atoms); 82 - bool val40 = task_is_rcu || task_is_migration; 83 - bool futex_lock_pi = test_bit(LTL_FUTEX_LOCK_PI, mon->atoms); 84 - bool val41 = futex_lock_pi || val40; 85 - bool block_on_rt_mutex = test_bit(LTL_BLOCK_ON_RT_MUTEX, mon->atoms); 86 - bool val5 = block_on_rt_mutex || val41; 87 - bool kthread_should_stop = test_bit(LTL_KTHREAD_SHOULD_STOP, mon->atoms); 88 - bool abort_sleep = test_bit(LTL_ABORT_SLEEP, mon->atoms); 89 - bool val32 = abort_sleep || kthread_should_stop; 90 78 bool woken_by_nmi = test_bit(LTL_WOKEN_BY_NMI, mon->atoms); 91 - bool val33 = woken_by_nmi || val32; 92 79 bool woken_by_hardirq = test_bit(LTL_WOKEN_BY_HARDIRQ, mon->atoms); 93 - bool val34 = woken_by_hardirq || val33; 94 80 bool woken_by_equal_or_higher_prio = test_bit(LTL_WOKEN_BY_EQUAL_OR_HIGHER_PRIO, 95 81 mon->atoms); 96 - bool val14 = woken_by_equal_or_higher_prio || val34; 97 82 bool wake = test_bit(LTL_WAKE, mon->atoms); 98 - bool val13 = !wake; 99 - bool kernel_thread = test_bit(LTL_KERNEL_THREAD, mon->atoms); 83 + bool task_is_rcu = test_bit(LTL_TASK_IS_RCU, mon->atoms); 84 + bool task_is_migration = test_bit(LTL_TASK_IS_MIGRATION, mon->atoms); 85 + bool sleep = test_bit(LTL_SLEEP, mon->atoms); 86 + bool rt = test_bit(LTL_RT, mon->atoms); 87 + bool nanosleep_timer_abstime = test_bit(LTL_NANOSLEEP_TIMER_ABSTIME, mon->atoms); 100 88 bool nanosleep_clock_tai = test_bit(LTL_NANOSLEEP_CLOCK_TAI, mon->atoms); 101 89 bool nanosleep_clock_monotonic = test_bit(LTL_NANOSLEEP_CLOCK_MONOTONIC, mon->atoms); 102 - bool val24 = nanosleep_clock_monotonic || nanosleep_clock_tai; 103 - bool nanosleep_timer_abstime = test_bit(LTL_NANOSLEEP_TIMER_ABSTIME, mon->atoms); 104 - bool val25 = nanosleep_timer_abstime && val24; 105 - bool clock_nanosleep = test_bit(LTL_CLOCK_NANOSLEEP, mon->atoms); 106 - bool val18 = clock_nanosleep && val25; 90 + bool kthread_should_stop = test_bit(LTL_KTHREAD_SHOULD_STOP, mon->atoms); 91 + bool kernel_thread = test_bit(LTL_KERNEL_THREAD, mon->atoms); 107 92 bool futex_wait = test_bit(LTL_FUTEX_WAIT, mon->atoms); 108 - bool val9 = futex_wait || val18; 93 + bool futex_lock_pi = test_bit(LTL_FUTEX_LOCK_PI, mon->atoms); 94 + bool epoll_wait = test_bit(LTL_EPOLL_WAIT, mon->atoms); 95 + bool clock_nanosleep = test_bit(LTL_CLOCK_NANOSLEEP, mon->atoms); 96 + bool block_on_rt_mutex = test_bit(LTL_BLOCK_ON_RT_MUTEX, mon->atoms); 97 + bool abort_sleep = test_bit(LTL_ABORT_SLEEP, mon->atoms); 98 + bool val42 = task_is_rcu || task_is_migration; 99 + bool val43 = futex_lock_pi || val42; 100 + bool val5 = block_on_rt_mutex || val43; 101 + bool val34 = abort_sleep || kthread_should_stop; 102 + bool val35 = woken_by_nmi || val34; 103 + bool val36 = woken_by_hardirq || val35; 104 + bool val14 = woken_by_equal_or_higher_prio || val36; 105 + bool val13 = !wake; 106 + bool val26 = nanosleep_clock_monotonic || nanosleep_clock_tai; 107 + bool val27 = nanosleep_timer_abstime && val26; 108 + bool val18 = clock_nanosleep && val27; 109 + bool val20 = val18 || epoll_wait; 110 + bool val9 = futex_wait || val20; 109 111 bool val11 = val9 || kernel_thread; 110 - bool sleep = test_bit(LTL_SLEEP, mon->atoms); 111 112 bool val2 = !sleep; 112 - bool rt = test_bit(LTL_RT, mon->atoms); 113 113 bool val1 = !rt; 114 114 bool val3 = val1 || val2; 115 115 ··· 128 124 static void 129 125 ltl_possible_next_states(struct ltl_monitor *mon, unsigned int state, unsigned long *next) 130 126 { 131 - bool task_is_migration = test_bit(LTL_TASK_IS_MIGRATION, mon->atoms); 132 - bool task_is_rcu = test_bit(LTL_TASK_IS_RCU, mon->atoms); 133 - bool val40 = task_is_rcu || task_is_migration; 134 - bool futex_lock_pi = test_bit(LTL_FUTEX_LOCK_PI, mon->atoms); 135 - bool val41 = futex_lock_pi || val40; 136 - bool block_on_rt_mutex = test_bit(LTL_BLOCK_ON_RT_MUTEX, mon->atoms); 137 - bool val5 = block_on_rt_mutex || val41; 138 - bool kthread_should_stop = test_bit(LTL_KTHREAD_SHOULD_STOP, mon->atoms); 139 - bool abort_sleep = test_bit(LTL_ABORT_SLEEP, mon->atoms); 140 - bool val32 = abort_sleep || kthread_should_stop; 141 127 bool woken_by_nmi = test_bit(LTL_WOKEN_BY_NMI, mon->atoms); 142 - bool val33 = woken_by_nmi || val32; 143 128 bool woken_by_hardirq = test_bit(LTL_WOKEN_BY_HARDIRQ, mon->atoms); 144 - bool val34 = woken_by_hardirq || val33; 145 129 bool woken_by_equal_or_higher_prio = test_bit(LTL_WOKEN_BY_EQUAL_OR_HIGHER_PRIO, 146 130 mon->atoms); 147 - bool val14 = woken_by_equal_or_higher_prio || val34; 148 131 bool wake = test_bit(LTL_WAKE, mon->atoms); 149 - bool val13 = !wake; 150 - bool kernel_thread = test_bit(LTL_KERNEL_THREAD, mon->atoms); 132 + bool task_is_rcu = test_bit(LTL_TASK_IS_RCU, mon->atoms); 133 + bool task_is_migration = test_bit(LTL_TASK_IS_MIGRATION, mon->atoms); 134 + bool sleep = test_bit(LTL_SLEEP, mon->atoms); 135 + bool rt = test_bit(LTL_RT, mon->atoms); 136 + bool nanosleep_timer_abstime = test_bit(LTL_NANOSLEEP_TIMER_ABSTIME, mon->atoms); 151 137 bool nanosleep_clock_tai = test_bit(LTL_NANOSLEEP_CLOCK_TAI, mon->atoms); 152 138 bool nanosleep_clock_monotonic = test_bit(LTL_NANOSLEEP_CLOCK_MONOTONIC, mon->atoms); 153 - bool val24 = nanosleep_clock_monotonic || nanosleep_clock_tai; 154 - bool nanosleep_timer_abstime = test_bit(LTL_NANOSLEEP_TIMER_ABSTIME, mon->atoms); 155 - bool val25 = nanosleep_timer_abstime && val24; 156 - bool clock_nanosleep = test_bit(LTL_CLOCK_NANOSLEEP, mon->atoms); 157 - bool val18 = clock_nanosleep && val25; 139 + bool kthread_should_stop = test_bit(LTL_KTHREAD_SHOULD_STOP, mon->atoms); 140 + bool kernel_thread = test_bit(LTL_KERNEL_THREAD, mon->atoms); 158 141 bool futex_wait = test_bit(LTL_FUTEX_WAIT, mon->atoms); 159 - bool val9 = futex_wait || val18; 142 + bool futex_lock_pi = test_bit(LTL_FUTEX_LOCK_PI, mon->atoms); 143 + bool epoll_wait = test_bit(LTL_EPOLL_WAIT, mon->atoms); 144 + bool clock_nanosleep = test_bit(LTL_CLOCK_NANOSLEEP, mon->atoms); 145 + bool block_on_rt_mutex = test_bit(LTL_BLOCK_ON_RT_MUTEX, mon->atoms); 146 + bool abort_sleep = test_bit(LTL_ABORT_SLEEP, mon->atoms); 147 + bool val42 = task_is_rcu || task_is_migration; 148 + bool val43 = futex_lock_pi || val42; 149 + bool val5 = block_on_rt_mutex || val43; 150 + bool val34 = abort_sleep || kthread_should_stop; 151 + bool val35 = woken_by_nmi || val34; 152 + bool val36 = woken_by_hardirq || val35; 153 + bool val14 = woken_by_equal_or_higher_prio || val36; 154 + bool val13 = !wake; 155 + bool val26 = nanosleep_clock_monotonic || nanosleep_clock_tai; 156 + bool val27 = nanosleep_timer_abstime && val26; 157 + bool val18 = clock_nanosleep && val27; 158 + bool val20 = val18 || epoll_wait; 159 + bool val9 = futex_wait || val20; 160 160 bool val11 = val9 || kernel_thread; 161 - bool sleep = test_bit(LTL_SLEEP, mon->atoms); 162 161 bool val2 = !sleep; 163 - bool rt = test_bit(LTL_RT, mon->atoms); 164 162 bool val1 = !rt; 165 163 bool val3 = val1 || val2; 166 164
+1
tools/verification/models/rtapp/sleep.ltl
··· 5 5 6 6 RT_VALID_SLEEP_REASON = FUTEX_WAIT 7 7 or RT_FRIENDLY_NANOSLEEP 8 + or EPOLL_WAIT 8 9 9 10 RT_FRIENDLY_NANOSLEEP = CLOCK_NANOSLEEP 10 11 and NANOSLEEP_TIMER_ABSTIME