Re: [patch V5 part 3 12/29] x86/entry/common: Provide idtentry_enter/exit()

From: Andy Lutomirski
Date: Mon May 11 2020 - 11:31:38 EST


On Mon, May 11, 2020 at 3:59 AM Thomas Gleixner <tglx@xxxxxxxxxxxxx> wrote:
>
> Andy Lutomirski <luto@xxxxxxxxxx> writes:
> >> + * Invoked by all exception/interrupt IDTENTRY handlers which are not
> >> + * returning through the paranoid exit path (all except NMI, #DF and the IST
> >> + * variants of #MC and #DB).
> >

> +void noinstr idtentry_exit(struct pt_regs *regs)
> +{
> + lockdep_assert_irqs_disabled();
> +
> + if (IS_ENABLED(CONFIG_DEBUG_ENTRY))
> + WARN_ON_ONCE(!on_thread_stack());

Whoops. After sleeping on this, this is obviously wrong. If this is
something like a page fault, we can be on an IST or IRQ stack.
Perhaps the actual condition should be:

WARN_ON_ONCE(!on_thread_stack() && (regs->flags & X86_FLAGS_IF) &&
preempt_count() == 0);

IOW, the actual condition we want is that, if the idtenter_entry/exit
code might schedule or if a cond_local_irq_enable() path might
schedule, we had better be on the correct stack.

Sorry for causing confusion.