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.


-boris


> +
> +     set_irq_regs(old_regs);
> +
> +     inhcall = get_and_clear_inhcall();
> +     __idtentry_exit(regs, inhcall);
> +     restore_inhcall(inhcall);
>  }

Reply via email to