The XEN PV hypercall requires the ability of conditional rescheduling when preemption is disabled because some hypercalls take ages.
Split out the rescheduling code from idtentry_exit_cond_rcu() so it can be reused for that. Signed-off-by: Thomas Gleixner <t...@linutronix.de> --- V9: New patch --- arch/x86/entry/common.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) --- a/arch/x86/entry/common.c +++ b/arch/x86/entry/common.c @@ -580,6 +580,20 @@ bool noinstr idtentry_enter_cond_rcu(str return false; } +static void idtentry_exit_cond_resched(struct pt_regs *regs, bool may_sched) +{ + if (may_sched && !preempt_count()) { + /* Sanity check RCU and thread stack */ + rcu_irq_exit_check_preempt(); + if (IS_ENABLED(CONFIG_DEBUG_ENTRY)) + WARN_ON_ONCE(!on_thread_stack()); + if (need_resched()) + preempt_schedule_irq(); + } + /* Covers both tracing and lockdep */ + trace_hardirqs_on(); +} + /** * idtentry_exit_cond_rcu - Handle return from exception with conditional RCU * handling @@ -621,21 +635,7 @@ void noinstr idtentry_exit_cond_rcu(stru } instrumentation_begin(); - - /* Check kernel preemption, if enabled */ - if (IS_ENABLED(CONFIG_PREEMPTION)) { - if (!preempt_count()) { - /* Sanity check RCU and thread stack */ - rcu_irq_exit_check_preempt(); - if (IS_ENABLED(CONFIG_DEBUG_ENTRY)) - WARN_ON_ONCE(!on_thread_stack()); - if (need_resched()) - preempt_schedule_irq(); - } - } - /* Covers both tracing and lockdep */ - trace_hardirqs_on(); - + idtentry_exit_cond_resched(regs, IS_ENABLED(CONFIG_PREEMPTION)); instrumentation_end(); } else { /*