| From 88e96b35b3a8f67140d0699c673afb5e97e0fe07 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 30 Nov 2021 11:10:43 +0100 |
| Subject: powerpc/modules: Don't WARN on first module allocation attempt |
| |
| From: Christophe Leroy <christophe.leroy@csgroup.eu> |
| |
| [ Upstream commit f1797e4de1146009c888bcf8b6bb6648d55394f1 ] |
| |
| module_alloc() first tries to allocate module text within 24 bits direct |
| jump from kernel text, and tries a wider allocation if first one fails. |
| |
| When first allocation fails the following is observed in kernel logs: |
| |
| vmap allocation for size 2400256 failed: use vmalloc=<size> to increase size |
| systemd-udevd: vmalloc error: size 2395133, vm_struct allocation failed, mode:0xcc0(GFP_KERNEL), nodemask=(null) |
| CPU: 0 PID: 127 Comm: systemd-udevd Tainted: G W 5.15.5-gentoo-PowerMacG4 #9 |
| Call Trace: |
| [e2a53a50] [c0ba0048] dump_stack_lvl+0x80/0xb0 (unreliable) |
| [e2a53a70] [c0540128] warn_alloc+0x11c/0x2b4 |
| [e2a53b50] [c0531be8] __vmalloc_node_range+0xd8/0x64c |
| [e2a53c10] [c00338c0] module_alloc+0xa0/0xac |
| [e2a53c40] [c027a368] load_module+0x2ae0/0x8148 |
| [e2a53e30] [c027fc78] sys_finit_module+0xfc/0x130 |
| [e2a53f30] [c0035098] ret_from_syscall+0x0/0x28 |
| ... |
| |
| Add __GFP_NOWARN flag to first allocation so that no warning appears |
| when it fails. |
| |
| Reported-by: Erhard Furtner <erhard_f@mailbox.org> |
| Fixes: 2ec13df16704 ("powerpc/modules: Load modules closer to kernel text") |
| Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Link: https://lore.kernel.org/r/93c9b84d6ec76aaf7b4f03468e22433a6d308674.1638267035.git.christophe.leroy@csgroup.eu |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/powerpc/kernel/module.c | 11 ++++++----- |
| 1 file changed, 6 insertions(+), 5 deletions(-) |
| |
| diff --git a/arch/powerpc/kernel/module.c b/arch/powerpc/kernel/module.c |
| index ed04a3ba66fe8..40a583e9d3c70 100644 |
| --- a/arch/powerpc/kernel/module.c |
| +++ b/arch/powerpc/kernel/module.c |
| @@ -90,16 +90,17 @@ int module_finalize(const Elf_Ehdr *hdr, |
| } |
| |
| static __always_inline void * |
| -__module_alloc(unsigned long size, unsigned long start, unsigned long end) |
| +__module_alloc(unsigned long size, unsigned long start, unsigned long end, bool nowarn) |
| { |
| pgprot_t prot = strict_module_rwx_enabled() ? PAGE_KERNEL : PAGE_KERNEL_EXEC; |
| + gfp_t gfp = GFP_KERNEL | (nowarn ? __GFP_NOWARN : 0); |
| |
| /* |
| * Don't do huge page allocations for modules yet until more testing |
| * is done. STRICT_MODULE_RWX may require extra work to support this |
| * too. |
| */ |
| - return __vmalloc_node_range(size, 1, start, end, GFP_KERNEL, prot, |
| + return __vmalloc_node_range(size, 1, start, end, gfp, prot, |
| VM_FLUSH_RESET_PERMS | VM_NO_HUGE_VMAP, |
| NUMA_NO_NODE, __builtin_return_address(0)); |
| } |
| @@ -114,13 +115,13 @@ void *module_alloc(unsigned long size) |
| |
| /* First try within 32M limit from _etext to avoid branch trampolines */ |
| if (MODULES_VADDR < PAGE_OFFSET && MODULES_END > limit) |
| - ptr = __module_alloc(size, limit, MODULES_END); |
| + ptr = __module_alloc(size, limit, MODULES_END, true); |
| |
| if (!ptr) |
| - ptr = __module_alloc(size, MODULES_VADDR, MODULES_END); |
| + ptr = __module_alloc(size, MODULES_VADDR, MODULES_END, false); |
| |
| return ptr; |
| #else |
| - return __module_alloc(size, VMALLOC_START, VMALLOC_END); |
| + return __module_alloc(size, VMALLOC_START, VMALLOC_END, false); |
| #endif |
| } |
| -- |
| 2.34.1 |
| |