diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2011-06-07 11:25:03 +0200 |
---|---|---|
committer | Clark Williams <williams@redhat.com> | 2012-04-10 16:40:34 -0500 |
commit | d95954154579bb8fbb3f37137b1a799e04b4ea46 (patch) | |
tree | 2097fd3f7698305e2fa18d507d0c79fa6c5e8cda /kernel/sched | |
parent | 7f1754bb072e46f56cd6d5963969bf7b99f2de26 (diff) |
sched-cond-resched.patch
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel/sched')
-rw-r--r-- | kernel/sched/core.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index d08d0a0d623c..e78a98b73350 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -4554,9 +4554,17 @@ static inline int should_resched(void) static void __cond_resched(void) { - add_preempt_count(PREEMPT_ACTIVE); - __schedule(); - sub_preempt_count(PREEMPT_ACTIVE); + do { + add_preempt_count(PREEMPT_ACTIVE); + __schedule(); + sub_preempt_count(PREEMPT_ACTIVE); + /* + * Check again in case we missed a preemption + * opportunity between schedule and now. + */ + barrier(); + + } while (need_resched()); } int __sched _cond_resched(void) |