|
@@ -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 */
|