From d19850a66f383fbdf2de9fb4da8aa51f8a462b2d Mon Sep 17 00:00:00 2001 From: Liu Yuntao Date: Fri, 24 Nov 2023 16:44:11 +0800 Subject: [PATCH] fix use_hpage concurrent bug and add some information for debug --- src/sysboost_loader/binfmt_rto_604.c | 15 +++++++++------ src/sysboost_loader/loader_device.c | 12 ++++++++++++ src/sysboost_loader/loader_device.h | 2 ++ 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/sysboost_loader/binfmt_rto_604.c b/src/sysboost_loader/binfmt_rto_604.c index 10e2ce3..d30ae57 100644 --- a/src/sysboost_loader/binfmt_rto_604.c +++ b/src/sysboost_loader/binfmt_rto_604.c @@ -1157,6 +1157,7 @@ static int load_elf_binary(struct linux_binprm *bprm) struct loaded_rto *loaded_rto = NULL; struct list_head *preload_seg_pos = NULL; struct loaded_seg *loaded_seg; + bool using_hpage = false; #endif retval = -ENOEXEC; @@ -1183,8 +1184,10 @@ load_rto: struct inode *inode = bprm->file->f_inode; int ret; - if (use_hpage) + if (use_hpage) { loaded_rto = find_loaded_rto(bprm->file->f_inode); + using_hpage = true; + } ret = try_replace_file(bprm); if (ret) goto out; @@ -1198,7 +1201,7 @@ load_rto: /* loading rto from now on */ if (debug) { pr_info("exec in rto mode, filename: %s, loaded_rto: %pK\n", - bprm->file->f_path.dentry->d_iname, loaded_rto); + FILE_TO_NAME(bprm->file), loaded_rto); } #ifdef CONFIG_ARM64 /* close vdso optimization on arm64 in case of BUG */ @@ -1505,7 +1508,7 @@ out_free_interp: * is then page aligned. */ #ifdef CONFIG_ELF_SYSBOOST - if (use_hpage) + if (using_hpage) load_bias = ELF_HPAGESTART(load_bias - vaddr); else load_bias = ELF_PAGESTART(load_bias - vaddr); @@ -1541,7 +1544,7 @@ out_free_interp: #ifdef CONFIG_ELF_SYSBOOST error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt, - elf_prot, elf_flags, total_size, true, is_exec_seg); + elf_prot, elf_flags, total_size, using_hpage, is_exec_seg); #else error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt, elf_prot, elf_flags, total_size); @@ -1556,7 +1559,7 @@ out_free_interp: goto out_free_dentry; } #ifdef CONFIG_ELF_SYSBOOST - if (use_hpage && preload_seg_pos) { + if (using_hpage && preload_seg_pos) { preload_seg_pos = preload_seg_pos->next; BUG_ON(preload_seg_pos == &loaded_rto->segs); loaded_seg = list_entry(preload_seg_pos, @@ -1576,7 +1579,7 @@ out_free_interp: first_pt_load = 0; if (elf_ex->e_type == ET_DYN) { #ifdef CONFIG_ELF_SYSBOOST - if (use_hpage) { + if (using_hpage) { load_bias += error - ELF_HPAGESTART(load_bias + vaddr); } else { diff --git a/src/sysboost_loader/loader_device.c b/src/sysboost_loader/loader_device.c index b3ce370..812158d 100644 --- a/src/sysboost_loader/loader_device.c +++ b/src/sysboost_loader/loader_device.c @@ -172,22 +172,26 @@ static int preload_rto(struct file *file) rto_file = try_get_rto_file(file); if (IS_ERR(rto_file)) { + pr_info("%s: try_get_rto_file fail\n", __func__); return -ENOENT; } loaded_rto = loaded_rto_alloc(inode); if (!loaded_rto) { + pr_info("%s: loaded_rto_alloc fail\n", __func__); ret = -ENOMEM; goto error_alloc; } elf_ex = load_bprm_buf(rto_file); if (IS_ERR(elf_ex)) { + pr_info("%s: load_bprm_buf fail\n", __func__); ret = PTR_ERR(elf_ex); goto error_bprm_buf; } elf_phdata = load_elf_phdrs(elf_ex, rto_file); if (!elf_phdata) { + pr_info("%s: load_elf_phdrs fail\n", __func__); ret = -EIO; goto error_phdrs; } @@ -195,6 +199,14 @@ static int preload_rto(struct file *file) for(i = 0, elf_ppnt = elf_phdata; i < elf_ex->e_phnum; i++, elf_ppnt++) { if (elf_ppnt->p_type != PT_LOAD) continue; + + if (elf_ppnt->p_align < HPAGE_SIZE) { + pr_info("%s: align must >= 0x%lx, current file %s align is 0x%llx\n", + __func__, HPAGE_SIZE, + FILE_TO_NAME(rto_file), elf_ppnt->p_align); + ret = -EINVAL; + goto error_seg; + } size = elf_ppnt->p_filesz + ELF_HPAGEOFFSET(elf_ppnt->p_vaddr); offset = elf_ppnt->p_offset - ELF_HPAGEOFFSET(elf_ppnt->p_vaddr); diff --git a/src/sysboost_loader/loader_device.h b/src/sysboost_loader/loader_device.h index a1a6e78..a701c58 100644 --- a/src/sysboost_loader/loader_device.h +++ b/src/sysboost_loader/loader_device.h @@ -42,3 +42,5 @@ void *load_bprm_buf(struct file *file); #define RTO_LOAD_FLAG_LOAD 0x1 #define RTO_LOAD_FLAG_PRELOAD 0x2 #define RTO_LOAD_FLAG_MAX 0x100 + +#define FILE_TO_NAME(x) (x->f_path.dentry->d_iname) -- Gitee