Message ID | 20240429121620.1186447-1-rppt@kernel.org (mailing list archive) |
---|---|
Headers | show |
Series | mm: jit/text allocator | expand |
On Mon, Apr 29, 2024 at 03:16:04PM +0300, Mike Rapoport wrote: > From: "Mike Rapoport (IBM)" <rppt@kernel.org> > > Hi, > > The patches are also available in git: > https://git.kernel.org/pub/scm/linux/kernel/git/rppt/linux.git/log/?h=execmem/v7 > > v7 changes: > * define MODULE_{VADDR,END} for riscv32 to fix the build and avoid > #ifdefs in a function body > * add Acks, thanks everybody Thanks, I've pushed this to modules-next for further exposure / testing. Given the status of testing so far with prior revisions, in that only a few issues were found and that those were fixed, and the status of reviews, this just might be ripe for v6.10. Luis
On Mon, Apr 29, 2024 at 09:29:20AM -0700, Luis Chamberlain wrote: > On Mon, Apr 29, 2024 at 03:16:04PM +0300, Mike Rapoport wrote: > > From: "Mike Rapoport (IBM)" <rppt@kernel.org> > > > > Hi, > > > > The patches are also available in git: > > https://git.kernel.org/pub/scm/linux/kernel/git/rppt/linux.git/log/?h=execmem/v7 > > > > v7 changes: > > * define MODULE_{VADDR,END} for riscv32 to fix the build and avoid > > #ifdefs in a function body > > * add Acks, thanks everybody > > Thanks, I've pushed this to modules-next for further exposure / testing. > Given the status of testing so far with prior revisions, in that only a > few issues were found and that those were fixed, and the status of > reviews, this just might be ripe for v6.10. Looks like there is still some work needed. I've picked up next-20240501 and on arch/mips with CONFIG_MODULE_COMPRESS_XZ=y and CONFIG_MODULE_DECOMPRESS=y I fail to load any module: # modprobe rfkill [11746.539090] Invalid ELF header magic: != ELF [11746.587149] execmem: unable to allocate memory modprobe: can't load module rfkill (kernel/net/rfkill/rfkill.ko.xz): Out of memory The (hopefully) relevant parts of my .config: CONFIG_HAVE_KERNEL_XZ=y CONFIG_MIPS=y CONFIG_RALINK=y CONFIG_SOC_MT7621=y CONFIG_EXECMEM=y CONFIG_MODULES_USE_ELF_REL=y CONFIG_MODULES=y # CONFIG_MODULE_DEBUG is not set # CONFIG_MODULE_FORCE_LOAD is not set CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set # CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set # CONFIG_MODULE_COMPRESS_NONE is not set # CONFIG_MODULE_COMPRESS_GZIP is not set CONFIG_MODULE_COMPRESS_XZ=y # CONFIG_MODULE_COMPRESS_ZSTD is not set CONFIG_MODULE_DECOMPRESS=y # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set CONFIG_MODULES_TREE_LOOKUP=y Best regards, Liviu > > Luis >
On Thu, May 02, 2024 at 11:50:36PM +0100, Liviu Dudau wrote: > On Mon, Apr 29, 2024 at 09:29:20AM -0700, Luis Chamberlain wrote: > > On Mon, Apr 29, 2024 at 03:16:04PM +0300, Mike Rapoport wrote: > > > From: "Mike Rapoport (IBM)" <rppt@kernel.org> > > > > > > Hi, > > > > > > The patches are also available in git: > > > https://git.kernel.org/pub/scm/linux/kernel/git/rppt/linux.git/log/?h=execmem/v7 > > > > > > v7 changes: > > > * define MODULE_{VADDR,END} for riscv32 to fix the build and avoid > > > #ifdefs in a function body > > > * add Acks, thanks everybody > > > > Thanks, I've pushed this to modules-next for further exposure / testing. > > Given the status of testing so far with prior revisions, in that only a > > few issues were found and that those were fixed, and the status of > > reviews, this just might be ripe for v6.10. > > Looks like there is still some work needed. I've picked up next-20240501 > and on arch/mips with CONFIG_MODULE_COMPRESS_XZ=y and CONFIG_MODULE_DECOMPRESS=y > I fail to load any module: > > # modprobe rfkill > [11746.539090] Invalid ELF header magic: != ELF > [11746.587149] execmem: unable to allocate memory > modprobe: can't load module rfkill (kernel/net/rfkill/rfkill.ko.xz): Out of memory > > The (hopefully) relevant parts of my .config: Thanks for the report! Any chance we can get you to try a bisection? I think it should take 2-3 test boots. To help reduce scope you try modules-next: https://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux.git/log/?h=modules-next Then can you check by resetting your tree to commmit 3fbe6c2f820a76 (mm: introduce execmem_alloc() and execmem_free()"). I suspect that should boot, so your bad commit would be the tip 3c2c250cb3a5fbb ("bpf: remove CONFIG_BPF_JIT dependency on CONFIG_MODULES of"). That gives us only a few commits to bisect: git log --oneline 3fbe6c2f820a76bc36d5546bda85832f57c8fce2.. 3c2c250cb3a5 (HEAD -> modules-next, korg/modules-next) bpf: remove CONFIG_BPF_JIT dependency on CONFIG_MODULES of 11e8e65cce5c kprobes: remove dependency on CONFIG_MODULES e10cbc38697b powerpc: use CONFIG_EXECMEM instead of CONFIG_MODULES where appropriate 4da3d38f24c5 x86/ftrace: enable dynamic ftrace without CONFIG_MODULES 13ae3d74ee70 arch: make execmem setup available regardless of CONFIG_MODULES 460bbbc70a47 powerpc: extend execmem_params for kprobes allocations e1a14069b5b4 arm64: extend execmem_info for generated code allocations 971e181c6585 riscv: extend execmem_params for generated code allocations 0fa276f26721 mm/execmem, arch: convert remaining overrides of module_alloc to execmem 022cef244287 mm/execmem, arch: convert simple overrides of module_alloc to execmem With 2-3 boots we should be to tell which is the bad commit. Luis
On Thu, May 02, 2024 at 04:07:05PM -0700, Luis Chamberlain wrote: > On Thu, May 02, 2024 at 11:50:36PM +0100, Liviu Dudau wrote: > > On Mon, Apr 29, 2024 at 09:29:20AM -0700, Luis Chamberlain wrote: > > > On Mon, Apr 29, 2024 at 03:16:04PM +0300, Mike Rapoport wrote: > > > > From: "Mike Rapoport (IBM)" <rppt@kernel.org> > > > > > > > > Hi, > > > > > > > > The patches are also available in git: > > > > https://git.kernel.org/pub/scm/linux/kernel/git/rppt/linux.git/log/?h=execmem/v7 > > > > > > > > v7 changes: > > > > * define MODULE_{VADDR,END} for riscv32 to fix the build and avoid > > > > #ifdefs in a function body > > > > * add Acks, thanks everybody > > > > > > Thanks, I've pushed this to modules-next for further exposure / testing. > > > Given the status of testing so far with prior revisions, in that only a > > > few issues were found and that those were fixed, and the status of > > > reviews, this just might be ripe for v6.10. > > > > Looks like there is still some work needed. I've picked up next-20240501 > > and on arch/mips with CONFIG_MODULE_COMPRESS_XZ=y and CONFIG_MODULE_DECOMPRESS=y > > I fail to load any module: > > > > # modprobe rfkill > > [11746.539090] Invalid ELF header magic: != ELF > > [11746.587149] execmem: unable to allocate memory > > modprobe: can't load module rfkill (kernel/net/rfkill/rfkill.ko.xz): Out of memory > > > > The (hopefully) relevant parts of my .config: > > Thanks for the report! Any chance we can get you to try a bisection? I > think it should take 2-3 test boots. To help reduce scope you try modules-next: > > https://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux.git/log/?h=modules-next > > Then can you check by resetting your tree to commmit 3fbe6c2f820a76 (mm: > introduce execmem_alloc() and execmem_free()"). I suspect that should > boot, so your bad commit would be the tip 3c2c250cb3a5fbb ("bpf: remove > CONFIG_BPF_JIT dependency on CONFIG_MODULES of"). > > That gives us only a few commits to bisect: > > git log --oneline 3fbe6c2f820a76bc36d5546bda85832f57c8fce2.. > 3c2c250cb3a5 (HEAD -> modules-next, korg/modules-next) bpf: remove CONFIG_BPF_JIT dependency on CONFIG_MODULES of > 11e8e65cce5c kprobes: remove dependency on CONFIG_MODULES > e10cbc38697b powerpc: use CONFIG_EXECMEM instead of CONFIG_MODULES where appropriate > 4da3d38f24c5 x86/ftrace: enable dynamic ftrace without CONFIG_MODULES > 13ae3d74ee70 arch: make execmem setup available regardless of CONFIG_MODULES > 460bbbc70a47 powerpc: extend execmem_params for kprobes allocations > e1a14069b5b4 arm64: extend execmem_info for generated code allocations > 971e181c6585 riscv: extend execmem_params for generated code allocations > 0fa276f26721 mm/execmem, arch: convert remaining overrides of module_alloc to execmem > 022cef244287 mm/execmem, arch: convert simple overrides of module_alloc to execmem > > With 2-3 boots we should be to tell which is the bad commit. Looks like 0fa276f26721 is the first bad commit. $ git bisect log # bad: [3c2c250cb3a5fbbccc4a4ff4c9354c54af91f02c] bpf: remove CONFIG_BPF_JIT dependency on CONFIG_MODULES of # good: [3fbe6c2f820a76bc36d5546bda85832f57c8fce2] mm: introduce execmem_alloc() and execmem_free() git bisect start '3c2c250cb3a5' '3fbe6c2f820a76' # bad: [460bbbc70a47e929b1936ca68979f3b79f168fc6] powerpc: extend execmem_params for kprobes allocations git bisect bad 460bbbc70a47e929b1936ca68979f3b79f168fc6 # bad: [0fa276f26721e0ffc2ae9c7cf67dcc005b43c67e] mm/execmem, arch: convert remaining overrides of module_alloc to execmem git bisect bad 0fa276f26721e0ffc2ae9c7cf67dcc005b43c67e # good: [022cef2442870db738a366d3b7a636040c081859] mm/execmem, arch: convert simple overrides of module_alloc to execmem git bisect good 022cef2442870db738a366d3b7a636040c081859 # first bad commit: [0fa276f26721e0ffc2ae9c7cf67dcc005b43c67e] mm/execmem, arch: convert remaining overrides of module_alloc to execmem Maybe MIPS also needs a ARCH_WANTS_EXECMEM_LATE? Best regards, Liviu > > Luis >
On Fri, May 03, 2024 at 01:23:30AM +0100, Liviu Dudau wrote: > On Thu, May 02, 2024 at 04:07:05PM -0700, Luis Chamberlain wrote: > > On Thu, May 02, 2024 at 11:50:36PM +0100, Liviu Dudau wrote: > > > On Mon, Apr 29, 2024 at 09:29:20AM -0700, Luis Chamberlain wrote: > > > > On Mon, Apr 29, 2024 at 03:16:04PM +0300, Mike Rapoport wrote: > > > > > From: "Mike Rapoport (IBM)" <rppt@kernel.org> > > > > > > > > > > Hi, > > > > > > > > > > The patches are also available in git: > > > > > https://git.kernel.org/pub/scm/linux/kernel/git/rppt/linux.git/log/?h=execmem/v7 > > > > > > > > > > v7 changes: > > > > > * define MODULE_{VADDR,END} for riscv32 to fix the build and avoid > > > > > #ifdefs in a function body > > > > > * add Acks, thanks everybody > > > > > > > > Thanks, I've pushed this to modules-next for further exposure / testing. > > > > Given the status of testing so far with prior revisions, in that only a > > > > few issues were found and that those were fixed, and the status of > > > > reviews, this just might be ripe for v6.10. > > > > > > Looks like there is still some work needed. I've picked up next-20240501 > > > and on arch/mips with CONFIG_MODULE_COMPRESS_XZ=y and CONFIG_MODULE_DECOMPRESS=y > > > I fail to load any module: > > > > > > # modprobe rfkill > > > [11746.539090] Invalid ELF header magic: != ELF > > > [11746.587149] execmem: unable to allocate memory > > > modprobe: can't load module rfkill (kernel/net/rfkill/rfkill.ko.xz): Out of memory > > > > > > The (hopefully) relevant parts of my .config: > > > > Thanks for the report! Any chance we can get you to try a bisection? I > > think it should take 2-3 test boots. To help reduce scope you try modules-next: > > > > https://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux.git/log/?h=modules-next > > > > Then can you check by resetting your tree to commmit 3fbe6c2f820a76 (mm: > > introduce execmem_alloc() and execmem_free()"). I suspect that should > > boot, so your bad commit would be the tip 3c2c250cb3a5fbb ("bpf: remove > > CONFIG_BPF_JIT dependency on CONFIG_MODULES of"). > > > > That gives us only a few commits to bisect: > > > > git log --oneline 3fbe6c2f820a76bc36d5546bda85832f57c8fce2.. > > 3c2c250cb3a5 (HEAD -> modules-next, korg/modules-next) bpf: remove CONFIG_BPF_JIT dependency on CONFIG_MODULES of > > 11e8e65cce5c kprobes: remove dependency on CONFIG_MODULES > > e10cbc38697b powerpc: use CONFIG_EXECMEM instead of CONFIG_MODULES where appropriate > > 4da3d38f24c5 x86/ftrace: enable dynamic ftrace without CONFIG_MODULES > > 13ae3d74ee70 arch: make execmem setup available regardless of CONFIG_MODULES > > 460bbbc70a47 powerpc: extend execmem_params for kprobes allocations > > e1a14069b5b4 arm64: extend execmem_info for generated code allocations > > 971e181c6585 riscv: extend execmem_params for generated code allocations > > 0fa276f26721 mm/execmem, arch: convert remaining overrides of module_alloc to execmem > > 022cef244287 mm/execmem, arch: convert simple overrides of module_alloc to execmem > > > > With 2-3 boots we should be to tell which is the bad commit. > > Looks like 0fa276f26721 is the first bad commit. > > $ git bisect log > # bad: [3c2c250cb3a5fbbccc4a4ff4c9354c54af91f02c] bpf: remove CONFIG_BPF_JIT dependency on CONFIG_MODULES of > # good: [3fbe6c2f820a76bc36d5546bda85832f57c8fce2] mm: introduce execmem_alloc() and execmem_free() > git bisect start '3c2c250cb3a5' '3fbe6c2f820a76' > # bad: [460bbbc70a47e929b1936ca68979f3b79f168fc6] powerpc: extend execmem_params for kprobes allocations > git bisect bad 460bbbc70a47e929b1936ca68979f3b79f168fc6 > # bad: [0fa276f26721e0ffc2ae9c7cf67dcc005b43c67e] mm/execmem, arch: convert remaining overrides of module_alloc to execmem > git bisect bad 0fa276f26721e0ffc2ae9c7cf67dcc005b43c67e > # good: [022cef2442870db738a366d3b7a636040c081859] mm/execmem, arch: convert simple overrides of module_alloc to execmem > git bisect good 022cef2442870db738a366d3b7a636040c081859 > # first bad commit: [0fa276f26721e0ffc2ae9c7cf67dcc005b43c67e] mm/execmem, arch: convert remaining overrides of module_alloc to execmem > > Maybe MIPS also needs a ARCH_WANTS_EXECMEM_LATE? I don't think so. It rather seems there's a bug in the initialization of the defaults in execmem. This should fix it: diff --git a/mm/execmem.c b/mm/execmem.c index f6dc3fabc1ca..0c4b36bc6d10 100644 --- a/mm/execmem.c +++ b/mm/execmem.c @@ -118,7 +118,6 @@ static void __init __execmem_init(void) info->ranges[EXECMEM_DEFAULT].end = VMALLOC_END; info->ranges[EXECMEM_DEFAULT].pgprot = PAGE_KERNEL_EXEC; info->ranges[EXECMEM_DEFAULT].alignment = 1; - return; } if (!execmem_validate(info)) > Best regards, > Liviu
On Fri, May 03, 2024 at 09:28:25AM +0300, Mike Rapoport wrote: > On Fri, May 03, 2024 at 01:23:30AM +0100, Liviu Dudau wrote: > > On Thu, May 02, 2024 at 04:07:05PM -0700, Luis Chamberlain wrote: > > > On Thu, May 02, 2024 at 11:50:36PM +0100, Liviu Dudau wrote: > > > > On Mon, Apr 29, 2024 at 09:29:20AM -0700, Luis Chamberlain wrote: > > > > > On Mon, Apr 29, 2024 at 03:16:04PM +0300, Mike Rapoport wrote: > > > > > > From: "Mike Rapoport (IBM)" <rppt@kernel.org> > > > > > > > > > > > > Hi, > > > > > > > > > > > > The patches are also available in git: > > > > > > https://git.kernel.org/pub/scm/linux/kernel/git/rppt/linux.git/log/?h=execmem/v7 > > > > > > > > > > > > v7 changes: > > > > > > * define MODULE_{VADDR,END} for riscv32 to fix the build and avoid > > > > > > #ifdefs in a function body > > > > > > * add Acks, thanks everybody > > > > > > > > > > Thanks, I've pushed this to modules-next for further exposure / testing. > > > > > Given the status of testing so far with prior revisions, in that only a > > > > > few issues were found and that those were fixed, and the status of > > > > > reviews, this just might be ripe for v6.10. > > > > > > > > Looks like there is still some work needed. I've picked up next-20240501 > > > > and on arch/mips with CONFIG_MODULE_COMPRESS_XZ=y and CONFIG_MODULE_DECOMPRESS=y > > > > I fail to load any module: > > > > > > > > # modprobe rfkill > > > > [11746.539090] Invalid ELF header magic: != ELF > > > > [11746.587149] execmem: unable to allocate memory > > > > modprobe: can't load module rfkill (kernel/net/rfkill/rfkill.ko.xz): Out of memory > > > > > > > > The (hopefully) relevant parts of my .config: > > > > > > Thanks for the report! Any chance we can get you to try a bisection? I > > > think it should take 2-3 test boots. To help reduce scope you try modules-next: > > > > > > https://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux.git/log/?h=modules-next > > > > > > Then can you check by resetting your tree to commmit 3fbe6c2f820a76 (mm: > > > introduce execmem_alloc() and execmem_free()"). I suspect that should > > > boot, so your bad commit would be the tip 3c2c250cb3a5fbb ("bpf: remove > > > CONFIG_BPF_JIT dependency on CONFIG_MODULES of"). > > > > > > That gives us only a few commits to bisect: > > > > > > git log --oneline 3fbe6c2f820a76bc36d5546bda85832f57c8fce2.. > > > 3c2c250cb3a5 (HEAD -> modules-next, korg/modules-next) bpf: remove CONFIG_BPF_JIT dependency on CONFIG_MODULES of > > > 11e8e65cce5c kprobes: remove dependency on CONFIG_MODULES > > > e10cbc38697b powerpc: use CONFIG_EXECMEM instead of CONFIG_MODULES where appropriate > > > 4da3d38f24c5 x86/ftrace: enable dynamic ftrace without CONFIG_MODULES > > > 13ae3d74ee70 arch: make execmem setup available regardless of CONFIG_MODULES > > > 460bbbc70a47 powerpc: extend execmem_params for kprobes allocations > > > e1a14069b5b4 arm64: extend execmem_info for generated code allocations > > > 971e181c6585 riscv: extend execmem_params for generated code allocations > > > 0fa276f26721 mm/execmem, arch: convert remaining overrides of module_alloc to execmem > > > 022cef244287 mm/execmem, arch: convert simple overrides of module_alloc to execmem > > > > > > With 2-3 boots we should be to tell which is the bad commit. > > > > Looks like 0fa276f26721 is the first bad commit. > > > > $ git bisect log > > # bad: [3c2c250cb3a5fbbccc4a4ff4c9354c54af91f02c] bpf: remove CONFIG_BPF_JIT dependency on CONFIG_MODULES of > > # good: [3fbe6c2f820a76bc36d5546bda85832f57c8fce2] mm: introduce execmem_alloc() and execmem_free() > > git bisect start '3c2c250cb3a5' '3fbe6c2f820a76' > > # bad: [460bbbc70a47e929b1936ca68979f3b79f168fc6] powerpc: extend execmem_params for kprobes allocations > > git bisect bad 460bbbc70a47e929b1936ca68979f3b79f168fc6 > > # bad: [0fa276f26721e0ffc2ae9c7cf67dcc005b43c67e] mm/execmem, arch: convert remaining overrides of module_alloc to execmem > > git bisect bad 0fa276f26721e0ffc2ae9c7cf67dcc005b43c67e > > # good: [022cef2442870db738a366d3b7a636040c081859] mm/execmem, arch: convert simple overrides of module_alloc to execmem > > git bisect good 022cef2442870db738a366d3b7a636040c081859 > > # first bad commit: [0fa276f26721e0ffc2ae9c7cf67dcc005b43c67e] mm/execmem, arch: convert remaining overrides of module_alloc to execmem > > > > Maybe MIPS also needs a ARCH_WANTS_EXECMEM_LATE? > > I don't think so. It rather seems there's a bug in the initialization of > the defaults in execmem. This should fix it: > > diff --git a/mm/execmem.c b/mm/execmem.c > index f6dc3fabc1ca..0c4b36bc6d10 100644 > --- a/mm/execmem.c > +++ b/mm/execmem.c > @@ -118,7 +118,6 @@ static void __init __execmem_init(void) > info->ranges[EXECMEM_DEFAULT].end = VMALLOC_END; > info->ranges[EXECMEM_DEFAULT].pgprot = PAGE_KERNEL_EXEC; > info->ranges[EXECMEM_DEFAULT].alignment = 1; > - return; > } > > if (!execmem_validate(info)) > That does, indeed, fix the issue! You can add my Tested-by when you submit the patch. Best regards, Liviu > > -- > Sincerely yours, > Mike. >
From: "Mike Rapoport (IBM)" <rppt@kernel.org> Hi, The patches are also available in git: https://git.kernel.org/pub/scm/linux/kernel/git/rppt/linux.git/log/?h=execmem/v7 v7 changes: * define MODULE_{VADDR,END} for riscv32 to fix the build and avoid #ifdefs in a function body * add Acks, thanks everybody v6: https://lore.kernel.org/all/20240426082854.7355-1-rppt@kernel.org * restore patch "arm64: extend execmem_info for generated code allocations" that disappeared in v5 rebase * update execmem initialization so that by default it will be initialized early while late initialization will be an opt-in v5: https://lore.kernel.org/all/20240422094436.3625171-1-rppt@kernel.org * rebase on v6.9-rc4 to avoid a conflict in kprobes * add copyrights to mm/execmem.c (Luis) * fix spelling (Ingo) * define MODULES_VADDDR for sparc (Sam) * consistently initialize struct execmem_info (Peter) * reduce #ifdefs in function bodies in kprobes (Masami) v4: https://lore.kernel.org/all/20240411160051.2093261-1-rppt@kernel.org * rebase on v6.9-rc2 * rename execmem_params to execmem_info and execmem_arch_params() to execmem_arch_setup() * use single execmem_alloc() API instead of execmem_{text,data}_alloc() (Song) * avoid extra copy of execmem parameters (Rick) * run execmem_init() as core_initcall() except for the architectures that may allocated text really early (currently only x86) (Will) * add acks for some of arm64 and riscv changes, thanks Will and Alexandre * new commits: - drop call to kasan_alloc_module_shadow() on arm64 because it's not needed anymore - rename MODULE_START to MODULES_VADDR on MIPS - use CONFIG_EXECMEM instead of CONFIG_MODULES on powerpc as per Christophe: https://lore.kernel.org/all/79062fa3-3402-47b3-8920-9231ad05e964@csgroup.eu/ v3: https://lore.kernel.org/all/20230918072955.2507221-1-rppt@kernel.org * add type parameter to execmem allocation APIs * remove BPF dependency on modules v2: https://lore.kernel.org/all/20230616085038.4121892-1-rppt@kernel.org * Separate "module" and "others" allocations with execmem_text_alloc() and jit_text_alloc() * Drop ROX entailment on x86 * Add ack for nios2 changes, thanks Dinh Nguyen v1: https://lore.kernel.org/all/20230601101257.530867-1-rppt@kernel.org = Cover letter from v1 (sligtly updated) = module_alloc() is used everywhere as a mean to allocate memory for code. Beside being semantically wrong, this unnecessarily ties all subsystmes that need to allocate code, such as ftrace, kprobes and BPF to modules and puts the burden of code allocation to the modules code. Several architectures override module_alloc() because of various constraints where the executable memory can be located and this causes additional obstacles for improvements of code allocation. A centralized infrastructure for code allocation allows allocations of executable memory as ROX, and future optimizations such as caching large pages for better iTLB performance and providing sub-page allocations for users that only need small jit code snippets. Rick Edgecombe proposed perm_alloc extension to vmalloc [1] and Song Liu proposed execmem_alloc [2], but both these approaches were targeting BPF allocations and lacked the ground work to abstract executable allocations and split them from the modules core. Thomas Gleixner suggested to express module allocation restrictions and requirements as struct mod_alloc_type_params [3] that would define ranges, protections and other parameters for different types of allocations used by modules and following that suggestion Song separated allocations of different types in modules (commit ac3b43283923 ("module: replace module_layout with module_memory")) and posted "Type aware module allocator" set [4]. I liked the idea of parametrising code allocation requirements as a structure, but I believe the original proposal and Song's module allocator was too module centric, so I came up with these patches. This set splits code allocation from modules by introducing execmem_alloc() and and execmem_free(), APIs, replaces call sites of module_alloc() and module_memfree() with the new APIs and implements core text and related allocations in a central place. Instead of architecture specific overrides for module_alloc(), the architectures that require non-default behaviour for text allocation must fill execmem_info structure and implement execmem_arch_setup() that returns a pointer to that structure. If an architecture does not implement execmem_arch_setup(), the defaults compatible with the current modules::module_alloc() are used. Since architectures define different restrictions on placement, permissions, alignment and other parameters for memory that can be used by different subsystems that allocate executable memory, execmem APIs take a type argument, that will be used to identify the calling subsystem and to allow architectures to define parameters for ranges suitable for that subsystem. The new infrastructure allows decoupling of BPF, kprobes and ftrace from modules, and most importantly it paves the way for ROX allocations for executable memory. [1] https://lore.kernel.org/lkml/20201120202426.18009-1-rick.p.edgecombe@intel.com/ [2] https://lore.kernel.org/all/20221107223921.3451913-1-song@kernel.org/ [3] https://lore.kernel.org/all/87v8mndy3y.ffs@tglx/ [4] https://lore.kernel.org/all/20230526051529.3387103-1-song@kernel.org Mike Rapoport (IBM) (16): arm64: module: remove unneeded call to kasan_alloc_module_shadow() mips: module: rename MODULE_START to MODULES_VADDR nios2: define virtual address space for modules sparc: simplify module_alloc() module: make module_memory_{alloc,free} more self-contained mm: introduce execmem_alloc() and execmem_free() mm/execmem, arch: convert simple overrides of module_alloc to execmem mm/execmem, arch: convert remaining overrides of module_alloc to execmem riscv: extend execmem_params for generated code allocations arm64: extend execmem_info for generated code allocations powerpc: extend execmem_params for kprobes allocations arch: make execmem setup available regardless of CONFIG_MODULES x86/ftrace: enable dynamic ftrace without CONFIG_MODULES powerpc: use CONFIG_EXECMEM instead of CONFIG_MODULES where appropriate kprobes: remove dependency on CONFIG_MODULES bpf: remove CONFIG_BPF_JIT dependency on CONFIG_MODULES of arch/Kconfig | 10 +- arch/arm/kernel/module.c | 34 ------- arch/arm/mm/init.c | 45 +++++++++ arch/arm64/Kconfig | 1 + arch/arm64/kernel/module.c | 126 ----------------------- arch/arm64/kernel/probes/kprobes.c | 7 -- arch/arm64/mm/init.c | 140 ++++++++++++++++++++++++++ arch/arm64/net/bpf_jit_comp.c | 11 -- arch/loongarch/kernel/module.c | 6 -- arch/loongarch/mm/init.c | 21 ++++ arch/mips/include/asm/pgtable-64.h | 4 +- arch/mips/kernel/module.c | 10 -- arch/mips/mm/fault.c | 4 +- arch/mips/mm/init.c | 23 +++++ arch/nios2/include/asm/pgtable.h | 5 +- arch/nios2/kernel/module.c | 20 ---- arch/nios2/mm/init.c | 21 ++++ arch/parisc/kernel/module.c | 12 --- arch/parisc/mm/init.c | 23 ++++- arch/powerpc/Kconfig | 2 +- arch/powerpc/include/asm/kasan.h | 2 +- arch/powerpc/kernel/head_8xx.S | 4 +- arch/powerpc/kernel/head_book3s_32.S | 6 +- arch/powerpc/kernel/kprobes.c | 22 +--- arch/powerpc/kernel/module.c | 38 ------- arch/powerpc/lib/code-patching.c | 2 +- arch/powerpc/mm/book3s32/mmu.c | 2 +- arch/powerpc/mm/mem.c | 64 ++++++++++++ arch/riscv/include/asm/pgtable.h | 3 + arch/riscv/kernel/module.c | 12 --- arch/riscv/kernel/probes/kprobes.c | 10 -- arch/riscv/mm/init.c | 35 +++++++ arch/riscv/net/bpf_jit_core.c | 13 --- arch/s390/kernel/ftrace.c | 4 +- arch/s390/kernel/kprobes.c | 4 +- arch/s390/kernel/module.c | 42 +------- arch/s390/mm/init.c | 30 ++++++ arch/sparc/include/asm/pgtable_32.h | 2 + arch/sparc/kernel/module.c | 30 ------ arch/sparc/mm/Makefile | 2 + arch/sparc/mm/execmem.c | 21 ++++ arch/sparc/net/bpf_jit_comp_32.c | 8 +- arch/x86/Kconfig | 1 + arch/x86/kernel/ftrace.c | 16 +-- arch/x86/kernel/kprobes/core.c | 4 +- arch/x86/kernel/module.c | 51 ---------- arch/x86/mm/init.c | 29 ++++++ include/linux/execmem.h | 132 ++++++++++++++++++++++++ include/linux/module.h | 9 ++ include/linux/moduleloader.h | 15 --- kernel/bpf/Kconfig | 2 +- kernel/bpf/core.c | 6 +- kernel/kprobes.c | 63 +++++++----- kernel/module/Kconfig | 1 + kernel/module/main.c | 105 +++++++++---------- kernel/trace/trace_kprobe.c | 20 +++- mm/Kconfig | 3 + mm/Makefile | 1 + mm/execmem.c | 144 +++++++++++++++++++++++++++ mm/mm_init.c | 2 + 60 files changed, 904 insertions(+), 581 deletions(-) create mode 100644 arch/sparc/mm/execmem.c create mode 100644 include/linux/execmem.h create mode 100644 mm/execmem.c base-commit: 0bbac3facb5d6cc0171c45c9873a2dc96bea9680