From 679b3b200770da93c36fca1c7e06aafd458a6ecb Mon Sep 17 00:00:00 2001 From: Frederic Weisbecker Date: Sun, 24 Feb 2013 12:59:30 +0100 Subject: [PATCH] --- yaml --- r: 366077 b: refs/heads/master c: b22366cd54c6fe05db426f20adb10f461c19ec06 h: refs/heads/master i: 366075: 1ef7f959d117bd4c732009193e99cd62f9d8abbb v: v3 --- [refs] | 2 +- trunk/kernel/sched/core.c | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index d6c208ac3c8e..ca012b4382b9 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 6c1e0256fad84a843d915414e4b5973b7443d48d +refs/heads/master: b22366cd54c6fe05db426f20adb10f461c19ec06 diff --git a/trunk/kernel/sched/core.c b/trunk/kernel/sched/core.c index 7f12624a393c..af7a8c84b797 100644 --- a/trunk/kernel/sched/core.c +++ b/trunk/kernel/sched/core.c @@ -3082,11 +3082,13 @@ EXPORT_SYMBOL(preempt_schedule); asmlinkage void __sched preempt_schedule_irq(void) { struct thread_info *ti = current_thread_info(); + enum ctx_state prev_state; /* Catch callers which need to be fixed */ BUG_ON(ti->preempt_count || !irqs_disabled()); - user_exit(); + prev_state = exception_enter(); + do { add_preempt_count(PREEMPT_ACTIVE); local_irq_enable(); @@ -3100,6 +3102,8 @@ asmlinkage void __sched preempt_schedule_irq(void) */ barrier(); } while (need_resched()); + + exception_exit(prev_state); } #endif /* CONFIG_PREEMPT */