xref: /linux-6.15/include/linux/sched/idle.h (revision 564f7dfd)
1 #ifndef _LINUX_SCHED_IDLE_H
2 #define _LINUX_SCHED_IDLE_H
3 
4 #include <linux/sched.h>
5 
6 enum cpu_idle_type {
7 	CPU_IDLE,
8 	CPU_NOT_IDLE,
9 	CPU_NEWLY_IDLE,
10 	CPU_MAX_IDLE_TYPES
11 };
12 
13 extern void wake_up_if_idle(int cpu);
14 
15 /*
16  * Idle thread specific functions to determine the need_resched
17  * polling state.
18  */
19 #ifdef TIF_POLLING_NRFLAG
20 
21 static inline void __current_set_polling(void)
22 {
23 	set_thread_flag(TIF_POLLING_NRFLAG);
24 }
25 
26 static inline bool __must_check current_set_polling_and_test(void)
27 {
28 	__current_set_polling();
29 
30 	/*
31 	 * Polling state must be visible before we test NEED_RESCHED,
32 	 * paired by resched_curr()
33 	 */
34 	smp_mb__after_atomic();
35 
36 	return unlikely(tif_need_resched());
37 }
38 
39 static inline void __current_clr_polling(void)
40 {
41 	clear_thread_flag(TIF_POLLING_NRFLAG);
42 }
43 
44 static inline bool __must_check current_clr_polling_and_test(void)
45 {
46 	__current_clr_polling();
47 
48 	/*
49 	 * Polling state must be visible before we test NEED_RESCHED,
50 	 * paired by resched_curr()
51 	 */
52 	smp_mb__after_atomic();
53 
54 	return unlikely(tif_need_resched());
55 }
56 
57 #else
58 static inline void __current_set_polling(void) { }
59 static inline void __current_clr_polling(void) { }
60 
61 static inline bool __must_check current_set_polling_and_test(void)
62 {
63 	return unlikely(tif_need_resched());
64 }
65 static inline bool __must_check current_clr_polling_and_test(void)
66 {
67 	return unlikely(tif_need_resched());
68 }
69 #endif
70 
71 static inline void current_clr_polling(void)
72 {
73 	__current_clr_polling();
74 
75 	/*
76 	 * Ensure we check TIF_NEED_RESCHED after we clear the polling bit.
77 	 * Once the bit is cleared, we'll get IPIs with every new
78 	 * TIF_NEED_RESCHED and the IPI handler, scheduler_ipi(), will also
79 	 * fold.
80 	 */
81 	smp_mb(); /* paired with resched_curr() */
82 
83 	preempt_fold_need_resched();
84 }
85 
86 #endif /* _LINUX_SCHED_IDLE_H */
87