diff --git a/0001-fix-64K-pagesize-scan-problem.patch b/0001-fix-64K-pagesize-scan-problem.patch new file mode 100644 index 0000000..8c389d1 --- /dev/null +++ b/0001-fix-64K-pagesize-scan-problem.patch @@ -0,0 +1,109 @@ +From b5543c083777aa5d75d6b240b718f8c6be2def12 Mon Sep 17 00:00:00 2001 +From: liubo +Date: Thu, 18 Mar 2021 15:13:22 +0800 +Subject: [PATCH] fix 64K pagesize scan problem + +Signed-off-by: liubo +--- + inc/etmemd_inc/etmemd_scan.h | 1 + + src/etmemd_src/etmemd.c | 5 +++++ + src/etmemd_src/etmemd_scan.c | 38 ++++++++++++++++++++++++++++++++++++-- + 3 files changed, 42 insertions(+), 2 deletions(-) + +diff --git a/inc/etmemd_inc/etmemd_scan.h b/inc/etmemd_inc/etmemd_scan.h +index dbb6f70..9ae387e 100644 +--- a/inc/etmemd_inc/etmemd_scan.h ++++ b/inc/etmemd_inc/etmemd_scan.h +@@ -109,4 +109,5 @@ void clean_page_refs_unexpected(void *arg); + void clean_memory_grade_unexpected(void *arg); + + struct page_refs *add_page_refs_into_memory_grade(struct page_refs *page_refs, struct page_refs **list); ++int init_g_page_size(void); + #endif +diff --git a/src/etmemd_src/etmemd.c b/src/etmemd_src/etmemd.c +index 6670197..d99b7c8 100644 +--- a/src/etmemd_src/etmemd.c ++++ b/src/etmemd_src/etmemd.c +@@ -20,6 +20,7 @@ + #include "etmemd_rpc.h" + #include "etmemd_common.h" + #include "etmemd_project.h" ++#include "etmemd_scan.h" + + int main(int argc, char *argv[]) + { +@@ -35,6 +36,10 @@ int main(int argc, char *argv[]) + return 0; + } + ++ if (init_g_page_size() == -1) { ++ return -1; ++ } ++ + etmemd_handle_signal(); + if (etmemd_rpc_server() != 0) { + printf("fail to start rpc server of etmemd\n"); +diff --git a/src/etmemd_src/etmemd_scan.c b/src/etmemd_src/etmemd_scan.c +index 8617e8f..d67c940 100644 +--- a/src/etmemd_src/etmemd_scan.c ++++ b/src/etmemd_src/etmemd_scan.c +@@ -45,12 +45,46 @@ static const enum page_type g_page_type_by_idle_kind[] = { + PAGE_TYPE_INVAL, + }; + +-static const u_int64_t g_page_size[PAGE_TYPE_INVAL] = { ++static u_int64_t g_page_size[PAGE_TYPE_INVAL] = { + 1UL << PTE_SIZE_SHIFT, /* PTE size */ + 1UL << PMD_SIZE_SHIFT, /* PMD size */ + 1UL << PUD_SIZE_SHIFT, /* PUD size */ + }; + ++static unsigned int get_page_shift(long pagesize) ++{ ++ unsigned int page_shift = 0; ++ pagesize = pagesize >> 1; ++ while (pagesize != 0) { ++ page_shift++; ++ pagesize = pagesize >> 1; ++ } ++ ++ return page_shift; ++} ++ ++int init_g_page_size(void) ++{ ++ unsigned int page_shift; ++ long pagesize = -1; ++ ++ pagesize = sysconf(_SC_PAGESIZE); ++ if (pagesize == -1) { ++ etmemd_log(ETMEMD_LOG_ERR, "get pagesize fail, error: %d\n", errno); ++ return -1; ++ } ++ ++ /* In the x86 architecture, the pagesize is 4kB. In the arm64 architecture, ++ * the pagesize is 4KB, 16KB, 64KB. Therefore, the pagesize in different ++ * scenarios is calculated as follows: */ ++ page_shift = get_page_shift(pagesize); ++ g_page_size[PTE_TYPE] = 1 << page_shift; /* PTE_SIZE */ ++ g_page_size[PMD_TYPE] = 1 << (((page_shift - 3) * (4 - 2)) + 3); /* PMD_SIZE = (page_shift - 3) * (4 - 2) + 3 */ ++ g_page_size[PUD_TYPE] = 1 << (((page_shift - 3) * (4 - 1)) + 3); /* PUD_SIZE = (page_shift - 3) * (4 - 1) + 3 */ ++ ++ return 0; ++} ++ + static bool is_anonymous(const struct vma *vma) + { + if (vma->stat[VMA_STAT_MAY_SHARE] || vma->stat[VMA_STAT_EXEC]) { +@@ -470,7 +504,7 @@ static struct page_refs **walk_vmas(int fd, + + /* we make the buffer size as fitable as within a vma. + * because the size of buffer passed to kernel will be calculated again (<< (3 + PAGE_SHIFT)) */ +- size = (walk_address->walk_end - walk_address->walk_start) >> (3 + PAGE_SHIFT); ++ size = ((walk_address->walk_end - walk_address->walk_start) >> 3) / g_page_size[PTE_TYPE]; + + /* we need to compare the size to the minimum size that kernel handled */ + size = size < EPT_IDLE_BUF_MIN ? EPT_IDLE_BUF_MIN : size; +-- +1.8.3.1 + diff --git a/etmem.spec b/etmem.spec index dd9e650..b2ce292 100644 --- a/etmem.spec +++ b/etmem.spec @@ -2,11 +2,13 @@ Name: etmem Version: 1.0 -Release: 1 +Release: 2 Summary: etmem License: Mulan PSL v2 Source0: etmem-%{version}.tar.gz +Patch0: 0001-fix-64K-pagesize-scan-problem.patch + #Dependency BuildRequires: cmake BuildRequires: libboundscheck @@ -44,5 +46,8 @@ install -m 0600 conf/example_conf.yaml $RPM_BUILD_ROOT%{_sysconfdir}/etmem/ %postun -p /sbin/ldconfig %changelog +* Thu Mar 18 2021 liubo 1.0-2 +- Fix 64K pagesize scan problem + * Thu Mar 18 2021 louhongxiang - Package init