diff options
author | Frederic Weisbecker <fweisbec@gmail.com> | 2009-07-16 09:44:29 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-07-18 09:51:44 -0400 |
commit | 613afbf83298efaead05ebcac23d2285609d7160 (patch) | |
tree | 15fa2025d74cee5f6805ab974c532c6b6a603333 /include/linux/sched.h | |
parent | 6f80bd985fe242c2e6a8b6209ed20b0495d3d63b (diff) |
sched: Pull up the might_sleep() check into cond_resched()
might_sleep() is called late-ish in cond_resched(), after the
need_resched()/preempt enabled/system running tests are
checked.
It's better to check the sleeps while atomic earlier and not
depend on some environment datas that reduce the chances to
detect a problem.
Also define cond_resched_*() helpers as macros, so that the
FILE/LINE reported in the sleeping while atomic warning
displays the real origin and not sched.h
Changes in v2:
- Call __might_sleep() directly instead of might_sleep() which
may call cond_resched()
- Turn cond_resched() into a macro so that the file:line
couple reported refers to the caller of cond_resched() and
not __cond_resched() itself.
Changes in v3:
- Also propagate this __might_sleep() pull up to
cond_resched_lock() and cond_resched_softirq()
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <1247725694-6082-6-git-send-email-fweisbec@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'include/linux/sched.h')
-rw-r--r-- | include/linux/sched.h | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h index e2bdf18e05c4..c41d424db887 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -2286,17 +2286,26 @@ static inline int need_resched(void) | |||
2286 | */ | 2286 | */ |
2287 | extern int _cond_resched(void); | 2287 | extern int _cond_resched(void); |
2288 | 2288 | ||
2289 | static inline int cond_resched(void) | 2289 | #define cond_resched() ({ \ |
2290 | { | 2290 | __might_sleep(__FILE__, __LINE__, 0); \ |
2291 | return _cond_resched(); | 2291 | _cond_resched(); \ |
2292 | } | 2292 | }) |
2293 | 2293 | ||
2294 | extern int cond_resched_lock(spinlock_t * lock); | 2294 | extern int __cond_resched_lock(spinlock_t *lock); |
2295 | extern int cond_resched_softirq(void); | 2295 | |
2296 | static inline int cond_resched_bkl(void) | 2296 | #define cond_resched_lock(lock) ({ \ |
2297 | { | 2297 | __might_sleep(__FILE__, __LINE__, PREEMPT_OFFSET); \ |
2298 | return _cond_resched(); | 2298 | __cond_resched_lock(lock); \ |
2299 | } | 2299 | }) |
2300 | |||
2301 | extern int __cond_resched_softirq(void); | ||
2302 | |||
2303 | #define cond_resched_softirq() ({ \ | ||
2304 | __might_sleep(__FILE__, __LINE__, SOFTIRQ_OFFSET); \ | ||
2305 | __cond_resched_softirq(); \ | ||
2306 | }) | ||
2307 | |||
2308 | #define cond_resched_bkl() cond_resched() | ||
2300 | 2309 | ||
2301 | /* | 2310 | /* |
2302 | * Does a critical section need to be broken due to another | 2311 | * Does a critical section need to be broken due to another |