On Thu, Jul 25, 2019 at 8:39 AM Daniel Axtens <dja@xxxxxxxxxx> wrote: > > > >> Would it make things simpler if we pre-populate the top level page > >> tables for the whole vmalloc region? That would be > >> (16<<40)/4096/512/512*8 = 131072 bytes? > >> The check in vmalloc_fault in not really a big burden, so I am not > >> sure. Just brining as an option. > > > > I prefer pre-populating them. In particular, I have already spent far too much time debugging the awful explosions when the stack doesn’t have KASAN backing, and the vmap stack code is very careful to pre-populate the stack pgds — vmalloc_fault fundamentally can’t recover when the stack itself isn’t mapped. > > > > So the vmalloc_fault code, if it stays, needs some careful analysis to make sure it will actually survive all the various context switch cases. Or you can pre-populate it. > > > > No worries - I'll have another crack at prepopulating them for v2. > > I tried prepopulating them at first, but because I'm really a powerpc > developer rather than an x86 developer (and because I find mm code > confusing at the best of times) I didn't have a lot of luck. I think on > reflection I stuffed up the pgd/p4d stuff and I think I know how to fix > it. So I'll give it another go and ask for help here if I get stuck :) > I looked at this a bit more, and I think the vmalloc_fault approach is fine with one tweak. In prepare_switch_to(), you'll want to add something like: kasan_probe_shadow(next->thread.sp); where kasan_probe_shadow() is a new function that, depending on kernel config, either does nothing or reads the shadow associated with the passed-in address. Also, if you take this approach, I think you should refactor vmalloc_fault() to push the address check to a new helper: static bool is_vmalloc_fault_addr(unsigned long addr) { if (addr >= VMALLOC_START && addr < VMALLOC_END) return true; #ifdef CONFIG_WHATEVER if (addr >= whatever && etc) return true; #endif return false; } and call that from vmalloc_fault() rather than duplicating the logic. Also, thanks for doing this series!