On Thu, Oct 27, 2022 at 11:26:50AM -0700, Alexander Potapenko wrote: > On Thu, Oct 27, 2022 at 1:05 AM Peter Zijlstra <peterz@xxxxxxxxxxxxx> wrote: > > > > On Wed, Oct 26, 2022 at 11:38:53AM -0700, Alexander Potapenko wrote: > > > A bigger issue from the NMI perspective is probably > > > having __msan_poison_alloca() inserted in every non-noinstr kernel > > > function, because that hook may acquire the stackdepot lock. > > > > *urgghhh* that's broken, that must not be. There is a *TON* of NMI > > functions that are non-noinstr. > > __msan_poison_alloca() is guarded by kmsan_in_runtime(), which is > currently implemented as: > > static __always_inline bool kmsan_in_runtime(void) > { > if ((hardirq_count() >> HARDIRQ_SHIFT) > 1) > return true; > return kmsan_get_context()->kmsan_in_runtime; > } > > I think the easiest way to fix the NMI situation would be adding "if > in_nmi() return true"? It might help to look through these threads: https://lore.kernel.org/lkml/20220916135953.1320601-1-keescook@xxxxxxxxxxxx/ https://lore.kernel.org/all/20220919201648.2250764-1-keescook@xxxxxxxxxxxx/ I wandered around attempting to deal with in_nmi(), etc. And in the end just drop the attempt to cover it. It's worth noting that copy_from_user_nmi() exists on 1 architecture and has exactly 1 call-site... -- Kees Cook