On Tue, Jun 16, 2020 at 01:24:15PM +0200, Peter Zijlstra wrote: > > +void *module_alloc_prot(unsigned long size, pgprot_t prot) > > { > > + unsigned int flags = (pgprot_val(prot) & _PAGE_NX) ? > > + 0 : VM_FLUSH_RESET_PERMS; > > void *p; > > > > if (PAGE_ALIGN(size) > MODULES_LEN) > > @@ -75,7 +77,7 @@ void *module_alloc(unsigned long size) > > p = __vmalloc_node_range(size, MODULE_ALIGN, > > MODULES_VADDR + get_module_load_offset(), > > MODULES_END, GFP_KERNEL, > > - PAGE_KERNEL, 0, NUMA_NO_NODE, > > + prot, flags, NUMA_NO_NODE, > > __builtin_return_address(0)); > > if (p && (kasan_module_alloc(p, size) < 0)) { > > vfree(p); > > Hurmm.. Yes it would. It just doesn't feel right though. Can't we > unconditionally set the flag? At worst it makes free a little bit more > expensive. > > The thing is, I don't think _NX is the only prot that needs restoring. > Any prot other than the default (RW IIRC) needs restoring. If that actually is the case I think we should just check for a non-default permission in __vmalloc_node_range itself and handle it there, which seems like a nice solution.