1 /* SPDX-License-Identifier: GPL-2.0 */ 1 2 #ifndef __ASM_PREEMPT_H 3 #define __ASM_PREEMPT_H 4 5 #include <linux/thread_info.h> 6 7 #define PREEMPT_ENABLED (0) 8 9 static __always_inline int preempt_count(void) 10 { 11 return READ_ONCE(current_thread_info() 12 } 13 14 static __always_inline volatile int *preempt_c 15 { 16 return ¤t_thread_info()->preempt 17 } 18 19 static __always_inline void preempt_count_set( 20 { 21 *preempt_count_ptr() = pc; 22 } 23 24 /* 25 * must be macros to avoid header recursion he 26 */ 27 #define init_task_preempt_count(p) do { \ 28 task_thread_info(p)->preempt_count = F 29 } while (0) 30 31 #define init_idle_preempt_count(p, cpu) do { \ 32 task_thread_info(p)->preempt_count = P 33 } while (0) 34 35 static __always_inline void set_preempt_need_r 36 { 37 } 38 39 static __always_inline void clear_preempt_need 40 { 41 } 42 43 static __always_inline bool test_preempt_need_ 44 { 45 return false; 46 } 47 48 /* 49 * The various preempt_count add/sub methods 50 */ 51 52 static __always_inline void __preempt_count_ad 53 { 54 *preempt_count_ptr() += val; 55 } 56 57 static __always_inline void __preempt_count_su 58 { 59 *preempt_count_ptr() -= val; 60 } 61 62 static __always_inline bool __preempt_count_de 63 { 64 /* 65 * Because of load-store architectures 66 * operations; we cannot use PREEMPT_N 67 * lost. 68 */ 69 return !--*preempt_count_ptr() && tif_ 70 } 71 72 /* 73 * Returns true when we need to resched and ca 74 */ 75 static __always_inline bool should_resched(int 76 { 77 return unlikely(preempt_count() == pre 78 tif_need_resched()); 79 } 80 81 #ifdef CONFIG_PREEMPTION 82 extern asmlinkage void preempt_schedule(void); 83 extern asmlinkage void preempt_schedule_notrac 84 85 #if defined(CONFIG_PREEMPT_DYNAMIC) && defined 86 87 void dynamic_preempt_schedule(void); 88 void dynamic_preempt_schedule_notrace(void); 89 #define __preempt_schedule() dynami 90 #define __preempt_schedule_notrace() dynami 91 92 #else /* !CONFIG_PREEMPT_DYNAMIC || !CONFIG_HA 93 94 #define __preempt_schedule() preempt_schedule( 95 #define __preempt_schedule_notrace() preempt_s 96 97 #endif /* CONFIG_PREEMPT_DYNAMIC && CONFIG_HAV 98 #endif /* CONFIG_PREEMPTION */ 99 100 #endif /* __ASM_PREEMPT_H */ 101
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.