1 #ifndef __LINUX_PREEMPT_H 2 #define __LINUX_PREEMPT_H 3 4 /* 5 * include/linux/preempt.h - macros for accessing and manipulating 6 * preempt_count (used for kernel preemption, interrupt count, etc.) 7 */ 8 9 #include <linux/thread_info.h> 10 #include <linux/linkage.h> 11 12 #ifdef CONFIG_DEBUG_PREEMPT 13 extern void fastcall add_preempt_count(int val); 14 extern void fastcall sub_preempt_count(int val); 15 #else 16 # define add_preempt_count(val) do { preempt_count() += (val); } while (0) 17 # define sub_preempt_count(val) do { preempt_count() -= (val); } while (0) 18 #endif 19 20 #define inc_preempt_count() add_preempt_count(1) 21 #define dec_preempt_count() sub_preempt_count(1) 22 23 #define preempt_count() (current_thread_info()->preempt_count) 24 25 #ifdef CONFIG_PREEMPT 26 27 asmlinkage void preempt_schedule(void); 28 29 #define preempt_disable() \ 30 do { \ 31 inc_preempt_count(); \ 32 barrier(); \ 33 } while (0) 34 35 #define preempt_enable_no_resched() \ 36 do { \ 37 barrier(); \ 38 dec_preempt_count(); \ 39 } while (0) 40 41 #define preempt_check_resched() \ 42 do { \ 43 if (unlikely(test_thread_flag(TIF_NEED_RESCHED))) \ 44 preempt_schedule(); \ 45 } while (0) 46 47 #define preempt_enable() \ 48 do { \ 49 preempt_enable_no_resched(); \ 50 barrier(); \ 51 preempt_check_resched(); \ 52 } while (0) 53 54 #else 55 56 #define preempt_disable() do { } while (0) 57 #define preempt_enable_no_resched() do { } while (0) 58 #define preempt_enable() do { } while (0) 59 #define preempt_check_resched() do { } while (0) 60 61 #endif 62 63 #endif /* __LINUX_PREEMPT_H */ 64