http://downloads.netgear.com/files/GPL/GPL_Source_V361j_DM111PSP_series_consumer_rele...
[bcm963xx.git] / kernel / linux / include / linux / preempt.h
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/linkage.h>
11
12 #ifdef __KERNEL__
13
14 #define preempt_count() (current_thread_info()->preempt_count)
15
16 #define inc_preempt_count() \
17 do { \
18         preempt_count()++; \
19 } while (0)
20
21 #define dec_preempt_count() \
22 do { \
23         preempt_count()--; \
24 } while (0)
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         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 #else  /* __KERNEL__ */
64
65 /* We need to disable much of the above in order to build iptables.
66  * Create unresolvable references so there are no surprises. */
67 asmlinkage void preempt_disable(void);
68 asmlinkage void preempt_enable(void);
69 asmlinkage int preempt_count(void);
70
71 #endif /* __KERNEL__ */
72
73 #endif /* __LINUX_PREEMPT_H */