diff --git a/0001-refactor-syscall-wrapper-for-aarch64-reduce-the-memo.patch b/0001-refactor-syscall-wrapper-for-aarch64-reduce-the-memo.patch new file mode 100644 index 0000000000000000000000000000000000000000..0f8069c593f75c64c82a4067482ce34944deadbc --- /dev/null +++ b/0001-refactor-syscall-wrapper-for-aarch64-reduce-the-memo.patch @@ -0,0 +1,166 @@ +From 6a43e037faab2f3d084fce8b16d864f18b033a48 Mon Sep 17 00:00:00 2001 +From: liqiang +Date: Mon, 17 Jun 2024 11:18:43 +0800 +Subject: [PATCH] refactor syscall wrapper for aarch64, reduce the memory range + to o be writable + +Signed-off-by: liqiang +--- + qtfs/include/symbol_wrapper.h | 14 ++++++++++++-- + qtfs/qtfs/syscall.c | 25 ++++++++++++------------- + qtfs/qtfs_common/symbol_wrapper.c | 18 ++++++------------ + 3 files changed, 30 insertions(+), 27 deletions(-) + +diff --git a/qtfs/include/symbol_wrapper.h b/qtfs/include/symbol_wrapper.h +index cef2cd9..4ce500f 100644 +--- a/qtfs/include/symbol_wrapper.h ++++ b/qtfs/include/symbol_wrapper.h +@@ -72,8 +72,18 @@ static inline int make_ro(unsigned long address) + + #ifdef __aarch64__ + extern void (*update_mapping_prot)(phys_addr_t phys, unsigned long virt, phys_addr_t size, pgprot_t prot); +-extern unsigned long start_rodata, end_rodata; +-#define section_size (end_rodata - start_rodata) ++static inline int make_rw(unsigned long address) ++{ ++ update_mapping_prot(__pa_symbol(address & PAGE_MASK), (unsigned long)(address & PAGE_MASK), PAGE_SIZE, PAGE_KERNEL); ++ return 0; ++} ++ ++static inline int make_ro(unsigned long address) ++{ ++ update_mapping_prot(__pa_symbol(address & PAGE_MASK), (unsigned long)(address & PAGE_MASK), PAGE_SIZE, PAGE_KERNEL_RO); ++ return 0; ++} ++ + #endif + + int qtfs_syscall_replace_start(void); +diff --git a/qtfs/qtfs/syscall.c b/qtfs/qtfs/syscall.c +index a02a225..7b139a4 100644 +--- a/qtfs/qtfs/syscall.c ++++ b/qtfs/qtfs/syscall.c +@@ -441,22 +441,22 @@ int qtfs_syscall_init(void) + symbols_origin[SYMBOL_SYSCALL_MOUNT] = qtfs_kern_syms.sys_call_table[__NR_mount]; + symbols_origin[SYMBOL_SYSCALL_UMOUNT] = qtfs_kern_syms.sys_call_table[__NR_umount2]; + symbols_origin[SYMBOL_SYSCALL_EPOLL_CTL] = qtfs_kern_syms.sys_call_table[__NR_epoll_ctl]; +-#ifdef __x86_64__ ++ + make_rw((unsigned long)qtfs_kern_syms.sys_call_table); ++ make_rw((unsigned long)qtfs_kern_syms.sys_call_table + PAGE_SIZE); ++#ifdef __x86_64__ + qtfs_kern_syms.sys_call_table[__NR_mount] = (unsigned long *)__x64_sys_qtfs_mount; + qtfs_kern_syms.sys_call_table[__NR_umount2] = (unsigned long *)__x64_sys_qtfs_umount; + qtfs_kern_syms.sys_call_table[__NR_epoll_ctl] = (unsigned long *)__x64_sys_qtfs_epoll_ctl; +- make_ro((unsigned long)qtfs_kern_syms.sys_call_table); + #endif + #ifdef __aarch64__ +- // disable write protection +- update_mapping_prot(__pa_symbol(start_rodata), (unsigned long)start_rodata, section_size, PAGE_KERNEL); + qtfs_kern_syms.sys_call_table[__NR_mount] = (unsigned long *)__arm64_sys_qtfs_mount; + qtfs_kern_syms.sys_call_table[__NR_umount2] = (unsigned long *)__arm64_sys_qtfs_umount; + qtfs_kern_syms.sys_call_table[__NR_epoll_ctl] = (unsigned long *)__arm64_sys_qtfs_epoll_ctl; +- // enable write protection +- update_mapping_prot(__pa_symbol(start_rodata), (unsigned long)start_rodata, section_size, PAGE_KERNEL_RO); + #endif ++ // enable write protection ++ make_ro((unsigned long)qtfs_kern_syms.sys_call_table); ++ make_ro((unsigned long)qtfs_kern_syms.sys_call_table + PAGE_SIZE); + qtfs_debug("qtfs use qtfs_mount instead of mount and umount\n"); + qtfs_debug("qtfs use qtfs_epoll_ctl instead of epoll_ctl\n"); + return 0; +@@ -464,23 +464,22 @@ int qtfs_syscall_init(void) + + int qtfs_syscall_fini(void) + { +-#ifdef __x86_64__ + make_rw((unsigned long)qtfs_kern_syms.sys_call_table); ++ make_rw((unsigned long)qtfs_kern_syms.sys_call_table + PAGE_SIZE); ++#ifdef __x86_64__ + qtfs_kern_syms.sys_call_table[__NR_mount] = (unsigned long *)symbols_origin[SYMBOL_SYSCALL_MOUNT]; + qtfs_kern_syms.sys_call_table[__NR_umount2] = (unsigned long *)symbols_origin[SYMBOL_SYSCALL_UMOUNT]; + qtfs_kern_syms.sys_call_table[__NR_epoll_ctl] = (unsigned long *)symbols_origin[SYMBOL_SYSCALL_EPOLL_CTL]; +- /*set mkdir syscall to the original one */ +- make_ro((unsigned long)qtfs_kern_syms.sys_call_table); + #endif + #ifdef __aarch64__ +- // disable write protection +- update_mapping_prot(__pa_symbol(start_rodata), (unsigned long)start_rodata, section_size, PAGE_KERNEL); + qtfs_kern_syms.sys_call_table[__NR_mount] = (unsigned long *)symbols_origin[SYMBOL_SYSCALL_MOUNT]; + qtfs_kern_syms.sys_call_table[__NR_umount2] = (unsigned long *)symbols_origin[SYMBOL_SYSCALL_UMOUNT]; + qtfs_kern_syms.sys_call_table[__NR_epoll_ctl] = (unsigned long *)symbols_origin[SYMBOL_SYSCALL_EPOLL_CTL]; +- // enable write protection +- update_mapping_prot(__pa_symbol(start_rodata), (unsigned long)start_rodata, section_size, PAGE_KERNEL_RO); + #endif ++ // enable write protection ++ make_ro((unsigned long)qtfs_kern_syms.sys_call_table); ++ make_ro((unsigned long)qtfs_kern_syms.sys_call_table + PAGE_SIZE); ++ + qtfs_info("qtfs mount umount and epoll_ctl resumed\n"); + atomic_inc(&replace_available); + return 0; +diff --git a/qtfs/qtfs_common/symbol_wrapper.c b/qtfs/qtfs_common/symbol_wrapper.c +index 84c1bd5..5ceaf5f 100644 +--- a/qtfs/qtfs_common/symbol_wrapper.c ++++ b/qtfs/qtfs_common/symbol_wrapper.c +@@ -55,7 +55,6 @@ struct pt_regs; + #endif + #ifdef __aarch64__ + void (*update_mapping_prot)(phys_addr_t phys, unsigned long virt, phys_addr_t size, pgprot_t prot); +-unsigned long start_rodata, end_rodata; + + // symbols not finded in sys call table + enum qtfs_sym_a64 { +@@ -132,9 +131,7 @@ int qtfs_kallsyms_hack_init(void) + + #ifdef __aarch64__ + update_mapping_prot = (void *)qtfs_kallsyms_lookup_name("update_mapping_prot"); +- start_rodata = (unsigned long)qtfs_kallsyms_lookup_name("__start_rodata"); +- end_rodata = (unsigned long)qtfs_kallsyms_lookup_name("__end_rodata"); +- if (update_mapping_prot == NULL || (void *)start_rodata == NULL || (void *)end_rodata == NULL) { ++ if (update_mapping_prot == NULL) { + qtfs_err("failed to init memory protect handler"); + return -1; + } +@@ -170,33 +167,30 @@ int qtfs_syscall_replace_start(void) + } + + symbols_origin[SYMBOL_SYSCALL_CONNECT] = qtfs_kern_syms.sys_call_table[__NR_connect]; ++ make_rw((unsigned long)&qtfs_kern_syms.sys_call_table[__NR_connect]); + #ifdef __x86_64__ +- make_rw((unsigned long)qtfs_kern_syms.sys_call_table); + qtfs_kern_syms.sys_call_table[__NR_connect] = (unsigned long *)__x64_sys_qtfs_connect; +- make_ro((unsigned long)qtfs_kern_syms.sys_call_table); + #endif + + #ifdef __aarch64__ +- update_mapping_prot(__pa_symbol(start_rodata), (unsigned long)start_rodata, section_size, PAGE_KERNEL); + qtfs_kern_syms.sys_call_table[__NR_connect] = (unsigned long *)__arm64_sys_qtfs_connect; +- update_mapping_prot(__pa_symbol(start_rodata), (unsigned long)start_rodata, section_size, PAGE_KERNEL_RO); + #endif ++ make_ro((unsigned long)&qtfs_kern_syms.sys_call_table[__NR_connect]); + return 0; + } + + void qtfs_syscall_replace_stop(void) + { ++ make_rw((unsigned long)&qtfs_kern_syms.sys_call_table[__NR_connect]); + #ifdef __x86_64__ +- make_rw((unsigned long)qtfs_kern_syms.sys_call_table); + qtfs_kern_syms.sys_call_table[__NR_connect] = (void *)qtfs_kallsyms_lookup_name("__x64_sys_connect"); +- make_ro((unsigned long)qtfs_kern_syms.sys_call_table); + #endif + + #ifdef __aarch64__ +- update_mapping_prot(__pa_symbol(start_rodata), (unsigned long)start_rodata, section_size, PAGE_KERNEL); + qtfs_kern_syms.sys_call_table[__NR_connect] = (void *)qtfs_kallsyms_lookup_name("__arm64_sys_connect"); +- update_mapping_prot(__pa_symbol(start_rodata), (unsigned long)start_rodata, section_size, PAGE_KERNEL_RO); + #endif ++ make_ro((unsigned long)&qtfs_kern_syms.sys_call_table[__NR_connect]); ++ + atomic_inc(&replace_available); + } + +-- +2.37.1 (Apple Git-137.1) + diff --git a/0002-fix-readdir-bug-in-devtmpfs.patch b/0002-fix-readdir-bug-in-devtmpfs.patch new file mode 100644 index 0000000000000000000000000000000000000000..c49680bdd5fc85cd48f704c1101af6839c8c7c04 --- /dev/null +++ b/0002-fix-readdir-bug-in-devtmpfs.patch @@ -0,0 +1,45 @@ +From 645c009ced7f759d0d26c6f0a0b53a084cf82db5 Mon Sep 17 00:00:00 2001 +From: liqiang +Date: Wed, 10 Jul 2024 02:37:00 +0000 +Subject: [PATCH] fix readdir bug in devtmpfs if /dev/ have a large number of + files, readdir can't get whole informations, because of direct save and use + file->f_pos is not correct in devtmpfs + +Just use vfs_llseek to instead. + +Signed-off-by: liqiang +--- + qtfs/qtfs_server/fsops.c | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +diff --git a/qtfs/qtfs_server/fsops.c b/qtfs/qtfs_server/fsops.c +index cd7365d..f2f3749 100644 +--- a/qtfs/qtfs_server/fsops.c ++++ b/qtfs/qtfs_server/fsops.c +@@ -668,14 +668,20 @@ static int handle_readdir(struct qtserver_arg *arg) + rsp->d.vldcnt = 0; + return sizeof(struct qtrsp_readdir) - sizeof(rsp->dirent); + } +- file->f_pos = req->pos; ++ if (vfs_llseek(file, req->pos, SEEK_SET) < 0) { ++ qtfs_err("handle readdir error, file path:%s seek set:%lld failed", req->path, req->pos); ++ rsp->d.ret = QTFS_ERR; ++ rsp->d.vldcnt = 0; ++ filp_close(file, NULL); ++ return sizeof(struct qtrsp_readdir) - sizeof(rsp->dirent); ++ } + ret = iterate_dir(file, &buf.ctx); +- rsp->d.pos = file->f_pos; ++ rsp->d.pos = vfs_llseek(file, 0, SEEK_CUR); + rsp->d.ret = QTFS_OK; + rsp->d.vldcnt = buf.vldcnt; + rsp->d.over = (req->pos == rsp->d.pos) ? 1 : 0; + qtfs_info("handle readdir ret:%d, pos:%lld path:%s, valid count:%d, leftcount:%d validbyte:%lu\n", +- ret, req->pos, req->path, buf.vldcnt, buf.count, sizeof(rsp->dirent) - buf.count); ++ ret, req->pos, req->path, buf.vldcnt, buf.count, req->count - buf.count); + filp_close(file, NULL); + + return sizeof(struct qtrsp_readdir_len) + req->count; +-- +2.37.1 (Apple Git-137.1) + diff --git a/0003-Change-the-maximum-number-of-qtfs-links-from-16-to-6.patch b/0003-Change-the-maximum-number-of-qtfs-links-from-16-to-6.patch new file mode 100644 index 0000000000000000000000000000000000000000..59dfe0c6b012dc15c3ad5d0ca21b45e0f7610df5 --- /dev/null +++ b/0003-Change-the-maximum-number-of-qtfs-links-from-16-to-6.patch @@ -0,0 +1,42 @@ +From 682168145e892229f39ed66d9f21dd221782a9f9 Mon Sep 17 00:00:00 2001 +From: liqiang +Date: Fri, 19 Jul 2024 11:55:23 +0000 +Subject: [PATCH] Change the maximum number of qtfs links from 16 to 64 + +Signed-off-by: liqiang +--- + qtfs/include/comm.h | 2 +- + qtfs/qtfs_common/conn.c | 4 ++++ + 2 files changed, 5 insertions(+), 1 deletion(-) + +diff --git a/qtfs/include/comm.h b/qtfs/include/comm.h +index faa8ce3..b2c4c97 100644 +--- a/qtfs/include/comm.h ++++ b/qtfs/include/comm.h +@@ -73,7 +73,7 @@ enum { + #define QTINFO_MAX_EVENT_TYPE 36 // look qtreq_type at req.h + #define QTFS_FUNCTION_LEN 64 + +-#define QTFS_MAX_THREADS 16 ++#define QTFS_MAX_THREADS 64 + #define QTFS_LOGLEVEL_STRLEN 6 + + struct qtfs_server_userp_s { +diff --git a/qtfs/qtfs_common/conn.c b/qtfs/qtfs_common/conn.c +index fa3c1b9..5f080cd 100644 +--- a/qtfs/qtfs_common/conn.c ++++ b/qtfs/qtfs_common/conn.c +@@ -667,6 +667,10 @@ static void parse_param(void) + int qtfs_conn_param_init(void) + { + #ifdef QTFS_CLIENT ++ if (qtfs_conn_max_conn > QTFS_MAX_THREADS) { ++ qtfs_err("QTFS parameter qtfs_conn_max_conn(%d) is invalid, max conn:%d", qtfs_conn_max_conn, QTFS_MAX_THREADS); ++ return -1; ++ } + qtfs_fifo_pvar_cache = kmem_cache_create("qtfs_fifo_pvar", + sizeof(struct qtfs_conn_var_s), + 0, +-- +2.37.1 (Apple Git-137.1) + diff --git a/dpu-utilities.spec b/dpu-utilities.spec index d5e302ed92522e83ee79a52fc1fa8847629cc91c..5072a12d198ef2e8249b62e1f70b3b62d6f9b2d2 100644 --- a/dpu-utilities.spec +++ b/dpu-utilities.spec @@ -1,7 +1,7 @@ Name: dpu-utilities Summary: openEuler dpu utilities -Version: 1.5 -Release: 1 +Version: 1.10 +Release: 4 License: GPL-2.0 Source: https://gitee.com/openeuler/dpu-utilities/repository/archive/v%{version}.tar.gz ExclusiveOS: linux @@ -13,6 +13,10 @@ Provides: %{name} = %{version}-%{release} %define kernel_version %(ver=`rpm -qa|grep kernel-devel`;echo ${ver#*kernel-devel-}) BuildRequires: kernel-devel >= 5.10, gcc, make, json-c-devel, glib2-devel +Patch1: 0001-refactor-syscall-wrapper-for-aarch64-reduce-the-memo.patch +Patch2: 0002-fix-readdir-bug-in-devtmpfs.patch +Patch3: 0003-Change-the-maximum-number-of-qtfs-links-from-16-to-6.patch + %description This package contains the software utilities on dpu. @@ -139,6 +143,39 @@ sed -i '/# product cut_conf/a\dpuos kiwi/minios/cfg_dpuos yes' /opt/imageT sed -i '//a\dpuos 1 rpm-dir euler_base' /opt/imageTailor/repos/RepositoryRule.conf %changelog +* Tue Jul 23 2024 liqiang 1.10-4 +- Change the maximum number of qtfs links from 16 to 64 + +* Wed Jul 10 2024 liqiang 1.10-3 +- Fix readdir bug in devtmpfs + +* Mon Jun 24 2024 liqiang 1.10-2 +- Refactor syscall wrapper for aarch64 reduce the memory + +* Fri May 24 2024 liqiang 1.10-1 +- Update to v1.10 for some features and bugfix + +* Tue Dec 26 2023 liqiang 1.6-7 +- Update recent bugfixes + +* Sat Dec 16 2023 liqiang 1.6-6 +- Update readme description and fix a bug + +* Sat Dec 16 2023 liqiang 1.6-5 +- fix event misalignment problem + +* Thu Dec 14 2023 liqiang 1.6-4 +- Fix suspend and fd leak of fifo + +* Wed Dec 13 2023 liqiang 1.6-3 +- Update some bugfix + +* Sat Dec 9 2023 liqiang 1.6-2 +- fix some problem of fifo, resolve problem in libvirt + +* Fri Dec 1 2023 Guangxing Deng 1.6-1 +- Upgrade dpu-utilities version to 1.6 + * Thu Nov 23 2023 Guangxing Deng 1.5-1 - Upgrade dpu-utilities version to 1.5 diff --git a/v1.5.tar.gz b/v1.10.tar.gz similarity index 31% rename from v1.5.tar.gz rename to v1.10.tar.gz index c3edaded445d91d67b3ce01d0ab994d900fca25f..e9206b8d29b63a8390a605c108fdebb7fb15ee12 100644 Binary files a/v1.5.tar.gz and b/v1.10.tar.gz differ