On Tue, Jul 14, 2020 at 11:33:33AM +0100, Russell King - ARM Linux admin wrote: > On Tue, Jul 14, 2020 at 01:17:22PM +0300, Ard Biesheuvel wrote: > > On Tue, 14 Jul 2020 at 12:53, Jarkko Sakkinen > > <jarkko.sakki...@linux.intel.com> wrote: > > > > > > On Mon, Jul 13, 2020 at 10:49:48PM +0300, Ard Biesheuvel wrote: > > > > This patch suggests that there are other reasons why conflating > > > > allocation of module space and allocating text pages for other uses > > > > is a bad idea, but switching all users to text_alloc() is a step in > > > > the wrong direction. It would be better to stop using module_alloc() > > > > in core code except in the module loader, and have a generic > > > > text_alloc() that can be overridden by the arch if necessary. Note > > > > that x86 and s390 are the only architectures that use module_alloc() > > > > in ftrace code. > > > > > > This series essentially does this: introduces text_alloc() and > > > text_memfree(), which have generic implementations in kernel/text.c. > > > Those can be overriddent by arch specific implementations. > > > > > > What you think should be done differently than in my patch set? > > > > > > > On arm64, module_alloc is only used by the module loader, and so > > pulling it out and renaming it will cause unused code to be > > incorporated into the kernel when building without module support, > > which is the use case you claim to be addressing. > > > > Module_alloc has semantics that are intimately tied to the module > > loader, but over the years, it ended up being (ab)used by other > > subsystems, which don't require those semantics but just need n pages > > of vmalloc space with executable permissions. > > > > So the correct approach is to make text_alloc() implement just that, > > generically, and switch bpf etc to use it. Then, only on architectures > > that need it, override it with an implementation that has the required > > additional semantics. > > > > Refactoring 10+ architectures like this without any regard for how > > text_alloc() deviates from module_alloc() just creates a lot of churn > > that others will have to clean up after you. > > For 32-bit ARM, our bpf code uses "blx/bx" (or equivalent code > sequences) rather than encoding a "bl" or "b", so BPF there doesn't > care where the executable memory is mapped, and doesn't need any > PLTs. Given that, should bpf always allocate from the vmalloc() > region to preserve the module space for modules?
Most of the allocators use __vmalloc_node_range() but arch/nios2 uses just plain kmalloc(): /* * Modules should NOT be allocated with kmalloc for (obvious) reasons. * But we do it for now to avoid relocation issues. CALL26/PCREL26 cannot reach * from 0x80000000 (vmalloc area) to 0xc00000000 (kernel) (kmalloc returns * addresses in 0xc0000000) */ void *module_alloc(unsigned long size) { if (size == 0) return NULL; return kmalloc(size, GFP_KERNEL); } Also consider arch/x86 module_alloc(): void *module_alloc(unsigned long size) { void *p; if (PAGE_ALIGN(size) > MODULES_LEN) return NULL; p = __vmalloc_node_range(size, MODULE_ALIGN, MODULES_VADDR + get_module_load_offset(), MODULES_END, GFP_KERNEL, PAGE_KERNEL, 0, NUMA_NO_NODE, __builtin_return_address(0)); if (p && (kasan_module_alloc(p, size) < 0)) { vfree(p); return NULL; } return p; } The generic version is void * __weak module_alloc(unsigned long size) { return __vmalloc_node_range(size, 1, VMALLOC_START, VMALLOC_END, GFP_KERNEL, PAGE_KERNEL_EXEC, VM_FLUSH_RESET_PERMS, NUMA_NO_NODE, __builtin_return_address(0)); } There is quite a lot of divergence from the generic version. However, in other arch's it's mostly just divergence in vmalloc() parameters and not as radical as in x86. I could probably limit the total havoc to just nios2 and x86 if there is a set of vmalloc parameters that work for all arch's. Then there could be kernel/text.c and re-implementations for x86 and nios2. I'm all for having separate text_alloc() and text_memfree() if these issues can be somehow sorted out. /Jarkko