at v4.13 86 lines 1.8 kB view raw
1#ifndef _LINUX_SCHED_IDLE_H 2#define _LINUX_SCHED_IDLE_H 3 4#include <linux/sched.h> 5 6enum cpu_idle_type { 7 CPU_IDLE, 8 CPU_NOT_IDLE, 9 CPU_NEWLY_IDLE, 10 CPU_MAX_IDLE_TYPES 11}; 12 13extern 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 21static inline void __current_set_polling(void) 22{ 23 set_thread_flag(TIF_POLLING_NRFLAG); 24} 25 26static 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 39static inline void __current_clr_polling(void) 40{ 41 clear_thread_flag(TIF_POLLING_NRFLAG); 42} 43 44static 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 58static inline void __current_set_polling(void) { } 59static inline void __current_clr_polling(void) { } 60 61static inline bool __must_check current_set_polling_and_test(void) 62{ 63 return unlikely(tif_need_resched()); 64} 65static inline bool __must_check current_clr_polling_and_test(void) 66{ 67 return unlikely(tif_need_resched()); 68} 69#endif 70 71static 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 */