diff options
Diffstat (limited to 'drivers/xen/preempt.c')
-rw-r--r-- | drivers/xen/preempt.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/xen/preempt.c b/drivers/xen/preempt.c index 08cb419eb4e6..128375ff80b8 100644 --- a/drivers/xen/preempt.c +++ b/drivers/xen/preempt.c @@ -31,13 +31,15 @@ EXPORT_SYMBOL_GPL(xen_in_preemptible_hcall); asmlinkage __visible void xen_maybe_preempt_hcall(void) { if (unlikely(__this_cpu_read(xen_in_preemptible_hcall) - && need_resched())) { + && need_resched() && !preempt_count())) { /* * Clear flag as we may be rescheduled on a different * cpu. */ __this_cpu_write(xen_in_preemptible_hcall, false); - _cond_resched(); + local_irq_enable(); + cond_resched(); + local_irq_disable(); __this_cpu_write(xen_in_preemptible_hcall, true); } } |