Re: [PATCH v1 2/2] LoongArch: mm: Expand modules virtual address space to 2GB
From: Tiezhu Yang
Date: Mon Jul 20 2026 - 03:21:15 EST
On 2026/7/19 下午11:28, Xi Ruoyao wrote:
On Sun, 2026-07-19 at 12:01 +0300, Mike Rapoport wrote:
On Fri, Jul 17, 2026 at 03:57:15PM +0800, Tiezhu Yang wrote:
Frequent "execmem: unable to allocate memory" warnings are observed
during kernel module loading when updating the latest kernel.
This is because the modules virtual address region on LoongArch is
tightly constrained to 256MB, while ARM64 and RISC-V are natively
configured with a spacious 2GB region.
The constraint follows architecture ability to address kernel instructions
and data from modules code.
I don't know what are loongarch requirements, but I remember that arm64
added a layer of relocation support to allow 2G module address space.
IIUC on LoongArch the size of one module is limited to 256MB, but the
total size of modules can be up to 2GB, as the module loader creates PLT
entries for calls across the module boundary.
I'd seen the "execmem: unable to allocate memory" error loading the
large amdgpu module. But after I stripped the amdgpu module those
warnings gone away. To me this is very strange: shouldn't the module
loader just ignore the debug info even if it's not stripped instead of
requesting execmem for it???
Yes, after "strip --strip-debug drivers/gpu/drm/amd/amdgpu/amdgpu.ko",
there are no "execmem: unable to allocate memory" warnings anymore.
But we usually need the debuginfo, here are the details:
$ readelf -S drivers/gpu/drm/amd/amdgpu/amdgpu.ko
There are 78 section headers, starting at offset 0x3acdf0a0:
Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
...
[23] .debug_info PROGBITS 0000000000000000 00b73fa9
000000000bfde1bc 0000000000000000 0 0 1
[24] .rela.debug_info RELA 0000000000000000 280f2e40
0000000011f754a8 0000000000000018 I 75 23 8
...
$ objdump -h drivers/gpu/drm/amd/amdgpu/amdgpu.ko
drivers/gpu/drm/amd/amdgpu/amdgpu.ko: file format elf64-loongarch
Sections:
Idx Name Size VMA LMA File off Algn
...
14 .debug_info 0bfde1bc 0000000000000000 0000000000000000 00b73fa9 2**0
CONTENTS, RELOC, READONLY, DEBUGGING, OCTETS
...
The size of .debug_info is 0x0bfde1bc (191.87 MB),
the flag of .debug_info is not SHF_EXECINSTR or SHF_ALLOC.
The size of .rela.debug_info is 0x11f754a8 (287.46 MB),
the flag of .rela.debug_info is I (SHF_INFO_LINK).
Furthermore, I think the following changes are also necessary:
```
diff --git a/arch/loongarch/kernel/module.c b/arch/loongarch/kernel/module.c
index 7d4d571ee55e..5a4cbd27f97d 100644
--- a/arch/loongarch/kernel/module.c
+++ b/arch/loongarch/kernel/module.c
@@ -484,6 +484,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,
Elf_Addr v;
Elf_Sym *sym;
Elf_Rela *rel = (void *) sechdrs[relsec].sh_addr;
+ Elf_Shdr *dst_sec = sechdrs + sechdrs[relsec].sh_info;
pr_debug("%s: Applying relocate section %u to %u\n", __func__, relsec,
sechdrs[relsec].sh_info);
@@ -522,6 +523,10 @@ int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,
v = sym->st_value + rel[i].r_addend;
+ /* Skip advanced address pairing for non-exec sections */
+ if (!(dst_sec->sh_flags & SHF_EXECINSTR))
+ goto apply_normal;
+
if (type == R_LARCH_PCADD_LO12 || type == R_LARCH_GOT_PCADD_LO12) {
bool found = false;
unsigned int j = idx;
@@ -562,6 +567,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,
idx = j; /* Record the previous j-loop end index */
}
+apply_normal:
switch (type) {
case R_LARCH_B26:
err = apply_r_larch_b26(mod, sechdrs, location,
```
Thanks,
Tiezhu