Message ID | 20230601101257.530867-11-rppt@kernel.org (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | mm: jit/text allocator | expand |
Context | Check | Description |
---|---|---|
bpf/vmtest-bpf-next-PR | pending | PR summary |
netdev/tree_selection | success | Not a local patch, async |
bpf/vmtest-bpf-next-VM_Test-1 | success | Logs for ShellCheck |
bpf/vmtest-bpf-next-VM_Test-6 | success | Logs for set-matrix |
bpf/vmtest-bpf-next-VM_Test-2 | success | Logs for build for aarch64 with gcc |
bpf/vmtest-bpf-next-VM_Test-4 | success | Logs for build for x86_64 with gcc |
bpf/vmtest-bpf-next-VM_Test-5 | success | Logs for build for x86_64 with llvm-16 |
bpf/vmtest-bpf-next-VM_Test-3 | success | Logs for build for s390x with gcc |
bpf/vmtest-bpf-next-VM_Test-8 | pending | Logs for test_maps on s390x with gcc |
bpf/vmtest-bpf-next-VM_Test-12 | pending | Logs for test_progs on s390x with gcc |
bpf/vmtest-bpf-next-VM_Test-7 | success | Logs for test_maps on aarch64 with gcc |
bpf/vmtest-bpf-next-VM_Test-9 | success | Logs for test_maps on x86_64 with gcc |
bpf/vmtest-bpf-next-VM_Test-10 | success | Logs for test_maps on x86_64 with llvm-16 |
bpf/vmtest-bpf-next-VM_Test-11 | success | Logs for test_progs on aarch64 with gcc |
bpf/vmtest-bpf-next-VM_Test-13 | fail | Logs for test_progs on x86_64 with gcc |
bpf/vmtest-bpf-next-VM_Test-14 | fail | Logs for test_progs on x86_64 with llvm-16 |
bpf/vmtest-bpf-next-VM_Test-15 | success | Logs for test_progs_no_alu32 on aarch64 with gcc |
bpf/vmtest-bpf-next-VM_Test-17 | fail | Logs for test_progs_no_alu32 on x86_64 with gcc |
bpf/vmtest-bpf-next-VM_Test-18 | fail | Logs for test_progs_no_alu32 on x86_64 with llvm-16 |
bpf/vmtest-bpf-next-VM_Test-19 | success | Logs for test_progs_no_alu32_parallel on aarch64 with gcc |
bpf/vmtest-bpf-next-VM_Test-20 | success | Logs for test_progs_no_alu32_parallel on x86_64 with gcc |
bpf/vmtest-bpf-next-VM_Test-21 | success | Logs for test_progs_no_alu32_parallel on x86_64 with llvm-16 |
bpf/vmtest-bpf-next-VM_Test-22 | success | Logs for test_progs_parallel on aarch64 with gcc |
bpf/vmtest-bpf-next-VM_Test-23 | success | Logs for test_progs_parallel on x86_64 with gcc |
bpf/vmtest-bpf-next-VM_Test-24 | success | Logs for test_progs_parallel on x86_64 with llvm-16 |
bpf/vmtest-bpf-next-VM_Test-25 | success | Logs for test_verifier on aarch64 with gcc |
bpf/vmtest-bpf-next-VM_Test-26 | success | Logs for test_verifier on s390x with gcc |
bpf/vmtest-bpf-next-VM_Test-27 | success | Logs for test_verifier on x86_64 with gcc |
bpf/vmtest-bpf-next-VM_Test-28 | success | Logs for test_verifier on x86_64 with llvm-16 |
bpf/vmtest-bpf-next-VM_Test-29 | success | Logs for veristat |
bpf/vmtest-bpf-next-VM_Test-16 | success | Logs for test_progs_no_alu32 on s390x with gcc |
diff --git a/include/linux/jitalloc.h b/include/linux/jitalloc.h index 7f8cafb3cfe9..0ba5ef785a85 100644 --- a/include/linux/jitalloc.h +++ b/include/linux/jitalloc.h @@ -55,6 +55,8 @@ struct jit_alloc_params *jit_alloc_arch_params(void); void jit_free(void *buf); void *jit_text_alloc(size_t len); void *jit_data_alloc(size_t len); +void jit_update_copy(void *buf, void *new_buf, size_t len); +void jit_update_set(void *buf, int c, size_t len); #ifdef CONFIG_JIT_ALLOC void jit_alloc_init(void); diff --git a/kernel/module/main.c b/kernel/module/main.c index 91477aa5f671..9f0711c42aa2 100644 --- a/kernel/module/main.c +++ b/kernel/module/main.c @@ -1197,9 +1197,19 @@ void __weak module_arch_freeing_init(struct module *mod) static void *module_memory_alloc(unsigned int size, enum mod_mem_type type) { - if (mod_mem_type_is_data(type)) - return jit_data_alloc(size); - return jit_text_alloc(size); + void *p; + + if (mod_mem_type_is_data(type)) { + p = jit_data_alloc(size); + if (p) + memset(p, 0, size); + } else { + p = jit_text_alloc(size); + if (p) + jit_update_set(p, 0, size); + } + + return p; } static void module_memory_free(void *ptr, enum mod_mem_type type) @@ -2223,7 +2233,6 @@ static int move_module(struct module *mod, struct load_info *info) t = type; goto out_enomem; } - memset(ptr, 0, mod->mem[type].size); mod->mem[type].base = ptr; } @@ -2251,7 +2260,7 @@ static int move_module(struct module *mod, struct load_info *info) ret = -ENOEXEC; goto out_enomem; } - memcpy(dest, (void *)shdr->sh_addr, shdr->sh_size); + jit_update_copy(dest, (void *)shdr->sh_addr, shdr->sh_size); } /* * Update the userspace copy's ELF section address to point to diff --git a/mm/jitalloc.c b/mm/jitalloc.c index 16fd715d501a..a8ae64364d56 100644 --- a/mm/jitalloc.c +++ b/mm/jitalloc.c @@ -7,6 +7,16 @@ static struct jit_alloc_params jit_alloc_params; +static inline void jit_text_poke_copy(void *dst, const void *src, size_t len) +{ + memcpy(dst, src, len); +} + +static inline void jit_text_poke_set(void *addr, int c, size_t len) +{ + memset(addr, c, len); +} + static void *jit_alloc(size_t len, unsigned int alignment, pgprot_t pgprot, unsigned long start, unsigned long end, unsigned long fallback_start, unsigned long fallback_end, @@ -86,6 +96,16 @@ void *jit_data_alloc(size_t len) fallback_start, fallback_end, kasan); } +void jit_update_copy(void *buf, void *new_buf, size_t len) +{ + jit_text_poke_copy(buf, new_buf, len); +} + +void jit_update_set(void *addr, int c, size_t len) +{ + jit_text_poke_set(addr, c, len); +} + struct jit_alloc_params * __weak jit_alloc_arch_params(void) { return NULL;