On Thu, Jan 23, 2025 at 11:48:10AM -0800, Josh Poimboeuf wrote: > On Thu, Jan 23, 2025 at 09:40:26AM +0100, Peter Zijlstra wrote: > > On Wed, Jan 22, 2025 at 02:49:02PM -0800, Josh Poimboeuf wrote: > > > But also, the nmi_cookie is still needed for the case where the NMI > > > arrives before info->cookie gets cleared by early entry-from-user. > > > > So how about we clear cookie (and set nr_entries to -1) at > > I think we could set nr_entries to 0 instead of -1? > > > return-to-user, after we've done the work loop and have interrupts > > disabled until we hit userspace. > > > > Any NMI that hits there will have to cause another entry anyway. > > But there's a cookie mismatch: > > // return-to-user: IRQs disabled > <NMI> > current->unwind_info.cookie = 0x1234 > </NMI> > unwind_exit_to_user_mode() > current->unwind_info.cookie = 0 > IRET > <IRQ> > task_work() > callback(@cookie=WRONG)
Though, assuming we're keeping the unwind_work struct, there's a simpler alternative to nmi_cookie: store the cookie in the unwind_work. Then the task work can just use that instead of current->unwind_info.cookie. -- Josh