diff options
Diffstat (limited to 'include/linux/preempt.h')
-rw-r--r-- | include/linux/preempt.h | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/include/linux/preempt.h b/include/linux/preempt.h index 2e681d9555bd..9dfe0eb1b47a 100644 --- a/include/linux/preempt.h +++ b/include/linux/preempt.h | |||
@@ -33,12 +33,24 @@ do { \ | |||
33 | barrier(); \ | 33 | barrier(); \ |
34 | } while (0) | 34 | } while (0) |
35 | 35 | ||
36 | #define preempt_enable_no_resched() \ | 36 | #define __preempt_enable_no_resched() \ |
37 | do { \ | 37 | do { \ |
38 | barrier(); \ | 38 | barrier(); \ |
39 | dec_preempt_count(); \ | 39 | dec_preempt_count(); \ |
40 | } while (0) | 40 | } while (0) |
41 | 41 | ||
42 | #ifdef CONFIG_DEBUG_PREEMPT | ||
43 | extern void notrace preempt_enable_no_resched(void); | ||
44 | #else | ||
45 | # define preempt_enable_no_resched() __preempt_enable_no_resched() | ||
46 | #endif | ||
47 | |||
48 | #define preempt_enable_and_schedule() \ | ||
49 | do { \ | ||
50 | __preempt_enable_no_resched(); \ | ||
51 | schedule(); \ | ||
52 | } while (0) | ||
53 | |||
42 | #define preempt_check_resched() \ | 54 | #define preempt_check_resched() \ |
43 | do { \ | 55 | do { \ |
44 | if (unlikely(test_thread_flag(TIF_NEED_RESCHED))) \ | 56 | if (unlikely(test_thread_flag(TIF_NEED_RESCHED))) \ |
@@ -47,7 +59,7 @@ do { \ | |||
47 | 59 | ||
48 | #define preempt_enable() \ | 60 | #define preempt_enable() \ |
49 | do { \ | 61 | do { \ |
50 | preempt_enable_no_resched(); \ | 62 | __preempt_enable_no_resched(); \ |
51 | barrier(); \ | 63 | barrier(); \ |
52 | preempt_check_resched(); \ | 64 | preempt_check_resched(); \ |
53 | } while (0) | 65 | } while (0) |
@@ -84,6 +96,8 @@ do { \ | |||
84 | 96 | ||
85 | #define preempt_disable() do { } while (0) | 97 | #define preempt_disable() do { } while (0) |
86 | #define preempt_enable_no_resched() do { } while (0) | 98 | #define preempt_enable_no_resched() do { } while (0) |
99 | #define __preempt_enable_no_resched() do { } while (0) | ||
100 | #define preempt_enable_and_schedule() schedule() | ||
87 | #define preempt_enable() do { } while (0) | 101 | #define preempt_enable() do { } while (0) |
88 | #define preempt_check_resched() do { } while (0) | 102 | #define preempt_check_resched() do { } while (0) |
89 | 103 | ||
@@ -93,6 +107,18 @@ do { \ | |||
93 | 107 | ||
94 | #endif | 108 | #endif |
95 | 109 | ||
110 | #ifdef CONFIG_PREEMPT_RT | ||
111 | # define preempt_disable_rt() preempt_disable() | ||
112 | # define preempt_enable_rt() preempt_enable() | ||
113 | # define preempt_disable_nort() do { } while (0) | ||
114 | # define preempt_enable_nort() do { } while (0) | ||
115 | #else | ||
116 | # define preempt_disable_rt() do { } while (0) | ||
117 | # define preempt_enable_rt() do { } while (0) | ||
118 | # define preempt_disable_nort() preempt_disable() | ||
119 | # define preempt_enable_nort() preempt_enable() | ||
120 | #endif | ||
121 | |||
96 | #ifdef CONFIG_PREEMPT_NOTIFIERS | 122 | #ifdef CONFIG_PREEMPT_NOTIFIERS |
97 | 123 | ||
98 | struct preempt_notifier; | 124 | struct preempt_notifier; |