From 68a66e5c31a3310cc7d6b1c6e496b5e12ea27c76 Mon Sep 17 00:00:00 2001 From: c30027328 Date: Wed, 26 Jul 2023 17:33:35 +0800 Subject: [PATCH] add hugepage malloc --- src/binfmt_rto/binfmt_rto.c | 44 +++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/src/binfmt_rto/binfmt_rto.c b/src/binfmt_rto/binfmt_rto.c index 2c4f9cf..730e8d3 100644 --- a/src/binfmt_rto/binfmt_rto.c +++ b/src/binfmt_rto/binfmt_rto.c @@ -603,9 +603,24 @@ create_elf_tables(struct linux_binprm *bprm, const struct elfhdr *exec, return 0; } +static unsigned long vm_mmap_hugepage(struct file *filep, unsigned long addr, + unsigned long len, unsigned long prot, + unsigned long flag, unsigned long off) +{ + if (len & (HPAGE_SIZE - 1)) + return -EINVAL; + unsigned long ret; + struct mm_struct *mm = current->mm; + unsigned long populate; + LIST_HEAD(uf); + // to do mmap hugepage + + return ret; +} + static unsigned long elf_map(struct file *filep, unsigned long addr, const struct elf_phdr *eppnt, int prot, int type, - unsigned long total_size) + unsigned long total_size, bool is_rto_format) { unsigned long map_addr; unsigned long size = eppnt->p_filesz + ELF_PAGEOFFSET(eppnt->p_vaddr); @@ -628,9 +643,13 @@ static unsigned long elf_map(struct file *filep, unsigned long addr, */ if (total_size) { total_size = ELF_PAGEALIGN(total_size); - map_addr = vm_mmap(filep, addr, total_size, prot, type, off); - if (!BAD_ADDR(map_addr)) - vm_munmap(map_addr+size, total_size-size); + if (is_rto_format) { + vm_mmap_hugepage(filep, addr, total_size, prot, type, off); + } else { + map_addr = vm_mmap(filep, addr, total_size, prot, type, off); + if (!BAD_ADDR(map_addr)) + vm_munmap(map_addr+size, total_size-size); + } } else map_addr = vm_mmap(filep, addr, size, prot, type, off); @@ -891,7 +910,7 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex, load_addr = -vaddr; map_addr = elf_map(interpreter, load_addr + vaddr, - eppnt, elf_prot, elf_type, total_size); + eppnt, elf_prot, elf_type, total_size, is_rto_format); total_size = 0; error = map_addr; if (BAD_ADDR(map_addr)) @@ -1254,10 +1273,17 @@ load_rto: goto out_free_ph; retval = -ENOMEM; - elf_interpreter = kmalloc(elf_ppnt->p_filesz, GFP_KERNEL); - if (!elf_interpreter) + + if (is_rto_format) { + // alloc hugepage + elf_interpreter = kmalloc(elf_ppnt->p_filesz, GFP_TRANSHUGE); + } else { + elf_interpreter = kmalloc(elf_ppnt->p_filesz, GFP_KERNEL); + } + + if (!elf_interpreter) goto out_free_ph; - + retval = elf_read(bprm->file, elf_interpreter, elf_ppnt->p_filesz, elf_ppnt->p_offset); if (retval < 0) @@ -1511,7 +1537,7 @@ out_free_interp: } error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt, - elf_prot, elf_flags, total_size); + elf_prot, elf_flags, total_size, is_rto_format); if (BAD_ADDR(error)) { retval = IS_ERR((void *)error) ? PTR_ERR((void*)error) : -EINVAL; -- Gitee