diff options
Diffstat (limited to 'kernel/sched/core.c')
| -rw-r--r-- | kernel/sched/core.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 7f12624a393c..af7a8c84b797 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
| @@ -3082,11 +3082,13 @@ EXPORT_SYMBOL(preempt_schedule); | |||
| 3082 | asmlinkage void __sched preempt_schedule_irq(void) | 3082 | asmlinkage void __sched preempt_schedule_irq(void) |
| 3083 | { | 3083 | { |
| 3084 | struct thread_info *ti = current_thread_info(); | 3084 | struct thread_info *ti = current_thread_info(); |
| 3085 | enum ctx_state prev_state; | ||
| 3085 | 3086 | ||
| 3086 | /* Catch callers which need to be fixed */ | 3087 | /* Catch callers which need to be fixed */ |
| 3087 | BUG_ON(ti->preempt_count || !irqs_disabled()); | 3088 | BUG_ON(ti->preempt_count || !irqs_disabled()); |
| 3088 | 3089 | ||
| 3089 | user_exit(); | 3090 | prev_state = exception_enter(); |
| 3091 | |||
| 3090 | do { | 3092 | do { |
| 3091 | add_preempt_count(PREEMPT_ACTIVE); | 3093 | add_preempt_count(PREEMPT_ACTIVE); |
| 3092 | local_irq_enable(); | 3094 | local_irq_enable(); |
| @@ -3100,6 +3102,8 @@ asmlinkage void __sched preempt_schedule_irq(void) | |||
| 3100 | */ | 3102 | */ |
| 3101 | barrier(); | 3103 | barrier(); |
| 3102 | } while (need_resched()); | 3104 | } while (need_resched()); |
| 3105 | |||
| 3106 | exception_exit(prev_state); | ||
| 3103 | } | 3107 | } |
| 3104 | 3108 | ||
| 3105 | #endif /* CONFIG_PREEMPT */ | 3109 | #endif /* CONFIG_PREEMPT */ |
