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