Boris Ostrovsky <boris.ostrov...@oracle.com> writes: > On 5/20/20 3:16 PM, Thomas Gleixner wrote: > > >> +__visible noinstr void xen_pv_evtchn_do_upcall(struct pt_regs *regs) >> +{ >> + struct pt_regs *old_regs; >> + bool inhcall; >> + >> + idtentry_enter(regs); >> + old_regs = set_irq_regs(regs); >> + >> + run_on_irqstack(__xen_pv_evtchn_do_upcall, NULL, regs); > > > We need to handle nested case (i.e. !irq_needs_irq_stack(), like in your > original version). Moving get_and_clear_inhcall() up should prevent > scheduling when this happens.
I locally changed run_on_irqstack() to do the magic checks and select the right one. Thanks, tglx