!60 upgrade etmem version to 1.1

From: @liubo254 
Reviewed-by: @louhongxiang 
Signed-off-by: @liuzhiqiang26
This commit is contained in:
openeuler-ci-bot 2023-02-03 06:52:50 +00:00 committed by Gitee
commit 672efb140c
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
87 changed files with 5 additions and 32940 deletions

View File

@ -1,109 +0,0 @@
From b5543c083777aa5d75d6b240b718f8c6be2def12 Mon Sep 17 00:00:00 2001
From: liubo <liubo254@huawei.com>
Date: Thu, 18 Mar 2021 15:13:22 +0800
Subject: [PATCH] fix 64K pagesize scan problem
Signed-off-by: liubo <liubo254@huawei.com>
---
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

View File

@ -1,39 +0,0 @@
From 4ea1e7293c73143cc60a0d90bc16dfea4ebb7770 Mon Sep 17 00:00:00 2001
From: sunshihao <sunshihao@huawei.com>
Date: Sat, 20 Mar 2021 18:14:42 +0800
Subject: [PATCH] change aarch64 march to armv8-a
The atomic operation is used in the etmem code,
If the compiler instruction set is higher than the
executor instruction set, the etmemd process will crash.
Signed-off-by: liubo <liubo254@huawei.com>
---
CMakeLists.txt | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c3064f7..a4a83ca 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -71,7 +71,7 @@ set_target_properties(etmemd PROPERTIES LINK_FLAGS "-s -fPIE -pie -fPIC -Wl,-z,r
target_link_libraries(etmemd PRIVATE pthread dl rt boundscheck)
if( ${ARCHITECTURE} STREQUAL "aarch64" )
- target_compile_options(etmemd PRIVATE -march=native)
+ target_compile_options(etmemd PRIVATE -march=armv8-a)
else()
target_compile_options(etmemd PRIVATE -march=core-avx-i -m64)
endif()
@@ -86,7 +86,7 @@ set_target_properties(etmem PROPERTIES LINK_FLAGS "-s -fPIE -pie -fPIC -Wl,-z,re
target_link_libraries(etmem PRIVATE pthread dl rt boundscheck)
if( ${ARCHITECTURE} STREQUAL "aarch64" )
- target_compile_options(etmem PRIVATE -march=native)
+ target_compile_options(etmem PRIVATE -march=armv8-a)
else()
target_compile_options(etmem PRIVATE -march=core-avx-i -m64)
endif()
--
1.8.3.1

View File

@ -1,82 +0,0 @@
From a8620c7e4e5ddb1123e97ed10c2f1bc0a6684d0d Mon Sep 17 00:00:00 2001
From: louhongxiang <louhongxiang@huawei.com>
Date: Fri, 2 Apr 2021 11:29:02 +0800
Subject: [PATCH 03/50] update README.md.
---
README.md | 21 ++++++++++++---------
1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/README.md b/README.md
index 54e28f9..3e2a50a 100644
--- a/README.md
+++ b/README.md
@@ -4,15 +4,19 @@
随着CPU算力的发展尤其是ARM核成本的降低内存成本和内存容量成为约束业务成本和性能的核心痛点因此如何节省内存成本如何扩大内存容量成为存储迫切要解决的问题。
-etmem内存垂直扩展技术通过DRAM+内存压缩/高性能存储新介质形成多级内存存储,对内存数据进行分级,将分级后的内存冷数据从内存介质迁移到高性能存储介质中,达到内存容量扩展的目的,从而实现内存成本下降。
+etmem内存分级扩展技术通过DRAM+内存压缩/高性能存储新介质形成多级内存存储,对内存数据进行分级,将分级后的内存冷数据从内存介质迁移到高性能存储介质中,达到内存容量扩展的目的,从而实现内存成本下降。
-## 安装教程
+## 编译教程
1. 下载etmem源码
- $ git clone https://gitee.com/src-openeuler/etmem.git
+ $ git clone https://gitee.com/openeuler/etmem.git
-2. 编译安装
+2. 编译和运行依赖
+
+ etmem的编译和运行依赖于libboundscheck组件
+
+3. 编译
$ cd etmem
@@ -24,7 +28,6 @@ etmem内存垂直扩展技术通过DRAM+内存压缩/高性能存储新介质
$ make
- $ make install
## 使用说明
@@ -56,7 +59,7 @@ options
在运行etmem进程之前需要管理员预先规划哪些进程需要做内存扩展将进程信息配置到etmem配置文件中并配置内存扫描的周期、扫描次数、内存冷热阈值等信息。
-配置文件的示例文件在安装etmem软件包后放置在/etc/etmem/example_conf.yaml示例内容为
+配置文件的示例文件在源码包中放置在源码根目录的conf/example_conf.yaml建议在使用时放置在/etc/etmem/目录下,示例内容为:
```
options:
@@ -100,7 +103,7 @@ options:
#### 使用方法
-通过etmem二进制执行工程创建/删除/查询操作,前提是服务端已经成功运行,并且配置文件/etc/etmem/example_conf.yaml内容正确。
+通过etmem二进制执行工程创建/删除/查询操作前提是服务端已经成功运行并且配置文件e.g. /etc/etmem/example_conf.yaml内容正确。
添加工程:
@@ -173,7 +176,7 @@ show命令
#### 使用方法
-通过etmem二进制执行任务启动/停止操作,前提是服务端已经成功运行,配置文件/etc/etmem/example_conf.yaml内容正确且etmem工程已经创建。
+通过etmem二进制执行任务启动/停止操作,前提是服务端已经成功运行,配置文件(e.g. /etc/etmem/example_conf.yaml)内容正确且etmem工程已经创建。
启动工程
@@ -213,4 +216,4 @@ Usage:
1. Fork本仓库
2. 新建个人分支
3. 提交代码
-4. 新建Pull Request
\ No newline at end of file
+4. 新建Pull Request
--
2.27.0

File diff suppressed because it is too large Load Diff

View File

@ -1,256 +0,0 @@
From b54b30489959a7692cc6d484e3b16d1d54f7ed85 Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Sun, 25 Apr 2021 21:44:44 +0800
Subject: [PATCH 05/50] fix code check problems
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
inc/etmemd_inc/etmemd_project.h | 3 ++-
src/etmem_src/etmem_common.c | 2 +-
src/etmemd_src/etmemd_common.c | 2 ++
src/etmemd_src/etmemd_cslide.c | 32 +++++++++++++++++++++-----------
src/etmemd_src/etmemd_project.c | 9 ++++++---
src/etmemd_src/etmemd_rpc.c | 4 ++--
src/etmemd_src/etmemd_slide.c | 4 ++--
7 files changed, 36 insertions(+), 20 deletions(-)
diff --git a/inc/etmemd_inc/etmemd_project.h b/inc/etmemd_inc/etmemd_project.h
index d15c7fd..e574a84 100644
--- a/inc/etmemd_inc/etmemd_project.h
+++ b/inc/etmemd_inc/etmemd_project.h
@@ -102,7 +102,8 @@ enum opt_result etmemd_migrate_start(const char *project_name);
* */
enum opt_result etmemd_migrate_stop(const char *project_name);
-enum opt_result etmemd_project_mgt_engine(const char *project_name, const char *eng_name, char *cmd, char *task_name, int sock_fd);
+enum opt_result etmemd_project_mgt_engine(const char *project_name, const char *eng_name, char *cmd, char *task_name,
+ int sock_fd);
enum opt_result etmemd_project_add_engine(GKeyFile *config);
enum opt_result etmemd_project_remove_engine(GKeyFile *config);
enum opt_result etmemd_project_add_task(GKeyFile *config);
diff --git a/src/etmem_src/etmem_common.c b/src/etmem_src/etmem_common.c
index 65d3690..8d0cee3 100644
--- a/src/etmem_src/etmem_common.c
+++ b/src/etmem_src/etmem_common.c
@@ -36,7 +36,7 @@ int parse_name_string(const char *val, char **name_str, size_t max_len)
return -EINVAL;
}
if (len > max_len) {
- printf("string is too long, it should not be larger than %lu\n", max_len);
+ printf("string is too long, it should not be larger than %zu\n", max_len);
return -ENAMETOOLONG;
}
diff --git a/src/etmemd_src/etmemd_common.c b/src/etmemd_src/etmemd_common.c
index 43ed013..4b9c4cb 100644
--- a/src/etmemd_src/etmemd_common.c
+++ b/src/etmemd_src/etmemd_common.c
@@ -403,12 +403,14 @@ int dprintf_all(int fd, const char *format, ...)
ret = vsprintf_s(line, FILE_LINE_MAX_LEN, format, args_in);
if (ret > FILE_LINE_MAX_LEN) {
etmemd_log(ETMEMD_LOG_ERR, "fprintf_all fail as truncated.\n");
+ va_end(args_in);
return -1;
}
ret = write_all(fd, line);
if (ret < 0) {
etmemd_log(ETMEMD_LOG_ERR, "write_all fail.\n");
+ va_end(args_in);
return -1;
}
diff --git a/src/etmemd_src/etmemd_cslide.c b/src/etmemd_src/etmemd_cslide.c
index a3692ad..5fd1c32 100644
--- a/src/etmemd_src/etmemd_cslide.c
+++ b/src/etmemd_src/etmemd_cslide.c
@@ -8,7 +8,7 @@
* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
* PURPOSE.
* See the Mulan PSL v2 for more details.
- * Author: louhongxiang
+ * Author: shikemeng
* Create: 2021-4-19
* Description: Memigd cslide API.
******************************************************************************/
@@ -44,7 +44,9 @@
#define BATCHSIZE (1 << 16)
#define factory_foreach_working_pid_params(iter, factory) \
- for ((iter) = (factory)->working_head, next_working_params(&(iter)); (iter) != NULL; (iter) = (iter)->next, next_working_params(&(iter)))
+ for ((iter) = (factory)->working_head, next_working_params(&(iter)); \
+ (iter) != NULL; \
+ (iter) = (iter)->next, next_working_params(&(iter)))
#define factory_foreach_pid_params(iter, factory) \
for ((iter) = (factory)->working_head; (iter) != NULL; (iter) = (iter)->next)
@@ -184,7 +186,8 @@ struct page_filter {
void (*flow_cal_func)(struct flow_ctrl *ctrl);
long long (*flow_move_func)(struct flow_ctrl *ctrl, long long target, int node);
bool (*flow_enough)(struct flow_ctrl *ctrl);
- void (*filter_policy)(struct page_filter *filter, struct node_pair *pair, struct count_page_refs *cpf, struct memory_grade *memory_grade);
+ void (*filter_policy)(struct page_filter *filter, struct node_pair *pair,
+ struct count_page_refs *cpf, struct memory_grade *memory_grade);
struct flow_ctrl *ctrl;
int count_start;
int count_end;
@@ -509,7 +512,6 @@ static int add_node_pair(struct node_map *map, int cold_node, int hot_node)
return 0;
}
-
static int init_node_verifier(struct node_verifier *nv, int node_num)
{
nv->nodes_map_count = calloc(node_num, sizeof(int));
@@ -933,7 +935,8 @@ static bool node_cal_cold_can_move(struct node_ctrl *node_ctrl)
{
long long can_move;
- can_move = node_ctrl->quota < node_ctrl->reserve - node_ctrl->free ? node_ctrl->quota : node_ctrl->reserve - node_ctrl->free;
+ can_move = node_ctrl->quota < node_ctrl->reserve - node_ctrl->free ?
+ node_ctrl->quota : node_ctrl->reserve - node_ctrl->free;
if (can_move > node_ctrl->cold_free) {
can_move = node_ctrl->cold_free;
}
@@ -956,7 +959,8 @@ static inline bool node_move_cold(struct node_ctrl *node_ctrl, long long *target
return cap_cost(&node_ctrl->cold_move_cap, target);
}
-static int init_flow_ctrl(struct flow_ctrl *ctrl, struct sys_mem *sys_mem, struct node_map *node_map, long long quota, long long reserve)
+static int init_flow_ctrl(struct flow_ctrl *ctrl, struct sys_mem *sys_mem, struct node_map *node_map,
+ long long quota, long long reserve)
{
struct node_pair *pair = NULL;
struct node_ctrl *tmp = NULL;
@@ -1114,7 +1118,8 @@ static void do_filter(struct page_filter *filter, struct cslide_eng_params *eng_
}
}
-static void to_hot_policy(struct page_filter *filter, struct node_pair *pair, struct count_page_refs *cpf, struct memory_grade *memory_grade)
+static void to_hot_policy(struct page_filter *filter, struct node_pair *pair,
+ struct count_page_refs *cpf, struct memory_grade *memory_grade)
{
long long can_move;
struct node_page_refs *npf = &cpf->node_pfs[pair->cold_node];
@@ -1123,7 +1128,8 @@ static void to_hot_policy(struct page_filter *filter, struct node_pair *pair, st
move_npf_to_list(npf, &memory_grade->hot_pages, can_move);
}
-static void to_cold_policy(struct page_filter *filter, struct node_pair *pair, struct count_page_refs *cpf, struct memory_grade *memory_grade)
+static void to_cold_policy(struct page_filter *filter, struct node_pair *pair,
+ struct count_page_refs *cpf, struct memory_grade *memory_grade)
{
long long can_move;
struct node_page_refs *npf = &cpf->node_pfs[pair->hot_node];
@@ -1376,7 +1382,9 @@ static int cslide_merge_share_vmas(struct cslide_eng_params *eng_params)
vma_pf = g_share_vma_head;
while (vma_pf != NULL) {
- for (iter = vma_pf->next, count = 1; iter != NULL && iter->vma->inode == vma_pf->vma->inode; iter = iter->next, count++) {
+ for (iter = vma_pf->next, count = 1;
+ iter != NULL && iter->vma->inode == vma_pf->vma->inode;
+ iter = iter->next, count++) {
;
}
if (count > 1) {
@@ -1403,7 +1411,8 @@ static int cslide_get_vmas(struct cslide_pid_params *pid_params)
etmemd_log(ETMEMD_LOG_ERR, "sprintf pid %u fail\n", pid_params->pid);
return -1;
}
- pid_params->vmas = get_vmas_with_flags(pid, task_params->vmflags_array, task_params->vmflags_num, task_params->anon_only);
+ pid_params->vmas = get_vmas_with_flags(pid, task_params->vmflags_array, task_params->vmflags_num,
+ task_params->anon_only);
if (pid_params->vmas == NULL) {
etmemd_log(ETMEMD_LOG_ERR, "get vmas for %s fail\n", pid);
return -1;
@@ -2108,7 +2117,8 @@ static int fill_node_pair(void *obj, void *val)
return ret;
}
- for (pair = strtok_r(node_pair_str, pair_delim, &saveptr_pair); pair != NULL; pair = strtok_r(NULL, pair_delim, &saveptr_pair)) {
+ for (pair = strtok_r(node_pair_str, pair_delim, &saveptr_pair); pair != NULL;
+ pair = strtok_r(NULL, pair_delim, &saveptr_pair)) {
hot_node_str = strtok_r(pair, node_delim, &saveptr_node);
if (hot_node_str == NULL) {
etmemd_log(ETMEMD_LOG_ERR, "parse hot node failed\n");
diff --git a/src/etmemd_src/etmemd_project.c b/src/etmemd_src/etmemd_project.c
index 9ead14c..bd21819 100644
--- a/src/etmemd_src/etmemd_project.c
+++ b/src/etmemd_src/etmemd_project.c
@@ -132,7 +132,8 @@ static enum opt_result engine_of_group(GKeyFile *config, char *group_name, struc
return OPT_SUCCESS;
}
-static enum opt_result task_of_group(GKeyFile *config, char *group_name, struct project *proj, struct engine *eng, struct task **tk)
+static enum opt_result task_of_group(GKeyFile *config, char *group_name,
+ struct project *proj, struct engine *eng, struct task **tk)
{
char *task_name = NULL;
char *key = NULL;
@@ -155,7 +156,8 @@ static enum opt_result task_of_group(GKeyFile *config, char *group_name, struct
return OPT_SUCCESS;
}
-static enum opt_result get_group_objs(GKeyFile *config, char *group_name, struct project **proj, struct engine **eng, struct task **tk)
+static enum opt_result get_group_objs(GKeyFile *config, char *group_name,
+ struct project **proj, struct engine **eng, struct task **tk)
{
enum opt_result ret;
@@ -682,7 +684,8 @@ enum opt_result etmemd_migrate_stop(const char *project_name)
return OPT_SUCCESS;
}
-enum opt_result etmemd_project_mgt_engine(const char *project_name, const char *eng_name, char *cmd, char *task_name, int sock_fd)
+enum opt_result etmemd_project_mgt_engine(const char *project_name, const char *eng_name, char *cmd, char *task_name,
+ int sock_fd)
{
struct engine *eng = NULL;
struct project *proj = NULL;
diff --git a/src/etmemd_src/etmemd_rpc.c b/src/etmemd_src/etmemd_rpc.c
index e154083..2e8e49d 100644
--- a/src/etmemd_src/etmemd_rpc.c
+++ b/src/etmemd_src/etmemd_rpc.c
@@ -121,7 +121,7 @@ static enum opt_result do_obj_cmd(GKeyFile *config, struct obj_cmd_item *items,
return OPT_SUCCESS;
}
-struct obj_cmd_item obj_add_items[] = {
+struct obj_cmd_item g_obj_add_items[] = {
{PROJ_GROUP, etmemd_project_add},
{ENG_GROUP, etmemd_project_add_engine},
{TASK_GROUP, etmemd_project_add_task},
@@ -129,7 +129,7 @@ struct obj_cmd_item obj_add_items[] = {
static enum opt_result do_obj_add(GKeyFile *config)
{
- return do_obj_cmd(config, obj_add_items, ARRAY_SIZE(obj_add_items));
+ return do_obj_cmd(config, g_obj_add_items, ARRAY_SIZE(g_obj_add_items));
}
static struct obj_cmd_item obj_remove_items[] = {
diff --git a/src/etmemd_src/etmemd_slide.c b/src/etmemd_src/etmemd_slide.c
index ea9ccb4..f7609f4 100644
--- a/src/etmemd_src/etmemd_slide.c
+++ b/src/etmemd_src/etmemd_slide.c
@@ -199,7 +199,7 @@ static void slide_stop_task(struct engine *eng, struct task *tk)
params->executor = NULL;
}
-struct engine_ops slide_eng_ops = {
+struct engine_ops g_slide_eng_ops = {
.fill_eng_params = NULL,
.clear_eng_params = NULL,
.fill_task_params = slide_fill_task,
@@ -213,7 +213,7 @@ struct engine_ops slide_eng_ops = {
int fill_engine_type_slide(struct engine *eng)
{
- eng->ops = &slide_eng_ops;
+ eng->ops = &g_slide_eng_ops;
eng->engine_type = SLIDE_ENGINE;
eng->name = "slide";
return 0;
--
2.27.0

View File

@ -1,240 +0,0 @@
From c367b624d3674a572701e9ceee93ca5b73107f0c Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Mon, 26 Apr 2021 17:04:07 +0800
Subject: [PATCH 06/50] remove unused share vmas merge
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
src/etmemd_src/etmemd_cslide.c | 197 ---------------------------------
1 file changed, 197 deletions(-)
diff --git a/src/etmemd_src/etmemd_cslide.c b/src/etmemd_src/etmemd_cslide.c
index 5fd1c32..3983a32 100644
--- a/src/etmemd_src/etmemd_cslide.c
+++ b/src/etmemd_src/etmemd_cslide.c
@@ -194,18 +194,11 @@ struct page_filter {
int count_step;
};
-struct page_offset {
- struct page_refs *page_refs;
- uint64_t to_offset;
-};
-
struct cslide_cmd_item {
char *name;
int (*func)(void *params, int fd);
};
-struct vma_pf *g_share_vma_head = NULL;
-
static inline int get_node_num(void)
{
return numa_num_configured_nodes();
@@ -1215,191 +1208,6 @@ static int cslide_policy(struct cslide_eng_params *eng_params)
return 0;
}
-static void sort_add_vma_pf(struct vma_pf *vma_pf)
-{
- struct vma_pf **iter = &g_share_vma_head;
-
- for (; *iter != NULL && (*iter)->vma->inode < vma_pf->vma->inode; iter = &((*iter)->next)) {
- ;
- }
-
- vma_pf->next = *iter;
- *iter = vma_pf;
-}
-
-static bool is_share(struct vma_pf *vma_pf)
-{
- struct vma *vma = vma_pf->vma;
-
- if (vma->inode != 0 && vma->stat[VMA_STAT_MAY_SHARE]) {
- return true;
- }
-
- return false;
-}
-
-static inline uint64_t to_offset(struct page_offset *po)
-{
- return po->page_refs->addr + po->to_offset;
-}
-
-static int page_offset_cmp(const void *a, const void *b)
-{
- struct page_offset *l = (struct page_offset *)a;
- struct page_offset *r = (struct page_offset *)b;
-
- return to_offset(l) - to_offset(r);
-}
-
-static inline void init_merge_po(struct page_offset *to_merge_po, int count)
-{
- qsort(to_merge_po, count, sizeof(struct page_offset), page_offset_cmp);
-}
-
-static void next_po(struct page_offset *to_merge_po, int *count)
-{
- struct page_offset *po = to_merge_po;
- struct page_offset tmp;
- uint64_t offset;
- int i;
-
- po->page_refs = po->page_refs->next;
- if (po->page_refs == NULL) {
- for (i = 1; i < *count; i++) {
- to_merge_po[i - 1] = to_merge_po[i];
- }
- (*count)--;
- return;
- }
-
- tmp = *po;
- offset = to_offset(po);
- for (i = 1; i < *count; i++) {
- if (to_offset(&to_merge_po[i]) >= offset) {
- break;
- }
- to_merge_po[i - 1] = to_merge_po[i];
- }
- to_merge_po[i - 1] = tmp;
-}
-
-static void merge_share_pfs(struct page_refs **share_pfs, int share_pfs_num)
-{
- int max_count = -1;
- struct page_refs *max_pf = NULL;
- int i;
-
- /* only keep one page_refs with max count */
- for (i = 0; i < share_pfs_num; i++) {
- if (share_pfs[i]->count > max_count) {
- max_pf = share_pfs[i];
- max_count = share_pfs[i]->count;
- }
- share_pfs[i]->count = -1;
- }
- max_pf->count = max_count;
-}
-
-static int do_merge_vma_pf(struct vma_pf *vma_pf, int count)
-{
- struct page_refs **share_pfs = NULL;
- struct page_offset *to_merge_po = NULL;
- struct page_offset *iter = NULL;
- int share_pfs_num;
- uint64_t cur_offset = 0;
- uint64_t next_offset;
- int i;
-
- share_pfs = calloc(count, sizeof(struct page_refs *));
- if (share_pfs == NULL) {
- etmemd_log(ETMEMD_LOG_ERR, "alloc share_pfs fail\n");
- return -1;
- }
-
- to_merge_po = calloc(count, sizeof(struct page_offset));
- if (to_merge_po == NULL) {
- etmemd_log(ETMEMD_LOG_ERR, "alloc iter_pfs fail\n");
- free(share_pfs);
- return -1;
- }
-
- for (i = 0; i < count; i++) {
- to_merge_po[i].page_refs = vma_pf->page_refs;
- to_merge_po[i].to_offset = vma_pf->vma->offset - vma_pf->vma->start;
- vma_pf = vma_pf->next;
- }
-
- init_merge_po(to_merge_po, count);
- iter = to_merge_po;
- share_pfs[0] = iter->page_refs;
- share_pfs_num = 1;
- cur_offset = to_offset(iter);
-
- for (next_po(to_merge_po, &count); count > 0; next_po(to_merge_po, &count)) {
- iter = to_merge_po;
- next_offset = to_offset(iter);
- if (next_offset == cur_offset) {
- share_pfs[share_pfs_num] = iter->page_refs;
- share_pfs_num++;
- } else {
- if (share_pfs_num > 1) {
- merge_share_pfs(share_pfs, share_pfs_num);
- }
- share_pfs[0] = iter->page_refs;
- share_pfs_num = 1;
- cur_offset = next_offset;
- }
-
- }
- if (share_pfs_num > 1) {
- merge_share_pfs(share_pfs, share_pfs_num);
- }
-
- free(to_merge_po);
- free(share_pfs);
- return 0;
-}
-
-static int cslide_merge_share_vmas(struct cslide_eng_params *eng_params)
-{
- struct cslide_pid_params *pid_params = NULL;
- struct vma_pf *vma_pf = NULL;
- struct vma_pf *iter = NULL;
- int count;
- uint64_t i;
-
- factory_foreach_working_pid_params(pid_params, &eng_params->factory) {
- vma_pf = pid_params->vma_pf;
- if (vma_pf == NULL) {
- continue;
- }
- for (i = 0; i < pid_params->vmas->vma_cnt; i++) {
- if (is_share(&vma_pf[i])) {
- sort_add_vma_pf(&vma_pf[i]);
- }
- }
- }
-
- vma_pf = g_share_vma_head;
- while (vma_pf != NULL) {
- for (iter = vma_pf->next, count = 1;
- iter != NULL && iter->vma->inode == vma_pf->vma->inode;
- iter = iter->next, count++) {
- ;
- }
- if (count > 1) {
- if (do_merge_vma_pf(vma_pf, count) != 0) {
- etmemd_log(ETMEMD_LOG_ERR, "merge vma with inode %lld fail\n", vma_pf->vma->inode);
- g_share_vma_head = NULL;
- return -1;
- }
- }
- vma_pf = iter;
- }
- g_share_vma_head = NULL;
- return 0;
-}
-
static int cslide_get_vmas(struct cslide_pid_params *pid_params)
{
struct cslide_task_params *task_params = pid_params->task_params;
@@ -1525,11 +1333,6 @@ static int cslide_do_scan(struct cslide_eng_params *eng_params)
sleep(eng_params->sleep);
}
- if (cslide_merge_share_vmas(eng_params) != 0) {
- etmemd_log(ETMEMD_LOG_ERR, "cslide merge share vams fail\n");
- return -1;
- }
-
return 0;
}
--
2.27.0

View File

@ -1,52 +0,0 @@
From 910519ccf986b80a7ee5a5aab90b62828bdc8b84 Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Wed, 28 Apr 2021 09:54:06 +0800
Subject: [PATCH 07/50] fix error when open idle_pages failed
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
src/etmemd_src/etmemd_cslide.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/etmemd_src/etmemd_cslide.c b/src/etmemd_src/etmemd_cslide.c
index 3983a32..618cafe 100644
--- a/src/etmemd_src/etmemd_cslide.c
+++ b/src/etmemd_src/etmemd_cslide.c
@@ -1281,7 +1281,6 @@ static int cslide_scan_vmas(struct cslide_pid_params *params)
scan_fp = etmemd_get_proc_file(pid, IDLE_SCAN_FILE, SCAN_AS_HUGE, "r");
if (scan_fp == NULL) {
etmemd_log(ETMEMD_LOG_ERR, "open %s file for pid %u fail\n", IDLE_SCAN_FILE, params->pid);
- params->vma_pf = NULL;
return -1;
}
@@ -1298,7 +1297,6 @@ static int cslide_scan_vmas(struct cslide_pid_params *params)
walk_address.walk_end = vma->end;
if (walk_vmas(fd, &walk_address, &vma_pf->page_refs, NULL) == NULL) {
etmemd_log(ETMEMD_LOG_ERR, "scan vma start %llu end %llu fail\n", vma->start, vma->end);
- cslide_free_vmas(params);
fclose(scan_fp);
return -1;
}
@@ -1308,6 +1306,8 @@ static int cslide_scan_vmas(struct cslide_pid_params *params)
return 0;
}
+// allocted data will be cleaned in cslide_main->cslide_clean_params
+// ->cslide_free_vmas
static int cslide_do_scan(struct cslide_eng_params *eng_params)
{
struct cslide_pid_params *iter = NULL;
@@ -1531,7 +1531,9 @@ static void cslide_clean_params(struct cslide_eng_params *eng_params)
struct cslide_pid_params *iter = NULL;
factory_foreach_pid_params(iter, &eng_params->factory) {
+ // clean memory allocted in cslide_policy
clean_pid_param(iter);
+ // clean memory allocted in cslide_do_scan
cslide_free_vmas(iter);
}
}
--
2.27.0

View File

@ -1,134 +0,0 @@
From c76f33082c0a67fe95fd7a00b079fb7191da32d5 Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Wed, 28 Apr 2021 16:39:49 +0800
Subject: [PATCH 08/50] fix memleak
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
src/etmemd_src/etmemd_cslide.c | 23 ++++++++++++++++++-----
src/etmemd_src/etmemd_rpc.c | 17 ++++++++++++++++-
2 files changed, 34 insertions(+), 6 deletions(-)
diff --git a/src/etmemd_src/etmemd_cslide.c b/src/etmemd_src/etmemd_cslide.c
index 618cafe..18cf740 100644
--- a/src/etmemd_src/etmemd_cslide.c
+++ b/src/etmemd_src/etmemd_cslide.c
@@ -689,6 +689,14 @@ static void factory_remove_pid_params(struct cslide_params_factory *factory, str
static void factory_free_pid_params(struct cslide_params_factory *factory, struct cslide_pid_params *params)
{
+ // Pid not started i.e not used. Free it here
+ if (params->state == STATE_NONE) {
+ free_pid_params(params);
+ return;
+ }
+
+ // Pid in use, free by cslide main when call factory_update_pid_params
+ // Avoid data race
params->state = STATE_FREE;
}
@@ -771,7 +779,7 @@ static int cslide_count_node_pfs(struct cslide_pid_params *params)
void **pages = NULL;
int *status = NULL;
int actual_num = 0;
- int ret = -1;
+ int ret = 0;
int vma_i = 0;
if (params->vmas == NULL || params->vma_pf == NULL) {
@@ -787,6 +795,7 @@ static int cslide_count_node_pfs(struct cslide_pid_params *params)
pages = malloc(sizeof(void *) * batch_size);
if (pages == NULL) {
etmemd_log(ETMEMD_LOG_ERR, "malloc pages fail\n");
+ ret = -1;
goto free_status;
}
@@ -800,7 +809,9 @@ static int cslide_count_node_pfs(struct cslide_pid_params *params)
if (actual_num == batch_size || page_refs->next == NULL) {
if (move_pages(pid, actual_num, pages, NULL, status, MPOL_MF_MOVE_ALL) != 0) {
etmemd_log(ETMEMD_LOG_ERR, "get page refs numa node fail\n");
- goto free_pages;
+ clean_page_refs_unexpected(&last);
+ ret = -1;
+ break;
}
insert_count_pfs(params->count_page_refs, last, status, actual_num);
last = page_refs->next;
@@ -808,10 +819,10 @@ static int cslide_count_node_pfs(struct cslide_pid_params *params)
}
page_refs = page_refs->next;
}
+
+ // this must be called before return
setup_count_pfs_tail(params->count_page_refs, params->count);
- ret = 0;
-free_pages:
free(pages);
pages = NULL;
free_status:
@@ -2033,7 +2044,7 @@ static int cslide_fill_eng(GKeyFile *config, struct engine *eng)
if (init_cslide_eng_params(params) != 0) {
etmemd_log(ETMEMD_LOG_ERR, "init cslide engine params fail\n");
- return -1;
+ goto free_eng_params;
}
params->loop = eng->proj->loop;
@@ -2055,6 +2066,8 @@ static int cslide_fill_eng(GKeyFile *config, struct engine *eng)
destroy_eng_params:
destroy_cslide_eng_params(params);
+free_eng_params:
+ free(params);
return -1;
}
diff --git a/src/etmemd_src/etmemd_rpc.c b/src/etmemd_src/etmemd_rpc.c
index 2e8e49d..49c292d 100644
--- a/src/etmemd_src/etmemd_rpc.c
+++ b/src/etmemd_src/etmemd_rpc.c
@@ -492,6 +492,21 @@ static void free_server_rpc_params(struct server_rpc_params *svr)
free(svr->file_name);
svr->file_name = NULL;
}
+
+ if (svr->eng_name != NULL) {
+ free(svr->eng_name);
+ svr->eng_name = NULL;
+ }
+
+ if (svr->eng_cmd != NULL) {
+ free(svr->eng_cmd);
+ svr->eng_cmd = NULL;
+ }
+
+ if (svr->task_name != NULL) {
+ free(svr->task_name);
+ svr->task_name = NULL;
+ }
}
static void etmemd_rpc_send_response_msg(int sock_fd, enum opt_result result)
@@ -531,7 +546,6 @@ static void etmemd_rpc_handle(int sock_fd)
}
etmemd_rpc_send_response_msg(sock_fd, ret);
- free_server_rpc_params(&g_rpc_params);
return;
}
@@ -605,6 +619,7 @@ static int etmemd_rpc_accept(int sock_fd)
if (etmemd_rpc_parse(recv_buf, (unsigned long)rc) == 0) {
etmemd_rpc_handle(accp_fd);
}
+ free_server_rpc_params(&g_rpc_params);
ret = 0;
RPC_EXIT:
--
2.27.0

View File

@ -1,56 +0,0 @@
From a3e62729dafbb634a73921c2200337fb46ab923e Mon Sep 17 00:00:00 2001
From: louhongxiang <louhongxiang@huawei.com>
Date: Thu, 29 Apr 2021 10:47:51 +0800
Subject: [PATCH 09/50] fix some bugs that occur when execute obj add or del
command.
---
src/etmem_src/etmem_rpc.c | 2 +-
src/etmemd_src/etmemd_file.c | 4 ++++
src/etmemd_src/etmemd_rpc.c | 2 +-
3 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/src/etmem_src/etmem_rpc.c b/src/etmem_src/etmem_rpc.c
index 8d03914..fadf1ea 100644
--- a/src/etmem_src/etmem_rpc.c
+++ b/src/etmem_src/etmem_rpc.c
@@ -182,7 +182,7 @@ static int etmem_client_recv(int sockfd)
recv_msg = (char *)recv_buf;
recv_msg[recv_size] = '\0';
- printf("%s", recv_msg);
+ printf("%s\n", recv_msg);
if (etmem_recv_find_fail_keyword(recv_msg)) {
printf("error occurs when getting response from etmemd server\n");
goto EXIT;
diff --git a/src/etmemd_src/etmemd_file.c b/src/etmemd_src/etmemd_file.c
index ac2654e..8b478c6 100644
--- a/src/etmemd_src/etmemd_file.c
+++ b/src/etmemd_src/etmemd_file.c
@@ -35,6 +35,10 @@ static int parse_item(GKeyFile *config, char *group_name, struct config_item *it
break;
case STR_VAL:
val = (void *)g_key_file_get_string(config, group_name, item->key, &error);
+ if (val == NULL || strlen(val) == 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "section %s of group [%s] should not be empty\n", item->key, group_name);
+ return -1;
+ }
break;
default:
etmemd_log(ETMEMD_LOG_ERR, "config item type %d not support\n", item->type);
diff --git a/src/etmemd_src/etmemd_rpc.c b/src/etmemd_src/etmemd_rpc.c
index 49c292d..a8653e2 100644
--- a/src/etmemd_src/etmemd_rpc.c
+++ b/src/etmemd_src/etmemd_rpc.c
@@ -63,7 +63,7 @@ struct rpc_resp_msg g_resp_msg_arr[] = {
{OPT_ENG_NOEXIST, "error: engine is not exist"},
{OPT_TASK_EXISTED, "error: task has been existed"},
{OPT_TASK_NOEXIST, "error: task is not exist"},
- {OPT_INTER_ERR, "error: etmemd has internal error"},
+ {OPT_INTER_ERR, "error: etmemd has internal error, see reason details in messages"},
{OPT_RET_END, NULL},
};
--
2.27.0

View File

@ -1,334 +0,0 @@
From 146be685ec749239979023358a653ef960652f6c Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Wed, 28 Apr 2021 19:19:30 +0800
Subject: [PATCH 10/50] clean code
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
inc/etmem_inc/etmem_common.h | 2 -
src/etmem_src/etmem.c | 2 +-
src/etmem_src/etmem_common.c | 73 ---------------------------------
src/etmem_src/etmem_engine.c | 18 +++++---
src/etmem_src/etmem_obj.c | 46 ++-------------------
src/etmem_src/etmem_project.c | 22 +++-------
src/etmem_src/etmem_rpc.c | 2 +-
src/etmemd_src/etmemd_project.c | 6 ++-
8 files changed, 30 insertions(+), 141 deletions(-)
diff --git a/inc/etmem_inc/etmem_common.h b/inc/etmem_inc/etmem_common.h
index 294d216..09f6e1a 100644
--- a/inc/etmem_inc/etmem_common.h
+++ b/inc/etmem_inc/etmem_common.h
@@ -36,8 +36,6 @@ struct mem_proj {
char *eng_cmd;
};
-int parse_name_string(const char *val, char **name_str, size_t max_len);
int etmem_parse_check_result(int params_cnt, int argc);
-void free_proj_member(struct mem_proj *proj);
#endif
diff --git a/src/etmem_src/etmem.c b/src/etmem_src/etmem.c
index 863f91b..7f04ad1 100644
--- a/src/etmem_src/etmem.c
+++ b/src/etmem_src/etmem.c
@@ -34,7 +34,7 @@ static void usage(void)
" etmem OBJECT COMMAND\n"
" etmem help\n"
"\nParameters:\n"
- " OBJECT := { project | migrate }\n"
+ " OBJECT := { project | obj }\n"
" COMMAND := { add | del | start | stop | show | help }\n");
}
diff --git a/src/etmem_src/etmem_common.c b/src/etmem_src/etmem_common.c
index 8d0cee3..66fbfc9 100644
--- a/src/etmem_src/etmem_common.c
+++ b/src/etmem_src/etmem_common.c
@@ -20,43 +20,6 @@
#include "securec.h"
#include "etmem_common.h"
-int parse_name_string(const char *val, char **name_str, size_t max_len)
-{
- size_t len;
- int ret;
-
- if (val == NULL) {
- printf("name string should not be NULL\n");
- return -EINVAL;
- }
-
- len = strlen(val) + 1;
- if (len == 1) {
- printf("name string should not be empty\n");
- return -EINVAL;
- }
- if (len > max_len) {
- printf("string is too long, it should not be larger than %zu\n", max_len);
- return -ENAMETOOLONG;
- }
-
- *name_str = (char *)calloc(len, sizeof(char));
- if (*name_str == NULL) {
- printf("malloc project name failed.\n");
- return -ENOMEM;
- }
-
- ret = strncpy_s(*name_str, len, val, len - 1);
- if (ret != EOK) {
- printf("strncpy_s project name failed.\n");
- free(*name_str);
- *name_str = NULL;
- return ret;
- }
-
- return 0;
-}
-
int etmem_parse_check_result(int params_cnt, int argc)
{
if (params_cnt > 0 && argc - 1 > params_cnt * 2) { /* maximum number of args is limited to params_cnt * 2+1 */
@@ -66,39 +29,3 @@ int etmem_parse_check_result(int params_cnt, int argc)
return 0;
}
-
-void free_proj_member(struct mem_proj *proj)
-{
- if (proj->proj_name != NULL) {
- free(proj->proj_name);
- proj->proj_name = NULL;
- }
-
- if (proj->file_name != NULL) {
- free(proj->file_name);
- proj->file_name = NULL;
- }
-
- if (proj->sock_name != NULL) {
- free(proj->sock_name);
- proj->sock_name = NULL;
- }
-
- if (proj->eng_name != NULL) {
- free(proj->eng_name);
- proj->eng_name = NULL;
- }
-
- if (proj->task_name != NULL) {
- free(proj->task_name);
- proj->task_name = NULL;
- }
-
- if (proj->eng_cmd != NULL) {
- free(proj->eng_cmd);
- proj->eng_cmd = NULL;
- }
-
-}
-
-
diff --git a/src/etmem_src/etmem_engine.c b/src/etmem_src/etmem_engine.c
index 7673205..e744aaa 100644
--- a/src/etmem_src/etmem_engine.c
+++ b/src/etmem_src/etmem_engine.c
@@ -23,15 +23,23 @@
static void engine_help(void)
{
- printf("etmem engine help information\n");
+ printf("\nUsage:\n"
+ " memig engine eng_cmd [options]\n"
+ " memig engine help\n"
+ "\nOptions:\n"
+ " -n|--proj_name <proj_name> project engine belongs to\n"
+ " -s|--socket <socket_name> socket name to connect\n"
+ " -e|--engine <engine_name> engine to execute cmd\n"
+ " -t|--task_name <task_name> task for cmd\n"
+ "\nNotes:\n"
+ " 1. project name must be given.\n"
+ " 2. socket name must be given.\n"
+ " 3. engine name must be given.\n"
+ " 4. engine cmd must be given.\n");
}
static int engine_parse_cmd(struct etmem_conf *conf, struct mem_proj *proj)
{
- if (conf->argc == 0) {
- printf("too few params for etmem client engine command\n");
- return -1;
- }
proj->eng_cmd = conf->argv[0];
proj->cmd = ETMEM_CMD_ENGINE;
return 0;
diff --git a/src/etmem_src/etmem_obj.c b/src/etmem_src/etmem_obj.c
index a3f66fe..a5517ea 100644
--- a/src/etmem_src/etmem_obj.c
+++ b/src/etmem_src/etmem_obj.c
@@ -61,34 +61,6 @@ static int obj_parse_cmd(struct etmem_conf *conf, struct mem_proj *proj)
return -1;
}
-static int parse_file_name(const char *val, char **file_name)
-{
- size_t len;
- int ret;
-
- len = strlen(val) + 1;
- if (len > FILE_NAME_MAX_LEN) {
- printf("file name is too long, should not be larger than %u\n", FILE_NAME_MAX_LEN);
- return -ENAMETOOLONG;
- }
-
- *file_name = (char *)calloc(len, sizeof(char));
- if (*file_name == NULL) {
- printf("malloc file name failed\n");
- return -ENOMEM;
- }
-
- ret = strncpy_s(*file_name, len, val, len - 1);
- if (ret != EOK) {
- printf("strncpy_s file name fail\n");
- free(*file_name);
- *file_name = NULL;
- return ret;
- }
-
- return 0;
-}
-
static int obj_parse_args(struct etmem_conf *conf, struct mem_proj *proj)
{
int opt, ret;
@@ -102,18 +74,10 @@ static int obj_parse_args(struct etmem_conf *conf, struct mem_proj *proj)
while ((opt = getopt_long(conf->argc, conf->argv, "f:s:", opts, NULL)) != -1) {
switch (opt) {
case 'f':
- ret = parse_file_name(optarg, &proj->file_name);
- if (ret != 0) {
- printf("parse file name failed\n");
- return ret;
- }
+ proj->file_name = optarg;
break;
case 's':
- ret = parse_name_string(optarg, &proj->sock_name, SOCKET_NAME_MAX_LEN);
- if (ret != 0) {
- printf("parse socket name failed.\n");
- return ret;
- }
+ proj->sock_name = optarg;
break;
case '?':
/* fallthrough */
@@ -164,19 +128,17 @@ static int obj_do_cmd(struct etmem_conf *conf)
ret = obj_parse_args(conf, &proj);
if (ret != 0) {
printf("obj_parse_args fail\n");
- goto EXIT;
+ return ret;
}
ret = obj_check_params(&proj);
if (ret != 0) {
printf("obj_check_params fail\n");
- goto EXIT;
+ return ret;
}
ret = etmem_rpc_client(&proj);
-EXIT:
- free_proj_member(&proj);
return ret;
}
diff --git a/src/etmem_src/etmem_project.c b/src/etmem_src/etmem_project.c
index 790979e..bb53df3 100644
--- a/src/etmem_src/etmem_project.c
+++ b/src/etmem_src/etmem_project.c
@@ -78,22 +78,14 @@ static int project_parse_args(const struct etmem_conf *conf, struct mem_proj *pr
{NULL, 0, NULL, 0},
};
- while ((opt = getopt_long(conf->argc, conf->argv, "f:n:s:",
+ while ((opt = getopt_long(conf->argc, conf->argv, "n:s:",
opts, NULL)) != -1) {
switch (opt) {
case 'n':
- ret = parse_name_string(optarg, &proj->proj_name, PROJECT_NAME_MAX_LEN);
- if (ret != 0) {
- printf("parse project name failed.\n");
- return ret;
- }
+ proj->proj_name = optarg;
break;
case 's':
- ret = parse_name_string(optarg, &proj->sock_name, SOCKET_NAME_MAX_LEN);
- if (ret != 0) {
- printf("parse socket name failed.\n");
- return ret;
- }
+ proj->sock_name = optarg;
break;
case '?':
/* fallthrough */
@@ -148,18 +140,16 @@ static int project_do_cmd(struct etmem_conf *conf)
ret = project_parse_args(conf, &proj);
if (ret != 0) {
- goto EXIT;
+ return ret;
}
ret = project_check_params(&proj);
if (ret != 0) {
- goto EXIT;
+ return ret;
}
- etmem_rpc_client(&proj);
+ ret = etmem_rpc_client(&proj);
-EXIT:
- free_proj_member(&proj);
return ret;
}
diff --git a/src/etmem_src/etmem_rpc.c b/src/etmem_src/etmem_rpc.c
index 8d03914..76fadb8 100644
--- a/src/etmem_src/etmem_rpc.c
+++ b/src/etmem_src/etmem_rpc.c
@@ -134,7 +134,7 @@ static int etmem_client_send(const struct mem_proj *proj, int sockfd)
}
if (send(sockfd, reg_cmd, reg_cmd_len, 0) < 0) {
- perror("send failed:");
+ perror("send failed:");
goto EXIT;
}
ret = 0;
diff --git a/src/etmemd_src/etmemd_project.c b/src/etmemd_src/etmemd_project.c
index bd21819..b3158d8 100644
--- a/src/etmemd_src/etmemd_project.c
+++ b/src/etmemd_src/etmemd_project.c
@@ -709,10 +709,14 @@ enum opt_result etmemd_project_mgt_engine(const char *project_name, const char *
eng = get_eng_by_name(proj, eng_name);
if (eng == NULL) {
etmemd_log(ETMEMD_LOG_ERR, "engine %s is not existed\n", eng_name);
- return OPT_INVAL;
+ return OPT_ENG_NOEXIST;
}
if (task_name != NULL) {
tk = get_task_by_name(proj, eng, task_name);
+ if (tk == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "task %s not found\n", task_name);
+ return OPT_TASK_NOEXIST;
+ }
}
if (eng->ops->eng_mgt_func(eng, tk, cmd, sock_fd) != 0) {
return OPT_INVAL;
--
2.27.0

View File

@ -1,111 +0,0 @@
From e92f5b0da3bde551281df30c498e701c767e3335 Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Wed, 28 Apr 2021 19:36:57 +0800
Subject: [PATCH 11/50] wait for next period when error occurs in this period
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
src/etmemd_src/etmemd_cslide.c | 24 ++++++++++++++++--------
1 file changed, 16 insertions(+), 8 deletions(-)
diff --git a/src/etmemd_src/etmemd_cslide.c b/src/etmemd_src/etmemd_cslide.c
index 18cf740..1749383 100644
--- a/src/etmemd_src/etmemd_cslide.c
+++ b/src/etmemd_src/etmemd_cslide.c
@@ -1184,7 +1184,7 @@ static void move_cold_pages(struct cslide_eng_params *eng_params, struct flow_ct
do_filter(&filter, eng_params);
}
-static void cslide_filter_pfs(struct cslide_eng_params *eng_params)
+static int cslide_filter_pfs(struct cslide_eng_params *eng_params)
{
struct flow_ctrl ctrl;
long long quota = (long long)eng_params->mig_quota * HUGE_1M_SIZE;
@@ -1192,7 +1192,7 @@ static void cslide_filter_pfs(struct cslide_eng_params *eng_params)
if (init_flow_ctrl(&ctrl, &eng_params->mem, &eng_params->node_map, quota, reserve) != 0) {
etmemd_log(ETMEMD_LOG_ERR, "init_flow_ctrl fail\n");
- return;
+ return -1;
}
move_hot_pages(eng_params, &ctrl);
@@ -1200,6 +1200,7 @@ static void cslide_filter_pfs(struct cslide_eng_params *eng_params)
move_cold_pages(eng_params, &ctrl);
destroy_flow_ctrl(&ctrl);
+ return 0;
}
static int cslide_policy(struct cslide_eng_params *eng_params)
@@ -1215,8 +1216,7 @@ static int cslide_policy(struct cslide_eng_params *eng_params)
}
}
- cslide_filter_pfs(eng_params);
- return 0;
+ return cslide_filter_pfs(eng_params);
}
static int cslide_get_vmas(struct cslide_pid_params *pid_params)
@@ -1225,6 +1225,7 @@ static int cslide_get_vmas(struct cslide_pid_params *pid_params)
struct vma *vma = NULL;
char pid[PID_STR_MAX_LEN] = {0};
uint64_t i;
+ int ret = -1;
if (snprintf_s(pid, PID_STR_MAX_LEN, PID_STR_MAX_LEN - 1, "%u", pid_params->pid) <= 0) {
etmemd_log(ETMEMD_LOG_ERR, "sprintf pid %u fail\n", pid_params->pid);
@@ -1236,6 +1237,13 @@ static int cslide_get_vmas(struct cslide_pid_params *pid_params)
etmemd_log(ETMEMD_LOG_ERR, "get vmas for %s fail\n", pid);
return -1;
}
+ // avoid calloc for vma_pf with size 0 below
+ // return success as vma may be created later
+ if (pid_params->vmas->vma_cnt == 0) {
+ etmemd_log(ETMEMD_LOG_WARN, "no vma detect for %s\n", pid);
+ ret = 0;
+ goto free_vmas;
+ }
pid_params->vma_pf = calloc(pid_params->vmas->vma_cnt, sizeof(struct vma_pf));
if (pid_params->vma_pf == NULL) {
@@ -1253,7 +1261,7 @@ static int cslide_get_vmas(struct cslide_pid_params *pid_params)
free_vmas:
free_vmas(pid_params->vmas);
pid_params->vmas = NULL;
- return -1;
+ return ret;
}
static void cslide_free_vmas(struct cslide_pid_params *params)
@@ -1327,7 +1335,7 @@ static int cslide_do_scan(struct cslide_eng_params *eng_params)
factory_foreach_working_pid_params(iter, &eng_params->factory) {
if (cslide_get_vmas(iter) != 0) {
etmemd_log(ETMEMD_LOG_ERR, "cslide get vmas fail\n");
- continue;
+ return -1;
}
}
@@ -1338,7 +1346,7 @@ static int cslide_do_scan(struct cslide_eng_params *eng_params)
}
if (cslide_scan_vmas(iter) != 0) {
etmemd_log(ETMEMD_LOG_ERR, "cslide scan vmas fail\n");
- continue;
+ return -1;
}
}
sleep(eng_params->sleep);
@@ -1387,7 +1395,7 @@ static int do_migrate_pages(unsigned int pid, struct page_refs *page_refs, int n
actual_num = 0;
if (ret != 0) {
etmemd_log(ETMEMD_LOG_ERR, "task %d move_pages fail with %d errno %d\n", pid, ret, errno);
- continue;
+ break;
}
}
}
--
2.27.0

View File

@ -1,110 +0,0 @@
From 2eba7f18281d1a7a6a728095cd16b1ebb1b36c0a Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Wed, 28 Apr 2021 19:48:33 +0800
Subject: [PATCH 12/50] add recursive in etmemd_get_task_pids to control if it
should get child pids. cslide will not get child pids.
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
inc/etmemd_inc/etmemd_task.h | 2 +-
src/etmemd_src/etmemd_cslide.c | 2 +-
src/etmemd_src/etmemd_pool_adapter.c | 2 +-
src/etmemd_src/etmemd_task.c | 23 +++++++++++++----------
4 files changed, 16 insertions(+), 13 deletions(-)
diff --git a/inc/etmemd_inc/etmemd_task.h b/inc/etmemd_inc/etmemd_task.h
index d6d89ea..3f32be5 100644
--- a/inc/etmemd_inc/etmemd_task.h
+++ b/inc/etmemd_inc/etmemd_task.h
@@ -51,7 +51,7 @@ struct task {
struct task *next;
};
-int etmemd_get_task_pids(struct task *tk);
+int etmemd_get_task_pids(struct task *tk, bool recursive);
void etmemd_free_task_pids(struct task *tk);
diff --git a/src/etmemd_src/etmemd_cslide.c b/src/etmemd_src/etmemd_cslide.c
index 1749383..43d8108 100644
--- a/src/etmemd_src/etmemd_cslide.c
+++ b/src/etmemd_src/etmemd_cslide.c
@@ -1899,7 +1899,7 @@ static int cslide_fill_task(GKeyFile *config, struct task *tk)
}
tk->params = params;
- if (etmemd_get_task_pids(tk) != 0) {
+ if (etmemd_get_task_pids(tk, false) != 0) {
etmemd_log(ETMEMD_LOG_ERR, "cslide fail to get task pids\n");
tk->params = NULL;
goto exit;
diff --git a/src/etmemd_src/etmemd_pool_adapter.c b/src/etmemd_src/etmemd_pool_adapter.c
index 417f864..b879dbc 100644
--- a/src/etmemd_src/etmemd_pool_adapter.c
+++ b/src/etmemd_src/etmemd_pool_adapter.c
@@ -49,7 +49,7 @@ static void *launch_threadtimer_executor(void *arg)
int scheduing_count;
if (tk->eng->proj->start) {
- if (etmemd_get_task_pids(tk) != 0) {
+ if (etmemd_get_task_pids(tk, true) != 0) {
return NULL;
}
diff --git a/src/etmemd_src/etmemd_task.c b/src/etmemd_src/etmemd_task.c
index 5c81b74..61ba0df 100644
--- a/src/etmemd_src/etmemd_task.c
+++ b/src/etmemd_src/etmemd_task.c
@@ -264,19 +264,13 @@ int get_pid_from_task_type(const struct task *tk, char *pid)
return -1;
}
-static int get_and_fill_pids(struct task *tk, char *pid)
+static int fill_task_child_pid(struct task *tk, char *pid)
{
char *arg_pid[] = {"/usr/bin/pgrep", "-P", pid, NULL};
FILE *file = NULL;
int ret;
int pipefd[2]; /* used for pipefd[2] communication to obtain the task PID */
- /* first, insert the pid of task into the pids list */
- if (fill_task_pid(tk, pid) != 0) {
- etmemd_log(ETMEMD_LOG_WARN, "fill task pid fail\n");
- return -1;
- }
-
if (pipe(pipefd) == -1) {
return -1;
}
@@ -341,7 +335,7 @@ void etmemd_free_task_pids(struct task *tk)
}
}
-int etmemd_get_task_pids(struct task *tk)
+int etmemd_get_task_pids(struct task *tk, bool recursive)
{
char pid[PID_STR_MAX_LEN] = {0};
@@ -356,8 +350,17 @@ int etmemd_get_task_pids(struct task *tk)
return -1;
}
- /* then fill the pids according to the pid of task */
- if (get_and_fill_pids(tk, pid) != 0) {
+ /* first, insert the pid of task into the pids list */
+ if (fill_task_pid(tk, pid) != 0) {
+ etmemd_log(ETMEMD_LOG_WARN, "fill task pid fail\n");
+ return -1;
+ }
+ if (!recursive) {
+ return 0;
+ }
+
+ /* then fill the child pids according to the pid of task */
+ if (fill_task_child_pid(tk, pid) != 0) {
etmemd_free_task_pids(tk);
etmemd_log(ETMEMD_LOG_WARN, "get task child pids fail\n");
return -1;
--
2.27.0

View File

@ -1,130 +0,0 @@
From c4aca9bea94bc7fd639a6b508675b3f113e3736e Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Thu, 29 Apr 2021 09:26:06 +0800
Subject: [PATCH 13/50] check permission according cmd to be executed
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
inc/etmemd_inc/etmemd_rpc.h | 2 +
src/etmemd_src/etmemd_rpc.c | 75 ++++++++++++++++++++++---------------
2 files changed, 46 insertions(+), 31 deletions(-)
diff --git a/inc/etmemd_inc/etmemd_rpc.h b/inc/etmemd_inc/etmemd_rpc.h
index 146cec3..4f61390 100644
--- a/inc/etmemd_inc/etmemd_rpc.h
+++ b/inc/etmemd_inc/etmemd_rpc.h
@@ -55,5 +55,7 @@ int etmemd_parse_sock_name(const char *sock_name);
int etmemd_rpc_server(void);
bool etmemd_sock_name_set(void);
void etmemd_sock_name_free(void);
+// some engine cmd need to check socket permission
+int check_socket_permission(int sock_fd);
#endif
diff --git a/src/etmemd_src/etmemd_rpc.c b/src/etmemd_src/etmemd_rpc.c
index 49c292d..09497b3 100644
--- a/src/etmemd_src/etmemd_rpc.c
+++ b/src/etmemd_src/etmemd_rpc.c
@@ -181,10 +181,54 @@ free_file:
return ret;
}
+int check_socket_permission(int sock_fd) {
+ struct ucred cred;
+ socklen_t len;
+ ssize_t rc;
+
+ len = sizeof(struct ucred);
+
+ rc = getsockopt(sock_fd,
+ SOL_SOCKET,
+ SO_PEERCRED,
+ &cred,
+ &len);
+ if (rc < 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "getsockopt failed, err(%s)\n",
+ strerror(errno));
+ return -1;
+ }
+
+ if (cred.uid != 0 || cred.gid != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "client socket connect failed, permition denied\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+// ENG_CMD cmd permission checked inside engine
+static int check_cmd_permission(int sock_fd, int cmd)
+{
+ switch (cmd) {
+ case OBJ_ADD:
+ case OBJ_DEL:
+ case MIG_STOP:
+ case MIG_START:
+ return check_socket_permission(sock_fd);
+ default:
+ return 0;
+ }
+}
+
static enum opt_result etmemd_switch_cmd(const struct server_rpc_params svr_param)
{
enum opt_result ret = OPT_INVAL;
+ if (check_cmd_permission(svr_param.sock_fd, svr_param.cmd) != 0) {
+ return OPT_INVAL;
+ }
+
switch (svr_param.cmd) {
case OBJ_ADD:
case OBJ_DEL:
@@ -549,32 +593,6 @@ static void etmemd_rpc_handle(int sock_fd)
return;
}
-static int check_socket_permission(int sock_fd) {
- struct ucred cred;
- socklen_t len;
- ssize_t rc;
-
- len = sizeof(struct ucred);
-
- rc = getsockopt(sock_fd,
- SOL_SOCKET,
- SO_PEERCRED,
- &cred,
- &len);
- if (rc < 0) {
- etmemd_log(ETMEMD_LOG_ERR, "getsockopt failed, err(%s)\n",
- strerror(errno));
- return -1;
- }
-
- if (cred.uid != 0 || cred.gid != 0) {
- etmemd_log(ETMEMD_LOG_ERR, "client socket connect failed, permition denied\n");
- return -1;
- }
-
- return 0;
-}
-
static int etmemd_rpc_accept(int sock_fd)
{
char *recv_buf = NULL;
@@ -597,11 +615,6 @@ static int etmemd_rpc_accept(int sock_fd)
return 0;
}
- rc = check_socket_permission(accp_fd);
- if (rc != 0) {
- goto RPC_EXIT;
- }
-
rc = recv(accp_fd, recv_buf, RPC_BUFF_LEN_MAX, 0);
if (rc <= 0) {
etmemd_log(ETMEMD_LOG_WARN, "socket recive from client fail, error(%s)\n",
--
2.27.0

View File

@ -1,300 +0,0 @@
From 2a63484709098a551cbf6996c5362f25f6539ca5 Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Thu, 29 Apr 2021 11:32:07 +0800
Subject: [PATCH 14/50] stat pages info early only replace cold mem in hot node
in order to reduce pages to move
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
src/etmemd_src/etmemd_cslide.c | 134 ++++++++++++++++++++-------------
1 file changed, 81 insertions(+), 53 deletions(-)
diff --git a/src/etmemd_src/etmemd_cslide.c b/src/etmemd_src/etmemd_cslide.c
index 43d8108..7c30508 100644
--- a/src/etmemd_src/etmemd_cslide.c
+++ b/src/etmemd_src/etmemd_cslide.c
@@ -36,6 +36,7 @@
#define HUGE_1G_SIZE (1 << 30)
#define BYTE_TO_KB(s) ((s) >> 10)
#define KB_TO_BYTE(s) ((s) << 10)
+#define HUGE_2M_TO_KB(s) ((s) << 11)
#define TO_PCT 100
#define MAX_WM 100
@@ -154,6 +155,7 @@ struct cslide_eng_params {
int sleep;
};
struct cslide_params_factory factory;
+ struct node_pages_info *host_pages_info;
bool finish;
};
@@ -166,12 +168,13 @@ struct node_ctrl {
struct ctrl_cap hot_move_cap;
struct ctrl_cap hot_prefetch_cap;
struct ctrl_cap cold_move_cap;
- long long cold_replaced;
- long long cold_free;
- long long free;
- long long total;
- long long quota;
- long long reserve;
+ long long cold_replaced; // cold mem in hot node replace by hot mem in cold node
+ long long cold_free; // free mem in cold node
+ long long free; // free mem in hot node
+ long long cold; // cold mem in hot node
+ long long total; // total mem in hot node
+ long long quota; // move quota
+ long long reserve; // reserve space can't used by cold mem
};
struct flow_ctrl {
@@ -854,17 +857,21 @@ static bool node_cal_hot_can_move(struct node_ctrl *node_ctrl)
{
long long can_move;
+ // can_move limited by quota
if (node_ctrl->quota < node_ctrl->free) {
can_move = node_ctrl->quota;
} else {
+ // can_move limited by hot node free
can_move = node_ctrl->free + (node_ctrl->quota - node_ctrl->free) / 2;
+ // can_move limited by cold node free
if (can_move > node_ctrl->free + node_ctrl->cold_free) {
can_move = node_ctrl->free + node_ctrl->cold_free;
}
}
- if (can_move > node_ctrl->total) {
- can_move = node_ctrl->total;
+ // can_move limited by free and cold mem in hot node
+ if (can_move > node_ctrl->cold + node_ctrl->free) {
+ can_move = node_ctrl->cold + node_ctrl->free;
}
node_ctrl->hot_move_cap.cap = can_move;
return can_move > 0;
@@ -963,9 +970,13 @@ static inline bool node_move_cold(struct node_ctrl *node_ctrl, long long *target
return cap_cost(&node_ctrl->cold_move_cap, target);
}
-static int init_flow_ctrl(struct flow_ctrl *ctrl, struct sys_mem *sys_mem, struct node_map *node_map,
- long long quota, long long reserve)
+static int init_flow_ctrl(struct flow_ctrl *ctrl, struct cslide_eng_params *eng_params)
{
+
+ long long quota = (long long)eng_params->mig_quota * HUGE_1M_SIZE;
+ long long reserve = (long long)eng_params->hot_reserve * HUGE_1M_SIZE;
+ struct sys_mem *sys_mem = &eng_params->mem;
+ struct node_map *node_map = &eng_params->node_map;
struct node_pair *pair = NULL;
struct node_ctrl *tmp = NULL;
int i;
@@ -985,6 +996,7 @@ static int init_flow_ctrl(struct flow_ctrl *ctrl, struct sys_mem *sys_mem, struc
tmp = &ctrl->node_ctrl[i];
tmp->cold_free = sys_mem->node_mem[pair->cold_node].huge_free;
tmp->free = sys_mem->node_mem[pair->hot_node].huge_free;
+ tmp->cold = KB_TO_BYTE((unsigned long long)eng_params->host_pages_info[pair->hot_node].cold);
tmp->total = sys_mem->node_mem[pair->hot_node].huge_total;
tmp->quota = quota;
tmp->reserve = reserve;
@@ -1187,10 +1199,8 @@ static void move_cold_pages(struct cslide_eng_params *eng_params, struct flow_ct
static int cslide_filter_pfs(struct cslide_eng_params *eng_params)
{
struct flow_ctrl ctrl;
- long long quota = (long long)eng_params->mig_quota * HUGE_1M_SIZE;
- long long reserve = (long long)eng_params->hot_reserve * HUGE_1M_SIZE;
- if (init_flow_ctrl(&ctrl, &eng_params->mem, &eng_params->node_map, quota, reserve) != 0) {
+ if (init_flow_ctrl(&ctrl, eng_params) != 0) {
etmemd_log(ETMEMD_LOG_ERR, "init_flow_ctrl fail\n");
return -1;
}
@@ -1203,22 +1213,6 @@ static int cslide_filter_pfs(struct cslide_eng_params *eng_params)
return 0;
}
-static int cslide_policy(struct cslide_eng_params *eng_params)
-{
- struct cslide_pid_params *pid_params = NULL;
- int ret;
-
- factory_foreach_working_pid_params(pid_params, &eng_params->factory) {
- ret = cslide_count_node_pfs(pid_params);
- if (ret != 0) {
- etmemd_log(ETMEMD_LOG_ERR, "count node page refs fail\n");
- return ret;
- }
- }
-
- return cslide_filter_pfs(eng_params);
-}
-
static int cslide_get_vmas(struct cslide_pid_params *pid_params)
{
struct cslide_task_params *task_params = pid_params->task_params;
@@ -1510,26 +1504,41 @@ static bool need_migrate(struct cslide_eng_params *eng_params)
return false;
}
-static void get_node_pages_info(struct cslide_pid_params *pid_params)
+static void init_host_pages_info(struct cslide_eng_params *eng_params)
+{
+ int n;
+ int node_num = eng_params->mem.node_num;
+ struct node_pages_info *host_pages = eng_params->host_pages_info;
+
+ for (n = 0; n < node_num; n++) {
+ host_pages[n].cold = 0;
+ host_pages[n].hot = 0;
+ }
+}
+
+static void update_pages_info(struct cslide_eng_params *eng_params, struct cslide_pid_params *pid_params)
{
- struct cslide_eng_params *eng_params = pid_params->eng_params;
int n, c;
int t = eng_params->hot_threshold;
int count = pid_params->count;
int actual_t = t > count ? count + 1 : t;
int node_num = pid_params->count_page_refs->node_num;
- struct node_pages_info *info = pid_params->node_pages_info;
+ struct node_pages_info *task_pages = pid_params->node_pages_info;
+ struct node_pages_info *host_pages = eng_params->host_pages_info;
for (n = 0; n < node_num; n++) {
- info[n].cold = 0;
- info[n].hot = 0;
+ task_pages[n].cold = 0;
+ task_pages[n].hot = 0;
for (c = 0; c < actual_t; c++) {
- info[n].cold += pid_params->count_page_refs[c].node_pfs[n].num * 2 * 1024;
+ task_pages[n].cold += HUGE_2M_TO_KB(pid_params->count_page_refs[c].node_pfs[n].num);
}
for (; c <= count; c++) {
- info[n].hot += pid_params->count_page_refs[c].node_pfs[n].num * 2 * 1024;
+ task_pages[n].hot += HUGE_2M_TO_KB(pid_params->count_page_refs[c].node_pfs[n].num);
}
+
+ host_pages[n].cold += task_pages[n].cold;
+ host_pages[n].hot += task_pages[n].hot;
}
}
@@ -1538,13 +1547,33 @@ static void cslide_stat(struct cslide_eng_params *eng_params)
struct cslide_pid_params *iter = NULL;
pthread_mutex_lock(&eng_params->stat_mtx);
+ init_host_pages_info(eng_params);
factory_foreach_working_pid_params(iter, &eng_params->factory) {
- get_node_pages_info(iter);
+ update_pages_info(eng_params, iter);
}
eng_params->stat_time = time(NULL);
pthread_mutex_unlock(&eng_params->stat_mtx);
}
+static int cslide_policy(struct cslide_eng_params *eng_params)
+{
+ struct cslide_pid_params *pid_params = NULL;
+ int ret;
+
+ factory_foreach_working_pid_params(pid_params, &eng_params->factory) {
+ ret = cslide_count_node_pfs(pid_params);
+ if (ret != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "count node page refs fail\n");
+ return ret;
+ }
+ }
+
+ // update pages info now, so cslide_filter_pfs can use this info
+ cslide_stat(eng_params);
+
+ return cslide_filter_pfs(eng_params);
+}
+
static void cslide_clean_params(struct cslide_eng_params *eng_params)
{
struct cslide_pid_params *iter = NULL;
@@ -1559,6 +1588,8 @@ static void cslide_clean_params(struct cslide_eng_params *eng_params)
static void destroy_cslide_eng_params(struct cslide_eng_params *params)
{
+ free(params->host_pages_info);
+ params->host_pages_info = NULL;
destroy_factory(&params->factory);
pthread_mutex_destroy(&params->stat_mtx);
destroy_node_map(&params->node_map);
@@ -1567,6 +1598,8 @@ static void destroy_cslide_eng_params(struct cslide_eng_params *params)
static int init_cslide_eng_params(struct cslide_eng_params *params)
{
+ int node_num;
+
if (init_sys_mem(&params->mem) != 0) {
etmemd_log(ETMEMD_LOG_ERR, "init system memory fail\n");
return -1;
@@ -1587,8 +1620,18 @@ static int init_cslide_eng_params(struct cslide_eng_params *params)
goto destroy_stat_mtx;
}
+ node_num = params->mem.node_num;
+ params->host_pages_info = calloc(node_num, sizeof(struct node_pages_info));
+ if (params->host_pages_info == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "alloc host_pages_info fail\n");
+ goto destroy_factory;
+ }
+
return 0;
+destroy_factory:
+ destroy_factory(&params->factory);
+
destroy_stat_mtx:
pthread_mutex_destroy(&params->stat_mtx);
@@ -1642,7 +1685,6 @@ static void *cslide_main(void *arg)
}
next:
- cslide_stat(eng_params);
sleep(eng_params->interval);
cslide_clean_params(eng_params);
}
@@ -1745,24 +1787,11 @@ static struct cslide_cmd_item g_task_cmd_items[] = {
static int show_host_pages(void *params, int fd)
{
struct cslide_eng_params *eng_params = (struct cslide_eng_params *)params;
- struct cslide_pid_params *iter = NULL;
char *time_str = NULL;
int node_num = eng_params->mem.node_num;
int n;
uint32_t total;
- struct node_pages_info *info = calloc(node_num, sizeof(struct node_pages_info));
-
- if (info == NULL) {
- etmemd_log(ETMEMD_LOG_ERR, "alloc memory for node_page_info fail\n");
- return -1;
- }
-
- factory_foreach_working_pid_params(iter, &eng_params->factory) {
- for (n = 0; n < node_num; n++) {
- info[n].hot += iter->node_pages_info[n].hot;
- info[n].cold += iter->node_pages_info[n].cold;
- }
- }
+ struct node_pages_info *info = eng_params->host_pages_info;
time_str = get_time_stamp(&eng_params->stat_time);
if (time_str != NULL) {
@@ -1776,7 +1805,6 @@ static int show_host_pages(void *params, int fd)
n, total, info[n].hot + info[n].cold, info[n].hot, info[n].cold);
}
- free(info);
return 0;
}
--
2.27.0

View File

@ -1,41 +0,0 @@
From fd0ac585faf4f7893c728cb7898c265767f51082 Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Thu, 29 Apr 2021 13:54:39 +0800
Subject: [PATCH 15/50] limit mig_quota, hot_reserve to [0, INT_MAX]
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
src/etmemd_src/etmemd_cslide.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/src/etmemd_src/etmemd_cslide.c b/src/etmemd_src/etmemd_cslide.c
index 7c30508..18a78d3 100644
--- a/src/etmemd_src/etmemd_cslide.c
+++ b/src/etmemd_src/etmemd_cslide.c
@@ -2048,6 +2048,11 @@ static int fill_hot_reserve(void *obj, void *val)
struct cslide_eng_params *params = (struct cslide_eng_params *)obj;
int hot_reserve = parse_to_int(val);
+ if (hot_reserve < 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "config hot reserve %d not valid\n", hot_reserve);
+ return -1;
+ }
+
params->hot_reserve = hot_reserve;
return 0;
}
@@ -2057,6 +2062,11 @@ static int fill_mig_quota(void *obj, void *val)
struct cslide_eng_params *params = (struct cslide_eng_params *)obj;
int mig_quota = parse_to_int(val);
+ if (mig_quota < 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "config mig quota %d not valid\n", mig_quota);
+ return -1;
+ }
+
params->mig_quota = mig_quota;
return 0;
}
--
2.27.0

View File

@ -1,122 +0,0 @@
From 3ffad08c0870cabea2656de19047b558c53d7fbd Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Thu, 29 Apr 2021 14:33:52 +0800
Subject: [PATCH 16/50] add some dfx info
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
src/etmemd_src/etmemd_cslide.c | 43 +++++++++++++++++++++++-----------
1 file changed, 29 insertions(+), 14 deletions(-)
diff --git a/src/etmemd_src/etmemd_cslide.c b/src/etmemd_src/etmemd_cslide.c
index 18a78d3..f311a44 100644
--- a/src/etmemd_src/etmemd_cslide.c
+++ b/src/etmemd_src/etmemd_cslide.c
@@ -1300,7 +1300,7 @@ static int cslide_scan_vmas(struct cslide_pid_params *params)
fd = fileno(scan_fp);
if (fd == -1) {
fclose(scan_fp);
- etmemd_log(ETMEMD_LOG_ERR, "fileno file fail for %s\n", IDLE_SCAN_FILE);
+ etmemd_log(ETMEMD_LOG_ERR, "task %u fileno file fail for %s\n", params->pid, IDLE_SCAN_FILE);
return -1;
}
for (i = 0; i < vmas->vma_cnt; i++) {
@@ -1309,7 +1309,7 @@ static int cslide_scan_vmas(struct cslide_pid_params *params)
walk_address.walk_start = vma->start;
walk_address.walk_end = vma->end;
if (walk_vmas(fd, &walk_address, &vma_pf->page_refs, NULL) == NULL) {
- etmemd_log(ETMEMD_LOG_ERR, "scan vma start %llu end %llu fail\n", vma->start, vma->end);
+ etmemd_log(ETMEMD_LOG_ERR, "task %u scan vma start %llu end %llu fail\n", params->pid, vma->start, vma->end);
fclose(scan_fp);
return -1;
}
@@ -1349,14 +1349,16 @@ static int cslide_do_scan(struct cslide_eng_params *eng_params)
return 0;
}
+// error return -1; success return moved pages number
static int do_migrate_pages(unsigned int pid, struct page_refs *page_refs, int node)
{
int batch_size = BATCHSIZE;
- int ret = -1;
+ int ret;
void **pages = NULL;
int *nodes = NULL;
int *status = NULL;
int actual_num = 0;
+ int moved = -1;
if (page_refs == NULL) {
return 0;
@@ -1379,6 +1381,8 @@ static int do_migrate_pages(unsigned int pid, struct page_refs *page_refs, int n
etmemd_log(ETMEMD_LOG_ERR, "malloc pages fail\n");
goto free_status;
}
+
+ moved = 0;
while (page_refs != NULL) {
pages[actual_num] = (void *)page_refs->addr;
nodes[actual_num] = node;
@@ -1386,11 +1390,13 @@ static int do_migrate_pages(unsigned int pid, struct page_refs *page_refs, int n
page_refs = page_refs->next;
if (actual_num == batch_size || page_refs == NULL) {
ret = move_pages(pid, actual_num, pages, nodes, status, MPOL_MF_MOVE_ALL);
- actual_num = 0;
if (ret != 0) {
etmemd_log(ETMEMD_LOG_ERR, "task %d move_pages fail with %d errno %d\n", pid, ret, errno);
+ moved = -1;
break;
}
+ moved += actual_num;
+ actual_num = 0;
}
}
@@ -1402,25 +1408,34 @@ free_status:
free_nodes:
free(nodes);
nodes = NULL;
- return ret;
+ return moved;
}
static int migrate_single_task(unsigned int pid, const struct memory_grade *memory_grade, int hot_node, int cold_node)
{
- int ret = -1;
+ int moved;
- if (do_migrate_pages(pid, memory_grade->cold_pages, cold_node) != 0) {
- etmemd_log(ETMEMD_LOG_ERR, "migrate cold pages fail\n");
- return ret;
+ moved = do_migrate_pages(pid, memory_grade->cold_pages, cold_node);
+ if (moved == -1) {
+ etmemd_log(ETMEMD_LOG_ERR, "task %u migrate cold pages fail\n", pid);
+ return -1;
+ }
+ if (moved != 0) {
+ etmemd_log(ETMEMD_LOG_INFO, "task %u move pages %lld KB from node %d to node %d\n",
+ pid, HUGE_2M_TO_KB((unsigned int)moved), hot_node, cold_node);
}
- if (do_migrate_pages(pid, memory_grade->hot_pages, hot_node) != 0) {
- etmemd_log(ETMEMD_LOG_ERR, "migrate hot pages fail\n");
- return ret;
+ moved = do_migrate_pages(pid, memory_grade->hot_pages, hot_node);
+ if (moved == -1) {
+ etmemd_log(ETMEMD_LOG_ERR, "task %u migrate hot pages fail\n", pid);
+ return -1;
+ }
+ if (moved != 0) {
+ etmemd_log(ETMEMD_LOG_INFO, "task %u move pages %lld KB from node %d to %d\n",
+ pid, HUGE_2M_TO_KB((unsigned int)moved), cold_node, hot_node);
}
- ret = 0;
- return ret;
+ return 0;
}
static int cslide_do_migrate(struct cslide_eng_params *eng_params)
--
2.27.0

View File

@ -1,73 +0,0 @@
From 598735e135a95bf646da66708bab80a673f1344f Mon Sep 17 00:00:00 2001
From: louhongxiang <louhongxiang@huawei.com>
Date: Thu, 29 Apr 2021 15:28:22 +0800
Subject: [PATCH 17/50] do not stop the process when failed to delete any obj,
continue to delte the next one in config file specified.
---
src/etmemd_src/etmemd_rpc.c | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/src/etmemd_src/etmemd_rpc.c b/src/etmemd_src/etmemd_rpc.c
index a8653e2..8360f5a 100644
--- a/src/etmemd_src/etmemd_rpc.c
+++ b/src/etmemd_src/etmemd_rpc.c
@@ -94,11 +94,12 @@ struct obj_cmd_item {
enum opt_result (*func)(GKeyFile *config);
};
-static enum opt_result do_obj_cmd(GKeyFile *config, struct obj_cmd_item *items, unsigned n)
+static enum opt_result do_obj_cmd(GKeyFile *config, struct obj_cmd_item *items, unsigned n,bool add_opt)
{
unsigned i;
bool parsed = false;
enum opt_result ret;
+ enum opt_result err_ret = OPT_SUCCESS;
for (i = 0; i < n; i++) {
if (g_key_file_has_group(config, items[i].name) == FALSE) {
@@ -108,7 +109,10 @@ static enum opt_result do_obj_cmd(GKeyFile *config, struct obj_cmd_item *items,
ret = items[i].func(config);
if (ret != 0) {
etmemd_log(ETMEMD_LOG_ERR, "parse group %s fail\n", items[i].name);
- return ret;
+ if (add_opt) {
+ return ret;
+ }
+ err_ret = ret;
}
parsed = true;
}
@@ -118,6 +122,11 @@ static enum opt_result do_obj_cmd(GKeyFile *config, struct obj_cmd_item *items,
return OPT_INVAL;
}
+ if (err_ret != OPT_SUCCESS) {
+ etmemd_log(ETMEMD_LOG_ERR, "error occurs in %s operation\n", add_opt ? "add" : "del");
+ return err_ret;
+ }
+
return OPT_SUCCESS;
}
@@ -129,7 +138,7 @@ struct obj_cmd_item g_obj_add_items[] = {
static enum opt_result do_obj_add(GKeyFile *config)
{
- return do_obj_cmd(config, g_obj_add_items, ARRAY_SIZE(g_obj_add_items));
+ return do_obj_cmd(config, g_obj_add_items, ARRAY_SIZE(g_obj_add_items), true);
}
static struct obj_cmd_item obj_remove_items[] = {
@@ -140,7 +149,7 @@ static struct obj_cmd_item obj_remove_items[] = {
static enum opt_result do_obj_remove(GKeyFile *config)
{
- return do_obj_cmd(config, obj_remove_items, ARRAY_SIZE(obj_remove_items));
+ return do_obj_cmd(config, obj_remove_items, ARRAY_SIZE(obj_remove_items), false);
}
static enum opt_result handle_obj_cmd(char *file_name, enum cmd_type type)
--
2.27.0

View File

@ -1,41 +0,0 @@
From 6d9c2711f4fee6ec29ffcbf6bda5991e37cd12bb Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Thu, 29 Apr 2021 16:17:55 +0800
Subject: [PATCH 18/50] fix code check warnning remove redundant space
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
src/etmem_src/etmem_project.c | 2 +-
src/etmemd_src/etmemd_cslide.c | 3 ++-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/etmem_src/etmem_project.c b/src/etmem_src/etmem_project.c
index bb53df3..5892789 100644
--- a/src/etmem_src/etmem_project.c
+++ b/src/etmem_src/etmem_project.c
@@ -107,7 +107,7 @@ static int project_check_params(const struct mem_proj *proj)
printf("socket name to connect must all be given, please check.\n");
return -EINVAL;
}
-
+
if (proj->cmd == ETMEM_CMD_SHOW) {
return 0;
}
diff --git a/src/etmemd_src/etmemd_cslide.c b/src/etmemd_src/etmemd_cslide.c
index f311a44..5914ca1 100644
--- a/src/etmemd_src/etmemd_cslide.c
+++ b/src/etmemd_src/etmemd_cslide.c
@@ -1309,7 +1309,8 @@ static int cslide_scan_vmas(struct cslide_pid_params *params)
walk_address.walk_start = vma->start;
walk_address.walk_end = vma->end;
if (walk_vmas(fd, &walk_address, &vma_pf->page_refs, NULL) == NULL) {
- etmemd_log(ETMEMD_LOG_ERR, "task %u scan vma start %llu end %llu fail\n", params->pid, vma->start, vma->end);
+ etmemd_log(ETMEMD_LOG_ERR, "task %u scan vma start %llu end %llu fail\n",
+ params->pid, vma->start, vma->end);
fclose(scan_fp);
return -1;
}
--
2.27.0

View File

@ -1,78 +0,0 @@
From a8bea6d5ffcfe66020832eb57d233f4962aa3672 Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Thu, 29 Apr 2021 18:58:52 +0800
Subject: [PATCH 19/50] accept review advise
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
src/etmem_src/etmem_engine.c | 7 ++++---
src/etmemd_src/etmemd_cslide.c | 4 ++--
src/etmemd_src/etmemd_rpc.c | 3 +++
3 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/src/etmem_src/etmem_engine.c b/src/etmem_src/etmem_engine.c
index e744aaa..bafcfe6 100644
--- a/src/etmem_src/etmem_engine.c
+++ b/src/etmem_src/etmem_engine.c
@@ -24,8 +24,8 @@
static void engine_help(void)
{
printf("\nUsage:\n"
- " memig engine eng_cmd [options]\n"
- " memig engine help\n"
+ " etmem engine eng_cmd [options]\n"
+ " etmem engine help\n"
"\nOptions:\n"
" -n|--proj_name <proj_name> project engine belongs to\n"
" -s|--socket <socket_name> socket name to connect\n"
@@ -35,7 +35,8 @@ static void engine_help(void)
" 1. project name must be given.\n"
" 2. socket name must be given.\n"
" 3. engine name must be given.\n"
- " 4. engine cmd must be given.\n");
+ " 4. engine cmd must be given.\n"
+ " 5. eng_cmd is supported by engine own.\n");
}
static int engine_parse_cmd(struct etmem_conf *conf, struct mem_proj *proj)
diff --git a/src/etmemd_src/etmemd_cslide.c b/src/etmemd_src/etmemd_cslide.c
index 5914ca1..9c65464 100644
--- a/src/etmemd_src/etmemd_cslide.c
+++ b/src/etmemd_src/etmemd_cslide.c
@@ -1422,7 +1422,7 @@ static int migrate_single_task(unsigned int pid, const struct memory_grade *memo
return -1;
}
if (moved != 0) {
- etmemd_log(ETMEMD_LOG_INFO, "task %u move pages %lld KB from node %d to node %d\n",
+ etmemd_log(ETMEMD_LOG_INFO, "task %u move pages %llu KB from node %d to node %d\n",
pid, HUGE_2M_TO_KB((unsigned int)moved), hot_node, cold_node);
}
@@ -1432,7 +1432,7 @@ static int migrate_single_task(unsigned int pid, const struct memory_grade *memo
return -1;
}
if (moved != 0) {
- etmemd_log(ETMEMD_LOG_INFO, "task %u move pages %lld KB from node %d to %d\n",
+ etmemd_log(ETMEMD_LOG_INFO, "task %u move pages %llu KB from node %d to %d\n",
pid, HUGE_2M_TO_KB((unsigned int)moved), cold_node, hot_node);
}
diff --git a/src/etmemd_src/etmemd_rpc.c b/src/etmemd_src/etmemd_rpc.c
index 09497b3..fe0b975 100644
--- a/src/etmemd_src/etmemd_rpc.c
+++ b/src/etmemd_src/etmemd_rpc.c
@@ -212,8 +212,11 @@ static int check_cmd_permission(int sock_fd, int cmd)
{
switch (cmd) {
case OBJ_ADD:
+ /* fallthrough */
case OBJ_DEL:
+ /* fallthrough */
case MIG_STOP:
+ /* fallthrough */
case MIG_START:
return check_socket_permission(sock_fd);
default:
--
2.27.0

View File

@ -1,133 +0,0 @@
From 40e9ddb6fafbcbeda9db7d848967d0b4f38b1514 Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Thu, 6 May 2021 09:22:05 +0800
Subject: [PATCH 20/50] revert socket permission check
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
inc/etmemd_inc/etmemd_rpc.h | 2 -
src/etmemd_src/etmemd_rpc.c | 78 +++++++++++++++----------------------
2 files changed, 31 insertions(+), 49 deletions(-)
diff --git a/inc/etmemd_inc/etmemd_rpc.h b/inc/etmemd_inc/etmemd_rpc.h
index 4f61390..146cec3 100644
--- a/inc/etmemd_inc/etmemd_rpc.h
+++ b/inc/etmemd_inc/etmemd_rpc.h
@@ -55,7 +55,5 @@ int etmemd_parse_sock_name(const char *sock_name);
int etmemd_rpc_server(void);
bool etmemd_sock_name_set(void);
void etmemd_sock_name_free(void);
-// some engine cmd need to check socket permission
-int check_socket_permission(int sock_fd);
#endif
diff --git a/src/etmemd_src/etmemd_rpc.c b/src/etmemd_src/etmemd_rpc.c
index fe0b975..d7bf8d7 100644
--- a/src/etmemd_src/etmemd_rpc.c
+++ b/src/etmemd_src/etmemd_rpc.c
@@ -181,57 +181,10 @@ free_file:
return ret;
}
-int check_socket_permission(int sock_fd) {
- struct ucred cred;
- socklen_t len;
- ssize_t rc;
-
- len = sizeof(struct ucred);
-
- rc = getsockopt(sock_fd,
- SOL_SOCKET,
- SO_PEERCRED,
- &cred,
- &len);
- if (rc < 0) {
- etmemd_log(ETMEMD_LOG_ERR, "getsockopt failed, err(%s)\n",
- strerror(errno));
- return -1;
- }
-
- if (cred.uid != 0 || cred.gid != 0) {
- etmemd_log(ETMEMD_LOG_ERR, "client socket connect failed, permition denied\n");
- return -1;
- }
-
- return 0;
-}
-
-// ENG_CMD cmd permission checked inside engine
-static int check_cmd_permission(int sock_fd, int cmd)
-{
- switch (cmd) {
- case OBJ_ADD:
- /* fallthrough */
- case OBJ_DEL:
- /* fallthrough */
- case MIG_STOP:
- /* fallthrough */
- case MIG_START:
- return check_socket_permission(sock_fd);
- default:
- return 0;
- }
-}
-
static enum opt_result etmemd_switch_cmd(const struct server_rpc_params svr_param)
{
enum opt_result ret = OPT_INVAL;
- if (check_cmd_permission(svr_param.sock_fd, svr_param.cmd) != 0) {
- return OPT_INVAL;
- }
-
switch (svr_param.cmd) {
case OBJ_ADD:
case OBJ_DEL:
@@ -596,6 +549,32 @@ static void etmemd_rpc_handle(int sock_fd)
return;
}
+int check_socket_permission(int sock_fd) {
+ struct ucred cred;
+ socklen_t len;
+ ssize_t rc;
+
+ len = sizeof(struct ucred);
+
+ rc = getsockopt(sock_fd,
+ SOL_SOCKET,
+ SO_PEERCRED,
+ &cred,
+ &len);
+ if (rc < 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "getsockopt failed, err(%s)\n",
+ strerror(errno));
+ return -1;
+ }
+
+ if (cred.uid != 0 || cred.gid != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "client socket connect failed, permition denied\n");
+ return -1;
+ }
+
+ return 0;
+}
+
static int etmemd_rpc_accept(int sock_fd)
{
char *recv_buf = NULL;
@@ -618,6 +597,11 @@ static int etmemd_rpc_accept(int sock_fd)
return 0;
}
+ rc = check_socket_permission(accp_fd);
+ if (rc != 0) {
+ goto RPC_EXIT;
+ }
+
rc = recv(accp_fd, recv_buf, RPC_BUFF_LEN_MAX, 0);
if (rc <= 0) {
etmemd_log(ETMEMD_LOG_WARN, "socket recive from client fail, error(%s)\n",
--
2.27.0

View File

@ -1,549 +0,0 @@
From c009890697542083329ee384ac0e72f3c976f331 Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Thu, 6 May 2021 10:32:50 +0800
Subject: [PATCH 21/50] add thirdpart engine
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
CMakeLists.txt | 1 +
inc/etmemd_inc/etmemd_cslide.h | 2 +-
inc/etmemd_inc/etmemd_engine.h | 1 +
inc/etmemd_inc/etmemd_slide.h | 2 +-
inc/etmemd_inc/etmemd_thirdparty.h | 24 ++++
src/etmemd_src/etmemd_cslide.c | 2 +-
src/etmemd_src/etmemd_engine.c | 51 +++++++--
src/etmemd_src/etmemd_project.c | 75 ++++++------
src/etmemd_src/etmemd_rpc.c | 2 +-
src/etmemd_src/etmemd_slide.c | 2 +-
src/etmemd_src/etmemd_thirdparty.c | 178 +++++++++++++++++++++++++++++
11 files changed, 291 insertions(+), 49 deletions(-)
create mode 100644 inc/etmemd_inc/etmemd_thirdparty.h
create mode 100644 src/etmemd_src/etmemd_thirdparty.c
diff --git a/CMakeLists.txt b/CMakeLists.txt
index fa64b89..9ce4724 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -33,6 +33,7 @@ set(ETMEMD_SRC
${ETMEMD_SRC_DIR}/etmemd_engine.c
${ETMEMD_SRC_DIR}/etmemd_slide.c
${ETMEMD_SRC_DIR}/etmemd_cslide.c
+ ${ETMEMD_SRC_DIR}/etmemd_thirdparty.c
${ETMEMD_SRC_DIR}/etmemd_task.c
${ETMEMD_SRC_DIR}/etmemd_scan.c
${ETMEMD_SRC_DIR}/etmemd_threadpool.c
diff --git a/inc/etmemd_inc/etmemd_cslide.h b/inc/etmemd_inc/etmemd_cslide.h
index 2405f2d..9b03f6f 100644
--- a/inc/etmemd_inc/etmemd_cslide.h
+++ b/inc/etmemd_inc/etmemd_cslide.h
@@ -18,6 +18,6 @@
#include "etmemd_engine.h"
-int fill_engine_type_cslide(struct engine *eng);
+int fill_engine_type_cslide(struct engine *eng, GKeyFile *config);
#endif
diff --git a/inc/etmemd_inc/etmemd_engine.h b/inc/etmemd_inc/etmemd_engine.h
index 77916a5..36e1760 100644
--- a/inc/etmemd_inc/etmemd_engine.h
+++ b/inc/etmemd_inc/etmemd_engine.h
@@ -42,6 +42,7 @@ struct engine {
struct task *tasks;
uint64_t page_cnt; /* number of pages */
struct engine *next;
+ void *handler;
};
struct engine_ops {
diff --git a/inc/etmemd_inc/etmemd_slide.h b/inc/etmemd_inc/etmemd_slide.h
index e76e97a..af48be7 100644
--- a/inc/etmemd_inc/etmemd_slide.h
+++ b/inc/etmemd_inc/etmemd_slide.h
@@ -24,6 +24,6 @@ struct slide_params {
int t; /* watermark */
};
-int fill_engine_type_slide(struct engine *eng);
+int fill_engine_type_slide(struct engine *eng, GKeyFile *config);
#endif
diff --git a/inc/etmemd_inc/etmemd_thirdparty.h b/inc/etmemd_inc/etmemd_thirdparty.h
new file mode 100644
index 0000000..1cd750c
--- /dev/null
+++ b/inc/etmemd_inc/etmemd_thirdparty.h
@@ -0,0 +1,24 @@
+/******************************************************************************
+ * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+ * etmem is licensed under the Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+ * PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * Author: shikemeng
+ * Create: 2021-4-30
+ * Description: This is a header file of the function declaration for thirdparty function.
+ ******************************************************************************/
+
+#ifndef ETMEMD_THIRDPARTY_H
+#define ETMEMD_THIRDPARTY_H
+
+#include "etmemd_engine.h"
+
+int fill_engine_type_thirdparty(struct engine *eng, GKeyFile *config);
+void clear_engine_type_thirdparty(struct engine *eng);
+
+#endif
diff --git a/src/etmemd_src/etmemd_cslide.c b/src/etmemd_src/etmemd_cslide.c
index 9c65464..71b510f 100644
--- a/src/etmemd_src/etmemd_cslide.c
+++ b/src/etmemd_src/etmemd_cslide.c
@@ -2153,7 +2153,7 @@ struct engine_ops g_cslide_eng_ops = {
.eng_mgt_func = cslide_engine_do_cmd,
};
-int fill_engine_type_cslide(struct engine *eng)
+int fill_engine_type_cslide(struct engine *eng, GKeyFile *config)
{
eng->ops = &g_cslide_eng_ops;
eng->engine_type = CSLIDE_ENGINE;
diff --git a/src/etmemd_src/etmemd_engine.c b/src/etmemd_src/etmemd_engine.c
index 98a7430..c745e15 100644
--- a/src/etmemd_src/etmemd_engine.c
+++ b/src/etmemd_src/etmemd_engine.c
@@ -18,27 +18,51 @@
#include "etmemd_engine.h"
#include "etmemd_slide.h"
#include "etmemd_cslide.h"
+#include "etmemd_thirdparty.h"
#include "etmemd_log.h"
#include "etmemd_common.h"
#include "etmemd_file.h"
-struct engine_item {
+struct engine_add_item {
char *name;
- int (*fill_eng_func)(struct engine *eng);
+ int (*fill_eng_func)(struct engine *eng, GKeyFile *config);
};
-static struct engine_item g_engine_items[] = {
+struct engine_remove_item {
+ int type;
+ void (*clear_eng_func)(struct engine *eng);
+};
+
+static struct engine_add_item g_engine_add_items[] = {
{"slide", fill_engine_type_slide},
{"cslide", fill_engine_type_cslide},
+ {"thirdparty", fill_engine_type_thirdparty},
+};
+
+static struct engine_add_item *find_engine_add_item(const char *name)
+{
+ unsigned i;
+
+ for (i = 0; i < ARRAY_SIZE(g_engine_add_items); i++) {
+ if (strcmp(name, g_engine_add_items[i].name) == 0) {
+ return &g_engine_add_items[i];
+ }
+ }
+
+ return NULL;
+}
+
+static struct engine_remove_item g_engine_remove_items[] = {
+ {THIRDPARTY_ENGINE, clear_engine_type_thirdparty},
};
-static struct engine_item *find_engine_item(const char *name)
+static struct engine_remove_item *find_engine_remove_item(int type)
{
unsigned i;
- for (i = 0; i < ARRAY_SIZE(g_engine_items); i++) {
- if (strcmp(name, g_engine_items[i].name) == 0) {
- return &g_engine_items[i];
+ for (i = 0; i < ARRAY_SIZE(g_engine_remove_items); i++) {
+ if (g_engine_remove_items[i].type == type) {
+ return &g_engine_remove_items[i];
}
}
@@ -48,7 +72,7 @@ static struct engine_item *find_engine_item(const char *name)
struct engine *etmemd_engine_add(GKeyFile *config)
{
struct engine *eng = NULL;
- struct engine_item *item = NULL;
+ struct engine_add_item *item = NULL;
char *name = NULL;
if (g_key_file_has_key(config, ENG_GROUP, "name", NULL) == FALSE) {
@@ -62,7 +86,7 @@ struct engine *etmemd_engine_add(GKeyFile *config)
return NULL;
}
- item = find_engine_item(name);
+ item = find_engine_add_item(name);
if (item == NULL) {
etmemd_log(ETMEMD_LOG_ERR, "engine %s not support\n", name);
goto free_name;
@@ -74,7 +98,7 @@ struct engine *etmemd_engine_add(GKeyFile *config)
goto free_name;
}
- if (item->fill_eng_func(eng) != 0) {
+ if (item->fill_eng_func(eng, config) != 0) {
etmemd_log(ETMEMD_LOG_ERR, "fill engine %s fail\n", name);
free(eng);
eng = NULL;
@@ -94,5 +118,12 @@ free_name:
void etmemd_engine_remove(struct engine *eng)
{
+ struct engine_remove_item *item = NULL;
+
+ item = find_engine_remove_item(eng->engine_type);
+ if (item != NULL) {
+ item->clear_eng_func(eng);
+ }
+
free(eng);
}
diff --git a/src/etmemd_src/etmemd_project.c b/src/etmemd_src/etmemd_project.c
index b3158d8..885c86e 100644
--- a/src/etmemd_src/etmemd_project.c
+++ b/src/etmemd_src/etmemd_project.c
@@ -76,7 +76,7 @@ static struct task *get_task_by_name(struct project *proj, struct engine *eng, c
return NULL;
}
-static char *get_obj_key(char *obj_name, const char *group_name)
+static const char *get_obj_key(const char *obj_name, const char *group_name)
{
if (strcmp(obj_name, group_name) == 0) {
return "name";
@@ -85,46 +85,61 @@ static char *get_obj_key(char *obj_name, const char *group_name)
}
}
-static enum opt_result project_of_group(GKeyFile *config, const char *group_name, struct project **proj)
+static enum opt_result get_name_by_key(GKeyFile *config, const char *group_name, const char *key, char **name)
{
- *proj = NULL;
- char *proj_name = NULL;
- char *key = NULL;
-
- key = get_obj_key(PROJ_GROUP, group_name);
if (g_key_file_has_key(config, group_name, key, NULL) == FALSE) {
- etmemd_log(ETMEMD_LOG_ERR, "project name is not set for %s\n", group_name);
+ etmemd_log(ETMEMD_LOG_ERR, "key %s is not set in group %s\n", key, group_name);
return OPT_INVAL;
}
- proj_name = g_key_file_get_string(config, group_name, key, NULL);
- if (proj_name == NULL) {
- etmemd_log(ETMEMD_LOG_ERR, "get project name from %s fail\n", group_name);
+ *name = g_key_file_get_string(config, group_name, key, NULL);
+ if (*name == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "get value of key %s from group %s fail\n", key, group_name);
return OPT_INTER_ERR;
}
- *proj = get_proj_by_name(proj_name);
+ return OPT_SUCCESS;
+}
+
+static enum opt_result get_obj_name(GKeyFile *config, const char *group_name, const char *obj, char **name)
+{
+ const char *key = get_obj_key(obj, group_name);
+
+ return get_name_by_key(config, group_name, key, name);
+}
+static enum opt_result project_of_group(GKeyFile *config, const char *group_name, struct project **proj)
+{
+ char *proj_name = NULL;
+ enum opt_result ret;
+
+ ret = get_obj_name(config, group_name, PROJ_GROUP, &proj_name);
+ if (ret != OPT_SUCCESS) {
+ return ret;
+ }
+
+ *proj = get_proj_by_name(proj_name);
free(proj_name);
return OPT_SUCCESS;
}
static enum opt_result engine_of_group(GKeyFile *config, char *group_name, struct project *proj, struct engine **eng)
{
- char *key = NULL;
char *eng_name = NULL;
- *eng = NULL;
+ enum opt_result ret;
- key = get_obj_key(ENG_GROUP, group_name);
- if (g_key_file_has_key(config, group_name, key, NULL) == FALSE) {
- etmemd_log(ETMEMD_LOG_ERR, "engine is not set for %s\n", group_name);
- return OPT_INVAL;
+ ret = get_obj_name(config, group_name, ENG_GROUP, &eng_name);
+ if (ret != OPT_SUCCESS) {
+ return ret;
}
- eng_name = g_key_file_get_string(config, group_name, key, NULL);
- if (eng_name == NULL) {
- etmemd_log(ETMEMD_LOG_ERR, "get engine name from %s fail\n", group_name);
- return OPT_INTER_ERR;
+ // real engine name is set with "eng_name" for thirdparty engine
+ if (strcmp(eng_name, "thirdparty") == 0 && strcmp(group_name, ENG_GROUP) == 0) {
+ free(eng_name);
+ ret = get_name_by_key(config, ENG_GROUP, "eng_name", &eng_name);
+ if (ret != OPT_SUCCESS) {
+ return ret;
+ }
}
*eng = get_eng_by_name(proj, eng_name);
@@ -136,19 +151,11 @@ static enum opt_result task_of_group(GKeyFile *config, char *group_name,
struct project *proj, struct engine *eng, struct task **tk)
{
char *task_name = NULL;
- char *key = NULL;
- *tk = NULL;
-
- key = get_obj_key(TASK_GROUP, group_name);
- if (g_key_file_has_key(config, group_name, key, NULL) == FALSE) {
- etmemd_log(ETMEMD_LOG_ERR, "task name is not set for %s\n", group_name);
- return OPT_INVAL;
- }
+ enum opt_result ret;
- task_name = g_key_file_get_string(config, group_name, key, NULL);
- if (task_name == NULL) {
- etmemd_log(ETMEMD_LOG_ERR, "get task name from %s fail\n", group_name);
- return OPT_INTER_ERR;
+ ret = get_obj_name(config, group_name, TASK_GROUP, &task_name);
+ if (ret != OPT_SUCCESS) {
+ return ret;
}
*tk = get_task_by_name(proj, eng, task_name);
diff --git a/src/etmemd_src/etmemd_rpc.c b/src/etmemd_src/etmemd_rpc.c
index d7bf8d7..49c292d 100644
--- a/src/etmemd_src/etmemd_rpc.c
+++ b/src/etmemd_src/etmemd_rpc.c
@@ -549,7 +549,7 @@ static void etmemd_rpc_handle(int sock_fd)
return;
}
-int check_socket_permission(int sock_fd) {
+static int check_socket_permission(int sock_fd) {
struct ucred cred;
socklen_t len;
ssize_t rc;
diff --git a/src/etmemd_src/etmemd_slide.c b/src/etmemd_src/etmemd_slide.c
index f7609f4..64d0533 100644
--- a/src/etmemd_src/etmemd_slide.c
+++ b/src/etmemd_src/etmemd_slide.c
@@ -211,7 +211,7 @@ struct engine_ops g_slide_eng_ops = {
.eng_mgt_func = NULL,
};
-int fill_engine_type_slide(struct engine *eng)
+int fill_engine_type_slide(struct engine *eng, GKeyFile *config)
{
eng->ops = &g_slide_eng_ops;
eng->engine_type = SLIDE_ENGINE;
diff --git a/src/etmemd_src/etmemd_thirdparty.c b/src/etmemd_src/etmemd_thirdparty.c
new file mode 100644
index 0000000..1a05512
--- /dev/null
+++ b/src/etmemd_src/etmemd_thirdparty.c
@@ -0,0 +1,178 @@
+/******************************************************************************
+ * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+ * etmem is licensed under the Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+ * PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * Author: shikemeng
+ * Create: 2021-04-30
+ * Description: Memigd thirdparty API.
+ ******************************************************************************/
+
+#include <stdio.h>
+#include <dlfcn.h>
+
+#include "etmemd_engine.h"
+#include "etmemd_file.h"
+#include "etmemd_log.h"
+#include "etmemd_common.h"
+#include "etmemd_thirdparty.h"
+#include "securec.h"
+
+struct thirdparty_params {
+ char *eng_name;
+ char *libname;
+ char *ops_name;
+};
+
+static int fill_eng_name(void *obj, void *val)
+{
+ char *eng_name = (char *)val;
+ struct thirdparty_params *params = (struct thirdparty_params *)obj;
+
+ params->eng_name = eng_name;
+ return 0;
+}
+
+static int fill_libname(void *obj, void *val)
+{
+ char *libname = (char *)val;
+ struct thirdparty_params *params = (struct thirdparty_params *)obj;
+
+ params->libname = libname;
+ return 0;
+}
+
+static int fill_ops_name(void *obj, void *val)
+{
+ char *ops_name = (char *)val;
+ struct thirdparty_params *params = (struct thirdparty_params *)obj;
+
+ params->ops_name = ops_name;
+ return 0;
+}
+
+static struct config_item g_thirdparty_configs[] = {
+ {"eng_name", STR_VAL, fill_eng_name, false},
+ {"libname", STR_VAL, fill_libname, false},
+ {"ops_name", STR_VAL, fill_ops_name, false},
+};
+
+static void clear_thirdparty_params(struct thirdparty_params *params)
+{
+ if (params->eng_name != NULL) {
+ free(params->eng_name);
+ params->eng_name = NULL;
+ }
+ if (params->libname != NULL) {
+ free(params->libname);
+ params->libname = NULL;
+ }
+ if (params->ops_name != NULL) {
+ free(params->ops_name);
+ params->ops_name = NULL;
+ }
+}
+
+static int set_engine_ops(struct engine *eng, struct thirdparty_params *params)
+{
+ void *handler = NULL;
+ struct engine_ops *ops = NULL;
+ char *err = NULL;
+
+ handler = dlopen(params->libname, RTLD_NOW | RTLD_LOCAL);
+ if (handler == NULL) {
+ err = dlerror();
+ etmemd_log(ETMEMD_LOG_ERR, "load library %s fail with error: %s\n", params->libname, err);
+ return -1;
+ }
+
+ /* Clear error */
+ dlerror();
+ ops = dlsym(handler, params->ops_name);
+ err = dlerror();
+ if (err != NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "load engine_ops symbol %s fail with error: %s\n", params->ops_name, err);
+ dlclose(handler);
+ return -1;
+ }
+
+ eng->ops = ops;
+ eng->handler = handler;
+ return 0;
+}
+
+static void clear_engine_ops(struct engine *eng)
+{
+ dlclose(eng->handler);
+ eng->handler = NULL;
+ eng->ops = NULL;
+}
+
+static void set_engine_name(struct engine *eng, struct thirdparty_params *params)
+{
+ eng->name = params->eng_name;
+ /* avoid that eng_name will be freed in clear_thirdparty_params */
+ params->eng_name = NULL;
+}
+
+static void clear_engine_name(struct engine *eng)
+{
+ free(eng->name);
+ eng->name = NULL;
+}
+
+static int set_engine(struct engine *eng, struct thirdparty_params *params)
+{
+ if (set_engine_ops(eng, params) != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "set engine ops fail\n");
+ return -1;
+ }
+ set_engine_name(eng, params);
+ eng->engine_type = THIRDPARTY_ENGINE;
+
+ return 0;
+}
+
+static void clear_engine(struct engine *eng)
+{
+ clear_engine_name(eng);
+ clear_engine_ops(eng);
+}
+
+int fill_engine_type_thirdparty(struct engine *eng, GKeyFile *config)
+{
+ struct thirdparty_params params;
+ int ret = -1;
+
+ if (memset_s(&params, sizeof(struct thirdparty_params), 0, sizeof(struct thirdparty_params)) != EOK) {
+ etmemd_log(ETMEMD_LOG_ERR, "memset_s for thirdparty_params fail\n");
+ return -1;
+ }
+
+ if (parse_file_config(config, ENG_GROUP, g_thirdparty_configs,
+ ARRAY_SIZE(g_thirdparty_configs), &params) != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "parse thirdparty_params fail\n");
+ goto clear_params;
+ }
+
+ if (set_engine(eng, &params) != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "set engine fail\n");
+ goto clear_params;
+ }
+
+ ret = 0;
+
+clear_params:
+ clear_thirdparty_params(&params);
+ return ret;
+}
+
+void clear_engine_type_thirdparty(struct engine *eng)
+{
+ clear_engine(eng);
+}
--
2.27.0

View File

@ -1,321 +0,0 @@
From 2191a3f804026b73a82d146dfe834be0e515fc0e Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Thu, 6 May 2021 14:20:29 +0800
Subject: [PATCH 22/50] export symbols for user defined thirdparty engine
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
inc/etmemd_inc/etmem_thirdparty.h | 23 +++++++++++++
inc/etmemd_inc/etmemd_engine.h | 30 +----------------
inc/etmemd_inc/etmemd_engine_exp.h | 52 +++++++++++++++++++++++++++++
inc/etmemd_inc/etmemd_project.h | 13 +-------
inc/etmemd_inc/etmemd_project_exp.h | 33 ++++++++++++++++++
inc/etmemd_inc/etmemd_task.h | 19 +----------
inc/etmemd_inc/etmemd_task_exp.h | 43 ++++++++++++++++++++++++
7 files changed, 154 insertions(+), 59 deletions(-)
create mode 100644 inc/etmemd_inc/etmem_thirdparty.h
create mode 100644 inc/etmemd_inc/etmemd_engine_exp.h
create mode 100644 inc/etmemd_inc/etmemd_project_exp.h
create mode 100644 inc/etmemd_inc/etmemd_task_exp.h
diff --git a/inc/etmemd_inc/etmem_thirdparty.h b/inc/etmemd_inc/etmem_thirdparty.h
new file mode 100644
index 0000000..0e128ce
--- /dev/null
+++ b/inc/etmemd_inc/etmem_thirdparty.h
@@ -0,0 +1,23 @@
+/******************************************************************************
+ * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+ * etmem is licensed under the Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+ * PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * Author: shikemeng
+ * Create: 2021-4-30
+ * Description: This is a header file of the function declaration for user defined thirdparty engine.
+ ******************************************************************************/
+
+#ifndef ETMEM_THIRDPARTY_H
+#define ETMEM_THIRDPARTY_H
+
+#include "etmemd_project_exp.h"
+#include "etmemd_engine_exp.h"
+#include "etmemd_task_exp.h"
+
+#endif
diff --git a/inc/etmemd_inc/etmemd_engine.h b/inc/etmemd_inc/etmemd_engine.h
index 36e1760..b513ae8 100644
--- a/inc/etmemd_inc/etmemd_engine.h
+++ b/inc/etmemd_inc/etmemd_engine.h
@@ -16,9 +16,9 @@
#ifndef ETMEMD_ENGINE_H
#define ETMEMD_ENGINE_H
-#include <glib.h>
#include "etmemd.h"
#include "etmemd_task.h"
+#include "etmemd_engine_exp.h"
enum eng_type {
SLIDE_ENGINE = 0,
@@ -29,34 +29,6 @@ enum eng_type {
ENGINE_TYPE_CNT,
};
-/*
- * engine struct
- * */
-struct engine {
- int engine_type; /* engine type used for elimination strategy */
- char *name;
- void *params; /* point to engine parameter struct */
- struct project *proj;
- struct page_refs *page_ref; /* scan result */
- struct engine_ops *ops;
- struct task *tasks;
- uint64_t page_cnt; /* number of pages */
- struct engine *next;
- void *handler;
-};
-
-struct engine_ops {
- int (*fill_eng_params)(GKeyFile *config, struct engine *eng);
- void (*clear_eng_params)(struct engine *eng);
- int (*fill_task_params)(GKeyFile *config, struct task *task);
- void (*clear_task_params)(struct task *tk);
- int (*start_task)(struct engine *eng, struct task *tk);
- void (*stop_task)(struct engine *eng, struct task *tk);
- int (*alloc_pid_params)(struct engine *eng, struct task_pid **tk_pid);
- void (*free_pid_params)(struct engine *eng, struct task_pid **tk_pid);
- int (*eng_mgt_func)(struct engine *eng, struct task *tk, char *cmd, int fd);
-};
-
struct engine *etmemd_engine_add(GKeyFile *config);
void etmemd_engine_remove(struct engine *eng);
diff --git a/inc/etmemd_inc/etmemd_engine_exp.h b/inc/etmemd_inc/etmemd_engine_exp.h
new file mode 100644
index 0000000..2c119ec
--- /dev/null
+++ b/inc/etmemd_inc/etmemd_engine_exp.h
@@ -0,0 +1,52 @@
+/******************************************************************************
+ * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+ * etmem is licensed under the Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+ * PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * Author: shikemeng
+ * Create: 2021-04-30
+ * Description: This is a header file of the export engine symbols.
+ ******************************************************************************/
+
+#ifndef ETMEMD_ENGINE_EXP_H
+#define ETMEMD_ENGINE_EXP_H
+
+#include <glib.h>
+#include <stdint.h>
+
+struct task_pid;
+
+/*
+ * engine struct
+ * */
+struct engine {
+ int engine_type; /* engine type used for elimination strategy */
+ char *name;
+ void *params; /* point to engine parameter struct */
+ struct project *proj;
+ struct page_refs *page_ref; /* scan result */
+ struct engine_ops *ops;
+ struct task *tasks;
+ uint64_t page_cnt; /* number of pages */
+ struct engine *next;
+ void *handler;
+};
+
+struct engine_ops {
+ int (*fill_eng_params)(GKeyFile *config, struct engine *eng);
+ void (*clear_eng_params)(struct engine *eng);
+ int (*fill_task_params)(GKeyFile *config, struct task *task);
+ void (*clear_task_params)(struct task *tk);
+ int (*start_task)(struct engine *eng, struct task *tk);
+ void (*stop_task)(struct engine *eng, struct task *tk);
+ int (*alloc_pid_params)(struct engine *eng, struct task_pid **tk_pid);
+ void (*free_pid_params)(struct engine *eng, struct task_pid **tk_pid);
+ int (*eng_mgt_func)(struct engine *eng, struct task *tk, char *cmd, int fd);
+};
+
+#endif
diff --git a/inc/etmemd_inc/etmemd_project.h b/inc/etmemd_inc/etmemd_project.h
index e574a84..b44d68b 100644
--- a/inc/etmemd_inc/etmemd_project.h
+++ b/inc/etmemd_inc/etmemd_project.h
@@ -16,26 +16,15 @@
#ifndef ETMEMD_PROJECT_H
#define ETMEMD_PROJECT_H
-#include <sys/queue.h>
#include "etmemd_task.h"
#include "etmemd_engine.h"
+#include "etmemd_project_exp.h"
/* set the length of project name to 32 */
#define PROJECT_NAME_MAX_LEN 32
#define FILE_NAME_MAX_LEN 256
#define PROJECT_SHOW_COLM_MAX 128
-struct project {
- char *name;
- int interval;
- int loop;
- int sleep;
- bool start;
- struct engine *engs;
-
- SLIST_ENTRY(project) entry;
-};
-
enum opt_result {
OPT_SUCCESS = 0,
OPT_INVAL,
diff --git a/inc/etmemd_inc/etmemd_project_exp.h b/inc/etmemd_inc/etmemd_project_exp.h
new file mode 100644
index 0000000..bcd5108
--- /dev/null
+++ b/inc/etmemd_inc/etmemd_project_exp.h
@@ -0,0 +1,33 @@
+/******************************************************************************
+ * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+ * etmem is licensed under the Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+ * PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * Author: shikemeng
+ * Create: 2021-4-30
+ * Description: This is a header file of the export project symbols.
+ ******************************************************************************/
+
+#ifndef ETMEMD_PROJECT_EXP_H
+#define ETMEMD_PROJECT_EXP_H
+
+#include <sys/queue.h>
+#include <stdbool.h>
+
+struct project {
+ char *name;
+ int interval;
+ int loop;
+ int sleep;
+ bool start;
+ struct engine *engs;
+
+ SLIST_ENTRY(project) entry;
+};
+
+#endif
diff --git a/inc/etmemd_inc/etmemd_task.h b/inc/etmemd_inc/etmemd_task.h
index 3f32be5..be3ade3 100644
--- a/inc/etmemd_inc/etmemd_task.h
+++ b/inc/etmemd_inc/etmemd_task.h
@@ -17,12 +17,11 @@
#ifndef ETMEMD_TASK_H
#define ETMEMD_TASK_H
-#include <stdint.h>
#include <stdbool.h>
-#include <pthread.h>
#include <glib.h>
#include "etmemd_threadpool.h"
#include "etmemd_threadtimer.h"
+#include "etmemd_task_exp.h"
/* in some system the max length of pid may be larger than 5, so we use 10 here */
#define PID_STR_MAX_LEN 10
@@ -35,22 +34,6 @@ struct task_pid {
struct task_pid *next;
};
-struct task {
- char *type;
- char *value;
- char *name;
- uint64_t max_threads;
-
- struct task_pid *pids;
- struct engine *eng;
- void *params;
- pthread_t task_pt;
- timer_thread *timer_inst;
- thread_pool *threadpool_inst;
-
- struct task *next;
-};
-
int etmemd_get_task_pids(struct task *tk, bool recursive);
void etmemd_free_task_pids(struct task *tk);
diff --git a/inc/etmemd_inc/etmemd_task_exp.h b/inc/etmemd_inc/etmemd_task_exp.h
new file mode 100644
index 0000000..b62f382
--- /dev/null
+++ b/inc/etmemd_inc/etmemd_task_exp.h
@@ -0,0 +1,43 @@
+/******************************************************************************
+ * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+ * etmem is licensed under the Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+ * PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * Author: shikemeng
+ * Create: 2021-4-30
+ * Description: This is a header file of the export task symbols.
+ ******************************************************************************/
+
+#ifndef ETMEMD_TASK_EXP_H
+#define ETMEMD_TASK_EXP_H
+
+#include <stdint.h>
+#include <pthread.h>
+
+struct timer_thread_t;
+typedef struct timer_thread_t timer_thread;
+struct thread_pool_t;
+typedef struct thread_pool_t thread_pool;
+
+struct task {
+ char *type;
+ char *value;
+ char *name;
+ uint64_t max_threads;
+
+ struct task_pid *pids;
+ struct engine *eng;
+ void *params;
+ pthread_t task_pt;
+ timer_thread *timer_inst;
+ thread_pool *threadpool_inst;
+
+ struct task *next;
+};
+
+#endif
--
2.27.0

View File

@ -1,95 +0,0 @@
From 0cf348d3f3288237855b7e05b0500c886ee98be0 Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Sat, 8 May 2021 11:46:55 +0800
Subject: [PATCH 23/50] accept review advise
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
inc/etmemd_inc/etmemd_engine.h | 1 +
.../{etmem_thirdparty.h => etmemd_thirdparty_export.h} | 4 ++--
src/etmemd_src/etmemd_project.c | 9 ++++++++-
src/etmemd_src/etmemd_thirdparty.c | 6 ++----
4 files changed, 13 insertions(+), 7 deletions(-)
rename inc/etmemd_inc/{etmem_thirdparty.h => etmemd_thirdparty_export.h} (93%)
diff --git a/inc/etmemd_inc/etmemd_engine.h b/inc/etmemd_inc/etmemd_engine.h
index b513ae8..0134d21 100644
--- a/inc/etmemd_inc/etmemd_engine.h
+++ b/inc/etmemd_inc/etmemd_engine.h
@@ -16,6 +16,7 @@
#ifndef ETMEMD_ENGINE_H
#define ETMEMD_ENGINE_H
+#include <glib.h>
#include "etmemd.h"
#include "etmemd_task.h"
#include "etmemd_engine_exp.h"
diff --git a/inc/etmemd_inc/etmem_thirdparty.h b/inc/etmemd_inc/etmemd_thirdparty_export.h
similarity index 93%
rename from inc/etmemd_inc/etmem_thirdparty.h
rename to inc/etmemd_inc/etmemd_thirdparty_export.h
index 0e128ce..9d145ce 100644
--- a/inc/etmemd_inc/etmem_thirdparty.h
+++ b/inc/etmemd_inc/etmemd_thirdparty_export.h
@@ -13,8 +13,8 @@
* Description: This is a header file of the function declaration for user defined thirdparty engine.
******************************************************************************/
-#ifndef ETMEM_THIRDPARTY_H
-#define ETMEM_THIRDPARTY_H
+#ifndef ETMEM_THIRDPARTY_EXPORT_H
+#define ETMEM_THIRDPARTY_EXPORT_H
#include "etmemd_project_exp.h"
#include "etmemd_engine_exp.h"
diff --git a/src/etmemd_src/etmemd_project.c b/src/etmemd_src/etmemd_project.c
index 885c86e..deeaf5e 100644
--- a/src/etmemd_src/etmemd_project.c
+++ b/src/etmemd_src/etmemd_project.c
@@ -33,6 +33,8 @@
#define MAX_SLEEP_VALUE 1200
#define MAX_LOOP_VALUE 120
+#define MAX_OBJ_NAME_LEN 64
+
static SLIST_HEAD(project_list, project) g_projects = SLIST_HEAD_INITIALIZER(g_projects);
static struct project *get_proj_by_name(const char *name)
@@ -95,7 +97,12 @@ static enum opt_result get_name_by_key(GKeyFile *config, const char *group_name,
*name = g_key_file_get_string(config, group_name, key, NULL);
if (*name == NULL) {
etmemd_log(ETMEMD_LOG_ERR, "get value of key %s from group %s fail\n", key, group_name);
- return OPT_INTER_ERR;
+ return OPT_INVAL;
+ }
+ if (strlen(*name) > MAX_OBJ_NAME_LEN) {
+ etmemd_log(ETMEMD_LOG_ERR, "name len should not be greater than %d\n", MAX_OBJ_NAME_LEN);
+ free(*name);
+ return OPT_INVAL;
}
return OPT_SUCCESS;
diff --git a/src/etmemd_src/etmemd_thirdparty.c b/src/etmemd_src/etmemd_thirdparty.c
index 1a05512..0fd2a70 100644
--- a/src/etmemd_src/etmemd_thirdparty.c
+++ b/src/etmemd_src/etmemd_thirdparty.c
@@ -85,14 +85,12 @@ static int set_engine_ops(struct engine *eng, struct thirdparty_params *params)
char *err = NULL;
handler = dlopen(params->libname, RTLD_NOW | RTLD_LOCAL);
- if (handler == NULL) {
- err = dlerror();
+ err = dlerror();
+ if (err != NULL && handler == NULL) {
etmemd_log(ETMEMD_LOG_ERR, "load library %s fail with error: %s\n", params->libname, err);
return -1;
}
- /* Clear error */
- dlerror();
ops = dlsym(handler, params->ops_name);
err = dlerror();
if (err != NULL) {
--
2.27.0

View File

@ -1,194 +0,0 @@
From 3ea01a06171bba33358edbec6c8b5cb4101c8e8f Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Sat, 8 May 2021 11:48:12 +0800
Subject: [PATCH 24/50] correct etmemd name
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
src/etmem_src/etmem_project.c | 2 +-
src/etmemd_src/etmemd_cslide.c | 2 +-
src/etmemd_src/etmemd_engine.c | 2 +-
src/etmemd_src/etmemd_log.c | 2 +-
src/etmemd_src/etmemd_migrate.c | 2 +-
src/etmemd_src/etmemd_pool_adapter.c | 2 +-
src/etmemd_src/etmemd_project.c | 2 +-
src/etmemd_src/etmemd_scan.c | 2 +-
src/etmemd_src/etmemd_slide.c | 2 +-
src/etmemd_src/etmemd_task.c | 2 +-
src/etmemd_src/etmemd_thirdparty.c | 2 +-
src/etmemd_src/etmemd_threadpool.c | 2 +-
src/etmemd_src/etmemd_threadtimer.c | 2 +-
13 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/src/etmem_src/etmem_project.c b/src/etmem_src/etmem_project.c
index 5892789..ef2d8fe 100644
--- a/src/etmem_src/etmem_project.c
+++ b/src/etmem_src/etmem_project.c
@@ -10,7 +10,7 @@
* See the Mulan PSL v2 for more details.
* Author: louhongxiang
* Create: 2019-12-10
- * Description: Memig project command API.
+ * Description: Etmem project command API.
******************************************************************************/
#include <stdlib.h>
diff --git a/src/etmemd_src/etmemd_cslide.c b/src/etmemd_src/etmemd_cslide.c
index 71b510f..47a3608 100644
--- a/src/etmemd_src/etmemd_cslide.c
+++ b/src/etmemd_src/etmemd_cslide.c
@@ -10,7 +10,7 @@
* See the Mulan PSL v2 for more details.
* Author: shikemeng
* Create: 2021-4-19
- * Description: Memigd cslide API.
+ * Description: Etmemd cslide API.
******************************************************************************/
#include <stdlib.h>
diff --git a/src/etmemd_src/etmemd_engine.c b/src/etmemd_src/etmemd_engine.c
index c745e15..f57d52b 100644
--- a/src/etmemd_src/etmemd_engine.c
+++ b/src/etmemd_src/etmemd_engine.c
@@ -10,7 +10,7 @@
* See the Mulan PSL v2 for more details.
* Author: louhongxiang
* Create: 2019-12-10
- * Description: Memigd engine API.
+ * Description: Etmemd engine API.
******************************************************************************/
#include <stdio.h>
diff --git a/src/etmemd_src/etmemd_log.c b/src/etmemd_src/etmemd_log.c
index 86c8857..fc49db8 100644
--- a/src/etmemd_src/etmemd_log.c
+++ b/src/etmemd_src/etmemd_log.c
@@ -10,7 +10,7 @@
* See the Mulan PSL v2 for more details.
* Author: louhongxiang
* Create: 2019-12-10
- * Description: Memigd log API.
+ * Description: Etmemd log API.
******************************************************************************/
#include <stdlib.h>
diff --git a/src/etmemd_src/etmemd_migrate.c b/src/etmemd_src/etmemd_migrate.c
index a7aa9b8..2f29f31 100644
--- a/src/etmemd_src/etmemd_migrate.c
+++ b/src/etmemd_src/etmemd_migrate.c
@@ -10,7 +10,7 @@
* See the Mulan PSL v2 for more details.
* Author: louhongxiang
* Create: 2019-12-10
- * Description: Memigd migration API.
+ * Description: Etmemd migration API.
******************************************************************************/
#include <stdio.h>
diff --git a/src/etmemd_src/etmemd_pool_adapter.c b/src/etmemd_src/etmemd_pool_adapter.c
index b879dbc..8c0068e 100644
--- a/src/etmemd_src/etmemd_pool_adapter.c
+++ b/src/etmemd_src/etmemd_pool_adapter.c
@@ -10,7 +10,7 @@
* See the Mulan PSL v2 for more details.
* Author: louhongxiang
* Create: 2019-12-10
- * Description: Memigd pool adapter API.
+ * Description: Etmemd pool adapter API.
******************************************************************************/
#include <stdbool.h>
diff --git a/src/etmemd_src/etmemd_project.c b/src/etmemd_src/etmemd_project.c
index deeaf5e..3b12296 100644
--- a/src/etmemd_src/etmemd_project.c
+++ b/src/etmemd_src/etmemd_project.c
@@ -10,7 +10,7 @@
* See the Mulan PSL v2 for more details.
* Author: louhongxiang
* Create: 2019-12-10
- * Description: Memigd project API.
+ * Description: Etmemd project API.
******************************************************************************/
#include <stdio.h>
diff --git a/src/etmemd_src/etmemd_scan.c b/src/etmemd_src/etmemd_scan.c
index bb8dfa3..fb4dd33 100644
--- a/src/etmemd_src/etmemd_scan.c
+++ b/src/etmemd_src/etmemd_scan.c
@@ -10,7 +10,7 @@
* See the Mulan PSL v2 for more details.
* Author: louhongxiang
* Create: 2019-12-10
- * Description: Memigd scan API.
+ * Description: Etmemd scan API.
******************************************************************************/
#include <stdlib.h>
diff --git a/src/etmemd_src/etmemd_slide.c b/src/etmemd_src/etmemd_slide.c
index 64d0533..96d3dcc 100644
--- a/src/etmemd_src/etmemd_slide.c
+++ b/src/etmemd_src/etmemd_slide.c
@@ -10,7 +10,7 @@
* See the Mulan PSL v2 for more details.
* Author: louhongxiang
* Create: 2019-12-10
- * Description: Memigd slide API.
+ * Description: Etmemd slide API.
******************************************************************************/
#include <stdlib.h>
diff --git a/src/etmemd_src/etmemd_task.c b/src/etmemd_src/etmemd_task.c
index 61ba0df..b948c63 100644
--- a/src/etmemd_src/etmemd_task.c
+++ b/src/etmemd_src/etmemd_task.c
@@ -10,7 +10,7 @@
* See the Mulan PSL v2 for more details.
* Author: louhongxiang
* Create: 2019-12-10
- * Description: Memigd task API.
+ * Description: Etmemd task API.
******************************************************************************/
#include <stdlib.h>
diff --git a/src/etmemd_src/etmemd_thirdparty.c b/src/etmemd_src/etmemd_thirdparty.c
index 0fd2a70..53d4b8e 100644
--- a/src/etmemd_src/etmemd_thirdparty.c
+++ b/src/etmemd_src/etmemd_thirdparty.c
@@ -10,7 +10,7 @@
* See the Mulan PSL v2 for more details.
* Author: shikemeng
* Create: 2021-04-30
- * Description: Memigd thirdparty API.
+ * Description: Etmemd thirdparty API.
******************************************************************************/
#include <stdio.h>
diff --git a/src/etmemd_src/etmemd_threadpool.c b/src/etmemd_src/etmemd_threadpool.c
index 953d5a4..dac42d1 100644
--- a/src/etmemd_src/etmemd_threadpool.c
+++ b/src/etmemd_src/etmemd_threadpool.c
@@ -10,7 +10,7 @@
* See the Mulan PSL v2 for more details.
* Author: louhongxiang
* Create: 2019-12-10
- * Description: Memigd threadpool API.
+ * Description: Etmemd threadpool API.
******************************************************************************/
#include <stdlib.h>
diff --git a/src/etmemd_src/etmemd_threadtimer.c b/src/etmemd_src/etmemd_threadtimer.c
index 660085b..d18b3e0 100644
--- a/src/etmemd_src/etmemd_threadtimer.c
+++ b/src/etmemd_src/etmemd_threadtimer.c
@@ -10,7 +10,7 @@
* See the Mulan PSL v2 for more details.
* Author: louhongxiang
* Create: 2019-12-10
- * Description: Memigd threadtimer API.
+ * Description: Etmemd threadtimer API.
******************************************************************************/
#include <pthread.h>
--
2.27.0

View File

@ -1,243 +0,0 @@
From 7701548a6a1d131e642e74ef39a5a38093023b3f Mon Sep 17 00:00:00 2001
From: louhongxiang <louhongxiang@huawei.com>
Date: Mon, 10 May 2021 20:31:23 +0800
Subject: [PATCH 25/50] add support for systemctl mode to start etmem
---
inc/etmemd_inc/etmemd_common.h | 7 ++-
inc/etmemd_inc/etmemd_rpc.h | 1 +
inc/etmemd_inc/etmemd_task.h | 3 --
src/etmemd_src/etmemd_common.c | 7 ++-
src/etmemd_src/etmemd_rpc.c | 80 ++++++++++++++++++++++++++++++++++
src/etmemd_src/etmemd_task.c | 4 +-
6 files changed, 95 insertions(+), 7 deletions(-)
diff --git a/inc/etmemd_inc/etmemd_common.h b/inc/etmemd_inc/etmemd_common.h
index 1b62bbd..e228476 100644
--- a/inc/etmemd_inc/etmemd_common.h
+++ b/inc/etmemd_inc/etmemd_common.h
@@ -23,10 +23,15 @@
#define FILE_LINE_MAX_LEN 1024
#define KEY_VALUE_MAX_LEN 64
#define DECIMAL_RADIX 10
-#define ETMEMD_MAX_PARAMETER_NUM 5
+#define ETMEMD_MAX_PARAMETER_NUM 6
#define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
+/* in some system the max length of pid may be larger than 5, so we use 10 herr */
+#define PID_STR_MAX_LEN 10
+
+#define PIPE_FD_LEN 2
+
/*
* function: parse cmdline passed to etmemd server.
*
diff --git a/inc/etmemd_inc/etmemd_rpc.h b/inc/etmemd_inc/etmemd_rpc.h
index 146cec3..aa0a49b 100644
--- a/inc/etmemd_inc/etmemd_rpc.h
+++ b/inc/etmemd_inc/etmemd_rpc.h
@@ -55,5 +55,6 @@ int etmemd_parse_sock_name(const char *sock_name);
int etmemd_rpc_server(void);
bool etmemd_sock_name_set(void);
void etmemd_sock_name_free(void);
+int etmemd_deal_systemctl(void);
#endif
diff --git a/inc/etmemd_inc/etmemd_task.h b/inc/etmemd_inc/etmemd_task.h
index be3ade3..29e8e8f 100644
--- a/inc/etmemd_inc/etmemd_task.h
+++ b/inc/etmemd_inc/etmemd_task.h
@@ -23,9 +23,6 @@
#include "etmemd_threadtimer.h"
#include "etmemd_task_exp.h"
-/* in some system the max length of pid may be larger than 5, so we use 10 here */
-#define PID_STR_MAX_LEN 10
-
struct task_pid {
unsigned int pid;
float rt_swapin_rate; /* real time swapin rate */
diff --git a/src/etmemd_src/etmemd_common.c b/src/etmemd_src/etmemd_common.c
index 4b9c4cb..155a64b 100644
--- a/src/etmemd_src/etmemd_common.c
+++ b/src/etmemd_src/etmemd_common.c
@@ -37,6 +37,7 @@ static void usage(void)
"\noptions:\n"
" -l|--log-level <log-level> Log level\n"
" -s|--socket <sockect name> Socket name to listen to\n"
+ " -m|--mode-systemctl mode used to start(systemctl)\n"
" -h|--help Show this message\n");
}
@@ -66,6 +67,9 @@ static int etmemd_parse_opts_valid(int opt, bool *is_help)
*is_help = true;
usage();
break;
+ case 'm':
+ ret = etmemd_deal_systemctl();
+ break;
case '?':
printf("error: parse parameters failed\n");
/* fallthrough */
@@ -99,12 +103,13 @@ static int etmemd_parse_check_result(int params_cnt, int argc, const bool *is_he
int etmemd_parse_cmdline(int argc, char *argv[], bool *is_help)
{
- const char *op_str = "s:l:h";
+ const char *op_str = "s:l:mh";
int params_cnt = 0;
int opt, ret;
struct option long_options[] = {
{"socket", required_argument, NULL, 's'},
{"log-level", required_argument, NULL, 'l'},
+ {"mode-systemctl", no_argument, NULL, 'm'},
{"help", no_argument, NULL, 'h'},
{NULL, 0, NULL, 0},
};
diff --git a/src/etmemd_src/etmemd_rpc.c b/src/etmemd_src/etmemd_rpc.c
index 8360f5a..ba5971c 100644
--- a/src/etmemd_src/etmemd_rpc.c
+++ b/src/etmemd_src/etmemd_rpc.c
@@ -19,6 +19,9 @@
#include <sys/socket.h>
#include <signal.h>
#include <glib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
#include "securec.h"
#include "etmemd_rpc.h"
#include "etmemd_project.h"
@@ -35,6 +38,8 @@
static bool g_exit = true;
static char *g_sock_name = NULL;
static int g_sock_fd;
+static int g_fd[PIPE_FD_LEN];
+static int g_use_systemctl = 0;
struct server_rpc_params g_rpc_params;
struct rpc_resp_msg {
@@ -67,6 +72,12 @@ struct rpc_resp_msg g_resp_msg_arr[] = {
{OPT_RET_END, NULL},
};
+int etmemd_deal_systemctl(void)
+{
+ g_use_systemctl = 1;
+ return 0;
+}
+
static void etmemd_set_flag(int s)
{
etmemd_log(ETMEMD_LOG_ERR, "caught signal %d\n", s);
@@ -637,8 +648,69 @@ RPC_EXIT:
return ret;
}
+static int rpc_deal_parent(void)
+{
+ int len, handle, pid;
+ char pid_s[PID_STR_MAX_LEN];
+ int val = 0;
+
+ /* in systemctl mode, parent process need to write child pid */
+ if (socketpair(AF_UNIX, SOCK_STREAM, 0, g_fd) < 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "Error initing pipefd\n");
+ return -1;
+ }
+
+ pid = fork();
+ if (pid != 0) {
+ if ((handle = open("/run/etmemd.pid", O_WRONLY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE)) == -1) {
+ etmemd_log(ETMEMD_LOG_ERR, "Error opening file\n");
+ exit(1);
+ }
+
+ if ((len = sprintf_s(pid_s, PID_STR_MAX_LEN, "%d", pid)) <= 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "sprintf for pid failed\n");
+ exit(1);
+ }
+
+ if ((write(handle, pid_s, len)) != len) {
+ etmemd_log(ETMEMD_LOG_ERR, "Error writing to the file\n");
+ exit(1);
+ }
+
+ close(g_fd[1]);
+ if (read(g_fd[0], &val, sizeof(val)) <= 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "Error reading to the file\n");
+ exit(1);
+ }
+
+ if (val == 1) {
+ exit(0);
+ }
+ }
+ return 0;
+}
+
+static int rpc_deal_child(void)
+{
+ int val = 1;
+ close(g_fd[0]);
+ if (write(g_fd[1], &val, sizeof(val)) <= 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "Error writing pipe fd\n");
+ return -1;
+ }
+ close(g_fd[1]);
+ return 0;
+}
+
int etmemd_rpc_server(void)
{
+ /* in systemctl mode, parent process need to write child pid */
+ if (g_use_systemctl) {
+ if (rpc_deal_parent() != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "Error deal by parent process\n");
+ return -1;
+ }
+ }
if (!etmemd_sock_name_set()) {
etmemd_log(ETMEMD_LOG_ERR, "socket name of rpc must be provided\n");
return -1;
@@ -661,6 +733,14 @@ int etmemd_rpc_server(void)
return -1;
}
+ /* in systemctl mode, child process need to notify parent to exit */
+ if (g_use_systemctl) {
+ if (rpc_deal_child() != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "Error sending message to parent process\n");
+ return -1;
+ }
+ }
+
while (!g_exit) {
if (etmemd_rpc_accept(g_sock_fd) != 0) {
etmemd_log(ETMEMD_LOG_ERR, "handle remote call failed once, error(%s)\n",
diff --git a/src/etmemd_src/etmemd_task.c b/src/etmemd_src/etmemd_task.c
index b948c63..01491f7 100644
--- a/src/etmemd_src/etmemd_task.c
+++ b/src/etmemd_src/etmemd_task.c
@@ -205,7 +205,7 @@ static int get_pid_from_type_name(char *val, char *pid)
char *arg_pid[] = {"/usr/bin/pgrep", "-x", val, NULL};
FILE *file = NULL;
int ret = -1;
- int pipefd[2]; /* used for pipefd[2] communication to obtain the task PID */
+ int pipefd[PIPE_FD_LEN]; /* used for pipefd[PIPE_FD_LEN] communication to obtain the task PID */
if (pipe(pipefd) == -1) {
return -1;
@@ -269,7 +269,7 @@ static int fill_task_child_pid(struct task *tk, char *pid)
char *arg_pid[] = {"/usr/bin/pgrep", "-P", pid, NULL};
FILE *file = NULL;
int ret;
- int pipefd[2]; /* used for pipefd[2] communication to obtain the task PID */
+ int pipefd[PIPE_FD_LEN]; /* used for pipefd[PIPE_FD_LEN] communication to obtain the task PID */
if (pipe(pipefd) == -1) {
return -1;
--
2.27.0

View File

@ -1,524 +0,0 @@
From dcf4760df185d5e75f522914e160d85d4f3543ce Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Tue, 11 May 2021 15:53:10 +0800
Subject: [PATCH 26/50] add scan library
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
CMakeLists.txt | 25 ++++++++++
inc/etmemd_inc/etmemd.h | 23 +---------
inc/etmemd_inc/etmemd_exp.h | 42 +++++++++++++++++
inc/etmemd_inc/etmemd_scan.h | 43 ++---------------
inc/etmemd_inc/etmemd_scan_exp.h | 71 +++++++++++++++++++++++++++++
inc/etmemd_inc/etmemd_scan_export.h | 22 +++++++++
src/etmemd_src/etmemd_common.c | 13 +++++-
src/etmemd_src/etmemd_scan.c | 67 +++++++++++++++++++++++++--
src/etmemd_src/etmemd_scan.version | 4 ++
9 files changed, 244 insertions(+), 66 deletions(-)
create mode 100644 inc/etmemd_inc/etmemd_exp.h
create mode 100644 inc/etmemd_inc/etmemd_scan_exp.h
create mode 100644 inc/etmemd_inc/etmemd_scan_export.h
create mode 100644 src/etmemd_src/etmemd_scan.version
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9ce4724..6d11da9 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -55,8 +55,13 @@ add_executable(etmemd
add_executable(etmem
${ETMEM_SRC})
+add_library(etmemd_scan SHARED
+ ${ETMEMD_SRC})
+
set(EXECUTABLE_OUTPUT_PATH ${BUILD_DIR}/bin)
+set(LIBRARY_OUTPUT_PATH ${BUILD_DIR}/lib)
+
include(FindPkgConfig)
pkg_search_module(GLIB2 REQUIRED glib-2.0)
@@ -67,6 +72,10 @@ target_include_directories(etmemd PRIVATE
target_include_directories(etmem PRIVATE
${PROJECT_SOURCE_DIR}/inc/etmem_inc)
+target_include_directories(etmemd_scan PRIVATE
+ ${PROJECT_SOURCE_DIR}/inc/etmemd_inc
+ ${GLIB2_INCLUDE_DIRS})
+
target_compile_options(etmemd PRIVATE -fsigned-char -fno-omit-frame-pointer -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wmissing-declarations -fno-strict-aliasing -Werror -Wformat -Wformat-security -D_GNU_SOURCE -fPIE -pie -fPIC -fstack-protector-strong -fno-common -DNDEBUG -O2 -D_FORTIFY_SOURCE=2 -Wall -Werror -Wl,-z,relro,-z,now,-z,noexecstack -Wtrampolines -pthread -Wno-pointer-sign -Wstrict-prototypes -Wold-style-definition -std=gnu99)
@@ -97,3 +106,19 @@ if( ${ARCHITECTURE} STREQUAL "aarch64" )
else()
target_compile_options(etmem PRIVATE -march=core-avx-i -m64)
endif()
+
+target_compile_options(etmemd_scan PRIVATE -fsigned-char -fno-omit-frame-pointer -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wmissing-declarations -fno-strict-aliasing -Werror -Wformat -Wformat-security -D_GNU_SOURCE -fPIE -pie -fPIC -fstack-protector-strong -fno-common -DNDEBUG -O2 -D_FORTIFY_SOURCE=2 -Wall -Werror -Wl,-z,relro,-z,now,-z,noexecstack -Wtrampolines -pthread -Wno-pointer-sign -Wstrict-prototypes -Wold-style-definition -std=gnu99 -fPIC -shared)
+
+
+if(CONFIG_DEBUG STREQUAL "y")
+ target_compile_options(etmemd_scan PRIVATE -g)
+endif()
+
+set_target_properties(etmemd_scan PROPERTIES LINK_FLAGS "-s -fPIE -pie -fPIC -Wl,-z,relro,-z,now,-z,noexecstack -Wtrampolines -Wl,--version-script=${ETMEMD_SRC_DIR}/etmemd_scan.version")
+target_link_libraries(etmemd_scan PRIVATE pthread dl rt boundscheck numa ${GLIB2_LIBRARIES})
+
+if( ${ARCHITECTURE} STREQUAL "aarch64" )
+ target_compile_options(etmemd_scan PRIVATE -march=armv8-a)
+else()
+ target_compile_options(etmemd_scan PRIVATE -march=core-avx-i -m64)
+endif()
diff --git a/inc/etmemd_inc/etmemd.h b/inc/etmemd_inc/etmemd.h
index 797049e..357ea4a 100644
--- a/inc/etmemd_inc/etmemd.h
+++ b/inc/etmemd_inc/etmemd.h
@@ -16,34 +16,13 @@
#ifndef ETMEMD_H
#define ETMEMD_H
-#include <stdint.h>
#include <stdbool.h>
+#include "etmemd_exp.h"
#define PTE_SIZE_SHIFT 12
#define PMD_SIZE_SHIFT 21
#define PUD_SIZE_SHIFT 30
-/*
- * page type specified by size
- * */
-enum page_type {
- PTE_TYPE = 0,
- PMD_TYPE,
- PUD_TYPE,
- PAGE_TYPE_INVAL,
-};
-
-/*
- * page struct after scan and parse
- * */
-struct page_refs {
- uint64_t addr; /* page address */
- int count; /* page count */
- enum page_type type; /* page type including PTE/PMD/PUD */
-
- struct page_refs *next; /* point to next page */
-};
-
/* memory grade is the result that judged by policy function after pagerefs come into it,
* every policy fucntion has its own rule to make the choice which page is hot grade or
* the other grades */
diff --git a/inc/etmemd_inc/etmemd_exp.h b/inc/etmemd_inc/etmemd_exp.h
new file mode 100644
index 0000000..8c57d9f
--- /dev/null
+++ b/inc/etmemd_inc/etmemd_exp.h
@@ -0,0 +1,42 @@
+/******************************************************************************
+ * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+ * etmem is licensed under the Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+ * PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * Author: shikemeng
+ * Create: 2021-04-30
+ * Description: This is a header file of the export data structure definition for page.
+ ******************************************************************************/
+
+#ifndef ETMEMD_EXP_H
+#define ETMEMD_EXP_H
+
+#include <stdint.h>
+
+/*
+ * page type specified by size
+ * */
+enum page_type {
+ PTE_TYPE = 0,
+ PMD_TYPE,
+ PUD_TYPE,
+ PAGE_TYPE_INVAL,
+};
+
+/*
+ * page struct after scan and parse
+ * */
+struct page_refs {
+ uint64_t addr; /* page address */
+ int count; /* page count */
+ enum page_type type; /* page type including PTE/PMD/PUD */
+
+ struct page_refs *next; /* point to next page */
+};
+
+#endif
diff --git a/inc/etmemd_inc/etmemd_scan.h b/inc/etmemd_inc/etmemd_scan.h
index ed72e1a..09ad51c 100644
--- a/inc/etmemd_inc/etmemd_scan.h
+++ b/inc/etmemd_inc/etmemd_scan.h
@@ -19,9 +19,8 @@
#include <fcntl.h>
#include "etmemd.h"
#include "etmemd_task.h"
+#include "etmemd_scan_exp.h"
-#define VMA_PATH_STR_LEN 256
-#define VMA_MAJOR_MINOR_LEN 8
#define VMA_SEG_CNT_MAX 6
#define VMA_PERMS_STR_LEN 5
#define VMA_ADDR_STR_LEN 17
@@ -35,15 +34,7 @@
#define SMAPS_FILE "/smaps"
#define VMFLAG_HEAD "VmFlags"
-#define SCAN_AS_HUGE O_LARGEFILE
-
-enum {
- VMA_STAT_READ = 0,
- VMA_STAT_WRITE,
- VMA_STAT_EXEC,
- VMA_STAT_MAY_SHARE,
- VMA_STAT_INIT,
-};
+#define ALL_SCAN_FLAGS (SCAN_AS_HUGE | SCAN_IGN_HOST)
enum page_idle_type {
PTE_ACCESS = 0, /* 4k page */
@@ -66,40 +57,12 @@ enum access_type_weight {
WRITE_TYPE_WEIGHT = 3,
};
-/*
- * vma struct
- * */
-struct vma {
- uint64_t start; /* address start */
- uint64_t end; /* address end */
- bool stat[VMA_STAT_INIT]; /* vm area permissions */
- uint64_t offset; /* vm area offset */
- uint64_t inode; /* vm area inode */
- char path[VMA_PATH_STR_LEN]; /* path name */
- char major[VMA_MAJOR_MINOR_LEN]; /* device number major part */
- char minor[VMA_MAJOR_MINOR_LEN]; /* device number minor part */
-
- struct vma *next; /* point to next vma */
-};
-
struct walk_address {
uint64_t walk_start; /* walk address start */
uint64_t walk_end; /* walk address end */
uint64_t last_walk_end; /* last walk address end */
};
-/*
- * vmas struct
- * */
-struct vmas {
- uint64_t vma_cnt; /* number of vm area */
-
- struct vma *vma_list; /* vm area list */
-};
-
-/* etmemd_free_page_refs need to be called by the handler who called etmemd_do_scan() successfully */
-void etmemd_free_page_refs(struct page_refs *pf);
-
/* the caller need to judge value returned by etmemd_do_scan(), NULL means fail. */
struct page_refs *etmemd_do_scan(const struct task_pid *tpid, const struct task *tk);
@@ -107,7 +70,7 @@ struct page_refs *etmemd_do_scan(const struct task_pid *tpid, const struct task
void free_vmas(struct vmas *vmas);
struct page_refs **walk_vmas(int fd, struct walk_address *walk_address, struct page_refs **pf, unsigned long *use_rss);
-int get_page_refs(const struct vmas *vmas, const char *pid, struct page_refs **page_refs, unsigned long *use_rss);
+int get_page_refs(const struct vmas *vmas, const char *pid, struct page_refs **page_refs, unsigned long *use_rss, int flags);
int split_vmflags(char ***vmflags_array, char *vmflags);
struct vmas *get_vmas_with_flags(const char *pid, char **vmflags_array, int vmflags_num, bool is_anon_only);
diff --git a/inc/etmemd_inc/etmemd_scan_exp.h b/inc/etmemd_inc/etmemd_scan_exp.h
new file mode 100644
index 0000000..1fd4379
--- /dev/null
+++ b/inc/etmemd_inc/etmemd_scan_exp.h
@@ -0,0 +1,71 @@
+/******************************************************************************
+ * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+ * etmem is licensed under the Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+ * PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * Author: shikemeng
+ * Create: 2021-04-30
+ * Description: This is a header file of the function declaration for export scan function.
+ ******************************************************************************/
+
+#ifndef ETMEMD_SCAN_EXP_H
+#define ETMEMD_SCAN_EXP_H
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <fcntl.h>
+
+#define VMA_PATH_STR_LEN 256
+#define VMA_MAJOR_MINOR_LEN 8
+
+#define SCAN_AS_HUGE 0100000000 /* treat normal vm page as vm hugepage */
+#define SCAN_IGN_HOST 0200000000 /* ignore host access when scan vm */
+
+enum {
+ VMA_STAT_READ = 0,
+ VMA_STAT_WRITE,
+ VMA_STAT_EXEC,
+ VMA_STAT_MAY_SHARE,
+ VMA_STAT_INIT,
+};
+
+/*
+ * vma struct
+ * */
+struct vma {
+ uint64_t start; /* address start */
+ uint64_t end; /* address end */
+ bool stat[VMA_STAT_INIT]; /* vm area permissions */
+ uint64_t offset; /* vm area offset */
+ uint64_t inode; /* vm area inode */
+ char path[VMA_PATH_STR_LEN]; /* path name */
+ char major[VMA_MAJOR_MINOR_LEN]; /* device number major part */
+ char minor[VMA_MAJOR_MINOR_LEN]; /* device number minor part */
+
+ struct vma *next; /* point to next vma */
+};
+
+/*
+ * vmas struct
+ * */
+struct vmas {
+ uint64_t vma_cnt; /* number of vm area */
+
+ struct vma *vma_list; /* vm area list */
+};
+
+int etmemd_scan_init(void);
+void etmemd_scan_exit(void);
+
+struct vmas *etmemd_get_vmas(const char *pid, char **vmflags_array, int vmflags_num, bool is_anon_only);
+void etmemd_free_vmas(struct vmas *vmas);
+
+int etmemd_get_page_refs(const struct vmas *vmas, const char *pid, struct page_refs **page_refs, int flags);
+void etmemd_free_page_refs(struct page_refs *page_refs);
+
+#endif
diff --git a/inc/etmemd_inc/etmemd_scan_export.h b/inc/etmemd_inc/etmemd_scan_export.h
new file mode 100644
index 0000000..7ddc097
--- /dev/null
+++ b/inc/etmemd_inc/etmemd_scan_export.h
@@ -0,0 +1,22 @@
+/******************************************************************************
+ * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+ * etmem is licensed under the Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+ * PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * Author: shikemeng
+ * Create: 2021-4-30
+ * Description: This is a header file of the export scan library.
+ ******************************************************************************/
+
+#ifndef ETMEMD_SCAN_EXPORT_H
+#define ETMEMD_SCAN_EXPORT_H
+
+#include "etmemd_exp.h"
+#include "etmemd_scan_exp.h"
+
+#endif
diff --git a/src/etmemd_src/etmemd_common.c b/src/etmemd_src/etmemd_common.c
index 4b9c4cb..59933c4 100644
--- a/src/etmemd_src/etmemd_common.c
+++ b/src/etmemd_src/etmemd_common.c
@@ -24,12 +24,18 @@
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
#include "securec.h"
#include "etmemd_common.h"
#include "etmemd_rpc.h"
#include "etmemd_log.h"
+#define IDLE_SCAN_MAGIC 0X66
+#define IDLE_SCAN_ADD_FLAGS _IOW(IDLE_SCAN_MAGIC, 0x0, unsigned int)
+#define IDLE_SCAN_REMOVE_FLAGS _IOW(IDLE_SCAN_MAGIC, 0x1, unsigned int)
+
static void usage(void)
{
printf("\nusage of etmemd:\n"
@@ -228,11 +234,16 @@ FILE *etmemd_get_proc_file(const char *pid, const char *file, int flags, const c
return NULL;
}
- fd = open(file_name, flags);
+ fd = open(file_name, 0);
if (fd < 0) {
etmemd_log(ETMEMD_LOG_ERR, "open file %s fail\n", file_name);
goto free_file_name;
}
+ if (flags != 0 && ioctl(fd, IDLE_SCAN_ADD_FLAGS, &flags) != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "set idle flags for %s fail with %s\n", pid, strerror(errno));
+ close(fd);
+ goto free_file_name;
+ }
fp = fdopen(fd, mode);
free_file_name:
diff --git a/src/etmemd_src/etmemd_scan.c b/src/etmemd_src/etmemd_scan.c
index fb4dd33..ba0cf5e 100644
--- a/src/etmemd_src/etmemd_scan.c
+++ b/src/etmemd_src/etmemd_scan.c
@@ -35,6 +35,8 @@
#define VMFLAG_MAX_LEN 100
#define VMFLAG_MAX_NUM 30
+static bool g_exp_scan_inited = false;
+
static const enum page_type g_page_type_by_idle_kind[] = {
PTE_TYPE,
PMD_TYPE,
@@ -403,6 +405,25 @@ struct vmas *get_vmas(const char *pid)
return get_vmas_with_flags(pid, NULL, 0, true);
}
+struct vmas *etmemd_get_vmas(const char *pid, char *vmflags_array[], int vmflags_num, bool is_anon_only)
+{
+ int i;
+
+ if (pid == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "etmemd_get_vmas pid param is NULL\n");
+ return NULL;
+ }
+
+ for (i = 0; i < vmflags_num; i++) {
+ if (vmflags_array[i] == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "etmemd_get_vmas vmflags_array[%d] is NULL\n", i);
+ return NULL;
+ }
+ }
+
+ return get_vmas_with_flags(pid, vmflags_array, vmflags_num, is_anon_only);
+}
+
static u_int64_t get_address_from_buf(const unsigned char *buf, u_int64_t index)
{
u_int64_t address;
@@ -633,7 +654,7 @@ struct page_refs **walk_vmas(int fd,
* this parameter is used only in the dynamic engine to calculate the swap-in rate.
* In other policies, NULL can be directly transmitted.
* */
-int get_page_refs(const struct vmas *vmas, const char *pid, struct page_refs **page_refs, unsigned long *use_rss)
+int get_page_refs(const struct vmas *vmas, const char *pid, struct page_refs **page_refs, unsigned long *use_rss, int flags)
{
u_int64_t i;
FILE *scan_fp = NULL;
@@ -642,7 +663,7 @@ int get_page_refs(const struct vmas *vmas, const char *pid, struct page_refs **p
struct page_refs **tmp_page_refs = NULL;
struct walk_address walk_address = {0, 0, 0};
- scan_fp = etmemd_get_proc_file(pid, IDLE_SCAN_FILE, 0, "r");
+ scan_fp = etmemd_get_proc_file(pid, IDLE_SCAN_FILE, flags, "r");
if (scan_fp == NULL) {
etmemd_log(ETMEMD_LOG_ERR, "open %s file fail\n", IDLE_SCAN_FILE);
return -1;
@@ -683,6 +704,21 @@ int get_page_refs(const struct vmas *vmas, const char *pid, struct page_refs **p
return 0;
}
+int etmemd_get_page_refs(const struct vmas *vmas, const char *pid, struct page_refs **page_refs, int flags)
+{
+ if (!g_exp_scan_inited) {
+ etmemd_log(ETMEMD_LOG_ERR, "scan module is not inited before etmemd_get_page_refs\n");
+ return -1;
+ }
+
+ if (vmas == NULL || pid == NULL || page_refs == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "NULL param is found in etmemd_get_page_refs\n");
+ return -1;
+ }
+
+ return get_page_refs(vmas, pid, page_refs, NULL, flags & ALL_SCAN_FLAGS);
+}
+
void etmemd_free_page_refs(struct page_refs *pf)
{
struct page_refs *tmp_pf = NULL;
@@ -721,7 +757,7 @@ struct page_refs *etmemd_do_scan(const struct task_pid *tpid, const struct task
/* loop for scanning idle_pages to get result of memory access. */
for (i = 0; i < tk->eng->proj->loop; i++) {
- ret = get_page_refs(vmas, pid, &page_refs, NULL);
+ ret = get_page_refs(vmas, pid, &page_refs, NULL, 0);
if (ret != 0) {
etmemd_log(ETMEMD_LOG_ERR, "scan operation failed\n");
/* free page_refs nodes already exist */
@@ -737,6 +773,11 @@ struct page_refs *etmemd_do_scan(const struct task_pid *tpid, const struct task
return page_refs;
}
+void etmemd_free_vmas(struct vmas *vmas)
+{
+ free_vmas(vmas);
+}
+
void clean_page_refs_unexpected(void *arg)
{
struct page_refs **pf = (struct page_refs **)arg;
@@ -773,3 +814,23 @@ struct page_refs *add_page_refs_into_memory_grade(struct page_refs *page_refs, s
/* return the next page_refs of the one that passed in */
return tmp;
}
+
+int etmemd_scan_init(void)
+{
+ if (g_exp_scan_inited) {
+ etmemd_log(ETMEMD_LOG_ERR, "scan module already inited\n");
+ return -1;
+ }
+
+ if (init_g_page_size() == -1) {
+ return -1;
+ }
+
+ g_exp_scan_inited = true;
+ return 0;
+}
+
+void etmemd_scan_exit(void)
+{
+ g_exp_scan_inited = false;
+}
diff --git a/src/etmemd_src/etmemd_scan.version b/src/etmemd_src/etmemd_scan.version
new file mode 100644
index 0000000..576c96f
--- /dev/null
+++ b/src/etmemd_src/etmemd_scan.version
@@ -0,0 +1,4 @@
+libetmemd_scan {
+ global: etmemd_scan_init; etmemd_scan_exit; etmemd_get_vmas; etmemd_free_vmas; etmemd_get_page_refs; etmemd_free_page_refs;
+ local:*;
+};
--
2.27.0

View File

@ -1,72 +0,0 @@
From 104406ad127feeafbf5c8d618c608285ff23cd78 Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Tue, 11 May 2021 16:08:39 +0800
Subject: [PATCH 27/50] add ign_host to ignore host access when scan vm
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
src/etmemd_src/etmemd_cslide.c | 25 ++++++++++++++++++++++++-
1 file changed, 24 insertions(+), 1 deletion(-)
diff --git a/src/etmemd_src/etmemd_cslide.c b/src/etmemd_src/etmemd_cslide.c
index 47a3608..9a2ab04 100644
--- a/src/etmemd_src/etmemd_cslide.c
+++ b/src/etmemd_src/etmemd_cslide.c
@@ -98,6 +98,7 @@ struct cslide_task_params {
char **vmflags_array;
int vmflags_num;
};
+ int scan_flags;
};
struct vma_pf {
@@ -1285,13 +1286,14 @@ static int cslide_scan_vmas(struct cslide_pid_params *params)
struct walk_address walk_address;
uint64_t i;
int fd;
+ struct cslide_task_params *task_params = params->task_params;
if (snprintf_s(pid, PID_STR_MAX_LEN, PID_STR_MAX_LEN - 1, "%u", params->pid) <= 0) {
etmemd_log(ETMEMD_LOG_ERR, "snpintf pid %u fail\n", params->pid);
return -1;
}
- scan_fp = etmemd_get_proc_file(pid, IDLE_SCAN_FILE, SCAN_AS_HUGE, "r");
+ scan_fp = etmemd_get_proc_file(pid, IDLE_SCAN_FILE, task_params->scan_flags, "r");
if (scan_fp == NULL) {
etmemd_log(ETMEMD_LOG_ERR, "open %s file for pid %u fail\n", IDLE_SCAN_FILE, params->pid);
return -1;
@@ -1922,9 +1924,30 @@ static int fill_task_vm_flags(void *obj, void *val)
return 0;
}
+static int fill_task_scan_flags(void *obj, void *val)
+{
+ struct cslide_task_params *params = (struct cslide_task_params *)obj;
+ char *ign_host = (char *)val;
+ int ret = 0;
+
+ params->scan_flags |= SCAN_AS_HUGE;
+
+ if (strcmp(ign_host, "yes") == 0) {
+ params->scan_flags |= SCAN_IGN_HOST;
+ } else if (strcmp(ign_host, "no") != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "ign_host : not support %s\n", ign_host);
+ etmemd_log(ETMEMD_LOG_ERR, "ign_host : only support yes/no\n");
+ return -1;
+ }
+
+ free(val);
+ return ret;
+}
+
static struct config_item g_cslide_task_config_items[] = {
{"vm_flags", STR_VAL, fill_task_vm_flags, false},
{"anon_only", STR_VAL, fill_task_anon_only, false},
+ {"ign_host", STR_VAL, fill_task_scan_flags, false},
};
static int cslide_fill_task(GKeyFile *config, struct task *tk)
--
2.27.0

View File

@ -1,41 +0,0 @@
From 4c33e102cd7745a4b2c2186414e0f2338e763916 Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Tue, 11 May 2021 16:09:26 +0800
Subject: [PATCH 28/50] openlog with same ident
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
src/etmemd_src/etmemd_log.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/etmemd_src/etmemd_log.c b/src/etmemd_src/etmemd_log.c
index fc49db8..5d7dece 100644
--- a/src/etmemd_src/etmemd_log.c
+++ b/src/etmemd_src/etmemd_log.c
@@ -58,19 +58,19 @@ void etmemd_log(enum log_level log_level, const char *format, ...)
switch (log_level) {
case ETMEMD_LOG_DEBUG:
- openlog("[etmemd_debug] ", LOG_PID, LOG_USER);
+ openlog("[etmemd] ", LOG_PID, LOG_USER);
vsyslog(LOG_DEBUG, format, args_in);
break;
case ETMEMD_LOG_INFO:
- openlog("[etmemd_info] ", LOG_PID, LOG_USER);
+ openlog("[etmemd] ", LOG_PID, LOG_USER);
vsyslog(LOG_INFO, format, args_in);
break;
case ETMEMD_LOG_WARN:
- openlog("[etmemd_warning] ", LOG_PID, LOG_USER);
+ openlog("[etmemd] ", LOG_PID, LOG_USER);
vsyslog(LOG_WARNING, format, args_in);
break;
case ETMEMD_LOG_ERR:
- openlog("[etmemd_error] ", LOG_PID, LOG_USER);
+ openlog("[etmemd] ", LOG_PID, LOG_USER);
vsyslog(LOG_ERR, format, args_in);
break;
default:
--
2.27.0

View File

@ -1,139 +0,0 @@
From fee91c2853f346d5222bf818930182b7b05b0e9f Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Tue, 11 May 2021 22:44:06 +0800
Subject: [PATCH 29/50] accept advise
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
src/etmemd_src/etmemd_common.c | 2 +-
src/etmemd_src/etmemd_cslide.c | 2 +-
src/etmemd_src/etmemd_log.c | 6 ++----
src/etmemd_src/etmemd_scan.c | 23 ++++++++++++++++++++++-
4 files changed, 26 insertions(+), 7 deletions(-)
diff --git a/src/etmemd_src/etmemd_common.c b/src/etmemd_src/etmemd_common.c
index 59933c4..e1cb1dd 100644
--- a/src/etmemd_src/etmemd_common.c
+++ b/src/etmemd_src/etmemd_common.c
@@ -32,7 +32,7 @@
#include "etmemd_rpc.h"
#include "etmemd_log.h"
-#define IDLE_SCAN_MAGIC 0X66
+#define IDLE_SCAN_MAGIC 0x66
#define IDLE_SCAN_ADD_FLAGS _IOW(IDLE_SCAN_MAGIC, 0x0, unsigned int)
#define IDLE_SCAN_REMOVE_FLAGS _IOW(IDLE_SCAN_MAGIC, 0x1, unsigned int)
diff --git a/src/etmemd_src/etmemd_cslide.c b/src/etmemd_src/etmemd_cslide.c
index 9a2ab04..6f609b8 100644
--- a/src/etmemd_src/etmemd_cslide.c
+++ b/src/etmemd_src/etmemd_cslide.c
@@ -1937,7 +1937,7 @@ static int fill_task_scan_flags(void *obj, void *val)
} else if (strcmp(ign_host, "no") != 0) {
etmemd_log(ETMEMD_LOG_ERR, "ign_host : not support %s\n", ign_host);
etmemd_log(ETMEMD_LOG_ERR, "ign_host : only support yes/no\n");
- return -1;
+ ret = -1;
}
free(val);
diff --git a/src/etmemd_src/etmemd_log.c b/src/etmemd_src/etmemd_log.c
index 5d7dece..0ffcc20 100644
--- a/src/etmemd_src/etmemd_log.c
+++ b/src/etmemd_src/etmemd_log.c
@@ -56,26 +56,24 @@ void etmemd_log(enum log_level log_level, const char *format, ...)
va_start(args_in, format);
+ openlog("[etmemd] ", LOG_PID, LOG_USER);
switch (log_level) {
case ETMEMD_LOG_DEBUG:
- openlog("[etmemd] ", LOG_PID, LOG_USER);
vsyslog(LOG_DEBUG, format, args_in);
break;
case ETMEMD_LOG_INFO:
- openlog("[etmemd] ", LOG_PID, LOG_USER);
vsyslog(LOG_INFO, format, args_in);
break;
case ETMEMD_LOG_WARN:
- openlog("[etmemd] ", LOG_PID, LOG_USER);
vsyslog(LOG_WARNING, format, args_in);
break;
case ETMEMD_LOG_ERR:
- openlog("[etmemd] ", LOG_PID, LOG_USER);
vsyslog(LOG_ERR, format, args_in);
break;
default:
va_end(args_in);
printf("log_level is invalid, please check!\n");
+ closelog();
return;
}
diff --git a/src/etmemd_src/etmemd_scan.c b/src/etmemd_src/etmemd_scan.c
index ba0cf5e..c287c48 100644
--- a/src/etmemd_src/etmemd_scan.c
+++ b/src/etmemd_src/etmemd_scan.c
@@ -34,6 +34,7 @@
#define PMD_IDLE_PTES_PARAMETER 512
#define VMFLAG_MAX_LEN 100
#define VMFLAG_MAX_NUM 30
+#define VMFLAG_VALID_LEN 2
static bool g_exp_scan_inited = false;
@@ -272,6 +273,7 @@ static bool is_vma_with_vmflags(FILE *fp, char *vmflags_array[], int vmflags_num
char parse_line[FILE_LINE_MAX_LEN];
size_t len;
int i;
+ char *flags_start = NULL;
len = strlen(VMFLAG_HEAD);
while (fgets(parse_line, FILE_LINE_MAX_LEN - 1, fp) != NULL) {
@@ -283,9 +285,10 @@ static bool is_vma_with_vmflags(FILE *fp, char *vmflags_array[], int vmflags_num
continue;
}
+ flags_start = strstr(parse_line, ":");
/* check any flag in flags is set */
for (i = 0; i < vmflags_num; i++) {
- if (strstr(parse_line, vmflags_array[i]) == NULL) {
+ if (strstr(flags_start + 1, vmflags_array[i]) == NULL) {
return false;
}
}
@@ -405,6 +408,20 @@ struct vmas *get_vmas(const char *pid)
return get_vmas_with_flags(pid, NULL, 0, true);
}
+static bool is_flag_valid(char *flag)
+{
+ if (strstr(flag, " ") != NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "flag %s include space\n", flag);
+ return false;
+ }
+ if (strlen(flag) != VMFLAG_VALID_LEN) {
+ etmemd_log(ETMEMD_LOG_ERR, "flag %s len is not 2\n", flag);
+ return false;
+ }
+
+ return true;
+}
+
struct vmas *etmemd_get_vmas(const char *pid, char *vmflags_array[], int vmflags_num, bool is_anon_only)
{
int i;
@@ -419,6 +436,10 @@ struct vmas *etmemd_get_vmas(const char *pid, char *vmflags_array[], int vmflags
etmemd_log(ETMEMD_LOG_ERR, "etmemd_get_vmas vmflags_array[%d] is NULL\n", i);
return NULL;
}
+ if (!is_flag_valid(vmflags_array[i])) {
+ etmemd_log(ETMEMD_LOG_ERR, "etmemd_get_vmas flag %s invalid\n", vmflags_array[i]);
+ return NULL;
+ }
}
return get_vmas_with_flags(pid, vmflags_array, vmflags_num, is_anon_only);
--
2.27.0

View File

@ -1,157 +0,0 @@
From 21795f23fa1532edffb636de90789749bf7dae04 Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Tue, 11 May 2021 16:35:55 +0800
Subject: [PATCH 30/50] notify rpc success with finish tag
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
src/etmem_src/etmem_rpc.c | 39 +++++++++++++++++++++----------------
src/etmemd_src/etmemd_rpc.c | 25 ++++++++++++++++--------
2 files changed, 39 insertions(+), 25 deletions(-)
diff --git a/src/etmem_src/etmem_rpc.c b/src/etmem_src/etmem_rpc.c
index 48a4a96..2c70cf8 100644
--- a/src/etmem_src/etmem_rpc.c
+++ b/src/etmem_src/etmem_rpc.c
@@ -31,6 +31,9 @@
#define ETMEM_RPC_SEND_BUF_LEN 512
#define ETMEM_RPC_CONN_TIMEOUT 10
+#define SUCCESS_CHAR (0xff)
+#define FAIL_CHAR (0xfe)
+
static int etmem_client_conn(const struct mem_proj *proj, int sockfd)
{
struct sockaddr_un svr_addr;
@@ -144,14 +147,6 @@ EXIT:
return ret;
}
-static bool etmem_recv_find_fail_keyword(const char *recv_msg)
-{
- if (strstr(recv_msg, "error") != NULL) {
- return true;
- }
- return false;
-}
-
static int etmem_client_recv(int sockfd)
{
ssize_t recv_size;
@@ -159,6 +154,7 @@ static int etmem_client_recv(int sockfd)
char *recv_msg = NULL;
uint8_t *recv_buf = NULL;
size_t recv_len = ETMEM_RPC_RECV_BUF_LEN;
+ bool done = false;
recv_buf = (uint8_t *)calloc(recv_len, sizeof(uint8_t));
if (recv_buf == NULL) {
@@ -166,27 +162,36 @@ static int etmem_client_recv(int sockfd)
return -1;
}
- while (true) {
+ while (!done) {
recv_size = recv(sockfd, recv_buf, recv_len - 1, 0);
if (recv_size < 0) {
perror("recv failed:");
goto EXIT;
}
if (recv_size == 0) {
- if (errno == EAGAIN || errno == EWOULDBLOCK) {
- printf("recv timeout:\n");
- }
- ret = 0;
+ printf("connection closed by peer\n");
goto EXIT;
}
recv_msg = (char *)recv_buf;
recv_msg[recv_size] = '\0';
- printf("%s\n", recv_msg);
- if (etmem_recv_find_fail_keyword(recv_msg)) {
- printf("error occurs when getting response from etmemd server\n");
- goto EXIT;
+
+ // check and erease finish flag
+ switch (recv_msg[recv_size - 1]) {
+ case (char)SUCCESS_CHAR:
+ ret = 0;
+ done = true;
+ recv_msg[recv_size - 1] = '\0';
+ break;
+ case (char)FAIL_CHAR:
+ done = true;
+ recv_msg[recv_size - 1] = '\n';
+ break;
+ default:
+ break;
}
+
+ printf("%s", recv_msg);
}
EXIT:
diff --git a/src/etmemd_src/etmemd_rpc.c b/src/etmemd_src/etmemd_rpc.c
index ba5971c..208f6b5 100644
--- a/src/etmemd_src/etmemd_rpc.c
+++ b/src/etmemd_src/etmemd_rpc.c
@@ -35,6 +35,9 @@
#define RPC_CLIENT_MAX 1
#define RPC_BUFF_LEN_MAX 512
+#define SUCCESS_CHAR (0xff)
+#define FAIL_CHAR (0Xfe)
+
static bool g_exit = true;
static char *g_sock_name = NULL;
static int g_sock_fd;
@@ -58,7 +61,6 @@ struct server_rpc_parser g_rpc_parser[] = {
};
struct rpc_resp_msg g_resp_msg_arr[] = {
- {OPT_SUCCESS, "success"},
{OPT_INVAL, "error: invalid parameters"},
{OPT_PRO_EXISTED, "error: project has been existed"},
{OPT_PRO_NOEXIST, "error: project is not exist"},
@@ -533,10 +535,7 @@ static void etmemd_rpc_send_response_msg(int sock_fd, enum opt_result result)
{
int i = 0;
ssize_t ret = -1;
-
- if (result == OPT_SUCCESS) {
- return;
- }
+ char finish_tag;
while (g_resp_msg_arr[i].msg != NULL) {
if (result != g_resp_msg_arr[i].result) {
@@ -545,12 +544,22 @@ static void etmemd_rpc_send_response_msg(int sock_fd, enum opt_result result)
}
ret = send(sock_fd, g_resp_msg_arr[i].msg, strlen(g_resp_msg_arr[i].msg), 0);
+ if (ret < 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "send response to client fail, error(%s)\n",
+ strerror(errno));
+ }
break;
}
- if (ret < 0) {
- etmemd_log(ETMEMD_LOG_ERR, "send response to client fail, error(%s)\n",
- strerror(errno));
+ // notify result with finish tag
+ if (result == OPT_SUCCESS) {
+ finish_tag = SUCCESS_CHAR;
+ } else {
+ finish_tag = FAIL_CHAR;
+ }
+ ret = send(sock_fd, &finish_tag, 1, 0);
+ if (ret <= 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "send finish tag fail\n");
}
return;
}
--
2.27.0

View File

@ -1,131 +0,0 @@
From 57861ad98668370ef2b8de094ba2b5bfed4f9bac Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Wed, 12 May 2021 15:40:17 +0800
Subject: [PATCH 31/50] remove node_watermark
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
src/etmemd_src/etmemd_cslide.c | 79 ----------------------------------
1 file changed, 79 deletions(-)
diff --git a/src/etmemd_src/etmemd_cslide.c b/src/etmemd_src/etmemd_cslide.c
index 6f609b8..745dbcc 100644
--- a/src/etmemd_src/etmemd_cslide.c
+++ b/src/etmemd_src/etmemd_cslide.c
@@ -143,7 +143,6 @@ struct cslide_params_factory {
struct cslide_eng_params {
struct sys_mem mem;
struct node_map node_map;
- int node_watermark;
int hot_threshold;
int hot_reserve; // in MB
int mig_quota; // in MB
@@ -1463,65 +1462,6 @@ static int cslide_do_migrate(struct cslide_eng_params *eng_params)
return 0;
}
-static bool is_node_empty(struct node_mem *mem)
-{
- return mem->huge_free == mem->huge_total;
-}
-
-static bool is_all_cold_node_empty(struct cslide_eng_params *eng_params)
-{
- struct sys_mem *mem = &eng_params->mem;
- struct node_pair *pair = NULL;
- int i;
-
- for (i = 0; i < eng_params->node_map.cur_num; i++) {
- pair = &eng_params->node_map.pair[i];
- if (!is_node_empty(&mem->node_mem[pair->cold_node])) {
- return false;
- }
- }
- return true;
-}
-
-static inline bool is_busy(int node_watermark, long long total, long long free)
-{
- return free * TO_PCT / total < node_watermark;
-}
-
-static bool is_node_busy(int node_watermark, struct node_mem *mem)
-{
- return is_busy(node_watermark, mem->huge_total, mem->huge_free);
-}
-
-static bool is_any_hot_node_busy(struct cslide_eng_params *eng_params)
-{
- struct sys_mem *mem = &eng_params->mem;
- struct node_pair *pair = NULL;
- int node_watermark = eng_params->node_watermark;
- int i;
-
- for (i = 0; i < eng_params->node_map.cur_num; i++) {
- pair = &eng_params->node_map.pair[i];
- if (is_node_busy(node_watermark, &mem->node_mem[pair->hot_node])) {
- return true;
- }
- }
-
- return false;
-}
-
-static bool need_migrate(struct cslide_eng_params *eng_params)
-{
- if (!is_all_cold_node_empty(eng_params)) {
- return true;
- }
- if (is_any_hot_node_busy(eng_params)) {
- return true;
- }
-
- return false;
-}
-
static void init_host_pages_info(struct cslide_eng_params *eng_params)
{
int n;
@@ -1692,11 +1632,6 @@ static void *cslide_main(void *arg)
goto next;
}
- if (!need_migrate(eng_params)) {
- etmemd_log(ETMEMD_LOG_DEBUG, "no need to migrate\n");
- goto next;
- }
-
if (cslide_do_migrate(eng_params) != 0) {
etmemd_log(ETMEMD_LOG_ERR, "cslide_do_migrate fail\n");
goto next;
@@ -2055,19 +1990,6 @@ err:
return ret;
}
-static int fill_migrate_watermark(void *obj, void *val)
-{
- struct cslide_eng_params *params = (struct cslide_eng_params *)obj;
- int wm = parse_to_int(val);
-
- if (wm < MIN_WM || wm > MAX_WM) {
- etmemd_log(ETMEMD_LOG_ERR, "migrate watermark %d invalid\n", wm);
- return -1;
- }
- params->node_watermark = wm;
- return 0;
-}
-
static int fill_hot_threshold(void *obj, void *val)
{
struct cslide_eng_params *params = (struct cslide_eng_params *)obj;
@@ -2112,7 +2034,6 @@ static int fill_mig_quota(void *obj, void *val)
static struct config_item cslide_eng_config_items[] = {
{"node_pair", STR_VAL, fill_node_pair, false},
- {"node_watermark", INT_VAL, fill_migrate_watermark, false},
{"hot_threshold", INT_VAL, fill_hot_threshold, false},
{"node_mig_quota", INT_VAL, fill_mig_quota, false},
{"node_hot_reserve", INT_VAL, fill_hot_reserve, false},
--
2.27.0

View File

@ -1,80 +0,0 @@
From 3412ce69e8b61ad6d38f3d792930e8f2bafe6f00 Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Wed, 12 May 2021 19:50:43 +0800
Subject: [PATCH 32/50] print all log to stdout
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
src/etmem_src/etmem.c | 2 +-
src/etmem_src/etmem_project.c | 2 +-
src/etmem_src/etmem_rpc.c | 7 ++++---
3 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/src/etmem_src/etmem.c b/src/etmem_src/etmem.c
index 7f04ad1..aadde74 100644
--- a/src/etmem_src/etmem.c
+++ b/src/etmem_src/etmem.c
@@ -29,7 +29,7 @@ SLIST_HEAD(etmem_obj_list, etmem_obj) g_etmem_objs;
static void usage(void)
{
- fprintf(stderr,
+ fprintf(stdout,
"\nUsage:\n"
" etmem OBJECT COMMAND\n"
" etmem help\n"
diff --git a/src/etmem_src/etmem_project.c b/src/etmem_src/etmem_project.c
index ef2d8fe..2caaff5 100644
--- a/src/etmem_src/etmem_project.c
+++ b/src/etmem_src/etmem_project.c
@@ -25,7 +25,7 @@
static void project_help(void)
{
- fprintf(stderr,
+ fprintf(stdout,
"\nUsage:\n"
" etmem project start [options]\n"
" etmem project stop [options]\n"
diff --git a/src/etmem_src/etmem_rpc.c b/src/etmem_src/etmem_rpc.c
index 2c70cf8..76a8cf4 100644
--- a/src/etmem_src/etmem_rpc.c
+++ b/src/etmem_src/etmem_rpc.c
@@ -21,6 +21,7 @@
#include <sys/time.h>
#include <sys/un.h>
#include <errno.h>
+#include <string.h>
#include "securec.h"
#include "etmem_rpc.h"
@@ -71,7 +72,7 @@ static int etmem_client_conn(const struct mem_proj *proj, int sockfd)
if (connect(sockfd, (struct sockaddr *)&svr_addr,
offsetof(struct sockaddr_un, sun_path) + strlen(proj->sock_name) + 1) < 0) {
- perror("etmem connect to server failed:");
+ printf("etmem connect to server failed: %s\n", strerror(errno));
return errno;
}
@@ -137,7 +138,7 @@ static int etmem_client_send(const struct mem_proj *proj, int sockfd)
}
if (send(sockfd, reg_cmd, reg_cmd_len, 0) < 0) {
- perror("send failed:");
+ printf("send failed: %s\n", strerror(errno));
goto EXIT;
}
ret = 0;
@@ -165,7 +166,7 @@ static int etmem_client_recv(int sockfd)
while (!done) {
recv_size = recv(sockfd, recv_buf, recv_len - 1, 0);
if (recv_size < 0) {
- perror("recv failed:");
+ printf("recv failed: %s\n", strerror(errno));
goto EXIT;
}
if (recv_size == 0) {
--
2.27.0

View File

@ -1,49 +0,0 @@
From 509a5306e685b18f03eea91d84bf3aa70b8a5c2e Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Thu, 13 May 2021 14:20:29 +0800
Subject: [PATCH 33/50] accept review advise
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
src/etmem_src/etmem_rpc.c | 2 +-
src/etmemd_src/etmemd_rpc.c | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/etmem_src/etmem_rpc.c b/src/etmem_src/etmem_rpc.c
index 76a8cf4..384ead1 100644
--- a/src/etmem_src/etmem_rpc.c
+++ b/src/etmem_src/etmem_rpc.c
@@ -177,7 +177,7 @@ static int etmem_client_recv(int sockfd)
recv_msg = (char *)recv_buf;
recv_msg[recv_size] = '\0';
- // check and erease finish flag
+ // check and erase finish flag
switch (recv_msg[recv_size - 1]) {
case (char)SUCCESS_CHAR:
ret = 0;
diff --git a/src/etmemd_src/etmemd_rpc.c b/src/etmemd_src/etmemd_rpc.c
index 208f6b5..969d4af 100644
--- a/src/etmemd_src/etmemd_rpc.c
+++ b/src/etmemd_src/etmemd_rpc.c
@@ -546,7 +546,7 @@ static void etmemd_rpc_send_response_msg(int sock_fd, enum opt_result result)
ret = send(sock_fd, g_resp_msg_arr[i].msg, strlen(g_resp_msg_arr[i].msg), 0);
if (ret < 0) {
etmemd_log(ETMEMD_LOG_ERR, "send response to client fail, error(%s)\n",
- strerror(errno));
+ strerror(errno));
}
break;
}
@@ -557,7 +557,7 @@ static void etmemd_rpc_send_response_msg(int sock_fd, enum opt_result result)
} else {
finish_tag = FAIL_CHAR;
}
- ret = send(sock_fd, &finish_tag, 1, 0);
+ ret = send(sock_fd, &finish_tag, sizeof(finish_tag), 0);
if (ret <= 0) {
etmemd_log(ETMEMD_LOG_ERR, "send finish tag fail\n");
}
--
2.27.0

View File

@ -1,48 +0,0 @@
From bcbd8d433b5a0e64d202a781599a691183388024 Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Sun, 16 May 2021 16:46:45 +0800
Subject: [PATCH 34/50] fix open swap_pages failure
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
src/etmemd_src/etmemd_common.c | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/src/etmemd_src/etmemd_common.c b/src/etmemd_src/etmemd_common.c
index 07c9e7a..29aa52a 100644
--- a/src/etmemd_src/etmemd_common.c
+++ b/src/etmemd_src/etmemd_common.c
@@ -239,17 +239,26 @@ FILE *etmemd_get_proc_file(const char *pid, const char *file, int flags, const c
return NULL;
}
- fd = open(file_name, 0);
- if (fd < 0) {
+ fp = fopen(file_name, mode);
+ if (fp == NULL) {
etmemd_log(ETMEMD_LOG_ERR, "open file %s fail\n", file_name);
goto free_file_name;
}
+
+ fd = fileno(fp);
+ if (fd < 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "get fd of file %s fail\n", file_name);
+ fclose(fp);
+ fp = NULL;
+ goto free_file_name;
+ }
+
if (flags != 0 && ioctl(fd, IDLE_SCAN_ADD_FLAGS, &flags) != 0) {
etmemd_log(ETMEMD_LOG_ERR, "set idle flags for %s fail with %s\n", pid, strerror(errno));
- close(fd);
+ fclose(fp);
+ fp = NULL;
goto free_file_name;
}
- fp = fdopen(fd, mode);
free_file_name:
free(file_name);
--
2.27.0

View File

@ -1,85 +0,0 @@
From d560b00961e95e7eda3840a8189d226b0cbf08d5 Mon Sep 17 00:00:00 2001
From: louhongxiang <louhongxiang@huawei.com>
Date: Sat, 15 May 2021 17:29:40 +0800
Subject: [PATCH 35/50] give the correct example of config file
---
conf/example_conf.yaml | 68 ++++++++++++++++++++++++++++++++++--------
1 file changed, 56 insertions(+), 12 deletions(-)
diff --git a/conf/example_conf.yaml b/conf/example_conf.yaml
index 485c35a..de612f6 100644
--- a/conf/example_conf.yaml
+++ b/conf/example_conf.yaml
@@ -1,12 +1,56 @@
-options:
-loop : 3
-interval : 1
-sleep: 2
-
-policies:
- type : pid/name
- value : 123456/mysql
- max_threads: 3
- engine :slide
- param:
- T : 3
+[project]
+name=test
+loop=1
+interval=1
+sleep=1
+
+#slide
+[engine]
+name=slide
+project=test
+
+[task]
+project=test
+engine=slide
+name=background_slide
+type=name
+value=mysql
+T=1
+max_threads=1
+
+#cslide
+[engine]
+name=cslide
+project=test
+node_pair=2,0;3,1
+hot_threshold=1
+node_mig_quota=1024
+node_hot_reserve=1024
+
+[task]
+project=test
+engine=cslide
+name=background_cslide
+type=pid
+name=23456
+vm_flags=ht
+anon_only=no
+ign_host=no
+
+#thirdparty
+[engine]
+name=thirdparty
+project=test
+eng_name=my_engine
+libname=/usr/lib/etmem_fetch/my_engine.so
+ops_name=my_engine_ops
+engine_private_key=engine_private_value
+
+[task]
+project=test
+engine=my_engine
+name=backgroud_third
+type=pid
+value=12345
+task_private_key=task_private_value
+
--
2.27.0

View File

@ -1,26 +0,0 @@
From 8a66153b5d2094fae65e08418ac3752d868175dc Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Mon, 24 May 2021 20:08:38 +0800
Subject: [PATCH 36/50] check if start_task is NULL before call it
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
src/etmemd_src/etmemd_project.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/etmemd_src/etmemd_project.c b/src/etmemd_src/etmemd_project.c
index 3b12296..2e69dd6 100644
--- a/src/etmemd_src/etmemd_project.c
+++ b/src/etmemd_src/etmemd_project.c
@@ -279,7 +279,7 @@ enum opt_result etmemd_project_add_task(GKeyFile *config)
goto remove_task;
}
- if (proj->start && eng->ops->start_task(eng, tk) != 0) {
+ if (proj->start && eng->ops->start_task != NULL && eng->ops->start_task(eng, tk) != 0) {
etmemd_log(ETMEMD_LOG_ERR, "start added task %s fail\n", tk->name);
goto clear_task;
}
--
2.27.0

View File

@ -1,26 +0,0 @@
From 77d80edcb65316d95f8f09810613ee857dc7f8f9 Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Mon, 24 May 2021 20:24:18 +0800
Subject: [PATCH 37/50] correct max_threads when max_threads is 0
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
src/etmemd_src/etmemd_task.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/etmemd_src/etmemd_task.c b/src/etmemd_src/etmemd_task.c
index 01491f7..5aa693b 100644
--- a/src/etmemd_src/etmemd_task.c
+++ b/src/etmemd_src/etmemd_task.c
@@ -444,7 +444,7 @@ static int fill_task_threads(void *obj, void *val)
int max_threads = parse_to_int(val);
int core;
- if (max_threads < 0) {
+ if (max_threads <= 0) {
etmemd_log(ETMEMD_LOG_WARN,
"Thread count is abnormal, set the default minimum of current thread count to 1\n");
max_threads = 1;
--
2.27.0

View File

@ -1,25 +0,0 @@
From d99225f7e64d824b18c95fb475191ea50861169f Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Mon, 24 May 2021 21:17:47 +0800
Subject: [PATCH 38/50] fix etmem help return error
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
src/etmem_src/etmem.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/etmem_src/etmem.c b/src/etmem_src/etmem.c
index aadde74..76ea8d2 100644
--- a/src/etmem_src/etmem.c
+++ b/src/etmem_src/etmem.c
@@ -127,6 +127,7 @@ int main(int argc, char *argv[])
if (conf.obj != NULL && strcmp(conf.obj, "help") == 0 &&
argc == 2) { /* 2 is for param num of "etmem help" */
err = 0;
+ goto out;
}
err = -EINVAL;
goto out;
--
2.27.0

View File

@ -1,30 +0,0 @@
From 10accbfc9c4d0a7658a333d94f5c3d0f31aeb6e5 Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Wed, 26 May 2021 09:15:32 +0800
Subject: [PATCH 39/50] check if eng_mgt_func is NULL before use it
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
src/etmemd_src/etmemd_project.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/etmemd_src/etmemd_project.c b/src/etmemd_src/etmemd_project.c
index 2e69dd6..decae76 100644
--- a/src/etmemd_src/etmemd_project.c
+++ b/src/etmemd_src/etmemd_project.c
@@ -732,6 +732,12 @@ enum opt_result etmemd_project_mgt_engine(const char *project_name, const char *
return OPT_TASK_NOEXIST;
}
}
+
+ if (eng->ops->eng_mgt_func == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "engine %s does not support eng_mgt_func\n", eng->name);
+ return OPT_INVAL;
+ }
+
if (eng->ops->eng_mgt_func(eng, tk, cmd, sock_fd) != 0) {
return OPT_INVAL;
}
--
2.27.0

View File

@ -1,302 +0,0 @@
From 01e8f7ea6c15c12991026a1838ca0573bbf9b910 Mon Sep 17 00:00:00 2001
From: HukunaMatata <yuxiangyang4@huawei.com>
Date: Wed, 26 May 2021 09:45:27 +0800
Subject: [PATCH 40/50] make code clean for etmem.
---
inc/etmemd_inc/etmemd_common.h | 9 ------
inc/etmemd_inc/etmemd_task_exp.h | 2 +-
src/etmem_src/etmem.c | 2 --
src/etmem_src/etmem_engine.c | 10 ++-----
src/etmemd_src/etmemd_common.c | 44 ------------------------------
src/etmemd_src/etmemd_cslide.c | 28 ++++++++++++-------
src/etmemd_src/etmemd_rpc.c | 9 ++++++
src/etmemd_src/etmemd_scan.c | 1 -
src/etmemd_src/etmemd_thirdparty.c | 7 +++++
9 files changed, 38 insertions(+), 74 deletions(-)
diff --git a/inc/etmemd_inc/etmemd_common.h b/inc/etmemd_inc/etmemd_common.h
index e228476..4127ccf 100644
--- a/inc/etmemd_inc/etmemd_common.h
+++ b/inc/etmemd_inc/etmemd_common.h
@@ -54,15 +54,6 @@ FILE *etmemd_get_proc_file(const char *pid, const char *file, int flags, const c
int get_keyword_and_value(const char *str, char *key, char *val);
-/* function: get the line which has effective content only from the file
- *
- * in: FILE *file - the file to read
- *
- * out: char * - the string with effective content
- * NULL - end of file.
- * */
-char *skip_blank_line(FILE *file);
-
int dprintf_all(int fd, const char *format, ...);
#endif
diff --git a/inc/etmemd_inc/etmemd_task_exp.h b/inc/etmemd_inc/etmemd_task_exp.h
index b62f382..33d505a 100644
--- a/inc/etmemd_inc/etmemd_task_exp.h
+++ b/inc/etmemd_inc/etmemd_task_exp.h
@@ -28,7 +28,7 @@ struct task {
char *type;
char *value;
char *name;
- uint64_t max_threads;
+ int max_threads;
struct task_pid *pids;
struct engine *eng;
diff --git a/src/etmem_src/etmem.c b/src/etmem_src/etmem.c
index 76ea8d2..f243a75 100644
--- a/src/etmem_src/etmem.c
+++ b/src/etmem_src/etmem.c
@@ -23,8 +23,6 @@
#include "etmem_project.h"
#include "etmem_engine.h"
-#define CMD_POSITION 1
-
SLIST_HEAD(etmem_obj_list, etmem_obj) g_etmem_objs;
static void usage(void)
diff --git a/src/etmem_src/etmem_engine.c b/src/etmem_src/etmem_engine.c
index bafcfe6..675c38f 100644
--- a/src/etmem_src/etmem_engine.c
+++ b/src/etmem_src/etmem_engine.c
@@ -39,11 +39,11 @@ static void engine_help(void)
" 5. eng_cmd is supported by engine own.\n");
}
-static int engine_parse_cmd(struct etmem_conf *conf, struct mem_proj *proj)
+static void engine_parse_cmd(struct etmem_conf *conf, struct mem_proj *proj)
{
proj->eng_cmd = conf->argv[0];
proj->cmd = ETMEM_CMD_ENGINE;
- return 0;
+ return;
}
static int engine_parse_args(struct etmem_conf *conf, struct mem_proj *proj)
@@ -126,11 +126,7 @@ static int engine_do_cmd(struct etmem_conf *conf)
return ret;
}
- ret = engine_parse_cmd(conf, &proj);
- if (ret != 0) {
- printf("engine_parse_cmd fail\n");
- return -1;
- }
+ engine_parse_cmd(conf, &proj);
ret = engine_parse_args(conf, &proj);
if (ret != 0) {
diff --git a/src/etmemd_src/etmemd_common.c b/src/etmemd_src/etmemd_common.c
index 29aa52a..8aad0eb 100644
--- a/src/etmemd_src/etmemd_common.c
+++ b/src/etmemd_src/etmemd_common.c
@@ -34,7 +34,6 @@
#define IDLE_SCAN_MAGIC 0x66
#define IDLE_SCAN_ADD_FLAGS _IOW(IDLE_SCAN_MAGIC, 0x0, unsigned int)
-#define IDLE_SCAN_REMOVE_FLAGS _IOW(IDLE_SCAN_MAGIC, 0x1, unsigned int)
static void usage(void)
{
@@ -360,49 +359,6 @@ int get_keyword_and_value(const char *str, char *key, char *val)
return 0;
}
-static char *skip_colon_space_and_blank_line(char *str)
-{
- size_t len;
-
- len = strlen(str);
- while (len-- > 0) {
- if (is_valid_char_for_value(" :\n\t", str[len])) {
- str[len] = '\0';
- continue;
- }
-
- break;
- }
-
- if (strlen(str) == 0) {
- return "";
- }
-
- while (is_valid_char_for_value(" \t", *str)) {
- str++;
- }
-
- return str;
-}
-
-char *skip_blank_line(FILE *file)
-{
- static char line[FILE_LINE_MAX_LEN] = {};
- char *get_line = NULL;
-
- while (fgets(line, FILE_LINE_MAX_LEN, file) != NULL) {
- get_line = skip_colon_space_and_blank_line(line);
- if (strcmp(get_line, "") != 0) {
- break;
- }
- /* in case the last line is an empty line,
- * make the get_line equals to NULL before next loop begins */
- get_line = NULL;
- }
-
- return get_line;
-}
-
static int write_all(int fd, const char *buf)
{
ssize_t rest = strlen(buf);
diff --git a/src/etmemd_src/etmemd_cslide.c b/src/etmemd_src/etmemd_cslide.c
index 745dbcc..a77b7bb 100644
--- a/src/etmemd_src/etmemd_cslide.c
+++ b/src/etmemd_src/etmemd_cslide.c
@@ -33,15 +33,10 @@
#define HUGE_1M_SIZE (1 << 20)
#define HUGE_2M_SIZE (2 << 20)
-#define HUGE_1G_SIZE (1 << 30)
#define BYTE_TO_KB(s) ((s) >> 10)
#define KB_TO_BYTE(s) ((s) << 10)
#define HUGE_2M_TO_KB(s) ((s) << 11)
-#define TO_PCT 100
-#define MAX_WM 100
-#define MIN_WM 0
-
#define BATCHSIZE (1 << 16)
#define factory_foreach_working_pid_params(iter, factory) \
@@ -104,7 +99,6 @@ struct cslide_task_params {
struct vma_pf {
struct vma *vma;
struct page_refs *page_refs;
- struct vma_pf *next;
};
struct node_pages_info {
@@ -366,7 +360,7 @@ static void npf_setup_tail(struct node_page_refs *npf)
}
}
-static long long move_npf_to_list(struct node_page_refs *npf, struct page_refs **list, long long size)
+static void move_npf_to_list(struct node_page_refs *npf, struct page_refs **list, long long size)
{
struct page_refs *t = NULL;
struct page_refs *iter = NULL;
@@ -394,7 +388,7 @@ static long long move_npf_to_list(struct node_page_refs *npf, struct page_refs *
}
npf->size -= moved_size;
- return moved_size;
+ return;
}
static int init_count_page_refs(struct count_page_refs *cpf, int node_num)
@@ -1702,9 +1696,23 @@ static void cslide_stop_task(struct engine *eng, struct task *tk)
static char *get_time_stamp(time_t *t)
{
- char *ts = asctime(localtime(t));
- size_t len = strlen(ts);
+ struct tm *lt = NULL;
+ char *ts = NULL;
+ size_t len;
+
+ lt = localtime(t);
+ if (lt == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "get local time fail\n");
+ return NULL;
+ }
+
+ ts = asctime(localtime(t));
+ if (ts == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "get asctime fail\n");
+ return NULL;
+ }
+ len = strlen(ts);
if (ts[len - 1] == '\n') {
ts[len - 1] = '\0';
}
diff --git a/src/etmemd_src/etmemd_rpc.c b/src/etmemd_src/etmemd_rpc.c
index 969d4af..6b23059 100644
--- a/src/etmemd_src/etmemd_rpc.c
+++ b/src/etmemd_src/etmemd_rpc.c
@@ -169,12 +169,18 @@ static enum opt_result handle_obj_cmd(char *file_name, enum cmd_type type)
{
GKeyFile *config = NULL;
enum opt_result ret;
+ char resolve_path[PATH_MAX] = {0};
if (file_name == NULL) {
etmemd_log(ETMEMD_LOG_ERR, "file name is not set for obj cmd\n");
return OPT_INVAL;
}
+ if (realpath(file_name, resolve_path) == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "config file is not a real path(%s)\n", strerror(errno));
+ return OPT_INVAL;
+ }
+
config = g_key_file_new();
if (config == NULL) {
etmemd_log(ETMEMD_LOG_ERR, "get empty config file fail\n");
@@ -678,14 +684,17 @@ static int rpc_deal_parent(void)
if ((len = sprintf_s(pid_s, PID_STR_MAX_LEN, "%d", pid)) <= 0) {
etmemd_log(ETMEMD_LOG_ERR, "sprintf for pid failed\n");
+ close(handle);
exit(1);
}
if ((write(handle, pid_s, len)) != len) {
etmemd_log(ETMEMD_LOG_ERR, "Error writing to the file\n");
+ close(handle);
exit(1);
}
+ close(handle);
close(g_fd[1]);
if (read(g_fd[0], &val, sizeof(val)) <= 0) {
etmemd_log(ETMEMD_LOG_ERR, "Error reading to the file\n");
diff --git a/src/etmemd_src/etmemd_scan.c b/src/etmemd_src/etmemd_scan.c
index c287c48..1cafaed 100644
--- a/src/etmemd_src/etmemd_scan.c
+++ b/src/etmemd_src/etmemd_scan.c
@@ -32,7 +32,6 @@
#define PUD_SIZE_SHIFT 30
#define HEXADECIMAL_RADIX 16
#define PMD_IDLE_PTES_PARAMETER 512
-#define VMFLAG_MAX_LEN 100
#define VMFLAG_MAX_NUM 30
#define VMFLAG_VALID_LEN 2
diff --git a/src/etmemd_src/etmemd_thirdparty.c b/src/etmemd_src/etmemd_thirdparty.c
index 53d4b8e..8d1b50e 100644
--- a/src/etmemd_src/etmemd_thirdparty.c
+++ b/src/etmemd_src/etmemd_thirdparty.c
@@ -83,6 +83,13 @@ static int set_engine_ops(struct engine *eng, struct thirdparty_params *params)
void *handler = NULL;
struct engine_ops *ops = NULL;
char *err = NULL;
+ char resolve_path[PATH_MAX] = {0};
+
+ if (realpath(params->libname, resolve_path) == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "file of thirdparty libname %s is not a real path(%s)\n",
+ params->libname, strerror(errno));
+ return -1;
+ }
handler = dlopen(params->libname, RTLD_NOW | RTLD_LOCAL);
err = dlerror();
--
2.27.0

View File

@ -1,64 +0,0 @@
From 8945313183ecfd752c4d8fbd5d8e5e464bd9ed37 Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Wed, 26 May 2021 19:57:09 +0800
Subject: [PATCH 41/50] return error if migrate failed and clean code
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
src/etmemd_src/etmemd_cslide.c | 14 ++++++++++----
src/etmemd_src/etmemd_scan.c | 3 ---
2 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/src/etmemd_src/etmemd_cslide.c b/src/etmemd_src/etmemd_cslide.c
index 745dbcc..3a30d6b 100644
--- a/src/etmemd_src/etmemd_cslide.c
+++ b/src/etmemd_src/etmemd_cslide.c
@@ -1445,21 +1445,27 @@ static int cslide_do_migrate(struct cslide_eng_params *eng_params)
struct cslide_pid_params *iter = NULL;
struct node_pair *pair = NULL;
int bind_node, i;
+ int ret = 0;
factory_foreach_working_pid_params(iter, &eng_params->factory) {
for (i = 0; i < eng_params->node_map.cur_num; i++) {
pair = &eng_params->node_map.pair[i];
bind_node = pair->hot_node < pair->cold_node ? pair->hot_node : pair->cold_node;
if (numa_run_on_node(bind_node) != 0) {
- etmemd_log(ETMEMD_LOG_ERR, "fail to run on node %d to migrate memory\n", bind_node);
+ etmemd_log(ETMEMD_LOG_INFO, "fail to run on node %d to migrate memory\n", bind_node);
+ }
+ ret = migrate_single_task(iter->pid, &iter->memory_grade[i], pair->hot_node, pair->cold_node);
+ if (ret != 0) {
+ goto exit;
}
- migrate_single_task(iter->pid, &iter->memory_grade[i], pair->hot_node, pair->cold_node);
}
}
+
+exit:
if (numa_run_on_node(-1) != 0) {
- etmemd_log(ETMEMD_LOG_ERR, "fail to run on all node after migrate memory\n");
+ etmemd_log(ETMEMD_LOG_INFO, "fail to run on all node after migrate memory\n");
}
- return 0;
+ return ret;
}
static void init_host_pages_info(struct cslide_eng_params *eng_params)
diff --git a/src/etmemd_src/etmemd_scan.c b/src/etmemd_src/etmemd_scan.c
index c287c48..ed17d2b 100644
--- a/src/etmemd_src/etmemd_scan.c
+++ b/src/etmemd_src/etmemd_scan.c
@@ -27,9 +27,6 @@
#include "etmemd_log.h"
#include "securec.h"
-#define PTE_SIZE_SHIFT 12
-#define PMD_SIZE_SHIFT 21
-#define PUD_SIZE_SHIFT 30
#define HEXADECIMAL_RADIX 16
#define PMD_IDLE_PTES_PARAMETER 512
#define VMFLAG_MAX_NUM 30
--
2.27.0

View File

@ -1,59 +0,0 @@
From bc6ed8fe0b2691b92f0d508d73e1b903aee5fd63 Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Thu, 27 May 2021 14:42:55 +0800
Subject: [PATCH 42/50] etmemd: fix memleak and clean code
1.detach cslide main thread to release resource when exit
2.clean code
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
src/etmemd_src/etmemd_cslide.c | 6 +++++-
src/etmemd_src/etmemd_task.c | 7 ++++++-
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/src/etmemd_src/etmemd_cslide.c b/src/etmemd_src/etmemd_cslide.c
index d1dd06c..ad3eff8 100644
--- a/src/etmemd_src/etmemd_cslide.c
+++ b/src/etmemd_src/etmemd_cslide.c
@@ -1606,6 +1606,10 @@ static void *cslide_main(void *arg)
struct cslide_eng_params *eng_params = (struct cslide_eng_params *)arg;
struct sys_mem *mem = NULL;
+ // only invalid pthread id or deatch more than once will cause error
+ // so no need to check return value of pthread_detach
+ (void)pthread_detach(pthread_self());
+
while (true) {
factory_update_pid_params(&eng_params->factory);
if (eng_params->finish) {
@@ -1712,7 +1716,7 @@ static char *get_time_stamp(time_t *t)
return NULL;
}
- ts = asctime(localtime(t));
+ ts = asctime(lt);
if (ts == NULL) {
etmemd_log(ETMEMD_LOG_ERR, "get asctime fail\n");
return NULL;
diff --git a/src/etmemd_src/etmemd_task.c b/src/etmemd_src/etmemd_task.c
index 5aa693b..618245e 100644
--- a/src/etmemd_src/etmemd_task.c
+++ b/src/etmemd_src/etmemd_task.c
@@ -58,7 +58,12 @@ static int get_pid_through_pipe(char *arg_pid[], const int *pipefd)
return -1;
}
- execve(arg_pid[0], arg_pid, NULL);
+ if (execve(arg_pid[0], arg_pid, NULL) == -1) {
+ etmemd_log(ETMEMD_LOG_ERR, "execve %s fail with %s.\n", arg_pid[0], strerror(errno));
+ close(pipefd[1]);
+ return -1;
+ }
+
if (fflush(stdout) != 0) {
etmemd_log(ETMEMD_LOG_ERR, "fflush execve stdout fail.\n");
close(pipefd[1]);
--
2.27.0

View File

@ -1,575 +0,0 @@
From a70963f9e9d030a08b6b716c8cbd9826c8ba25bc Mon Sep 17 00:00:00 2001
From: shikemeng <shikemeng@huawei.com>
Date: Tue, 10 Aug 2021 02:22:02 +0000
Subject: [PATCH 43/50] =?UTF-8?q?update=20README.md.=20=E6=9B=B4=E6=96=B0?=
=?UTF-8?q?=E4=BA=8C=E8=BF=9B=E5=88=B6=E5=90=AF=E5=8A=A8=EF=BC=8C=E9=85=8D?=
=?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6=E8=AF=B4=E6=98=8E=EF=BC=8C=E5=B7=A5?=
=?UTF-8?q?=E7=A8=8B=E5=88=9B=E5=BB=BA=EF=BC=8C=E5=88=A0=E9=99=A4=EF=BC=8C?=
=?UTF-8?q?=E5=90=AF=E5=8A=A8=EF=BC=8C=E5=81=9C=E6=AD=A2=EF=BC=8C=E6=9F=A5?=
=?UTF-8?q?=E8=AF=A2=E7=9A=84=E7=AB=A0=E8=8A=82=E3=80=82=20=E6=96=B0?=
=?UTF-8?q?=E5=A2=9Eetmem=E6=94=AF=E6=8C=81=E9=9A=8F=E7=B3=BB=E7=BB=9F?=
=?UTF-8?q?=E5=90=AF=E5=8A=A8=EF=BC=8Cetmem=E6=94=AF=E6=8C=81=E7=AC=AC?=
=?UTF-8?q?=E4=B8=89=E6=96=B9=E5=86=85=E5=AD=98=E6=89=A9=E5=B1=95=E7=AD=96?=
=?UTF-8?q?=E7=95=A5=EF=BC=8Cetmem=E6=94=AF=E6=8C=81=E4=BD=BF=E7=94=A8AEP?=
=?UTF-8?q?=E8=BF=9B=E8=A1=8C=E5=86=85=E5=AD=98=E6=89=A9=E5=B1=95=E7=9A=84?=
=?UTF-8?q?=E7=AB=A0=E8=8A=82=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 457 +++++++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 366 insertions(+), 91 deletions(-)
diff --git a/README.md b/README.md
index 3e2a50a..93631a1 100644
--- a/README.md
+++ b/README.md
@@ -43,18 +43,22 @@ $ etmemd -l 0 -s etmemd_socket
options
--l|--log-level <log-level> Log level
--s|--socket <sockect name> Socket name to listen to
--h|--help Show this message
+-l|\-\-log-level <log-level> Log level
+
+-s|\-\-socket <sockect name> Socket name to listen to
+
+-h|\-\-help Show this message
+
+-m|\-\-mode-systemctl mode used to start(systemctl)
#### 命令行参数说明
| 参数 | 参数含义 | 是否必须 | 是否有参数 | 参数范围 | 示例说明 |
| --------------- | ---------------------------------- | -------- | ---------- | --------------------- | ------------------------------------------------------------ |
-| -l或--log-level | etmemd日志级别 | 否 | 是 | 0~3 | 0debug级别 1info级别 2warning级别 3error级别 只有大于等于配置的级别才会打印到/var/log/message文件中 |
-| -s或--socket | etmemd监听的名称用于与客户端交互 | 是 | 是 | 107个字符之内的字符串 | 指定服务端监听的名称 |
-| -h或--help | 帮助信息 | 否 | 否 | NA | 执行时带有此参数会打印后退出 |
-
+| -l或\-\-log-level | etmemd日志级别 | 否 | 是 | 0~3 | 0debug级别 1info级别 2warning级别 3error级别 只有大于等于配置的级别才会打印到/var/log/message文件中 |
+| -s或\-\-socket | etmemd监听的名称用于与客户端交互 | 是 | 是 | 107个字符之内的字符串 | 指定服务端监听的名称 |
+| -h或\-\-help | 帮助信息 | 否 | 否 | NA | 执行时带有此参数会打印后退出 |
+| -m或\-\-mode-systemctl| etmemd作为service被拉起时命令中可以使用此参数来支持fork模式启动| 否| 否| NA| NA|
### etmem配置文件
在运行etmem进程之前需要管理员预先规划哪些进程需要做内存扩展将进程信息配置到etmem配置文件中并配置内存扫描的周期、扫描次数、内存冷热阈值等信息。
@@ -62,158 +66,429 @@ options
配置文件的示例文件在源码包中放置在源码根目录的conf/example_conf.yaml建议在使用时放置在/etc/etmem/目录下,示例内容为:
```
-options:
- loop : 3
- interval : 1
- sleep: 2
- policies:
- type : pid/name
- value : 123456/mysql
- max_threads: 3
- engine : slide
- param:
- T: 3
+[project]
+name=test
+loop=1
+interval=1
+sleep=1
+
+#slide引擎示例
+[engine]
+name=slide
+project=test
+
+[task]
+project=test
+engine=slide
+name=background_slide
+type=name
+value=mysql
+T=1
+max_threads=1
+
+#cslide引擎示例
+[engine]
+name=cslide
+project=test
+node_pair=2,0;3,1
+hot_threshold=1
+node_mig_quota=1024
+node_hot_reserve=1024
+
+[task]
+project=test
+engine=cslide
+name=background_cslide
+type=pid
+name=23456
+vm_flags=ht
+anon_only=no
+ign_host=no
+
+#thirdparty引擎示例
+[engine]
+name=thirdparty
+project=test
+eng_name=my_engine
+libname=/usr/lib/etmem_fetch/my_engine.so
+ops_name=my_engine_ops
+engine_private_key=engine_private_value
+
+[task]
+project=test
+engine=my_engine
+name=backgroud_third
+type=pid
+value=12345
+task_private_key=task_private_value
```
配置文件各字段说明:
-| **置项** | **配置项含义** | **是否必须** | **是否有参数** | **参数范围** | **示例说明** |
-| ----------- | ------------------------------------------------------------ | ------------ | -------------- | ------------------------- | ------------------------------------------------------------ |
-| options | project公用配置段起始标识 | 是 | 否 | NA | 每个配置文件有且仅有一个此字段,并且文件以此字段开始 |
-| loop | 内存扫描的循环次数 | 是 | 是 | 1~120 | loop:3 //扫描3次 |
-| interval | 每次内存扫描的时间间隔 | 是 | 是 | 1~1200 | interval:5 //每次扫描之间间隔5s |
-| sleep | 每个内存扫描+操作的大周期之间时间间隔 | 是 | 是 | 1~1200 | sleep:10 //每次大周期之间间隔10s |
-| policies | project中各task任务配置段起始标识 | 是 | 否 | NA | 一个project中可以配置多个task每个task以policies:开头 |
-| type | 目标进程识别的方式 | 是 | 是 | pid/name | pid代表通过进程号识别name代表通过进程名称识别 |
-| value | 目标进程识别的具体字段 | 是 | 是 | 实际的进程号/进程名称 | 与type字段配合使用指定目标进程的进程号或进程名称由使用者保证配置的正确及唯一性 |
-| max_threads | etmemd内部线程池最大线程数每个线程处理一个进程/子进程的内存扫描+操作任务 | 否 | 是 | 1~2 * core数 + 1默认为1 | 对外部无表象控制etmemd服务端内部处理线程个数当目标进程有多个子进程时配置越大并发执行的个数也多但占用资源也越多 |
-| engine | 扫描引擎类型 | 是 | 是 | slide | 声明使用slide引擎进行冷热内存识别 |
-| param | 扫描引擎私有参数配置起始标识 | 是 | 否 | NA | 引擎私有参数配置段以此标识起始每个task对应一种引擎每个引擎对应一个param及其字段 |
-| T | slide引擎的水线配置 | 是 | 否 | 1~3 * loop | 水线阈值,大于等于此值的内存会被识别为热内存,反之为冷内存 |
-
-### etmem工程创建/删除/查询
+| 配置项 | 配置项含义 | 是否必须 | 是否有参数 | 参数范围 | 示例说明 |
+|-----------|---------------------|------|-------|------------|-----------------------------------------------------------------|
+| [project] | project公用配置段起始标识 | 否 | 否 | NA | project参数的开头标识表示下面的参数直到另外的[xxx]或文件结尾为止的范围内均为project section的参数 |
+| name | project的名字 | 是 | 是 | 64个字以内的字符串 | 用来标识projectengine和task在配置时需要指定要挂载到的project |
+| loop | 内存扫描的循环次数 | 是 | 是 | 1~10 | loop=3 //扫描3次 |
+| interval | 每次内存扫描的时间间隔 | 是 | 是 | 1~1200 | interval=5 //每次扫描之间间隔5s |
+| sleep | 每个内存扫描+操作的大周期之间时间间隔 | 是 | 是 | 1~1200 | sleep=10 //每次大周期之间间隔10s |
+| [engine] | engine公用配置段起始标识 | 否 | 否 | NA | engine参数的开头标识表示下面的参数直到另外的[xxx]或文件结尾为止的范围内均为engine section的参数 |
+| project | 声明所在的project | 是 | 是 | 64个字以内的字符串 | 已经存在名字为test的project则可以写为project=test |
+| engine | 声明所在的engine | 是 | 是 | slide/cslide/thridparty | 声明使用的是slide或cslide或thirdparty策略 |
+| node_pair | cslide engine的配置项声明系统中AEP和DRAM的node pair | engine为cslide时必须配置 | 是 | 成对配置AEP和DRAM的node号AEP和DRAM之间用逗号隔开没对pair之间用分号隔开 | node_pair=2,0;3,1 |
+| hot_threshold | cslide engine的配置项声明内存冷热水线的阈值 | engine为cslide时必须配置 | 是 | >= 0的整数 | hot_threshold=3 //访问次数小于3的内存会被识别为冷内存 |
+|node_mig_quota|cslide engine的配置项流控声明每次DRAM和AEP互相迁移时单向最大流量|engine为cslide时必须配置|是|>= 0的整数|node_mig_quota=1024 //单位为MBAEP到DRAM或DRAM到AEP搬迁一次最大1024M|
+|node_hot_reserve|cslide engine的配置项声明DRAM中热内存的预留空间大小|engine为cslide时必须配置|是|>= 0的整数|node_hot_reserve=1024 //单位为MB当所有虚拟机热内存大于此配置值时热内存也会迁移到AEP中|
+|eng_name|thirdparty engine的配置项声明engine自己的名字供task挂载|engine为thirdparty时必须配置|是|64个字以内的字符串|eng_name=my_engine //对此第三方策略engine挂载task时task中写明engine=my_engine|
+|libname|thirdparty engine的配置项声明第三方策略的动态库的地址绝对地址|engine为thirdparty时必须配置|是|64个字以内的字符串|libname=/user/lib/etmem_fetch/code_test/my_engine.so|
+|ops_name|thirdparty engine的配置项声明第三方策略的动态库中操作符号的名字|engine为thirdparty时必须配置|是|64个字以内的字符串|ops_name=my_engine_ops //第三方策略实现接口的结构体的名字|
+|engine_private_key|thirdparty engine的配置项预留给第三方策略自己解析私有参数的配置项选配|否|否|根据第三方策略私有参数自行限制|根据第三方策略私有engine参数自行配置|
+| [task] | task公用配置段起始标识 | 否 | 否 | NA | task参数的开头标识表示下面的参数直到另外的[xxx]或文件结尾为止的范围内均为task section的参数 |
+| project | 声明所挂的project | 是 | 是 | 64个字以内的字符串 | 已经存在名字为test的project则可以写为project=test |
+| engine | 声明所挂的engine | 是 | 是 | 64个字以内的字符串 | 所要挂载的engine的名字 |
+| name | task的名字 | 是 | 是 | 64个字以内的字符串 | name=background1 //声明task的名字是backgound1 |
+| type | 目标进程识别的方式 | 是 | 是 | pid/name | pid代表通过进程号识别name代表通过进程名称识别 |
+| value | 目标进程识别的具体字段 | 是 | 是 | 实际的进程号/进程名称 | 与type字段配合使用指定目标进程的进程号或进程名称由使用者保证配置的正确及唯一性 |
+| T | engine为slide的task配置项声明内存冷热水线的阈值 | engine为slide时必须配置 | 是 | 0~loop * 3 | T=3 //访问次数小于3的内存会被识别为冷内存 |
+| max_threads | engine为slide的task配置项etmemd内部线程池最大线程数每个线程处理一个进程/子进程的内存扫描+操作任务 | 否 | 是 | 1~2 * core数 + 1默认为1 | 对外部无表象控制etmemd服务端内部处理线程个数当目标进程有多个子进程时配置越大并发执行的个数也多但占用资源也越多 |
+| vm_flags | engine为cslide的task配置项通过指定flag扫描的vma不配置此项时扫描则不会区分 | engine为cslide时必须配置 | 是 | 当前只支持ht | vm_flags=ht //扫描flags为ht大页的vma内存 |
+| anon_only | engine为cslide的task配置项标识是否只扫描匿名页 | 否 | 是 | yes/no | anon_only=no //配置为yes时只扫描匿名页配置为no时非匿名页也会扫描 |
+| ign_host | engine为cslide的task配置项标识是否忽略host上的页表扫描信息 | 否 | 是 | yes/no | ign_host=no //yes为忽略no为不忽略 |
+| task_private_key | engine为thirdparty的task配置项预留给第三方策略的task解析私有参数的配置项选配 | 否 | 否 | 根据第三方策略私有参数自行限制 | 根据第三方策略私有task参数自行配置 |
+
+
+
+### etmem project/engine/task对象的创建和删除
#### 场景描述
-1管理员创建etmem工程一个工程可包含多个etmem任务
-
-2管理员查询已有的etmem工程
+1管理员创建etmem的project/engine/task一个工程可包含多个etmem engine一个engine可以包含多个任务
-3管理员删除已有的etmem工程删除工程前会自动先停止该工程中的所有任务
+2管理员删除已有的etmem project/engine/task删除工程前会自动先停止该工程中的所有任务
#### 使用方法
-通过etmem二进制执行工程创建/删除/查询操作前提是服务端已经成功运行并且配置文件e.g. /etc/etmem/example_conf.yaml内容正确。
+运行etmem二进制通过第二个参数指定为obj来进行创建或删除动作对project/engine/task则是通过配置文件中配置的内容来进行识别和区分。前提是etmem配置文件已配置正确etmemd进程已启动。
-添加工程:
+添加对象:
-etmem project add -n test -f /etc/etmem/example_conf.yaml -s etmemd_socket
+etmem obj add -f /etc/example_config.yaml -s etmemd_socket
-删除工程:
+删除对象:
-etmem project del -n test -s etmemd_socket
-
-查询工程:
-
-etmem project show -s etmemd_socket
+etmem obj del -f /etc/example_config.yaml -s etmemd_socket
打印帮助:
-etmem project help
+etmem obj help
#### 帮助信息
Usage:
- etmem project add [options]
- etmem project del [options]
- etmem project show
- etmem project help
- Options:
- -f|--file <conf_file> Add configuration file
- -n|--name <proj_name> Add project name
- -s|--sock <sock_name> Socket name to connect
+etmem obj add [options]
- Notes:
- \1. Project name and socket name must be given when execute add or del option.
- \2. Configuration file must be given when execute add option.
- \3. Socket name must be given when execute show option.
+etmem obj del [options]
-#### 命令行参数说明
+etmem obj help
-add命令
+Options:
-| 参数 | 参数含义 | 是否必须 | 是否有参数 | 示例说明 |
-| ------------ | ------------------------------------------------------------ | -------- | ---------- | -------------------------------------------------------- |
-| -n或--name | 指定project名称 | 是 | 是 | project名称与配置文件一一对应 |
-| -f或--file | 指定project的配置文件 | 是 | 是 | 需要指定路径名称 |
-| -s或--socket | 与etmemd服务端通信的socket名称需要与etmemd启动时指定的保持一致 | 是 | 是 | 必须配置在有多个etmemd时由管理员选择与哪个etmemd通信 |
+-f|\-\-file <conf_file> Add configuration file
-del命令
+-s|\-\-socket <socket_name> Socket name to connect
-| 参数 | 参数含义 | 是否必须 | 是否有参数 | 示例说明 |
-| ------------ | ------------------------------------------------------------ | -------- | ---------- | -------------------------------------------------------- |
-| -n或--name | 指定project名称 | 是 | 是 | project名称与配置文件一一对应 |
-| -s或--socket | 与etmemd服务端通信的socket名称需要与etmemd启动时指定的保持一致 | 是 | 是 | 必须配置在有多个etmemd时由管理员选择与哪个etmemd通信 |
+Notes:
+
+1. Configuration file must be given.
+
+#### 命令行参数说明
-show命令
| 参数 | 参数含义 | 是否必须 | 是否有参数 | 示例说明 |
| ------------ | ------------------------------------------------------------ | -------- | ---------- | -------------------------------------------------------- |
-| -s或--socket | 与etmemd服务端通信的socket名称需要与etmemd启动时指定的保持一致 | 是 | 是 | 必须配置在有多个etmemd时由管理员选择与哪个etmemd通信 |
+| -f或\-\-file | 指定对象的配置文件 | adddel子命令必须包含 | 是 | 需要指定路径名称 |
+| -s或\-\-socket | 与etmemd服务端通信的socket名称需要与etmemd启动时指定的保持一致 | adddel子命令必须包含 | 是 | 必须配置在有多个etmemd时由管理员选择与哪个etmemd通信 |
-### etmem任务启动/停止
+### etmem任务启动/停止/查询
#### 场景描述
-在已经通过etmem project add添加工程之后在还未调用etmem project del删除工程之前可以对etmem的工程进行启动和停止。
+在已经通过etmem obj add添加工程之后在还未调用etmem obj del删除工程之前可以对etmem的工程进行启动和停止。
1管理员启动已添加的工程
2管理员停止已启动的工程
-在管理员调用project del删除工程时如果工程已经启动则会自动停止。
+在管理员调用obj del删除工程时如果工程已经启动则会自动停止。
#### 使用方法
-通过etmem二进制执行任务启动/停止操作,前提是服务端已经成功运行,配置文件(e.g. /etc/etmem/example_conf.yaml)内容正确且etmem工程已经创建。
+对于已经添加成功的工程可以通过etmem project的命令来控制工程的启动和停止命令示例如下
启动工程
-etmem migrate start -n test -s etmemd_socket
+etmem project start -n test -s etmemd_socket
停止工程
-etmem migrate stop -n test -s etmemd_socket
+etmem project stop -n test -s etmemd_socket
+
+查询工程
+
+etmem project show -n test -s etmemd_socket
打印帮助
-etmem migrate help
+etmem project help
#### 帮助信息
Usage:
- etmem migrate start [options]
- etmem migrate stop [options]
- etmem migrate help
- Options:
- -n|--name <proj_name> Add project name
- -s|--sock <sock_name> Socket name to connect
+etmem project start [options]
+
+etmem project stop [options]
+
+etmem project show [options]
+
+etmem project help
+
+Options:
+
+-n|\-\-name <proj_name> Add project name
+
+-s|\-\-socket <socket_name> Socket name to connect
+
+Notes:
- Notes:
- Project name and socket name must be given when execute start or stop option.
+1. Project name and socket name must be given when execute add or del option.
+
+2. Socket name must be given when execute show option.
#### 命令行参数说明
| 参数 | 参数含义 | 是否必须 | 是否有参数 | 示例说明 |
| ------------ | ------------------------------------------------------------ | -------- | ---------- | -------------------------------------------------------- |
-| -n或--name | 指定project名称 | 是 | 是 | project名称与配置文件一一对应 |
-| -s或--socket | 与etmemd服务端通信的socket名称需要与etmemd启动时指定的保持一致 | 是 | 是 | 必须配置在有多个etmemd时由管理员选择与哪个etmemd通信 |
+| -n或\-\-name | 指定project名称 | startstopshow子命令必须包含 | 是 | project名称与配置文件一一对应 |
+| -s或\-\-socket | 与etmemd服务端通信的socket名称需要与etmemd启动时指定的保持一致 | startstopshow子命令必须包含 | 是 | 必须配置在有多个etmemd时由管理员选择与哪个etmemd通信 |
+
+### etmem支持随系统自启动
+
+#### 场景描述
+
+etmemd支持由用户配置systemd配置文件后以fork模式作为systemd服务被拉起运行
+
+#### 使用方法
+
+编写service配置文件来启动etmemd必须使用-m参数来指定此模式例如
+
+etmemd -l 0 -s etmemd_socket -m
+
+#### 帮助信息
+
+options:
+
+-l|\-\-log-level <log-level> Log level
+
+-s|\-\-socket <sockect name> Socket name to listen to
+
+-m|\-\-mode-systemctl mode used to start(systemctl)
+
+-h|\-\-help Show this message
+
+#### 命令行参数说明
+| 参数 | 参数含义 | 是否必须 | 是否有参数 | 参数范围 | 实例说明 |
+|----------------|------------|------|-------|------|-----------|
+| -l或\-\-log-level | etmemd日志级别 | 否 | 是 | 0~3 | 0debug级别1info级别2warning级别3error级别只有大于等于配置的级别才会打印到/var/log/message文件中|
+| -s或\-\-socket |etmemd监听的名称用于与客户端交互 | 是 | 是| 107个字符之内的字符串| 指定服务端监听的名称|
+|-m或\-\-mode-systemctl | etmemd作为service被拉起时命令中需要指定此参数来支持 | 否 | 否 | NA | NA |
+| -h或\-\-help | 帮助信息 | 否 |否 |NA |执行时带有此参数会打印后退出|
+
+
+
+
+### etmem支持第三方内存扩展策略
+
+#### 场景描述
+
+etmem支持用户注册第三方内存扩展策略同时提供扫描模块动态库运行时通过第三方策略淘汰算法淘汰内存。
+
+用户使用etmem所提供的扫描模块动态库并实现对接etmem所需要的结构体中的接口
+
+#### 使用方法
+
+用户使用自己实现的第三方扩展淘汰策略,主要需要按下面步骤进行实现和操作:
+
+1. 按需调用扫描模块提供的扫描接口,
+
+2. 按照etmem头文件中提供的函数模板来实现各个接口最终封装成结构体
+
+3. 编译出第三方扩展淘汰策略的动态库
+
+4. 在配置文件中按要求声明类型为thirdparty的engine
+
+5. 将动态库的名称和接口结构体的名称按要求填入配置文件中task对应的字段
+
+其他操作步骤与使用etmem的其他engine类似
+
+接口结构体模板
+
+struct engine_ops {
+
+/* 针对引擎私有参数的解析如果有需要实现否则置NULL */
+
+int (*fill_eng_params)(GKeyFile *config, struct engine *eng);
+
+/* 针对引擎私有参数的清理如果有需要实现否则置NULL */
+
+void (*clear_eng_params)(struct engine *eng);
+
+/* 针对任务私有参数的解析如果有需要实现否则置NULL */
+
+int (*fill_task_params)(GKeyFile *config, struct task *task);
+
+/* 针对任务私有参数的清理如果有需要实现否则置NULL */
+
+void (*clear_task_params)(struct task *tk);
+
+/* 启动任务的接口 */
+
+int (*start_task)(struct engine *eng, struct task *tk);
+
+/* 停止任务的接口 */
+
+void (*stop_task)(struct engine *eng, struct task *tk);
+
+/* 填充pid相关私有参数 */
+
+int (*alloc_pid_params)(struct engine *eng, struct task_pid **tk_pid);
+
+/* 销毁pid相关私有参数 */
+
+void (*free_pid_params)(struct engine *eng, struct task_pid **tk_pid);
+
+/* 第三方策略自身所需要的私有命令支持如果没有置为NULL */
+
+int (*eng_mgt_func)(struct engine *eng, struct task *tk, char *cmd, int fd);
+
+};
+
+配置文件示例如下所示,具体含义请参考配置文件说明章节:
+
+#thirdparty
+
+[engine]
+
+name=thirdparty
+
+project=test
+
+eng_name=my_engine
+
+libname=/user/lib/etmem_fetch/code_test/my_engine.so
+
+ops_name=my_engine_ops
+
+engine_private_key=engine_private_value
+
+[task]
+
+project=test
+
+engine=my_engine
+
+name=background1
+
+type=pid
+
+value=1798245
+
+task_private_key=task_private_value
+
+ **注意**
+
+用户需使用etmem所提供的扫描模块动态库并实现对接etmem所需要的结构体中的接口
+
+eng_mgt_func接口中的fd不能写入0xff和0xfe字
+
+支持在一个工程内添加多个不同的第三方策略动态库以配置文件中的eng_name来区分
+
+### etmem支持使用AEP进行内存扩展
+
+#### 场景描述
+
+使用etmem组件包使能内存分级扩展至AEP的通路。
+
+在节点内对虚拟机的大页进行扫描并通过cslide引擎进行策略淘汰将冷内存搬迁至AEP中
+
+#### 使用方法
+
+使用cslide引擎进行内存扩展参数示例如下具体参数含义请参考配置文件说明章节
+
+#cslide
+
+[engine]
+
+name=cslide
+
+project=test
+
+node_pair=2,0;3,1
+
+hot_threshold=1
+
+node_mig_quota=1024
+
+node_hot_reserve=1024
+
+[task]
+
+project=test
+
+engine=cslide
+
+name=background1
+
+type=pid
+
+value=1823197
+
+vm_flags=ht
+
+anon_only=no
+
+ign_host=no
+
+ **注意** :禁止并发扫描同一个进程
+
+同时此cslide策略支持私有的命令
+
+
+- showtaskpages
+- showhostpages
+
+针对使用此策略引擎的engine和engine所有的task可以通过这两个命令分别查看task相关的页面访问情况和虚拟机的host上系统大页的使用情况。
+
+示例命令如下:
+
+etmem engine showtaskpages <-t task_name> -n proj_name -e cslide -s etmemd_socket
+
+etmem engine showhostpages -n proj_name -e cslide -s etmemd_socket
+
+ **注意** showtaskpages和showhostpages仅支持引擎使用cslide的场景
+
+#### 命令行参数说明
+| 参数 | 参数含义 | 是否必须 | 是否有参数 | 实例说明 |
+|----|------|------|-------|------|
+|-n或\-\-proj_name| 指定project的名字| 是| 是| 指定已经存在所需要执行的project的名字|
+|-s或\-\-socket| 与etmemd服务端通信的socket名称需要与etmemd启动时指定的保持一致| 是| 是| 必须配置在有多个etmemd时由管理员选择与哪个etmemd通信|
+|-e或\-\-engine| 指定执行的引擎的名字| 是| 是| 指定已经存在的,所需要执行的引擎的名字|
+|-t或\-\-task_name| 指定执行的任务的名字| 否| 是| 指定已经存在的,所需要执行的任务的名字|
## 参与贡献
1. Fork本仓库
2. 新建个人分支
3. 提交代码
-4. 新建Pull Request
+4. 新建Pull Request
\ No newline at end of file
--
2.27.0

View File

@ -1,55 +0,0 @@
From 85a0e330d50c1546805c68cd621d1d85b5d08489 Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Tue, 10 Aug 2021 11:13:06 +0800
Subject: [PATCH 44/50] etmem: cleancode
1. group_name for task_of_group and engine_of_group is defined as const, so add const
to group_name in function definition
2. pagesize in init_g_page_size is assigned with a value following init_g_page_size
assigned with initial value -1. Remove redundant initialization.
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
src/etmemd_src/etmemd_project.c | 5 +++--
src/etmemd_src/etmemd_scan.c | 2 +-
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/src/etmemd_src/etmemd_project.c b/src/etmemd_src/etmemd_project.c
index decae76..53ef567 100644
--- a/src/etmemd_src/etmemd_project.c
+++ b/src/etmemd_src/etmemd_project.c
@@ -130,7 +130,8 @@ static enum opt_result project_of_group(GKeyFile *config, const char *group_name
return OPT_SUCCESS;
}
-static enum opt_result engine_of_group(GKeyFile *config, char *group_name, struct project *proj, struct engine **eng)
+static enum opt_result engine_of_group(GKeyFile *config, const char *group_name,
+ struct project *proj, struct engine **eng)
{
char *eng_name = NULL;
enum opt_result ret;
@@ -154,7 +155,7 @@ static enum opt_result engine_of_group(GKeyFile *config, char *group_name, struc
return OPT_SUCCESS;
}
-static enum opt_result task_of_group(GKeyFile *config, char *group_name,
+static enum opt_result task_of_group(GKeyFile *config, const char *group_name,
struct project *proj, struct engine *eng, struct task **tk)
{
char *task_name = NULL;
diff --git a/src/etmemd_src/etmemd_scan.c b/src/etmemd_src/etmemd_scan.c
index 3238668..0fb4fe6 100644
--- a/src/etmemd_src/etmemd_scan.c
+++ b/src/etmemd_src/etmemd_scan.c
@@ -70,7 +70,7 @@ static unsigned int get_page_shift(long pagesize)
int init_g_page_size(void)
{
unsigned int page_shift;
- long pagesize = -1;
+ long pagesize;
pagesize = sysconf(_SC_PAGESIZE);
if (pagesize == -1) {
--
2.27.0

View File

@ -1,520 +0,0 @@
From 6ef46195753a4f383e931b7267cebedc40e756c5 Mon Sep 17 00:00:00 2001
From: liubo <liubo254@huawei.com>
Date: Wed, 18 Aug 2021 10:22:50 +0800
Subject: [PATCH 45/50] add dram_percent to etmem
---
inc/etmemd_inc/etmemd_common.h | 9 ++++
inc/etmemd_inc/etmemd_exp.h | 5 ++
inc/etmemd_inc/etmemd_migrate.h | 3 +-
inc/etmemd_inc/etmemd_scan.h | 5 +-
inc/etmemd_inc/etmemd_slide.h | 1 +
src/etmemd_src/etmemd_common.c | 94 +++++++++++++++++++++++++++++++++
src/etmemd_src/etmemd_migrate.c | 46 ++++++++++++++++
src/etmemd_src/etmemd_scan.c | 70 ++++++++++++++++++++++++
src/etmemd_src/etmemd_slide.c | 83 +++++++++++++++++++++++++----
9 files changed, 304 insertions(+), 12 deletions(-)
diff --git a/inc/etmemd_inc/etmemd_common.h b/inc/etmemd_inc/etmemd_common.h
index 4127ccf..8d18f8a 100644
--- a/inc/etmemd_inc/etmemd_common.h
+++ b/inc/etmemd_inc/etmemd_common.h
@@ -20,10 +20,16 @@
#include <stdbool.h>
#define PROC_PATH "/proc/"
+#define STATUS_FILE "/status"
+#define SWAPIN "SwapIN"
+#define VMRSS "VmRSS"
+#define VMSWAP "VmSwap"
#define FILE_LINE_MAX_LEN 1024
#define KEY_VALUE_MAX_LEN 64
#define DECIMAL_RADIX 10
#define ETMEMD_MAX_PARAMETER_NUM 6
+#define BYTE_TO_KB(s) ((s) >> 10)
+#define KB_TO_BYTE(s) ((s) << 10)
#define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
@@ -48,11 +54,14 @@ int etmemd_parse_cmdline(int argc, char *argv[], bool *is_help);
bool check_str_format(char endptr);
int get_int_value(const char *val, int *value);
int get_unsigned_int_value(const char *val, unsigned int *value);
+int get_unsigned_long_value(const char *val, unsigned long *value);
void etmemd_safe_free(void **ptr);
FILE *etmemd_get_proc_file(const char *pid, const char *file, int flags, const char *mode);
int get_keyword_and_value(const char *str, char *key, char *val);
+unsigned long get_pagesize(void);
+int get_mem_from_proc_file(const char *pid, const char *file_name, unsigned long *data, const char *cmpstr);
int dprintf_all(int fd, const char *format, ...);
diff --git a/inc/etmemd_inc/etmemd_exp.h b/inc/etmemd_inc/etmemd_exp.h
index 8c57d9f..48a0018 100644
--- a/inc/etmemd_inc/etmemd_exp.h
+++ b/inc/etmemd_inc/etmemd_exp.h
@@ -39,4 +39,9 @@ struct page_refs {
struct page_refs *next; /* point to next page */
};
+struct page_sort {
+ struct page_refs **page_refs_sort;
+ struct page_refs **page_refs;
+ int loop;
+};
#endif
diff --git a/inc/etmemd_inc/etmemd_migrate.h b/inc/etmemd_inc/etmemd_migrate.h
index db61c69..ef20bde 100644
--- a/inc/etmemd_inc/etmemd_migrate.h
+++ b/inc/etmemd_inc/etmemd_migrate.h
@@ -17,6 +17,7 @@
#define ETMEMD_MIGRATE_H
#include "etmemd.h"
+#include "etmemd_task.h"
#define COLD_PAGE "/swap_pages"
@@ -26,5 +27,5 @@
#define SWAP_ADDR_LEN 20
int etmemd_grade_migrate(const char* pid, const struct memory_grade *memory_grade);
-
+unsigned long check_should_migrate(const struct task_pid *tk_pid);
#endif
diff --git a/inc/etmemd_inc/etmemd_scan.h b/inc/etmemd_inc/etmemd_scan.h
index 09ad51c..9e5bcc4 100644
--- a/inc/etmemd_inc/etmemd_scan.h
+++ b/inc/etmemd_inc/etmemd_scan.h
@@ -77,9 +77,12 @@ struct vmas *get_vmas_with_flags(const char *pid, char **vmflags_array, int vmfl
struct vmas *get_vmas(const char *pid);
void clean_page_refs_unexpected(void *arg);
-
void clean_memory_grade_unexpected(void *arg);
+void clean_page_sort_unexpected(void *arg);
+struct page_sort *alloc_page_sort(const struct task_pid *tk_pid);
+struct page_sort *sort_page_refs(struct page_refs **page_refs, const struct task_pid *tk_pid);
+
struct page_refs *add_page_refs_into_memory_grade(struct page_refs *page_refs, struct page_refs **list);
int init_g_page_size(void);
int page_type_to_size(enum page_type type);
diff --git a/inc/etmemd_inc/etmemd_slide.h b/inc/etmemd_inc/etmemd_slide.h
index af48be7..93de502 100644
--- a/inc/etmemd_inc/etmemd_slide.h
+++ b/inc/etmemd_inc/etmemd_slide.h
@@ -22,6 +22,7 @@
struct slide_params {
struct task_executor *executor;
int t; /* watermark */
+ uint8_t dram_percent;
};
int fill_engine_type_slide(struct engine *eng, GKeyFile *config);
diff --git a/src/etmemd_src/etmemd_common.c b/src/etmemd_src/etmemd_common.c
index 8aad0eb..4595499 100644
--- a/src/etmemd_src/etmemd_common.c
+++ b/src/etmemd_src/etmemd_common.c
@@ -195,6 +195,19 @@ int get_unsigned_int_value(const char *val, unsigned int *value)
return 0;
}
+int get_unsigned_long_value(const char *val, unsigned long *value)
+{
+ char *pos = NULL;
+
+ errno = 0;
+ *value = strtoul(val, &pos, DECIMAL_RADIX);
+ if (check_str_format(pos[0])) {
+ etmemd_log(ETMEMD_LOG_ERR, "invalid value, must be type of unsigned long.\n");
+ return -1;
+ }
+
+ return 0;
+}
void etmemd_safe_free(void **ptr)
{
if (ptr == NULL || *ptr == NULL) {
@@ -205,6 +218,36 @@ void etmemd_safe_free(void **ptr)
*ptr = NULL;
}
+static int get_status_num(char *getline, char *value, size_t value_len)
+{
+ size_t len = strlen(getline);
+ int start_cp_index = 0;
+ int end_cp_index = 0;
+ size_t i;
+
+ for (i = 0; i < len; i++) {
+ if (isdigit(getline[i])) {
+ start_cp_index = i;
+ end_cp_index = start_cp_index;
+ break;
+ }
+ }
+
+ for (; i < len; i++) {
+ if (!isdigit(getline[i])) {
+ end_cp_index = i - 1;
+ break;
+ }
+ }
+
+ if (strncpy_s(value, value_len, getline + start_cp_index, end_cp_index - start_cp_index + 1) != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "strncpy_s for result failed.\n");
+ return -1;
+ }
+
+ return 0;
+}
+
static char *etmemd_get_proc_file_str(const char *pid, const char *file)
{
char *file_name = NULL;
@@ -398,3 +441,54 @@ int dprintf_all(int fd, const char *format, ...)
va_end(args_in);
return 0;
}
+
+int get_mem_from_proc_file(const char *pid, const char *file_name, unsigned long *data, const char *cmpstr)
+{
+ FILE *file = NULL;
+ char value[KEY_VALUE_MAX_LEN] = {};
+ char get_line[FILE_LINE_MAX_LEN] = {};
+ unsigned long val;
+ int ret = -1;
+
+ file = etmemd_get_proc_file(pid, file_name, 0, "r");
+ if (file == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "cannot open %s for pid %s\n", file_name, pid);
+ return ret;
+ }
+
+ while (fgets(get_line, FILE_LINE_MAX_LEN - 1, file) != NULL) {
+ if (strstr(get_line, cmpstr) == NULL) {
+ continue;
+ }
+
+ if (get_status_num(get_line, value, KEY_VALUE_MAX_LEN) != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "get mem from /proc/%s/%s fail\n", pid, file_name);
+ break;
+ }
+
+ if (get_unsigned_long_value(value, &val) != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "get value with strtoul fail.\n");
+ break;
+ }
+
+ *data = val;
+ ret = 0;
+ break;
+ }
+
+ fclose(file);
+ return ret;
+}
+
+unsigned long get_pagesize(void)
+{
+ long pagesize;
+
+ pagesize = sysconf(_SC_PAGESIZE);
+ if (pagesize == -1) {
+ etmemd_log(ETMEMD_LOG_ERR, "get pageszie fail,error: %d\n", errno);
+ return -1;
+ }
+
+ return (unsigned long)pagesize;
+}
diff --git a/src/etmemd_src/etmemd_migrate.c b/src/etmemd_src/etmemd_migrate.c
index 2f29f31..639d570 100644
--- a/src/etmemd_src/etmemd_migrate.c
+++ b/src/etmemd_src/etmemd_migrate.c
@@ -20,6 +20,7 @@
#include "etmemd.h"
#include "etmemd_migrate.h"
#include "etmemd_common.h"
+#include "etmemd_slide.h"
#include "etmemd_log.h"
static char *get_swap_string(struct page_refs **page_refs, int batchsize)
@@ -113,3 +114,48 @@ int etmemd_grade_migrate(const char *pid, const struct memory_grade *memory_grad
return ret;
}
+unsigned long check_should_migrate(const struct task_pid *tk_pid)
+{
+ int ret = -1;
+ unsigned long vm_rss;
+ unsigned long vm_swap;
+ unsigned long vm_cmp;
+ unsigned long need_to_swap_page_num;
+ char pid_str[PID_STR_MAX_LEN] = {0};
+ unsigned long pagesize;
+ struct slide_params *slide_params = NULL;
+
+ if (snprintf_s(pid_str, PID_STR_MAX_LEN, PID_STR_MAX_LEN - 1, "%u", tk_pid->pid) <= 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "snprintf pid fail %u", tk_pid->pid);
+ return 0;
+ }
+
+ ret = get_mem_from_proc_file(pid_str, STATUS_FILE, &vm_rss, VMRSS);
+ if (ret != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "get vmrss %s fail", pid_str);
+ return 0;
+ }
+
+ ret = get_mem_from_proc_file(pid_str, STATUS_FILE, &vm_swap, VMSWAP);
+ if (ret != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "get swapout %s fail", pid_str);
+ return 0;
+ }
+
+ slide_params = (struct slide_params *)tk_pid->tk->params;
+ if (slide_params == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "slide params is null");
+ return 0;
+ }
+
+ vm_cmp = (vm_rss + vm_swap) / 100 * slide_params->dram_percent;
+ if (vm_cmp > vm_rss) {
+ etmemd_log(ETMEMD_LOG_DEBUG, "migrate too much, stop migrate this time\n");
+ return 0;
+ }
+
+ pagesize = get_pagesize();
+ need_to_swap_page_num = KB_TO_BYTE(vm_rss - vm_cmp) / pagesize;
+
+ return need_to_swap_page_num;
+}
diff --git a/src/etmemd_src/etmemd_scan.c b/src/etmemd_src/etmemd_scan.c
index 0fb4fe6..fec6373 100644
--- a/src/etmemd_src/etmemd_scan.c
+++ b/src/etmemd_src/etmemd_scan.c
@@ -24,6 +24,7 @@
#include "etmemd_project.h"
#include "etmemd_engine.h"
#include "etmemd_common.h"
+#include "etmemd_slide.h"
#include "etmemd_log.h"
#include "securec.h"
@@ -819,6 +820,46 @@ void clean_memory_grade_unexpected(void *arg)
return;
}
+void clean_page_sort_unexpected(void *arg)
+{
+ struct page_sort **msg = (struct page_sort **)arg;
+
+ if (*msg == NULL) {
+ return;
+ }
+
+ for (int i = 0; i < (*msg)->loop + 1; i++) {
+ clean_page_refs_unexpected(&((*msg)->page_refs_sort)[i]);
+ }
+
+ free(*msg);
+ *msg = NULL;
+
+ return;
+}
+
+struct page_sort *alloc_page_sort(const struct task_pid *tpid)
+{
+ struct page_sort *page_sort = NULL;
+
+ page_sort = (struct page_sort *)calloc(1, sizeof(struct page_sort));
+ if (page_sort == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "calloc page sort failed.\n");
+ return NULL;
+ }
+
+ page_sort->loop = tpid->tk->eng->proj->loop;
+
+ page_sort->page_refs_sort = (struct page_refs **)calloc((tpid->tk->eng->proj->loop + 1), sizeof(struct page_refs *));
+ if (page_sort->page_refs_sort == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "calloc page refs sort failed.\n");
+ free(page_sort);
+ return NULL;
+ }
+
+ return page_sort;
+}
+
struct page_refs *add_page_refs_into_memory_grade(struct page_refs *page_refs, struct page_refs **list)
{
struct page_refs *tmp = NULL;
@@ -851,3 +892,32 @@ void etmemd_scan_exit(void)
{
g_exp_scan_inited = false;
}
+
+/* Move the colder pages by sorting page refs.
+ * Use original page_refs if dram_percent is not set.
+ * But, use the sorting result of page_refs, if dram_percent is set to (0, 100] */
+struct page_sort *sort_page_refs(struct page_refs **page_refs, const struct task_pid *tpid)
+{
+ struct slide_params *slide_params = NULL;
+ struct page_sort *page_sort = NULL;
+ struct page_refs *page_next = NULL;
+
+ page_sort = alloc_page_sort(tpid);
+ if (page_sort == NULL)
+ return NULL;
+
+ slide_params = (struct slide_params *)tpid->tk->params;
+ if (slide_params == NULL || slide_params->dram_percent == 0) {
+ page_sort->page_refs = page_refs;
+ return page_sort;
+ }
+
+ while (*page_refs != NULL) {
+ page_next = (*page_refs)->next;
+ (*page_refs)->next = (page_sort->page_refs_sort[(*page_refs)->count]);
+ (page_sort->page_refs_sort[(*page_refs)->count]) = *page_refs;
+ *page_refs = page_next;
+ }
+
+ return page_sort;
+}
diff --git a/src/etmemd_src/etmemd_slide.c b/src/etmemd_src/etmemd_slide.c
index 96d3dcc..a024178 100644
--- a/src/etmemd_src/etmemd_slide.c
+++ b/src/etmemd_src/etmemd_slide.c
@@ -28,12 +28,15 @@
#include "etmemd_pool_adapter.h"
#include "etmemd_file.h"
-static struct memory_grade *slide_policy_interface(struct page_refs **page_refs, void *params)
+static struct memory_grade *slide_policy_interface(struct page_sort **page_sort, const struct task_pid *tpid)
{
- struct slide_params *slide_params = (struct slide_params *)params;
+ struct slide_params *slide_params = (struct slide_params *)(tpid->tk->params);
+ struct page_refs **page_refs = NULL;
struct memory_grade *memory_grade = NULL;
+ unsigned long need_2_swap_num;
+ volatile uint64_t count = 0;
- if (params == NULL) {
+ if (slide_params == NULL) {
etmemd_log(ETMEMD_LOG_ERR, "cannot get params for slide\n");
return NULL;
}
@@ -44,14 +47,41 @@ static struct memory_grade *slide_policy_interface(struct page_refs **page_refs,
return NULL;
}
- while (*page_refs != NULL) {
- if ((*page_refs)->count >= slide_params->t) {
- *page_refs = add_page_refs_into_memory_grade(*page_refs, &memory_grade->hot_pages);
- continue;
+ if (slide_params->dram_percent == 0) {
+ page_refs = (*page_sort)->page_refs;
+
+ while (*page_refs != NULL) {
+ if ((*page_refs)->count >= slide_params->t) {
+ *page_refs = add_page_refs_into_memory_grade(*page_refs, &memory_grade->hot_pages);
+ continue;
+ }
+ *page_refs = add_page_refs_into_memory_grade(*page_refs, &memory_grade->cold_pages);
+ }
+
+ return memory_grade;
+ }
+
+ need_2_swap_num = check_should_migrate(tpid);
+ if (need_2_swap_num == 0)
+ goto count_out;
+
+ for (int i = 0; i < tpid->tk->eng->proj->loop + 1; i++) {
+ page_refs = &((*page_sort)->page_refs_sort[i]);
+
+ while (*page_refs != NULL) {
+ if ((*page_refs)->count >= slide_params->t) {
+ *page_refs = add_page_refs_into_memory_grade(*page_refs, &memory_grade->hot_pages);
+ goto count_out;
+ }
+
+ *page_refs = add_page_refs_into_memory_grade(*page_refs, &memory_grade->cold_pages);
+ count++;
+ if (count >= need_2_swap_num)
+ goto count_out;
}
- *page_refs = add_page_refs_into_memory_grade(*page_refs, &memory_grade->cold_pages);
}
+count_out:
return memory_grade;
}
@@ -80,17 +110,32 @@ static void *slide_executor(void *arg)
struct task_pid *tk_pid = (struct task_pid *)arg;
struct page_refs *page_refs = NULL;
struct memory_grade *memory_grade = NULL;
+ struct page_sort *page_sort = NULL;
/* register cleanup function in case of unexpected cancellation detected,
* and register for memory_grade first, because it needs to clean after page_refs is cleaned */
pthread_cleanup_push(clean_memory_grade_unexpected, &memory_grade);
pthread_cleanup_push(clean_page_refs_unexpected, &page_refs);
+ pthread_cleanup_push(clean_page_sort_unexpected, &page_sort);
page_refs = etmemd_do_scan(tk_pid, tk_pid->tk);
- if (page_refs != NULL) {
- memory_grade = slide_policy_interface(&page_refs, tk_pid->tk->params);
+ if (page_refs == NULL) {
+ etmemd_log(ETMEMD_LOG_WARN, "pid %u cannot get page refs\n", tk_pid->pid);
+ goto scan_out;
}
+ page_sort = sort_page_refs(&page_refs, tk_pid);
+ if (page_sort == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "failed to alloc memory for page sort.", tk_pid->pid);
+ goto scan_out;
+ }
+
+ memory_grade = slide_policy_interface(&page_sort, tk_pid);
+
+scan_out:
+ /* clean up page_sort linked array */
+ pthread_cleanup_pop(1);
+
/* no need to use page_refs any longer.
* pop the cleanup function with parameter 1, because the items in page_refs list will be moved
* into the at least on list of memory_grade after polidy function called if no problems happened,
@@ -131,8 +176,26 @@ static int fill_task_threshold(void *obj, void *val)
return 0;
}
+static int fill_task_dram_percent(void *obj, void *val)
+{
+ struct slide_params *params = (struct slide_params *)obj;
+ int value = parse_to_int(val);
+
+ if (value <= 0 || value > 100) {
+ etmemd_log(ETMEMD_LOG_WARN,
+ "dram_percent %d is abnormal, the reasonable range is (0, 100],\
+ cancle the dram_percent parameter of current task\n", value);
+ value = 0;
+ }
+
+ params->dram_percent = value;
+
+ return 0;
+}
+
static struct config_item g_slide_task_config_items[] = {
{"T", INT_VAL, fill_task_threshold, false},
+ {"dram_percent", INT_VAL, fill_task_dram_percent, true},
};
static int slide_fill_task(GKeyFile *config, struct task *tk)
--
2.27.0

View File

@ -1,52 +0,0 @@
From 10883d861456fe5daf7e664c0311abed754da8fd Mon Sep 17 00:00:00 2001
From: liubo <liubo254@huawei.com>
Date: Mon, 27 Sep 2021 15:58:11 +0800
Subject: [PATCH 46/50] Fix memory leak in slide engine, remove project show
cmd error msg.
If a process has multiple subprocess, release the task_pid resource of
the subprocess corresponding to the task when project stops.
Remove project show error message if show cmd is executed successfully.
Signed-off-by: liubo <liubo254@huawei.com>
---
src/etmemd_src/etmemd_project.c | 7 ++++---
src/etmemd_src/etmemd_slide.c | 1 +
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/src/etmemd_src/etmemd_project.c b/src/etmemd_src/etmemd_project.c
index 53ef567..f7f1885 100644
--- a/src/etmemd_src/etmemd_project.c
+++ b/src/etmemd_src/etmemd_project.c
@@ -611,11 +611,12 @@ enum opt_result etmemd_project_show(const char *project_name, int sock_fd)
if (!exists) {
if (project_name == NULL) {
- etmemd_log(ETMEMD_LOG_ERR, "no project exists\n");
+ etmemd_log(ETMEMD_LOG_DEBUG, "no project exists\n");
+ dprintf_all(sock_fd, "no project exists\n\n");
} else {
- etmemd_log(ETMEMD_LOG_ERR, "project: project %s is not existed\n\n", project_name);
+ etmemd_log(ETMEMD_LOG_DEBUG, "project: project %s is not existed\n\n", project_name);
+ dprintf_all(sock_fd, "project: project %s is not existed\n\n", project_name);
}
- return OPT_PRO_NOEXIST;
}
return OPT_SUCCESS;
diff --git a/src/etmemd_src/etmemd_slide.c b/src/etmemd_src/etmemd_slide.c
index a024178..45db00a 100644
--- a/src/etmemd_src/etmemd_slide.c
+++ b/src/etmemd_src/etmemd_slide.c
@@ -227,6 +227,7 @@ free_params:
static void slide_clear_task(struct task *tk)
{
+ etmemd_free_task_pids(tk);
free(tk->params);
tk->params = NULL;
}
--
2.27.0

View File

@ -1,335 +0,0 @@
From b89f142798ebb23ad58ad3a0d1fe34f74e7801a6 Mon Sep 17 00:00:00 2001
From: louhongxiang <louhongxiang@huawei.com>
Date: Thu, 30 Sep 2021 14:15:50 +0800
Subject: [PATCH 47/50] move all the files to sub directory of etmem.
---
CMakeLists.txt => etmem/CMakeLists.txt | 0
{conf => etmem/conf}/example_conf.yaml | 0
{inc => etmem/inc}/etmem_inc/etmem.h | 0
{inc => etmem/inc}/etmem_inc/etmem_common.h | 0
{inc => etmem/inc}/etmem_inc/etmem_engine.h | 0
{inc => etmem/inc}/etmem_inc/etmem_obj.h | 0
{inc => etmem/inc}/etmem_inc/etmem_project.h | 0
{inc => etmem/inc}/etmem_inc/etmem_rpc.h | 0
{inc => etmem/inc}/etmemd_inc/etmemd.h | 0
{inc => etmem/inc}/etmemd_inc/etmemd_common.h | 0
{inc => etmem/inc}/etmemd_inc/etmemd_cslide.h | 0
{inc => etmem/inc}/etmemd_inc/etmemd_engine.h | 0
{inc => etmem/inc}/etmemd_inc/etmemd_engine_exp.h | 0
{inc => etmem/inc}/etmemd_inc/etmemd_exp.h | 0
{inc => etmem/inc}/etmemd_inc/etmemd_file.h | 0
{inc => etmem/inc}/etmemd_inc/etmemd_log.h | 0
{inc => etmem/inc}/etmemd_inc/etmemd_migrate.h | 0
{inc => etmem/inc}/etmemd_inc/etmemd_pool_adapter.h | 0
{inc => etmem/inc}/etmemd_inc/etmemd_project.h | 0
{inc => etmem/inc}/etmemd_inc/etmemd_project_exp.h | 0
{inc => etmem/inc}/etmemd_inc/etmemd_rpc.h | 0
{inc => etmem/inc}/etmemd_inc/etmemd_scan.h | 0
{inc => etmem/inc}/etmemd_inc/etmemd_scan_exp.h | 0
{inc => etmem/inc}/etmemd_inc/etmemd_scan_export.h | 0
{inc => etmem/inc}/etmemd_inc/etmemd_slide.h | 0
{inc => etmem/inc}/etmemd_inc/etmemd_task.h | 0
{inc => etmem/inc}/etmemd_inc/etmemd_task_exp.h | 0
{inc => etmem/inc}/etmemd_inc/etmemd_thirdparty.h | 0
{inc => etmem/inc}/etmemd_inc/etmemd_thirdparty_export.h | 0
{inc => etmem/inc}/etmemd_inc/etmemd_threadpool.h | 0
{inc => etmem/inc}/etmemd_inc/etmemd_threadtimer.h | 0
{src => etmem/src}/etmem_src/etmem.c | 0
{src => etmem/src}/etmem_src/etmem_common.c | 0
{src => etmem/src}/etmem_src/etmem_engine.c | 0
{src => etmem/src}/etmem_src/etmem_obj.c | 0
{src => etmem/src}/etmem_src/etmem_project.c | 0
{src => etmem/src}/etmem_src/etmem_rpc.c | 0
{src => etmem/src}/etmemd_src/etmemd.c | 0
{src => etmem/src}/etmemd_src/etmemd_common.c | 0
{src => etmem/src}/etmemd_src/etmemd_cslide.c | 0
{src => etmem/src}/etmemd_src/etmemd_engine.c | 0
{src => etmem/src}/etmemd_src/etmemd_file.c | 0
{src => etmem/src}/etmemd_src/etmemd_log.c | 0
{src => etmem/src}/etmemd_src/etmemd_migrate.c | 0
{src => etmem/src}/etmemd_src/etmemd_pool_adapter.c | 0
{src => etmem/src}/etmemd_src/etmemd_project.c | 0
{src => etmem/src}/etmemd_src/etmemd_rpc.c | 0
{src => etmem/src}/etmemd_src/etmemd_scan.c | 0
{src => etmem/src}/etmemd_src/etmemd_scan.version | 0
{src => etmem/src}/etmemd_src/etmemd_slide.c | 0
{src => etmem/src}/etmemd_src/etmemd_task.c | 0
{src => etmem/src}/etmemd_src/etmemd_thirdparty.c | 0
{src => etmem/src}/etmemd_src/etmemd_threadpool.c | 0
{src => etmem/src}/etmemd_src/etmemd_threadtimer.c | 0
56 files changed, 0 insertions(+), 0 deletions(-)
rename CMakeLists.txt => etmem/CMakeLists.txt (100%)
rename {conf => etmem/conf}/example_conf.yaml (100%)
rename {inc => etmem/inc}/etmem_inc/etmem.h (100%)
rename {inc => etmem/inc}/etmem_inc/etmem_common.h (100%)
rename {inc => etmem/inc}/etmem_inc/etmem_engine.h (100%)
rename {inc => etmem/inc}/etmem_inc/etmem_obj.h (100%)
rename {inc => etmem/inc}/etmem_inc/etmem_project.h (100%)
rename {inc => etmem/inc}/etmem_inc/etmem_rpc.h (100%)
rename {inc => etmem/inc}/etmemd_inc/etmemd.h (100%)
rename {inc => etmem/inc}/etmemd_inc/etmemd_common.h (100%)
rename {inc => etmem/inc}/etmemd_inc/etmemd_cslide.h (100%)
rename {inc => etmem/inc}/etmemd_inc/etmemd_engine.h (100%)
rename {inc => etmem/inc}/etmemd_inc/etmemd_engine_exp.h (100%)
rename {inc => etmem/inc}/etmemd_inc/etmemd_exp.h (100%)
rename {inc => etmem/inc}/etmemd_inc/etmemd_file.h (100%)
rename {inc => etmem/inc}/etmemd_inc/etmemd_log.h (100%)
rename {inc => etmem/inc}/etmemd_inc/etmemd_migrate.h (100%)
rename {inc => etmem/inc}/etmemd_inc/etmemd_pool_adapter.h (100%)
rename {inc => etmem/inc}/etmemd_inc/etmemd_project.h (100%)
rename {inc => etmem/inc}/etmemd_inc/etmemd_project_exp.h (100%)
rename {inc => etmem/inc}/etmemd_inc/etmemd_rpc.h (100%)
rename {inc => etmem/inc}/etmemd_inc/etmemd_scan.h (100%)
rename {inc => etmem/inc}/etmemd_inc/etmemd_scan_exp.h (100%)
rename {inc => etmem/inc}/etmemd_inc/etmemd_scan_export.h (100%)
rename {inc => etmem/inc}/etmemd_inc/etmemd_slide.h (100%)
rename {inc => etmem/inc}/etmemd_inc/etmemd_task.h (100%)
rename {inc => etmem/inc}/etmemd_inc/etmemd_task_exp.h (100%)
rename {inc => etmem/inc}/etmemd_inc/etmemd_thirdparty.h (100%)
rename {inc => etmem/inc}/etmemd_inc/etmemd_thirdparty_export.h (100%)
rename {inc => etmem/inc}/etmemd_inc/etmemd_threadpool.h (100%)
rename {inc => etmem/inc}/etmemd_inc/etmemd_threadtimer.h (100%)
rename {src => etmem/src}/etmem_src/etmem.c (100%)
rename {src => etmem/src}/etmem_src/etmem_common.c (100%)
rename {src => etmem/src}/etmem_src/etmem_engine.c (100%)
rename {src => etmem/src}/etmem_src/etmem_obj.c (100%)
rename {src => etmem/src}/etmem_src/etmem_project.c (100%)
rename {src => etmem/src}/etmem_src/etmem_rpc.c (100%)
rename {src => etmem/src}/etmemd_src/etmemd.c (100%)
rename {src => etmem/src}/etmemd_src/etmemd_common.c (100%)
rename {src => etmem/src}/etmemd_src/etmemd_cslide.c (100%)
rename {src => etmem/src}/etmemd_src/etmemd_engine.c (100%)
rename {src => etmem/src}/etmemd_src/etmemd_file.c (100%)
rename {src => etmem/src}/etmemd_src/etmemd_log.c (100%)
rename {src => etmem/src}/etmemd_src/etmemd_migrate.c (100%)
rename {src => etmem/src}/etmemd_src/etmemd_pool_adapter.c (100%)
rename {src => etmem/src}/etmemd_src/etmemd_project.c (100%)
rename {src => etmem/src}/etmemd_src/etmemd_rpc.c (100%)
rename {src => etmem/src}/etmemd_src/etmemd_scan.c (100%)
rename {src => etmem/src}/etmemd_src/etmemd_scan.version (100%)
rename {src => etmem/src}/etmemd_src/etmemd_slide.c (100%)
rename {src => etmem/src}/etmemd_src/etmemd_task.c (100%)
rename {src => etmem/src}/etmemd_src/etmemd_thirdparty.c (100%)
rename {src => etmem/src}/etmemd_src/etmemd_threadpool.c (100%)
rename {src => etmem/src}/etmemd_src/etmemd_threadtimer.c (100%)
diff --git a/CMakeLists.txt b/etmem/CMakeLists.txt
similarity index 100%
rename from CMakeLists.txt
rename to etmem/CMakeLists.txt
diff --git a/conf/example_conf.yaml b/etmem/conf/example_conf.yaml
similarity index 100%
rename from conf/example_conf.yaml
rename to etmem/conf/example_conf.yaml
diff --git a/inc/etmem_inc/etmem.h b/etmem/inc/etmem_inc/etmem.h
similarity index 100%
rename from inc/etmem_inc/etmem.h
rename to etmem/inc/etmem_inc/etmem.h
diff --git a/inc/etmem_inc/etmem_common.h b/etmem/inc/etmem_inc/etmem_common.h
similarity index 100%
rename from inc/etmem_inc/etmem_common.h
rename to etmem/inc/etmem_inc/etmem_common.h
diff --git a/inc/etmem_inc/etmem_engine.h b/etmem/inc/etmem_inc/etmem_engine.h
similarity index 100%
rename from inc/etmem_inc/etmem_engine.h
rename to etmem/inc/etmem_inc/etmem_engine.h
diff --git a/inc/etmem_inc/etmem_obj.h b/etmem/inc/etmem_inc/etmem_obj.h
similarity index 100%
rename from inc/etmem_inc/etmem_obj.h
rename to etmem/inc/etmem_inc/etmem_obj.h
diff --git a/inc/etmem_inc/etmem_project.h b/etmem/inc/etmem_inc/etmem_project.h
similarity index 100%
rename from inc/etmem_inc/etmem_project.h
rename to etmem/inc/etmem_inc/etmem_project.h
diff --git a/inc/etmem_inc/etmem_rpc.h b/etmem/inc/etmem_inc/etmem_rpc.h
similarity index 100%
rename from inc/etmem_inc/etmem_rpc.h
rename to etmem/inc/etmem_inc/etmem_rpc.h
diff --git a/inc/etmemd_inc/etmemd.h b/etmem/inc/etmemd_inc/etmemd.h
similarity index 100%
rename from inc/etmemd_inc/etmemd.h
rename to etmem/inc/etmemd_inc/etmemd.h
diff --git a/inc/etmemd_inc/etmemd_common.h b/etmem/inc/etmemd_inc/etmemd_common.h
similarity index 100%
rename from inc/etmemd_inc/etmemd_common.h
rename to etmem/inc/etmemd_inc/etmemd_common.h
diff --git a/inc/etmemd_inc/etmemd_cslide.h b/etmem/inc/etmemd_inc/etmemd_cslide.h
similarity index 100%
rename from inc/etmemd_inc/etmemd_cslide.h
rename to etmem/inc/etmemd_inc/etmemd_cslide.h
diff --git a/inc/etmemd_inc/etmemd_engine.h b/etmem/inc/etmemd_inc/etmemd_engine.h
similarity index 100%
rename from inc/etmemd_inc/etmemd_engine.h
rename to etmem/inc/etmemd_inc/etmemd_engine.h
diff --git a/inc/etmemd_inc/etmemd_engine_exp.h b/etmem/inc/etmemd_inc/etmemd_engine_exp.h
similarity index 100%
rename from inc/etmemd_inc/etmemd_engine_exp.h
rename to etmem/inc/etmemd_inc/etmemd_engine_exp.h
diff --git a/inc/etmemd_inc/etmemd_exp.h b/etmem/inc/etmemd_inc/etmemd_exp.h
similarity index 100%
rename from inc/etmemd_inc/etmemd_exp.h
rename to etmem/inc/etmemd_inc/etmemd_exp.h
diff --git a/inc/etmemd_inc/etmemd_file.h b/etmem/inc/etmemd_inc/etmemd_file.h
similarity index 100%
rename from inc/etmemd_inc/etmemd_file.h
rename to etmem/inc/etmemd_inc/etmemd_file.h
diff --git a/inc/etmemd_inc/etmemd_log.h b/etmem/inc/etmemd_inc/etmemd_log.h
similarity index 100%
rename from inc/etmemd_inc/etmemd_log.h
rename to etmem/inc/etmemd_inc/etmemd_log.h
diff --git a/inc/etmemd_inc/etmemd_migrate.h b/etmem/inc/etmemd_inc/etmemd_migrate.h
similarity index 100%
rename from inc/etmemd_inc/etmemd_migrate.h
rename to etmem/inc/etmemd_inc/etmemd_migrate.h
diff --git a/inc/etmemd_inc/etmemd_pool_adapter.h b/etmem/inc/etmemd_inc/etmemd_pool_adapter.h
similarity index 100%
rename from inc/etmemd_inc/etmemd_pool_adapter.h
rename to etmem/inc/etmemd_inc/etmemd_pool_adapter.h
diff --git a/inc/etmemd_inc/etmemd_project.h b/etmem/inc/etmemd_inc/etmemd_project.h
similarity index 100%
rename from inc/etmemd_inc/etmemd_project.h
rename to etmem/inc/etmemd_inc/etmemd_project.h
diff --git a/inc/etmemd_inc/etmemd_project_exp.h b/etmem/inc/etmemd_inc/etmemd_project_exp.h
similarity index 100%
rename from inc/etmemd_inc/etmemd_project_exp.h
rename to etmem/inc/etmemd_inc/etmemd_project_exp.h
diff --git a/inc/etmemd_inc/etmemd_rpc.h b/etmem/inc/etmemd_inc/etmemd_rpc.h
similarity index 100%
rename from inc/etmemd_inc/etmemd_rpc.h
rename to etmem/inc/etmemd_inc/etmemd_rpc.h
diff --git a/inc/etmemd_inc/etmemd_scan.h b/etmem/inc/etmemd_inc/etmemd_scan.h
similarity index 100%
rename from inc/etmemd_inc/etmemd_scan.h
rename to etmem/inc/etmemd_inc/etmemd_scan.h
diff --git a/inc/etmemd_inc/etmemd_scan_exp.h b/etmem/inc/etmemd_inc/etmemd_scan_exp.h
similarity index 100%
rename from inc/etmemd_inc/etmemd_scan_exp.h
rename to etmem/inc/etmemd_inc/etmemd_scan_exp.h
diff --git a/inc/etmemd_inc/etmemd_scan_export.h b/etmem/inc/etmemd_inc/etmemd_scan_export.h
similarity index 100%
rename from inc/etmemd_inc/etmemd_scan_export.h
rename to etmem/inc/etmemd_inc/etmemd_scan_export.h
diff --git a/inc/etmemd_inc/etmemd_slide.h b/etmem/inc/etmemd_inc/etmemd_slide.h
similarity index 100%
rename from inc/etmemd_inc/etmemd_slide.h
rename to etmem/inc/etmemd_inc/etmemd_slide.h
diff --git a/inc/etmemd_inc/etmemd_task.h b/etmem/inc/etmemd_inc/etmemd_task.h
similarity index 100%
rename from inc/etmemd_inc/etmemd_task.h
rename to etmem/inc/etmemd_inc/etmemd_task.h
diff --git a/inc/etmemd_inc/etmemd_task_exp.h b/etmem/inc/etmemd_inc/etmemd_task_exp.h
similarity index 100%
rename from inc/etmemd_inc/etmemd_task_exp.h
rename to etmem/inc/etmemd_inc/etmemd_task_exp.h
diff --git a/inc/etmemd_inc/etmemd_thirdparty.h b/etmem/inc/etmemd_inc/etmemd_thirdparty.h
similarity index 100%
rename from inc/etmemd_inc/etmemd_thirdparty.h
rename to etmem/inc/etmemd_inc/etmemd_thirdparty.h
diff --git a/inc/etmemd_inc/etmemd_thirdparty_export.h b/etmem/inc/etmemd_inc/etmemd_thirdparty_export.h
similarity index 100%
rename from inc/etmemd_inc/etmemd_thirdparty_export.h
rename to etmem/inc/etmemd_inc/etmemd_thirdparty_export.h
diff --git a/inc/etmemd_inc/etmemd_threadpool.h b/etmem/inc/etmemd_inc/etmemd_threadpool.h
similarity index 100%
rename from inc/etmemd_inc/etmemd_threadpool.h
rename to etmem/inc/etmemd_inc/etmemd_threadpool.h
diff --git a/inc/etmemd_inc/etmemd_threadtimer.h b/etmem/inc/etmemd_inc/etmemd_threadtimer.h
similarity index 100%
rename from inc/etmemd_inc/etmemd_threadtimer.h
rename to etmem/inc/etmemd_inc/etmemd_threadtimer.h
diff --git a/src/etmem_src/etmem.c b/etmem/src/etmem_src/etmem.c
similarity index 100%
rename from src/etmem_src/etmem.c
rename to etmem/src/etmem_src/etmem.c
diff --git a/src/etmem_src/etmem_common.c b/etmem/src/etmem_src/etmem_common.c
similarity index 100%
rename from src/etmem_src/etmem_common.c
rename to etmem/src/etmem_src/etmem_common.c
diff --git a/src/etmem_src/etmem_engine.c b/etmem/src/etmem_src/etmem_engine.c
similarity index 100%
rename from src/etmem_src/etmem_engine.c
rename to etmem/src/etmem_src/etmem_engine.c
diff --git a/src/etmem_src/etmem_obj.c b/etmem/src/etmem_src/etmem_obj.c
similarity index 100%
rename from src/etmem_src/etmem_obj.c
rename to etmem/src/etmem_src/etmem_obj.c
diff --git a/src/etmem_src/etmem_project.c b/etmem/src/etmem_src/etmem_project.c
similarity index 100%
rename from src/etmem_src/etmem_project.c
rename to etmem/src/etmem_src/etmem_project.c
diff --git a/src/etmem_src/etmem_rpc.c b/etmem/src/etmem_src/etmem_rpc.c
similarity index 100%
rename from src/etmem_src/etmem_rpc.c
rename to etmem/src/etmem_src/etmem_rpc.c
diff --git a/src/etmemd_src/etmemd.c b/etmem/src/etmemd_src/etmemd.c
similarity index 100%
rename from src/etmemd_src/etmemd.c
rename to etmem/src/etmemd_src/etmemd.c
diff --git a/src/etmemd_src/etmemd_common.c b/etmem/src/etmemd_src/etmemd_common.c
similarity index 100%
rename from src/etmemd_src/etmemd_common.c
rename to etmem/src/etmemd_src/etmemd_common.c
diff --git a/src/etmemd_src/etmemd_cslide.c b/etmem/src/etmemd_src/etmemd_cslide.c
similarity index 100%
rename from src/etmemd_src/etmemd_cslide.c
rename to etmem/src/etmemd_src/etmemd_cslide.c
diff --git a/src/etmemd_src/etmemd_engine.c b/etmem/src/etmemd_src/etmemd_engine.c
similarity index 100%
rename from src/etmemd_src/etmemd_engine.c
rename to etmem/src/etmemd_src/etmemd_engine.c
diff --git a/src/etmemd_src/etmemd_file.c b/etmem/src/etmemd_src/etmemd_file.c
similarity index 100%
rename from src/etmemd_src/etmemd_file.c
rename to etmem/src/etmemd_src/etmemd_file.c
diff --git a/src/etmemd_src/etmemd_log.c b/etmem/src/etmemd_src/etmemd_log.c
similarity index 100%
rename from src/etmemd_src/etmemd_log.c
rename to etmem/src/etmemd_src/etmemd_log.c
diff --git a/src/etmemd_src/etmemd_migrate.c b/etmem/src/etmemd_src/etmemd_migrate.c
similarity index 100%
rename from src/etmemd_src/etmemd_migrate.c
rename to etmem/src/etmemd_src/etmemd_migrate.c
diff --git a/src/etmemd_src/etmemd_pool_adapter.c b/etmem/src/etmemd_src/etmemd_pool_adapter.c
similarity index 100%
rename from src/etmemd_src/etmemd_pool_adapter.c
rename to etmem/src/etmemd_src/etmemd_pool_adapter.c
diff --git a/src/etmemd_src/etmemd_project.c b/etmem/src/etmemd_src/etmemd_project.c
similarity index 100%
rename from src/etmemd_src/etmemd_project.c
rename to etmem/src/etmemd_src/etmemd_project.c
diff --git a/src/etmemd_src/etmemd_rpc.c b/etmem/src/etmemd_src/etmemd_rpc.c
similarity index 100%
rename from src/etmemd_src/etmemd_rpc.c
rename to etmem/src/etmemd_src/etmemd_rpc.c
diff --git a/src/etmemd_src/etmemd_scan.c b/etmem/src/etmemd_src/etmemd_scan.c
similarity index 100%
rename from src/etmemd_src/etmemd_scan.c
rename to etmem/src/etmemd_src/etmemd_scan.c
diff --git a/src/etmemd_src/etmemd_scan.version b/etmem/src/etmemd_src/etmemd_scan.version
similarity index 100%
rename from src/etmemd_src/etmemd_scan.version
rename to etmem/src/etmemd_src/etmemd_scan.version
diff --git a/src/etmemd_src/etmemd_slide.c b/etmem/src/etmemd_src/etmemd_slide.c
similarity index 100%
rename from src/etmemd_src/etmemd_slide.c
rename to etmem/src/etmemd_src/etmemd_slide.c
diff --git a/src/etmemd_src/etmemd_task.c b/etmem/src/etmemd_src/etmemd_task.c
similarity index 100%
rename from src/etmemd_src/etmemd_task.c
rename to etmem/src/etmemd_src/etmemd_task.c
diff --git a/src/etmemd_src/etmemd_thirdparty.c b/etmem/src/etmemd_src/etmemd_thirdparty.c
similarity index 100%
rename from src/etmemd_src/etmemd_thirdparty.c
rename to etmem/src/etmemd_src/etmemd_thirdparty.c
diff --git a/src/etmemd_src/etmemd_threadpool.c b/etmem/src/etmemd_src/etmemd_threadpool.c
similarity index 100%
rename from src/etmemd_src/etmemd_threadpool.c
rename to etmem/src/etmemd_src/etmemd_threadpool.c
diff --git a/src/etmemd_src/etmemd_threadtimer.c b/etmem/src/etmemd_src/etmemd_threadtimer.c
similarity index 100%
rename from src/etmemd_src/etmemd_threadtimer.c
rename to etmem/src/etmemd_src/etmemd_threadtimer.c
--
2.27.0

File diff suppressed because it is too large Load Diff

View File

@ -1,481 +0,0 @@
From 498679879e2a81820126971839a23d307cdce9f5 Mon Sep 17 00:00:00 2001
From: Yangxin <245051644@qq.com>
Date: Thu, 30 Sep 2021 18:09:41 +0800
Subject: [PATCH 49/50] Add engine memdcd to etmemd.
Signed-off-by: Yangxin <245051644@qq.com>
---
etmem/CMakeLists.txt | 1 +
etmem/inc/etmemd_inc/etmemd_engine.h | 1 +
etmem/inc/etmemd_inc/etmemd_memdcd.h | 31 +++
etmem/src/etmemd_src/etmemd_engine.c | 2 +
etmem/src/etmemd_src/etmemd_memdcd.c | 374 +++++++++++++++++++++++++++
5 files changed, 409 insertions(+)
create mode 100644 etmem/inc/etmemd_inc/etmemd_memdcd.h
create mode 100644 etmem/src/etmemd_src/etmemd_memdcd.c
diff --git a/etmem/CMakeLists.txt b/etmem/CMakeLists.txt
index 6d11da9..b5eb83e 100644
--- a/etmem/CMakeLists.txt
+++ b/etmem/CMakeLists.txt
@@ -31,6 +31,7 @@ set(ETMEMD_SRC
${ETMEMD_SRC_DIR}/etmemd_log.c
${ETMEMD_SRC_DIR}/etmemd_project.c
${ETMEMD_SRC_DIR}/etmemd_engine.c
+ ${ETMEMD_SRC_DIR}/etmemd_memdcd.c
${ETMEMD_SRC_DIR}/etmemd_slide.c
${ETMEMD_SRC_DIR}/etmemd_cslide.c
${ETMEMD_SRC_DIR}/etmemd_thirdparty.c
diff --git a/etmem/inc/etmemd_inc/etmemd_engine.h b/etmem/inc/etmemd_inc/etmemd_engine.h
index 0134d21..9a50e10 100644
--- a/etmem/inc/etmemd_inc/etmemd_engine.h
+++ b/etmem/inc/etmemd_inc/etmemd_engine.h
@@ -24,6 +24,7 @@
enum eng_type {
SLIDE_ENGINE = 0,
CSLIDE_ENGINE,
+ MEMDCD_ENGINE,
DYNAMIC_FB_ENGINE,
HISTORICAL_FB_ENGINE,
THIRDPARTY_ENGINE,
diff --git a/etmem/inc/etmemd_inc/etmemd_memdcd.h b/etmem/inc/etmemd_inc/etmemd_memdcd.h
new file mode 100644
index 0000000..96f9307
--- /dev/null
+++ b/etmem/inc/etmemd_inc/etmemd_memdcd.h
@@ -0,0 +1,31 @@
+/******************************************************************************
+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved.
+ * etmem is licensed under the Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+ * PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * Author: YangXin
+ * Create: 2021-4-20
+ * Description: This is a header file of the function declaration for memdcd engine..
+ ******************************************************************************/
+
+
+#ifndef ETMEMD_MEMDCD_H
+#define ETMEMD_MEMDCD_H
+
+#include "etmemd_engine.h"
+
+#define MAX_SOCK_PATH_LENGTH 108
+
+struct memdcd_params {
+ struct task_executor *executor;
+ char memdcd_socket[MAX_SOCK_PATH_LENGTH];
+};
+
+int fill_engine_type_memdcd(struct engine *eng, GKeyFile *config);
+
+#endif
diff --git a/etmem/src/etmemd_src/etmemd_engine.c b/etmem/src/etmemd_src/etmemd_engine.c
index f57d52b..6a14ecb 100644
--- a/etmem/src/etmemd_src/etmemd_engine.c
+++ b/etmem/src/etmemd_src/etmemd_engine.c
@@ -18,6 +18,7 @@
#include "etmemd_engine.h"
#include "etmemd_slide.h"
#include "etmemd_cslide.h"
+#include "etmemd_memdcd.h"
#include "etmemd_thirdparty.h"
#include "etmemd_log.h"
#include "etmemd_common.h"
@@ -36,6 +37,7 @@ struct engine_remove_item {
static struct engine_add_item g_engine_add_items[] = {
{"slide", fill_engine_type_slide},
{"cslide", fill_engine_type_cslide},
+ {"memdcd", fill_engine_type_memdcd},
{"thirdparty", fill_engine_type_thirdparty},
};
diff --git a/etmem/src/etmemd_src/etmemd_memdcd.c b/etmem/src/etmemd_src/etmemd_memdcd.c
new file mode 100644
index 0000000..635e5a2
--- /dev/null
+++ b/etmem/src/etmemd_src/etmemd_memdcd.c
@@ -0,0 +1,374 @@
+/******************************************************************************
+ * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+ * etmem is licensed under the Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+ * PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * Author: Yangxin
+ * Create: 2021-04-05
+ * Description: API of memdcd engine.
+ ******************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "securec.h"
+#include "etmemd_log.h"
+#include "etmemd_common.h"
+#include "etmemd_engine.h"
+#include "etmemd_scan.h"
+#include "etmemd_migrate.h"
+#include "etmemd_pool_adapter.h"
+#include "etmemd_file.h"
+#include "etmemd_memdcd.h"
+
+#define MAX_VMA_NUM 512
+#define RESP_MSG_MAX_LEN 10
+#define CLIENT_RECV_DEFAULT_TIME 10
+
+enum MEMDCD_CMD_TYPE {
+ MEMDCD_CMD_MEM = 0
+};
+
+enum SwapType {
+ SWAP_TYPE_VMA_ADDR = 0xFFFFFF01,
+ SWAP_TYPE_MAX
+};
+
+struct vma_addr {
+ uint64_t start_addr;
+ uint64_t vma_len;
+};
+
+struct vma_addr_with_count {
+ struct vma_addr vma;
+ int count;
+};
+
+enum MEMDCD_MESSAGE_STATUS {
+ MEMDCD_SEND_START,
+ MEMDCD_SEND_PROCESS,
+ MEMDCD_SEND_END,
+};
+
+struct swap_vma_with_count {
+ enum SwapType type;
+ uint64_t length;
+ uint64_t total_length;
+ enum MEMDCD_MESSAGE_STATUS status;
+ struct vma_addr_with_count vma_addrs[MAX_VMA_NUM];
+};
+
+struct memory_message {
+ int pid;
+ uint32_t enable_uswap;
+ struct swap_vma_with_count vma;
+};
+
+struct memdcd_message {
+ enum MEMDCD_CMD_TYPE cmd_type;
+ union {
+ struct memory_message memory_msg;
+ };
+};
+
+static int memdcd_connection_init(time_t tm_out, const char sock_path[])
+{
+ struct sockaddr_un addr;
+ int len;
+
+ int sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (sockfd < 0){
+ etmemd_log(ETMEMD_LOG_ERR, "new socket for memdcd error.");
+ return -1;
+ }
+
+ len = offsetof(struct sockaddr_un, sun_path) + strlen(addr.sun_path);
+
+ if (memset_s(&addr, sizeof(struct sockaddr_un),
+ 0, sizeof(struct sockaddr_un)) != EOK) {
+ etmemd_log(ETMEMD_LOG_ERR, "clear addr failed\n");
+ goto err_out;
+ }
+
+ addr.sun_family = AF_UNIX;
+ if (memcpy_s(addr.sun_path, sizeof(addr.sun_path),
+ sock_path, strlen(sock_path)) != EOK) {
+ etmemd_log(ETMEMD_LOG_ERR, "copy for memdcd server path to addr fail, error(%s)\n",
+ strerror(errno));
+ goto err_out;
+ }
+
+ /* note, the below two line **MUST** maintain the order */
+ len = offsetof(struct sockaddr_un, sun_path) + strlen(addr.sun_path);
+ addr.sun_path[0] = '\0';
+ if (connect(sockfd, (struct sockaddr *)&addr, len) < 0){
+ etmemd_log(ETMEMD_LOG_ERR, "connect memdcd failed\n");
+ goto err_out;
+ }
+
+ return sockfd;
+
+err_out:
+ close(sockfd);
+ return -1;
+}
+
+static int send_data_to_memdcd(unsigned int pid, struct memdcd_message *msg, const char sock_path[])
+{
+ int client_fd;
+ int ret = 0;
+ int read_bytes;
+ int write_bytes;
+ char buff[RESP_MSG_MAX_LEN] = {0};
+ time_t recv_timeout = CLIENT_RECV_DEFAULT_TIME;
+
+ client_fd = memdcd_connection_init(recv_timeout, sock_path);
+ if (client_fd < 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "%s: connect error %d.\n", __func__, client_fd);
+ return -1;
+ }
+ write_bytes = write(client_fd, msg, sizeof(struct memdcd_message));
+ if (write_bytes <= 0) {
+ etmemd_log(ETMEMD_LOG_DEBUG, "etmemd_socket: send to memdcd for pid %u, bytes: %d\n",
+ pid, write_bytes);
+ ret = -1;
+ goto CLOSE_SOCK;
+ }
+
+ read_bytes = read(client_fd, buff, RESP_MSG_MAX_LEN);
+ if (read_bytes > 0) {
+ if (strcmp(buff, "success") == 0) {
+ etmemd_log(ETMEMD_LOG_INFO, "etmemd_socket: recv respond success.\n");
+ } else {
+ etmemd_log(ETMEMD_LOG_ERR, "etmemd_socket: recv respond failed.\n");
+ ret = -1;
+ }
+ }
+
+CLOSE_SOCK:
+ close(client_fd);
+
+ return ret;
+}
+
+static int memdcd_do_migrate(unsigned int pid, struct page_refs *page_refs_list, const char sock_path[])
+{
+ int count = 0, total_count = 0;
+ int ret = 0;
+ struct swap_vma_with_count *swap_vma = NULL;
+ struct page_refs *page_refs = page_refs_list;
+ struct memdcd_message *msg;
+
+ if (page_refs_list == NULL) {
+ /* do nothing */
+ return 0;
+ }
+
+ while (page_refs != NULL) {
+ page_refs = page_refs->next;
+ total_count++;
+ }
+ page_refs = page_refs_list;
+
+ msg = (struct memdcd_message *)calloc(1, sizeof(struct memdcd_message));
+ if (msg == NULL) {
+ etmemd_log(ETMEMD_LOG_WARN, "memigd_socket: malloc for swap vma failed. \n");
+ return -1;
+ }
+
+ msg->cmd_type = MEMDCD_CMD_MEM;
+ msg->memory_msg.pid = pid;
+ msg->memory_msg.enable_uswap = true;
+ msg->memory_msg.vma.status = MEMDCD_SEND_START;
+
+ swap_vma = &(msg->memory_msg.vma);
+ swap_vma->type = SWAP_TYPE_VMA_ADDR;
+ swap_vma->total_length = total_count;
+
+ while (page_refs != NULL) {
+ swap_vma->vma_addrs[count].vma.start_addr = page_refs->addr;
+ swap_vma->vma_addrs[count].vma.vma_len = page_type_to_size(page_refs->type);
+ swap_vma->vma_addrs[count].count = page_refs->count;
+ count++;
+ page_refs = page_refs->next;
+
+ if (count < MAX_VMA_NUM) {
+ continue;
+ }
+ if (page_refs == NULL) {
+ break;
+ }
+ swap_vma->length = count * sizeof(struct vma_addr_with_count);
+ if (send_data_to_memdcd(pid, msg, sock_path) != 0) {
+ ret = -1;
+ goto FREE_SWAP;
+ }
+ count = 0;
+ msg->memory_msg.vma.status = MEMDCD_SEND_PROCESS;
+ if (memset_s(swap_vma->vma_addrs, sizeof(swap_vma->vma_addrs),
+ 0, sizeof(swap_vma->vma_addrs)) != EOK) {
+ etmemd_log(ETMEMD_LOG_ERR, "clear swap_vma failed\n");
+ ret = -1;
+ goto FREE_SWAP;
+ }
+ }
+
+ if (msg->memory_msg.vma.status != MEMDCD_SEND_START)
+ msg->memory_msg.vma.status = MEMDCD_SEND_END;
+ swap_vma->length = count * sizeof(struct vma_addr_with_count);
+ if (send_data_to_memdcd(pid, msg, sock_path) != 0) {
+ ret = -1;
+ }
+
+FREE_SWAP:
+ free(msg);
+ return ret;
+}
+
+static void *memdcd_executor(void *arg)
+{
+ struct task_pid *tk_pid = (struct task_pid *)arg;
+ struct memdcd_params *memdcd_params = (struct memdcd_params *)(tk_pid->tk->params);
+ struct page_refs *page_refs = NULL;
+
+ /* register cleanup function in case of unexpected cancellation detected,
+ * and register for memory_grade first, because it needs to clean after page_refs is cleaned */
+ pthread_cleanup_push(clean_page_refs_unexpected, &page_refs);
+ page_refs = etmemd_do_scan(tk_pid, tk_pid->tk);
+ if (page_refs != NULL) {
+ if (memdcd_do_migrate(tk_pid->pid, page_refs, memdcd_params->memdcd_socket) != 0) {
+ etmemd_log(ETMEMD_LOG_WARN, "memdcd migrate for pid %u fail\n", tk_pid->pid);
+ }
+ }
+
+ /* no need to use page_refs any longer.
+ * pop the cleanup function with parameter 1, because the items in page_refs list will be moved
+ * into the at least on list of memory_grade after polidy function called if no problems happened,
+ * but mig_policy_func() may fails to move page_refs in rare cases.
+ * It will do nothing if page_refs is NULL */
+ pthread_cleanup_pop(1);
+
+ return NULL;
+}
+
+static int fill_task_sock_path(void *obj, void *val)
+{
+ const char *default_path = "@_memdcd.server";
+
+ struct memdcd_params *params = (struct memdcd_params *)obj;
+ char *sock_path = (char *)val;
+
+ if(strcmp(sock_path, "-") == 0) {
+ if (strncpy_s(params->memdcd_socket, MAX_SOCK_PATH_LENGTH, default_path, strlen(default_path)) != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "strncpy for memdcd_socket fail");
+ return -1;
+ }
+ } else {
+ if (strncpy_s(params->memdcd_socket, MAX_SOCK_PATH_LENGTH, sock_path, strlen(sock_path)) != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "strncpy for memdcd_socket fail");
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+static struct config_item g_memdcd_task_config_items[] = {
+ {"Sock", STR_VAL, fill_task_sock_path, false},
+};
+
+static int memdcd_fill_task(GKeyFile *config, struct task *tk)
+{
+ struct memdcd_params *params = calloc(1, sizeof(struct memdcd_params));
+ memset_s(params->memdcd_socket, MAX_SOCK_PATH_LENGTH, 0, MAX_SOCK_PATH_LENGTH);
+
+ if (params == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "alloc memdcd param fail\n");
+ return -1;
+ }
+
+ if (parse_file_config(config, TASK_GROUP, g_memdcd_task_config_items, ARRAY_SIZE(g_memdcd_task_config_items),
+ (void *)params) != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "memdcd fill task fail\n");
+ goto free_params;
+ }
+
+ if (strlen(params->memdcd_socket) >= MAX_SOCK_PATH_LENGTH) {
+ etmemd_log(ETMEMD_LOG_ERR, "length of engine param Sock must less than 108.\n");
+ goto free_params;
+ }
+
+ tk->params = params;
+ return 0;
+
+free_params:
+ free(params);
+ return -1;
+}
+
+static void memdcd_clear_task(struct task *tk)
+{
+ free(tk->params);
+ tk->params = NULL;
+}
+
+static int memdcd_start_task(struct engine *eng, struct task *tk)
+{
+ struct memdcd_params *params = tk->params;
+
+ params->executor = malloc(sizeof(struct task_executor));
+ if (params->executor == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "memdcd alloc memory for task_executor fail\n");
+ return -1;
+ }
+
+ params->executor->tk = tk;
+ params->executor->func = memdcd_executor;
+ if (start_threadpool_work(params->executor) != 0) {
+ free(params->executor);
+ params->executor = NULL;
+ etmemd_log(ETMEMD_LOG_ERR, "memdcd start task executor fail\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+static void memdcd_stop_task(struct engine *eng, struct task *tk)
+{
+ struct memdcd_params *params = tk->params;
+
+ stop_and_delete_threadpool_work(tk);
+ free(params->executor);
+ params->executor = NULL;
+}
+
+struct engine_ops g_memdcd_eng_ops = {
+ .fill_eng_params = NULL,
+ .clear_eng_params = NULL,
+ .fill_task_params = memdcd_fill_task,
+ .clear_task_params = memdcd_clear_task,
+ .start_task = memdcd_start_task,
+ .stop_task = memdcd_stop_task,
+ .alloc_pid_params = NULL,
+ .free_pid_params = NULL,
+ .eng_mgt_func = NULL,
+};
+
+int fill_engine_type_memdcd(struct engine *eng, GKeyFile *config)
+{
+ eng->ops = &g_memdcd_eng_ops;
+ eng->engine_type = MEMDCD_ENGINE;
+ eng->name = "memdcd";
+ return 0;
+}
\ No newline at end of file
--
2.27.0

View File

@ -1,39 +0,0 @@
From 1aef995d51254409b7aa1e2e84b9b750007e2413 Mon Sep 17 00:00:00 2001
From: YangXin <245051644@qq.com>
Date: Thu, 30 Sep 2021 18:58:33 +0800
Subject: [PATCH 50/50] Add CMakeLists.txt for three features of etmem.
Signed-off-by: YangXin <245051644@qq.com>
---
CMakeLists.txt | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
create mode 100644 CMakeLists.txt
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..a5d6761
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,18 @@
+# /******************************************************************************
+# * Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved.
+# * etmem is licensed under the Mulan PSL v2.
+# * You can use this software according to the terms and conditions of the Mulan PSL v2.
+# * You may obtain a copy of Mulan PSL v2 at:
+# * http://license.coscl.org.cn/MulanPSL2
+# * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+# * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+# * PURPOSE.
+# * See the Mulan PSL v2 for more details.
+# * Author:YangXin
+# * Create: 2021-09-31
+# * Description:CMakeLists for three features of etmem to compile
+# ******************************************************************************/
+
+add_subdirectory(etmem)
+add_subdirectory(memRouter)
+add_subdirectory(userswap)
\ No newline at end of file
--
2.27.0

View File

@ -1,99 +0,0 @@
From 6b25858292a295ab928cd8bfb89715ecee2e600b Mon Sep 17 00:00:00 2001
From: yangxin <245051644@qq.com>
Date: Wed, 15 Dec 2021 10:19:43 +0000
Subject: [PATCH] update memdcd engine for userswap
Filter out vmas without userswap flags in the memdcd engine.
Signed-off-by: YangXin <245051644@qq.com>
---
etmem/src/etmemd_src/etmemd_memdcd.c | 54 ++++++++++++++++++++++++++--
1 file changed, 51 insertions(+), 3 deletions(-)
diff --git a/etmem/src/etmemd_src/etmemd_memdcd.c b/etmem/src/etmemd_src/etmemd_memdcd.c
index 635e5a2..28590e2 100644
--- a/etmem/src/etmemd_src/etmemd_memdcd.c
+++ b/etmem/src/etmemd_src/etmemd_memdcd.c
@@ -235,6 +235,54 @@ FREE_SWAP:
return ret;
}
+static struct page_refs *memdcd_do_scan(const struct task_pid *tpid, const struct task *tk)
+{
+ int i = 0;
+ struct vmas *vmas = NULL;
+ struct page_refs *page_refs = NULL;
+ int ret = 0;
+ char pid[PID_STR_MAX_LEN] = {0};
+ char *us = "us";
+
+ if(tpid == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "task pid is null\n");
+ return NULL;
+ }
+
+ if (tk == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "task struct is null for pid %u\n", tpid->pid);
+ return NULL;
+ }
+
+ if (snprintf_s(pid, PID_STR_MAX_LEN, PID_STR_MAX_LEN - 1, "%u", tpid->pid) <= 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "snprintf pid fail %u", tpid->pid);
+ return NULL;
+ }
+ /* get vmas of target pid first. */
+ vmas = get_vmas_with_flags(pid, &us, 1, true);
+ if (vmas == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "get vmas for %s fail\n", pid);
+ return NULL;
+ }
+
+ /* loop for scanning idle_pages to get result of memory access. */
+ for (i = 0; i < tk->eng->proj->loop; i++) {
+ ret = get_page_refs(vmas, pid, &page_refs, NULL, 0);
+ if (ret != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "scan operation failed\n");
+ /* free page_refs nodes already exist */
+ etmemd_free_page_refs(page_refs);
+ page_refs = NULL;
+ break;
+ }
+ sleep((unsigned)tk->eng->proj->sleep);
+ }
+
+ free_vmas(vmas);
+
+ return page_refs;
+}
+
static void *memdcd_executor(void *arg)
{
struct task_pid *tk_pid = (struct task_pid *)arg;
@@ -244,7 +292,7 @@ static void *memdcd_executor(void *arg)
/* register cleanup function in case of unexpected cancellation detected,
* and register for memory_grade first, because it needs to clean after page_refs is cleaned */
pthread_cleanup_push(clean_page_refs_unexpected, &page_refs);
- page_refs = etmemd_do_scan(tk_pid, tk_pid->tk);
+ page_refs = memdcd_do_scan(tk_pid, tk_pid->tk);
if (page_refs != NULL) {
if (memdcd_do_migrate(tk_pid->pid, page_refs, memdcd_params->memdcd_socket) != 0) {
etmemd_log(ETMEMD_LOG_WARN, "memdcd migrate for pid %u fail\n", tk_pid->pid);
@@ -290,13 +338,13 @@ static struct config_item g_memdcd_task_config_items[] = {
static int memdcd_fill_task(GKeyFile *config, struct task *tk)
{
struct memdcd_params *params = calloc(1, sizeof(struct memdcd_params));
- memset_s(params->memdcd_socket, MAX_SOCK_PATH_LENGTH, 0, MAX_SOCK_PATH_LENGTH);
-
if (params == NULL) {
etmemd_log(ETMEMD_LOG_ERR, "alloc memdcd param fail\n");
return -1;
}
+ memset_s(params->memdcd_socket, MAX_SOCK_PATH_LENGTH, 0, MAX_SOCK_PATH_LENGTH);
+
if (parse_file_config(config, TASK_GROUP, g_memdcd_task_config_items, ARRAY_SIZE(g_memdcd_task_config_items),
(void *)params) != 0) {
etmemd_log(ETMEMD_LOG_ERR, "memdcd fill task fail\n");
--
2.27.0

View File

@ -1,38 +0,0 @@
From 560e15aea0edc9bf53f33e739b6d430f4fe16150 Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Tue, 19 Oct 2021 10:36:01 +0800
Subject: [PATCH 01/33] etmem: correct example config file
corret value config in cslide task
corret node_pair config in cslide engine
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
etmem/conf/example_conf.yaml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/etmem/conf/example_conf.yaml b/etmem/conf/example_conf.yaml
index de612f6..61ee68c 100644
--- a/etmem/conf/example_conf.yaml
+++ b/etmem/conf/example_conf.yaml
@@ -22,7 +22,7 @@ max_threads=1
[engine]
name=cslide
project=test
-node_pair=2,0;3,1
+node_pair=0,2;1,3
hot_threshold=1
node_mig_quota=1024
node_hot_reserve=1024
@@ -32,7 +32,7 @@ project=test
engine=cslide
name=background_cslide
type=pid
-name=23456
+value=23456
vm_flags=ht
anon_only=no
ign_host=no
--
1.8.3.1

View File

@ -1,167 +0,0 @@
From 0b40944b0a57393ccedb19b18f5c8307cfd42ffe Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Tue, 19 Oct 2021 10:43:09 +0800
Subject: [PATCH 02/33] etmem: split example_conf.yaml
User can't use example_conf.yaml directly as it contains diffrent
engine configs. Split it into three single engine config and user
can use it directly
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
etmem/conf/cslide_conf.yaml | 24 ++++++++++++++++++
etmem/conf/example_conf.yaml | 56 -----------------------------------------
etmem/conf/slide_conf.yaml | 18 +++++++++++++
etmem/conf/thirdparty_conf.yaml | 21 ++++++++++++++++
4 files changed, 63 insertions(+), 56 deletions(-)
create mode 100644 etmem/conf/cslide_conf.yaml
delete mode 100644 etmem/conf/example_conf.yaml
create mode 100644 etmem/conf/slide_conf.yaml
create mode 100644 etmem/conf/thirdparty_conf.yaml
diff --git a/etmem/conf/cslide_conf.yaml b/etmem/conf/cslide_conf.yaml
new file mode 100644
index 0000000..6b6ecc3
--- /dev/null
+++ b/etmem/conf/cslide_conf.yaml
@@ -0,0 +1,24 @@
+[project]
+name=test
+loop=1
+interval=1
+sleep=1
+
+#cslide
+[engine]
+name=cslide
+project=test
+node_pair=0,2;1,3
+hot_threshold=1
+node_mig_quota=1024
+node_hot_reserve=1024
+
+[task]
+project=test
+engine=cslide
+name=background_cslide
+type=pid
+value=23456
+vm_flags=ht
+anon_only=no
+ign_host=no
diff --git a/etmem/conf/example_conf.yaml b/etmem/conf/example_conf.yaml
deleted file mode 100644
index 61ee68c..0000000
--- a/etmem/conf/example_conf.yaml
+++ /dev/null
@@ -1,56 +0,0 @@
-[project]
-name=test
-loop=1
-interval=1
-sleep=1
-
-#slide
-[engine]
-name=slide
-project=test
-
-[task]
-project=test
-engine=slide
-name=background_slide
-type=name
-value=mysql
-T=1
-max_threads=1
-
-#cslide
-[engine]
-name=cslide
-project=test
-node_pair=0,2;1,3
-hot_threshold=1
-node_mig_quota=1024
-node_hot_reserve=1024
-
-[task]
-project=test
-engine=cslide
-name=background_cslide
-type=pid
-value=23456
-vm_flags=ht
-anon_only=no
-ign_host=no
-
-#thirdparty
-[engine]
-name=thirdparty
-project=test
-eng_name=my_engine
-libname=/usr/lib/etmem_fetch/my_engine.so
-ops_name=my_engine_ops
-engine_private_key=engine_private_value
-
-[task]
-project=test
-engine=my_engine
-name=backgroud_third
-type=pid
-value=12345
-task_private_key=task_private_value
-
diff --git a/etmem/conf/slide_conf.yaml b/etmem/conf/slide_conf.yaml
new file mode 100644
index 0000000..b99ab50
--- /dev/null
+++ b/etmem/conf/slide_conf.yaml
@@ -0,0 +1,18 @@
+[project]
+name=test
+loop=1
+interval=1
+sleep=1
+
+[engine]
+name=slide
+project=test
+
+[task]
+project=test
+engine=slide
+name=background_slide
+type=name
+value=mysql
+T=1
+max_threads=1
diff --git a/etmem/conf/thirdparty_conf.yaml b/etmem/conf/thirdparty_conf.yaml
new file mode 100644
index 0000000..1e1e9ac
--- /dev/null
+++ b/etmem/conf/thirdparty_conf.yaml
@@ -0,0 +1,21 @@
+[project]
+name=test
+loop=1
+interval=1
+sleep=1
+
+[engine]
+name=thirdparty
+project=test
+eng_name=my_engine
+libname=/usr/lib/etmem_fetch/my_engine.so
+ops_name=my_engine_ops
+engine_private_key=engine_private_value
+
+[task]
+project=test
+engine=my_engine
+name=backgroud_third
+type=pid
+value=12345
+task_private_key=task_private_value
--
1.8.3.1

View File

@ -1,146 +0,0 @@
From 4a8a5272e74994a694b88ab516a5331deea25bd2 Mon Sep 17 00:00:00 2001
From: volcanodragon <linfeilong@huawei.com>
Date: Tue, 9 Nov 2021 15:40:17 +0800
Subject: [PATCH 03/33] add License in memRouter
---
memRouter/License/LICENSE | 127 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 127 insertions(+)
create mode 100644 memRouter/License/LICENSE
diff --git a/memRouter/License/LICENSE b/memRouter/License/LICENSE
new file mode 100644
index 0000000..0db93af
--- /dev/null
+++ b/memRouter/License/LICENSE
@@ -0,0 +1,127 @@
+木兰宽松许可证, 第2版
+
+ 木兰宽松许可证, 第2版
+ 2020年1月 http://license.coscl.org.cn/MulanPSL2
+
+
+ 您对“软件”的复制、使用、修改及分发受木兰宽松许可证第2版“本许可证”的如下条款的约束
+
+ 0. 定义
+
+ “软件”是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。
+
+ “贡献”是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。
+
+ “贡献者”是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。
+
+ “法人实体”是指提交贡献的机构及其“关联实体”。
+
+ “关联实体”是指对“本许可证”下的行为方而言控制、受控制或与其共同受控制的机构此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。
+
+ 1. 授予版权许可
+
+ 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。
+
+ 2. 授予专利许可
+
+ 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。
+
+ 3. 无商标许可
+
+ “本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可但您为满足第4条规定的声明义务而必须使用除外。
+
+ 4. 分发限制
+
+ 您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。
+
+ 5. 免责声明与责任限制
+
+ “软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。
+
+ 6. 语言
+ “本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文版为准。
+
+ 条款结束
+
+ 如何将木兰宽松许可证第2版应用到您的软件
+
+ 如果您希望将木兰宽松许可证第2版应用到您的新软件为了方便接收者查阅建议您完成如下三步
+
+ 1 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字;
+
+ 2 请您在软件包的一级目录下创建以“LICENSE”为名的文件将整个许可证文本放入该文件中
+
+ 3 请将如下声明文本放入每个源文件的头部注释中。
+
+ Copyright (c) [Year] [name of copyright holder]
+ [Software Name] is licensed under Mulan PSL v2.
+ You can use this software according to the terms and conditions of the Mulan PSL v2.
+ You may obtain a copy of Mulan PSL v2 at:
+ http://license.coscl.org.cn/MulanPSL2
+ THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ See the Mulan PSL v2 for more details.
+
+
+ Mulan Permissive Software LicenseVersion 2
+
+ Mulan Permissive Software LicenseVersion 2 (Mulan PSL v2)
+ January 2020 http://license.coscl.org.cn/MulanPSL2
+
+ Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v2 (this License) with the following terms and conditions:
+
+ 0. Definition
+
+ Software means the program and related documents which are licensed under this License and comprise all Contribution(s).
+
+ Contribution means the copyrightable work licensed by a particular Contributor under this License.
+
+ Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License.
+
+ Legal Entity means the entity making a Contribution and all its Affiliates.
+
+ Affiliates means entities that control, are controlled by, or are under common control with the acting entity under this License, control means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity.
+
+ 1. Grant of Copyright License
+
+ Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not.
+
+ 2. Grant of Patent License
+
+ Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution, where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed. The patent license shall not apply to any modification of the Contribution, and any other combination which includes the Contribution. If you or your Affiliates directly or indirectly institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken.
+
+ 3. No Trademark License
+
+ No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in Section 4.
+
+ 4. Distribution Restriction
+
+ You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software.
+
+ 5. Disclaimer of Warranty and Limitation of Liability
+
+ THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO MATTER HOW ITS CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+ 6. Language
+
+ THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION SHALL PREVAIL.
+
+ END OF THE TERMS AND CONDITIONS
+
+ How to Apply the Mulan Permissive Software LicenseVersion 2 (Mulan PSL v2) to Your Software
+
+ To apply the Mulan PSL v2 to your work, for easy identification by recipients, you are suggested to complete following three steps:
+
+ i Fill in the blanks in following statement, including insert your software name, the year of the first publication of your software, and your name identified as the copyright owner;
+
+ ii Create a file named “LICENSE” which contains the whole context of this License in the first directory of your software package;
+
+ iii Attach the statement to the appropriate annotated syntax at the beginning of each source file.
+
+
+ Copyright (c) [Year] [name of copyright holder]
+ [Software Name] is licensed under Mulan PSL v2.
+ You can use this software according to the terms and conditions of the Mulan PSL v2.
+ You may obtain a copy of Mulan PSL v2 at:
+ http://license.coscl.org.cn/MulanPSL2
+ THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+ See the Mulan PSL v2 for more details.
--
1.8.3.1

View File

@ -1,698 +0,0 @@
From e36c5a68a748080a473988c7530786f3f7ac90d3 Mon Sep 17 00:00:00 2001
From: louhongxiang <louhongxiang@huawei.com>
Date: Mon, 22 Nov 2021 17:51:33 +0800
Subject: [PATCH 04/33] add code of testcase for etmem common function.
---
etmem/test/CMakeLists.txt | 198 ++++++++++++++++++++++++
etmem/test/common/test_common.c | 327 ++++++++++++++++++++++++++++++++++++++++
etmem/test/common/test_common.h | 138 +++++++++++++++++
3 files changed, 663 insertions(+)
create mode 100644 etmem/test/CMakeLists.txt
create mode 100644 etmem/test/common/test_common.c
create mode 100644 etmem/test/common/test_common.h
diff --git a/etmem/test/CMakeLists.txt b/etmem/test/CMakeLists.txt
new file mode 100644
index 0000000..5bf3477
--- /dev/null
+++ b/etmem/test/CMakeLists.txt
@@ -0,0 +1,198 @@
+# /******************************************************************************
+# * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+# * etmem is licensed under the Mulan PSL v2.
+# * You can use this software according to the terms and conditions of the Mulan PSL v2.
+# * You may obtain a copy of Mulan PSL v2 at:
+# * http://license.coscl.org.cn/MulanPSL2
+# * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+# * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+# * PURPOSE.
+# * See the Mulan PSL v2 for more details.
+# * Author: louhongxiang
+# * Create: 2021-11-19
+# * Description: CMakefileList for etmem to compile
+# ******************************************************************************/
+
+cmake_minimum_required (VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
+project(etmem)
+
+EXECUTE_PROCESS( COMMAND uname -m COMMAND tr -d '\n' OUTPUT_VARIABLE ARCHITECTURE )
+message( STATUS "Architecture: ${ARCHITECTURE}" )
+
+set(ETMEMD_SRC_DIR ${PROJECT_SOURCE_DIR}/../src/etmemd_src)
+set(ETMEM_SRC_DIR ${PROJECT_SOURCE_DIR}/../src/etmem_src)
+set(TEST_COMMON_DIR ${PROJECT_SOURCE_DIR}/common)
+set(BUILD_DIR ${PROJECT_SOURCE_DIR}/build)
+
+set(ETMEMD_SRC
+ ${ETMEMD_SRC_DIR}/etmemd.c
+ ${ETMEMD_SRC_DIR}/etmemd_file.c
+ ${ETMEMD_SRC_DIR}/etmemd_common.c
+ ${ETMEMD_SRC_DIR}/etmemd_rpc.c
+ ${ETMEMD_SRC_DIR}/etmemd_log.c
+ ${ETMEMD_SRC_DIR}/etmemd_project.c
+ ${ETMEMD_SRC_DIR}/etmemd_engine.c
+ ${ETMEMD_SRC_DIR}/etmemd_memdcd.c
+ ${ETMEMD_SRC_DIR}/etmemd_slide.c
+ ${ETMEMD_SRC_DIR}/etmemd_cslide.c
+ ${ETMEMD_SRC_DIR}/etmemd_thirdparty.c
+ ${ETMEMD_SRC_DIR}/etmemd_task.c
+ ${ETMEMD_SRC_DIR}/etmemd_scan.c
+ ${ETMEMD_SRC_DIR}/etmemd_threadpool.c
+ ${ETMEMD_SRC_DIR}/etmemd_threadtimer.c
+ ${ETMEMD_SRC_DIR}/etmemd_pool_adapter.c
+ ${ETMEMD_SRC_DIR}/etmemd_migrate.c)
+
+set(ETMEM_SRC
+ ${ETMEM_SRC_DIR}/etmem.c
+ ${ETMEM_SRC_DIR}/etmem_project.c
+ ${ETMEM_SRC_DIR}/etmem_obj.c
+ ${ETMEM_SRC_DIR}/etmem_engine.c
+ ${ETMEM_SRC_DIR}/etmem_rpc.c
+ ${ETMEM_SRC_DIR}/etmem_common.c)
+
+set(ETMEMD_CSLIDE_DEP
+ ${ETMEMD_SRC_DIR}/etmemd.c
+ ${ETMEMD_SRC_DIR}/etmemd_file.c
+ ${ETMEMD_SRC_DIR}/etmemd_common.c
+ ${ETMEMD_SRC_DIR}/etmemd_rpc.c
+ ${ETMEMD_SRC_DIR}/etmemd_log.c
+ ${ETMEMD_SRC_DIR}/etmemd_project.c
+ ${ETMEMD_SRC_DIR}/etmemd_engine.c
+ ${ETMEMD_SRC_DIR}/etmemd_slide.c
+ ${ETMEMD_SRC_DIR}/etmemd_thirdparty.c
+ ${ETMEMD_SRC_DIR}/etmemd_task.c
+ ${ETMEMD_SRC_DIR}/etmemd_scan.c
+ ${ETMEMD_SRC_DIR}/etmemd_threadpool.c
+ ${ETMEMD_SRC_DIR}/etmemd_threadtimer.c
+ ${ETMEMD_SRC_DIR}/etmemd_pool_adapter.c
+ ${ETMEMD_SRC_DIR}/etmemd_migrate.c)
+
+set(TEST_COMMON_SRC
+ ${TEST_COMMON_DIR}/test_common.c)
+
+add_library(
+etmemd_shared
+SHARED
+${ETMEMD_SRC})
+
+add_library(
+etmem_shared
+SHARED
+${ETMEM_SRC})
+
+add_library(
+test_common
+SHARED
+${TEST_COMMON_SRC})
+
+add_library(
+cslide_dep
+SHARED
+${ETMEMD_CSLIDE_DEP})
+
+add_executable(etmemd
+ ${ETMEMD_SRC})
+
+add_executable(etmem
+ ${ETMEM_SRC})
+
+set(EXECUTABLE_OUTPUT_PATH ${BUILD_DIR}/bin)
+
+set(LIBRARY_OUTPUT_PATH ${BUILD_DIR}/lib)
+
+include(FindPkgConfig)
+pkg_search_module(GLIB2 REQUIRED glib-2.0)
+
+target_include_directories(etmemd PRIVATE
+ ${PROJECT_SOURCE_DIR}/../inc/etmemd_inc
+ ${GLIB2_INCLUDE_DIRS})
+
+target_include_directories(etmemd_shared PRIVATE
+ ${PROJECT_SOURCE_DIR}/../inc/etmemd_inc
+ ${GLIB2_INCLUDE_DIRS})
+
+target_include_directories(etmem PRIVATE
+ ${PROJECT_SOURCE_DIR}/../inc/etmem_inc)
+
+target_include_directories(etmem_shared PRIVATE
+ ${PROJECT_SOURCE_DIR}/../inc/etmem_inc)
+
+target_include_directories(test_common PRIVATE
+ ${PROJECT_SOURCE_DIR}/../inc/etmemd_inc
+ ${PROJECT_SOURCE_DIR}/COMMON
+ ${GLIB2_INCLUDE_DIRS})
+
+target_include_directories(cslide_dep PRIVATE
+ ${PROJECT_SOURCE_DIR}/../inc/etmemd_inc
+ ${GLIB2_INCLUDE_DIRS})
+
+if(COVERAGE_ENABLE)
+ message(STATUS "Enable coverage compile option")
+ SET(COVERAGE_OPTION "${COVERAGE_OPTION} -fprofile-arcs -ftest-coverage")
+endif(COVERAGE_ENABLE)
+
+if(ASAN_ENABLE)
+ message(STATUS "Enable asan compile option")
+ SET(ASAN_OPTIONS "${ASAN_OPTION} -fsanitize=address -fsanitize-recover=address")
+endif(ASAN_ENABLE)
+
+IF(CMAKE_BUILD_TYPE STREQUAL Debug)
+ SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${COVERAGE_OPTION} ${ASAN_OPTIONS}")
+ SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${COVERAGE_OPTION} ${ASAN_OPTIONS}")
+ENDIF()
+
+# set common compile options
+set(COMMON_COMPILE_OPT -fsigned-char -fno-omit-frame-pointer -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wmissing-declarations -fno-strict-aliasing -Werror -Wformat -Wformat-security -D_GNU_SOURCE -fPIE -pie -fPIC -fstack-protector-strong -fno-common -DNDEBUG -O2 -D_FORTIFY_SOURCE=2 -Wall -Werror -Wl,-z,relro,-z,now,-z,noexecstack -Wtrampolines -pthread -Wno-pointer-sign -Wstrict-prototypes -Wold-style-definition -std=gnu99)
+
+if (CONFIG_DEBUG STREQUAL "y")
+ SET(COMMON_COMPILE_OPT ${COMMON_COMPILE_OPT} -g)
+endif()
+
+if( ${ARCHITECTURE} STREQUAL "aarch64")
+ SET(COMMON_COMPILE_OPT ${COMMON_COMPILE_OPT} -march=armv8-a)
+else()
+ SET(COMMON_COMPILE_OPT ${COMMON_COMPILE_OPT} -march=core-avx-i -m64)
+endif()
+
+# set common share library compile options
+set(SHARE_COMPILE_OPT -ldl -rdynamic)
+
+# set common link options
+set(COMMON_LINK_OPT "-fPIE -pie -fPIC -Wl,-z,relro,-z,now,-z,noexecstack -Wtrampolines")
+set(COMMON_LINK_LIB pthread dl rt boundscheck)
+set(SERVER_LINK_LIB numa ${GLIB2_LIBRARIES})
+
+# target etmemd
+target_compile_options(etmemd PRIVATE ${COMMON_COMPILE_OPT})
+set_target_properties(etmemd PROPERTIES LINK_FLAGS ${COMMON_LINK_OPT})
+target_link_libraries(etmemd PRIVATE ${COMMON_LINK_LIB} ${SERVER_LINK_LIB})
+
+# target etmem
+target_compile_options(etmem PRIVATE ${COMMON_COMPILE_OPT})
+set_target_properties(etmem PROPERTIES LINK_FLAGS ${COMMON_LINK_OPT})
+target_link_libraries(etmem PRIVATE ${COMMON_LINK_LIB} ${SERVER_LINK_LIB})
+
+# target etmemd share
+target_compile_options(etmemd_shared PRIVATE ${COMMON_COMPILE_OPT} ${SHARE_COMPILE_OPT})
+set_target_properties(etmemd_shared PROPERTIES LINK_FLAGS ${COMMON_LINK_OPT})
+target_link_libraries(etmemd_shared PRIVATE ${COMMON_LINK_LIB} ${SERVER_LINK_LIB})
+SET_TARGET_PROPERTIES(etmemd_shared PROPERTIES OUTPUT_NAME "etmemd")
+
+# target etmem share
+target_compile_options(etmem_shared PRIVATE ${COMMON_COMPILE_OPT} ${SHARE_COMPILE_OPT})
+set_target_properties(etmem_shared PROPERTIES LINK_FLAGS ${COMMON_LINK_OPT})
+target_link_libraries(etmem_shared PRIVATE ${COMMON_LINK_LIB})
+SET_TARGET_PROPERTIES(etmem_shared PROPERTIES OUTPUT_NAME "etmem")
+
+# target test etmemd share
+target_compile_options(test_common PRIVATE ${COMMON_COMPILE_OPT} ${SHARE_COMPILE_OPT})
+set_target_properties(test_common PROPERTIES LINK_FLAGS ${COMMON_LINK_OPT})
+target_link_libraries(test_common PRIVATE ${COMMON_LINK_LIB} ${SERVER_LINK_LIB})
+SET_TARGET_PROPERTIES(test_common PROPERTIES OUTPUT_NAME "test")
+
+# target etmemd cslide share
+target_compile_options(cslide_dep PRIVATE ${COMMON_COMPILE_OPT} ${SHARE_COMPILE_OPT})
+set_target_properties(cslide_dep PROPERTIES LINK_FLAGS ${COMMON_LINK_OPT})
+target_link_libraries(cslide_dep PRIVATE ${COMMON_LINK_LIB} ${SERVER_LINK_LIB})
+
diff --git a/etmem/test/common/test_common.c b/etmem/test/common/test_common.c
new file mode 100644
index 0000000..4551177
--- /dev/null
+++ b/etmem/test/common/test_common.c
@@ -0,0 +1,327 @@
+/******************************************************************************
+ * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+ * etmem is licensed under the Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+ * PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * Author: louhongxiang
+ * Create: 2021-11-19
+ * Description: This is a header file of the export data structure definition for page.
+ ******************************************************************************/
+
+#include <stdio.h>
+#include <numa.h>
+
+#include <CUnit/Basic.h>
+#include <CUnit/Automated.h>
+#include <CUnit/Console.h>
+
+#include "etmemd_project.h"
+
+#include "test_common.h"
+
+#define FIRST_COLD_NODE_INDEX 2
+#define FIRST_HOT_NODE_INDEX 0
+#define SECOND_COLD_NODE_INDEX 6
+#define SECOND_HOT_NODE_INDEX 4
+
+GKeyFile *load_config(const char *file_name)
+{
+ GKeyFile *config = NULL;
+
+ config = g_key_file_new();
+ CU_ASSERT_PTR_NOT_NULL(config);
+ CU_ASSERT_NOT_EQUAL(g_key_file_load_from_file(config, file_name, G_KEY_FILE_NONE, NULL), FALSE);
+ return config;
+}
+
+void unload_config(GKeyFile *config)
+{
+ g_key_file_free(config);
+}
+
+void construct_proj_file(struct proj_test_param *param)
+{
+ FILE *file = NULL;
+
+ file = fopen(param->file_name, "w+");
+ CU_ASSERT_PTR_NOT_NULL(file);
+ CU_ASSERT_NOT_EQUAL(fprintf(file, "[project]\n"), -1);
+ if (param->proj_name != NULL) {
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_NAME, param->proj_name), -1);
+ }
+ if (param->interval != NULL) {
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_INTERVAL, param->interval), -1);
+ }
+ if (param->loop != NULL) {
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_LOOP, param->loop), -1);
+ }
+ if (param->sleep != NULL) {
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_SLEEP, param->sleep), -1);
+ }
+ fclose(file);
+}
+
+GKeyFile *construct_proj_config(struct proj_test_param *param)
+{
+ construct_proj_file(param);
+
+ return load_config(param->file_name);
+}
+
+void destroy_proj_config(GKeyFile *config)
+{
+ unload_config(config);
+}
+
+void init_proj_param(struct proj_test_param *param)
+{
+ param->sleep = "1";
+ param->interval = "1";
+ param->loop = "1";
+ param->file_name = TMP_PROJ_CONFIG;
+ param->proj_name = DEFAULT_PROJ;
+ param->expt = OPT_SUCCESS;
+}
+
+void do_add_proj_test(struct proj_test_param * param)
+{
+ GKeyFile *config = NULL;
+
+ config = construct_proj_config(param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), param->expt);
+ destroy_proj_config(config);
+}
+
+void do_rm_proj_test(struct proj_test_param *param)
+{
+ GKeyFile *config = NULL;
+
+ config = load_config(param->file_name);
+ CU_ASSERT_EQUAL(etmemd_project_remove(config), param->expt);
+ unload_config(config);
+}
+
+void construct_eng_file(struct eng_test_param *param)
+{
+ FILE *file = NULL;
+
+ file = fopen(param->file_name, "w+");
+ CU_ASSERT_PTR_NOT_NULL(file);
+ CU_ASSERT_NOT_EQUAL(fprintf(file, "[engine]\n"), -1);
+ if (param->name != NULL) {
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_NAME, param->name), -1);
+ }
+ if (param->proj != NULL) {
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_PROJ, param->proj), -1);
+ }
+ fclose(file);
+}
+
+GKeyFile *construct_eng_config(struct eng_test_param *param)
+{
+ construct_eng_file(param);
+
+ return load_config(param->file_name);
+}
+
+void destroy_eng_config(GKeyFile *config)
+{
+ unload_config(config);
+}
+
+void init_task_param(struct task_test_param *param, const char *eng)
+{
+ param->name = DEFAULT_TASK;
+ param->proj = DEFAULT_PROJ;
+ param->eng = eng;
+ param->type = "pid";
+ param->value = "1";
+ param->file_name = TMP_TASK_CONFIG;
+}
+
+void construct_task_file(struct task_test_param *param)
+{
+ FILE *file = NULL;
+
+ file = fopen(param->file_name, "w+");
+ CU_ASSERT_PTR_NOT_NULL(file);
+ CU_ASSERT_NOT_EQUAL(fprintf(file, "[task]\n"), -1);
+ if (param->name != NULL) {
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_NAME, param->name), -1);
+ }
+ if (param->proj != NULL) {
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_PROJ, param->name), -1);
+ }
+ if (param->eng != NULL) {
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_ENG, param->name), -1);
+ }
+ if (param->type != NULL) {
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_TYPE, param->name), -1);
+ }
+ if (param->value != NULL) {
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_VALUE, param->name), -1);
+ }
+ fclose(file);
+}
+
+void init_slide_task(struct slide_task_test_param *param)
+{
+ init_task_param(&param->task_param, "slide");
+ param->max_threads = "1";
+ param->T = "1";
+}
+
+void add_slide_task(struct slide_task_test_param *param)
+{
+ FILE *file = NULL;
+ const char *file_name = param->task_param.file_name;
+
+ file = fopen(file_name, "a+");
+ CU_ASSERT_PTR_NOT_NULL(file);
+ if (param->max_threads != NULL) {
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_MAX_THREADS, param->max_threads), -1);
+ }
+ if (param->T != NULL) {
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_T, param->T), -1);
+ }
+ fclose(file);
+}
+
+GKeyFile *construct_slide_task_config(struct slide_task_test_param *param)
+{
+ struct task_test_param *task_param = &param->task_param;
+
+ construct_task_file(task_param);
+ add_slide_task(param);
+
+ return load_config(task_param->file_name);
+}
+
+void destroy_slide_task_config(GKeyFile *config)
+{
+ unload_config(config);
+}
+
+void init_slide_eng(struct eng_test_param *param)
+{
+ param->name = "slide";
+ param->proj = DEFAULT_PROJ;
+ param->file_name = TMP_ENG_CONFIG;
+}
+
+static char *get_node_pair(void)
+{
+ int node_num = numa_num_configured_nodes();
+
+ switch (node_num) {
+ case ONE_NODE_PAIR:
+ return "0,1";
+ case TWO_NODE_PAIR:
+ return "0,2;1,3";
+ case THREE_NODE_PAIR:
+ return "0,3;1,4;2,5";
+ default:
+ return NULL;
+ }
+}
+
+int get_first_cold_node(struct cslide_eng_test_param *param)
+{
+ return param->node_pair[FIRST_COLD_NODE_INDEX] - '0';
+}
+
+int get_first_hot_node(struct cslide_eng_test_param *param)
+{
+ return param->node_pair[FIRST_HOT_NODE_INDEX] - '0';
+}
+
+int get_second_cold_node(struct cslide_eng_test_param *param)
+{
+ return param->node_pair[SECOND_COLD_NODE_INDEX] - '0';
+}
+
+int get_second_hot_node(struct cslide_eng_test_param *param)
+{
+ return param->node_pair[SECOND_HOT_NODE_INDEX] - '0';
+}
+
+void init_cslide_eng(struct cslide_eng_test_param *param)
+{
+ param->eng_param.name = "cslide";
+ param->eng_param.proj = DEFAULT_PROJ;
+ param->eng_param.file_name = TMP_ENG_CONFIG;
+ param->node_pair = get_node_pair();
+ param->hot_threshold = "2";
+ param->node_mig_quota = "1024";
+ param->node_hot_reserve = "1024";
+}
+
+void add_cslide_eng(struct cslide_eng_test_param *param)
+{
+ FILE *file = NULL;
+ const char *file_name = param->eng_param.file_name;
+
+ file = fopen(file_name, "a+");
+ CU_ASSERT_PTR_NOT_NULL(file);
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_NODE_PAIR, param->node_pair), -1);
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_THRESH, param->hot_threshold), -1);
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_QUOTA, param->node_mig_quota), -1);
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_RESV, param->node_hot_reserve), -1);
+ fclose(file);
+}
+
+GKeyFile *construct_cslide_eng_config(struct cslide_eng_test_param *param)
+{
+ struct eng_test_param *eng_param = &param->eng_param;
+
+ construct_eng_file(eng_param);
+ add_cslide_eng(param);
+
+ return load_config(eng_param->file_name);
+}
+
+void destroy_cslide_eng_config(GKeyFile *config)
+{
+ unload_config(config);
+}
+
+void init_cslide_task(struct cslide_task_test_param *param)
+{
+ init_task_param(&param->task_param, "cslide");
+ param->vm_flags = "ht";
+ param->anon_only = "no";
+ param->ign_host = "yes";
+}
+
+void add_cslide_task(struct cslide_task_test_param *param)
+{
+ FILE *file = NULL;
+ const char *file_name = param->task_param.file_name;
+
+ file = fopen(file_name, "a+");
+ CU_ASSERT_PTR_NOT_NULL(file);
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_VM_FLAGS, param->vm_flags), -1);
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_ANON_ONLY, param->anon_only), -1);
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_IGN_HOST, param->ign_host), -1);
+ fclose(file);
+}
+
+GKeyFile *construct_cslide_task_config(struct cslide_task_test_param *param)
+{
+ struct task_test_param *task_param = &param->task_param;
+
+ construct_task_file(task_param);
+ add_cslide_task(param);
+
+ return load_config(task_param->file_name);
+}
+
+void destroy_cslide_task_config(GKeyFile *config)
+{
+ unload_config(config);
+}
diff --git a/etmem/test/common/test_common.h b/etmem/test/common/test_common.h
new file mode 100644
index 0000000..009c458
--- /dev/null
+++ b/etmem/test/common/test_common.h
@@ -0,0 +1,138 @@
+/******************************************************************************
+ * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+ * etmem is licensed under the Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+ * PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * Author: louhongxiang
+ * Create: 2021-11-19
+ * Description: This is a header file of the export data structure definition for page.
+ ******************************************************************************/
+
+#ifndef TEST_COMMON_H
+#define TEST_COMMON_H
+
+#include <glib.h>
+
+#include "etmemd_project.h"
+
+#define CONFIG_NAME "name=%s\n"
+#define CONFIG_INTERVAL "interval=%s\n"
+#define CONFIG_LOOP "loop=%s\n"
+#define CONFIG_SLEEP "sleep=%s\n"
+#define TMP_PROJ_CONFIG "proj_tmp.config"
+#define DEFAULT_PROJ "default_proj"
+
+#define CONFIG_PROJ "project=%s\n"
+#define TMP_ENG_CONFIG "eng_tmp.config"
+
+#define CONFIG_ENG "engine=%s\n"
+#define CONFIG_TYPE "type=%s\n"
+#define CONFIG_VALUE "value=%s\n"
+#define TMP_TASK_CONFIG "task_tmp.config"
+#define DEFAULT_TASK "default_task"
+
+#define CONFIG_MAX_THREADS "max_threads=%s\n"
+#define CONFIG_T "T=%s\n"
+
+#define CONFIG_NODE_PAIR "node_pair=%s\n"
+#define CONFIG_THRESH "hot_threshold=%s\n"
+#define CONFIG_QUOTA "node_mig_quota=%s\n"
+#define CONFIG_RESV "node_hot_reserve=%s\n"
+
+#define CONFIG_VM_FLAGS "vm_flags=%s\n"
+#define CONFIG_ANON_ONLY "anon_only=%s\n"
+#define CONFIG_IGN_HOST "igno_host=%s\n"
+
+#define ONE_NODE_PAIR 2
+#define TWO_NODE_PAIR 4
+#define THREE_NODE_PAIR 5
+
+
+struct proj_test_param {
+ const char *sleep;
+ const char *interval;
+ const char *loop;
+ const char *proj_name;
+ const char *file_name;
+ enum opt_result expt;
+};
+
+struct eng_test_param {
+ const char *name;
+ const char *proj;
+ const char *file_name;
+};
+
+struct task_test_param {
+ const char *name;
+ const char *proj;
+ const char *eng;
+ const char *type;
+ const char *value;
+ const char *file_name;
+};
+
+struct slide_task_test_param {
+ struct task_test_param task_param;
+ const char *max_threads;
+ const char *T;
+};
+
+struct cslide_eng_test_param {
+ struct eng_test_param eng_param;
+ const char *node_pair;
+ const char *hot_threshold;
+ const char *node_mig_quota;
+ const char *node_hot_reserve;
+};
+
+struct cslide_task_test_param {
+ struct task_test_param task_param;
+ const char *vm_flags;
+ const char *anon_only;
+ const char *ign_host;
+};
+
+GKeyFile *load_config(const char *file_name);
+void unload_config(GKeyFile *config);
+
+void construct_proj_file(struct proj_test_param *param);
+GKeyFile *construct_proj_config(struct proj_test_param *param);
+void destroy_proj_config(GKeyFile *config);
+void init_proj_param(struct proj_test_param *param);
+void do_add_proj_test(struct proj_test_param *param);
+void do_rm_proj_test(struct proj_test_param *param);
+
+void construct_eng_file(struct eng_test_param *param);
+GKeyFile *construct_eng_config(struct eng_test_param *param);
+void destroy_eng_config(GKeyFile *config);
+
+void init_task_param(struct task_test_param *param, const char *eng);
+void construct_task_file(struct task_test_param *param);
+
+void init_slide_task(struct slide_task_test_param *param);
+void add_slide_task(struct slide_task_test_param *param);
+GKeyFile *construct_slide_task_config(struct slide_task_test_param *param);
+void destroy_slide_task_config(GKeyFile *config);
+void init_slide_eng(struct eng_test_param *param);
+
+void init_cslide_eng(struct cslide_eng_test_param *param);
+void add_cslide_eng(struct cslide_eng_test_param *param);
+GKeyFile *construct_cslide_eng_config(struct cslide_eng_test_param *param);
+void destroy_cslide_eng_config(GKeyFile *config);
+
+int get_first_cold_node(struct cslide_eng_test_param *param);
+int get_first_hot_node(struct cslide_eng_test_param *param);
+int get_second_cold_node(struct cslide_eng_test_param *param);
+int get_second_hot_node(struct cslide_eng_test_param *param);
+
+void init_cslide_task(struct cslide_task_test_param *param);
+void add_cslide_task(struct cslide_task_test_param *param);
+GKeyFile *construct_cslide_task_config(struct cslide_task_test_param *param);
+void destroy_cslide_task_config(GKeyFile *config);
+#endif
--
1.8.3.1

View File

@ -1,523 +0,0 @@
From f63083aff0d1d305079d9f0c47717faa512361f8 Mon Sep 17 00:00:00 2001
From: liubo <liubo254@huawei.com>
Date: Tue, 30 Nov 2021 09:42:50 +0800
Subject: [PATCH 05/33] add code of testcase for etmem project function
---
etmem/test/project/CMakeLists.txt | 28 ++
etmem/test/project/etmem_project_ops_llt.c | 468 +++++++++++++++++++++++++++++
2 files changed, 496 insertions(+)
create mode 100644 etmem/test/project/CMakeLists.txt
create mode 100644 etmem/test/project/etmem_project_ops_llt.c
diff --git a/etmem/test/project/CMakeLists.txt b/etmem/test/project/CMakeLists.txt
new file mode 100644
index 0000000..70cd530
--- /dev/null
+++ b/etmem/test/project/CMakeLists.txt
@@ -0,0 +1,28 @@
+# /******************************************************************************
+# * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+# * etmem is licensed under the Mulan PSL v2.
+# * You can use this software according to the terms and conditions of the Mulan PSL v2.
+# * You may obtain a copy of Mulan PSL v2 at:
+# * http://license.coscl.org.cn/MulanPSL2
+# * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+# * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+# * PURPOSE.
+# * See the Mulan PSL v2 for more details.
+# * Author: liubo
+# * Create: 2021-11-29
+# * Description: CMakefileList for etmem_project_ops_llt to compile
+# ******************************************************************************/
+
+project(etmem)
+
+INCLUDE_DIRECTORIES(../../inc/etmem_inc)
+INCLUDE_DIRECTORIES(../../inc/etmemd_inc)
+INCLUDE_DIRECTORIES(../common)
+INCLUDE_DIRECTORIES(${GLIB2_INCLUDE_DIRS})
+
+SET(EXE etmem_project_ops_llt)
+
+add_executable(${EXE}
+etmem_project_ops_llt.c)
+
+target_link_libraries(${EXE} cunit ${BUILD_DIR}/lib/libetmemd.so ${BUILD_DIR}/lib/libtest.so pthread dl rt boundscheck numa ${GLIB2_LIBRARIES})
diff --git a/etmem/test/project/etmem_project_ops_llt.c b/etmem/test/project/etmem_project_ops_llt.c
new file mode 100644
index 0000000..edd2330
--- /dev/null
+++ b/etmem/test/project/etmem_project_ops_llt.c
@@ -0,0 +1,468 @@
+/******************************************************************************
+ * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+ * etmem is licensed under the Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+ * PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * Author: liubo
+ * Create: 2021-11-29
+ * Description: This is a source file of the unit test for project-related commands in etmem.
+ ******************************************************************************/
+
+#include <sys/file.h>
+#include <sys/sysinfo.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <limits.h>
+#include <glib.h>
+
+#include "etmemd_project.h"
+#include "etmemd_file.h"
+#include "etmemd_common.h"
+#include "securec.h"
+
+#include "test_common.h"
+
+#include <CUnit/Basic.h>
+#include <CUnit/Automated.h>
+#include <CUnit/Console.h>
+
+#define PROJECT_ADD_TEST_MAX_NUM 50
+
+static struct proj_test_param g_proj_test_param;
+
+static void etmem_pro_add_name(void)
+{
+ const char *project_name_long = "project name cannot longer than 32 ppmpppppppppppppppppppppppppppppppppppppppppppppp";
+ GKeyFile *config = NULL;
+ struct proj_test_param param;
+
+ init_proj_param(&param);
+
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_PRO_EXISTED);
+ destroy_proj_config(config);
+
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_remove(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+
+ param.proj_name = "";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_INVAL);
+ destroy_proj_config(config);
+
+ param.proj_name = project_name_long;
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_INVAL);
+ destroy_proj_config(config);
+
+ param.proj_name = DEFAULT_PROJ;
+}
+
+static void etmem_pro_add_interval(void)
+{
+ struct proj_test_param param;
+ GKeyFile *config = NULL;
+
+ init_proj_param(&param);
+
+ param.interval = "0";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_INVAL);
+ destroy_proj_config(config);
+
+ param.interval = "1";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_SUCCESS);
+ CU_ASSERT_EQUAL(etmemd_project_remove(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+
+ param.interval = "2";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_SUCCESS);
+ CU_ASSERT_EQUAL(etmemd_project_remove(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+
+ param.interval = "1199";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_SUCCESS);
+ CU_ASSERT_EQUAL(etmemd_project_remove(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+
+ param.interval = "1200";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_SUCCESS);
+ CU_ASSERT_EQUAL(etmemd_project_remove(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+
+ param.interval = "1201";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_INVAL);
+ destroy_proj_config(config);
+
+ param.interval = "abc";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_INVAL);
+ destroy_proj_config(config);
+}
+
+static void etmem_pro_add_loop(void)
+{
+ struct proj_test_param param;
+ GKeyFile *config = NULL;
+
+ init_proj_param(&param);
+
+ param.loop = "0";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_INVAL);
+ destroy_proj_config(config);
+
+ param.loop = "1";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_SUCCESS);
+ CU_ASSERT_EQUAL(etmemd_project_remove(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+
+ param.loop = "2";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_SUCCESS);
+ CU_ASSERT_EQUAL(etmemd_project_remove(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+
+ param.loop = "119";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_SUCCESS);
+ CU_ASSERT_EQUAL(etmemd_project_remove(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+
+ param.loop = "120";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_SUCCESS);
+ CU_ASSERT_EQUAL(etmemd_project_remove(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+
+ param.loop = "121";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_INVAL);
+ destroy_proj_config(config);
+
+ param.loop = "abc";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_INVAL);
+ destroy_proj_config(config);
+}
+
+static void etmem_pro_add_sleep(void)
+{
+ struct proj_test_param param;
+ GKeyFile *config = NULL;
+
+ init_proj_param(&param);
+
+ param.sleep = "0";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_INVAL);
+ destroy_proj_config(config);
+
+ param.sleep = "1";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_SUCCESS);
+ CU_ASSERT_EQUAL(etmemd_project_remove(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+
+ param.sleep = "2";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_SUCCESS);
+ CU_ASSERT_EQUAL(etmemd_project_remove(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+
+ param.sleep = "1199";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_SUCCESS);
+ CU_ASSERT_EQUAL(etmemd_project_remove(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+
+ param.sleep = "1200";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_SUCCESS);
+ CU_ASSERT_EQUAL(etmemd_project_remove(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+
+ param.sleep = "1201";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_INVAL);
+ destroy_proj_config(config);
+
+ param.sleep = "wrong sleep type";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_INVAL);
+ destroy_proj_config(config);
+}
+
+static void etmem_pro_lack_loop(void)
+{
+ struct proj_test_param param;
+ GKeyFile *config = NULL;
+
+ init_proj_param(&param);
+
+ param.loop = NULL;
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_INVAL);
+ destroy_proj_config(config);
+}
+
+void test_etmem_prj_add_error(void)
+{
+ etmem_pro_add_name();
+ etmem_pro_add_interval();
+ etmem_pro_add_loop();
+ etmem_pro_add_sleep();
+ etmem_pro_lack_loop();
+}
+
+void test_etmem_prj_del_error(void)
+{
+ struct proj_test_param param;
+ GKeyFile *config = NULL;
+
+ init_proj_param(&param);
+
+ param.proj_name = "";
+ config = construct_proj_config(&param);
+ CU_ASSERT_NOT_EQUAL(etmemd_project_remove(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+
+ param.proj_name = "noexist";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_remove(config), OPT_PRO_NOEXIST);
+ destroy_proj_config(config);
+}
+
+static void add_project_once(void)
+{
+ struct proj_test_param param;
+ GKeyFile *config = NULL;
+
+ init_proj_param(&param);
+
+ CU_ASSERT_EQUAL(etmemd_project_show(NULL, 0), OPT_PRO_NOEXIST);
+
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+
+ CU_ASSERT_EQUAL(etmemd_project_show(NULL, 0), OPT_SUCCESS);
+
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_remove(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+
+ CU_ASSERT_EQUAL(etmemd_project_show("noexist", 0), OPT_PRO_NOEXIST);
+}
+
+static int add_project_multiple(int proj_add_num)
+{
+ char project_name_str[PROJECT_NAME_MAX_LEN] = {0};
+ unsigned int project_num;
+ struct proj_test_param param;
+ GKeyFile *config = NULL;
+
+ init_proj_param(&param);
+
+ for (project_num = 0; project_num < proj_add_num; project_num++) {
+ if (snprintf_s(project_name_str, PROJECT_NAME_MAX_LEN, PROJECT_NAME_MAX_LEN - 1, "project_add_del_test_num%d",
+ project_num) <= 0) {
+ printf("get project_name wrong.\n");
+ return -1;
+ }
+ param.proj_name = project_name_str;
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+ }
+
+ CU_ASSERT_EQUAL(etmemd_project_show(NULL, 0), OPT_SUCCESS);
+ CU_ASSERT_EQUAL(etmemd_project_show("project_add_del_test_num5", 0), OPT_SUCCESS);
+
+ for (project_num = 0; project_num < proj_add_num; project_num++) {
+ if (snprintf_s(project_name_str, PROJECT_NAME_MAX_LEN, PROJECT_NAME_MAX_LEN - 1, "project_add_del_test_num%d",
+ project_num) <= 0) {
+ printf("get project_name wrong.\n");
+ return -1;
+ }
+ param.proj_name = project_name_str;
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_remove(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+ }
+
+ return 0;
+}
+
+void test_etmem_project_add_ok(void)
+{
+ add_project_once();
+ CU_ASSERT_EQUAL(add_project_multiple(PROJECT_ADD_TEST_MAX_NUM), 0);
+}
+
+void test_etmem_mig_start_error(void)
+{
+ struct proj_test_param param;
+
+ init_proj_param(&param);
+
+ CU_ASSERT_EQUAL(etmemd_migrate_start(NULL), OPT_INVAL);
+ CU_ASSERT_EQUAL(etmemd_migrate_start(""), OPT_PRO_NOEXIST);
+ CU_ASSERT_EQUAL(etmemd_migrate_start("etmem"), OPT_PRO_NOEXIST);
+ CU_ASSERT_EQUAL(etmemd_migrate_start("me^$%*mig"), OPT_PRO_NOEXIST);
+
+ param.proj_name = "add_for_migrate_test";
+ do_add_proj_test(&param);
+
+ CU_ASSERT_EQUAL(etmemd_migrate_start("add_for_migrate_test"), OPT_SUCCESS);
+ CU_ASSERT_EQUAL(etmemd_migrate_start("add_for_migrate_test"), OPT_PRO_STARTED);
+
+ etmemd_stop_all_projects();
+}
+
+void test_etmem_mig_stop_error(void)
+{
+ struct proj_test_param param;
+
+ init_proj_param(&param);
+
+ CU_ASSERT_EQUAL(etmemd_migrate_stop(NULL), OPT_INVAL);
+ CU_ASSERT_EQUAL(etmemd_migrate_stop(""), OPT_PRO_NOEXIST);
+ CU_ASSERT_EQUAL(etmemd_migrate_stop("ETMEM"), OPT_PRO_NOEXIST);
+ CU_ASSERT_EQUAL(etmemd_migrate_stop("ET^$%*MEM"), OPT_PRO_NOEXIST);
+
+ param.proj_name = "add_for_migrate_stop_test";
+ do_add_proj_test(&param);
+
+ CU_ASSERT_EQUAL(etmemd_migrate_start("add_for_migrate_stop_test"), OPT_SUCCESS);
+ CU_ASSERT_EQUAL(etmemd_migrate_stop("add_for_migrate_stop_test"), OPT_SUCCESS);
+ CU_ASSERT_EQUAL(etmemd_migrate_stop("add_for_migrate_stop_test"), OPT_PRO_STOPPED);
+
+ etmemd_stop_all_projects();
+}
+
+static int start_project_multiple(int proj_add_num)
+{
+ char project_name_str[PROJECT_NAME_MAX_LEN] = {0};
+ unsigned int project_num;
+ struct proj_test_param param;
+ GKeyFile *config = NULL;
+
+ init_proj_param(&param);
+
+ for (project_num = 0; project_num < proj_add_num; project_num++) {
+ if (snprintf_s(project_name_str, PROJECT_NAME_MAX_LEN, PROJECT_NAME_MAX_LEN - 1, "project_add_del_test_num%d",
+ project_num) <= 0) {
+ printf("get project_name wrong.\n");
+ return -1;
+ }
+ param.proj_name = project_name_str;
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+ CU_ASSERT_EQUAL(etmemd_migrate_start(project_name_str), OPT_SUCCESS);
+ }
+
+ for (project_num = 0; project_num < proj_add_num; project_num++) {
+ if (snprintf_s(project_name_str, PROJECT_NAME_MAX_LEN, PROJECT_NAME_MAX_LEN - 1, "project_add_del_test_num%d",
+ project_num) <= 0) {
+ printf("get project_name wrong.\n");
+ return -1;
+ }
+ param.proj_name = project_name_str;
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_migrate_stop(project_name_str), OPT_SUCCESS);
+ CU_ASSERT_EQUAL(etmemd_project_remove(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+ }
+
+ return 0;
+}
+
+void test_etmem_mig_start_ok(void)
+{
+ CU_ASSERT_EQUAL(start_project_multiple(1), 0);
+ CU_ASSERT_EQUAL(start_project_multiple(PROJECT_ADD_TEST_MAX_NUM), 0);
+}
+
+typedef enum {
+ CUNIT_SCREEN = 0,
+ CUNIT_XMLFILE,
+ CUNIT_CONSOLE
+} cu_run_mode;
+
+int main(int argc, const char **argv)
+{
+ CU_pSuite suite;
+ CU_pTest pTest;
+ unsigned int num_failures;
+ cu_run_mode cunit_mode = CUNIT_SCREEN;
+ int error_num;
+
+ if (argc > 1) {
+ cunit_mode = atoi(argv[1]);
+ }
+
+ if (CU_initialize_registry() != CUE_SUCCESS) {
+ return -CU_get_error();
+ }
+
+ suite = CU_add_suite("etmem_project_ops", NULL, NULL);
+ if (suite == NULL) {
+ goto ERROR;
+ }
+
+ if (CU_ADD_TEST(suite, test_etmem_prj_add_error) == NULL ||
+ CU_ADD_TEST(suite, test_etmem_prj_del_error) == NULL ||
+ CU_ADD_TEST(suite, test_etmem_project_add_ok) == NULL ||
+ CU_ADD_TEST(suite, test_etmem_mig_start_error) == NULL ||
+ CU_ADD_TEST(suite, test_etmem_mig_stop_error) == NULL ||
+ CU_ADD_TEST(suite, test_etmem_mig_start_ok) == NULL) {
+ printf("CU_ADD_TEST fail. \n");
+ goto ERROR;
+ }
+
+ switch (cunit_mode) {
+ case CUNIT_SCREEN:
+ CU_basic_set_mode(CU_BRM_VERBOSE);
+ CU_basic_run_tests();
+ break;
+ case CUNIT_XMLFILE:
+ CU_set_output_filename("etmemd_project.c");
+ CU_automated_run_tests();
+ break;
+ case CUNIT_CONSOLE:
+ CU_console_run_tests();
+ break;
+ default:
+ printf("not support cunit mode, only support: 0 or 1\n");
+ goto ERROR;
+ }
+
+ num_failures = CU_get_number_of_failures();
+ CU_cleanup_registry();
+ return num_failures;
+
+ERROR:
+ error_num = CU_get_error();
+ CU_cleanup_registry();
+ return -error_num;
+}
--
1.8.3.1

View File

@ -1,439 +0,0 @@
From 50fb3c7251e423268164627db86c1c312c707e63 Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Tue, 30 Nov 2021 11:11:01 +0800
Subject: [PATCH 06/33] add test for export scan
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
etmem/test/etmem_scan_ops_llt_test/CMakeLists.txt | 28 ++
.../etmem_scan_ops_llt_test/etmem_scan_ops_llt.c | 383 +++++++++++++++++++++
2 files changed, 411 insertions(+)
create mode 100644 etmem/test/etmem_scan_ops_llt_test/CMakeLists.txt
create mode 100644 etmem/test/etmem_scan_ops_llt_test/etmem_scan_ops_llt.c
diff --git a/etmem/test/etmem_scan_ops_llt_test/CMakeLists.txt b/etmem/test/etmem_scan_ops_llt_test/CMakeLists.txt
new file mode 100644
index 0000000..c6ff96c
--- /dev/null
+++ b/etmem/test/etmem_scan_ops_llt_test/CMakeLists.txt
@@ -0,0 +1,28 @@
+# /******************************************************************************
+# * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+# * etmem is licensed under the Mulan PSL v2.
+# * You can use this software according to the terms and conditions of the Mulan PSL v2.
+# * You may obtain a copy of Mulan PSL v2 at:
+# * http://license.coscl.org.cn/MulanPSL2
+# * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+# * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+# * PURPOSE.
+# * See the Mulan PSL v2 for more details.
+# * Author: shikemeng
+# * Create: 2021-11-30
+# * Description: CMakefileList for etmem_scan_ops_llt_test
+# ******************************************************************************/
+
+project(etmem)
+
+INCLUDE_DIRECTORIES(../../inc/etmem_inc)
+INCLUDE_DIRECTORIES(../../inc/etmemd_inc)
+INCLUDE_DIRECTORIES(${GLIB2_INCLUDE_DIRS})
+
+SET(EXE etmem_scan_ops_llt)
+
+add_executable(etmem_scan_ops_llt
+ etmem_scan_ops_llt.c
+ )
+
+target_link_libraries(${EXE} cunit ${BUILD_DIR}/lib/libetmemd.so pthread dl rt libboundscheck numa ${GLIB2_LIBRARIES})
diff --git a/etmem/test/etmem_scan_ops_llt_test/etmem_scan_ops_llt.c b/etmem/test/etmem_scan_ops_llt_test/etmem_scan_ops_llt.c
new file mode 100644
index 0000000..1856072
--- /dev/null
+++ b/etmem/test/etmem_scan_ops_llt_test/etmem_scan_ops_llt.c
@@ -0,0 +1,383 @@
+/******************************************************************************
+ * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+ * etmem is licensed under the Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+ * PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * Author: shikemeng
+ * Create: 2021-11-30
+ * Description: test for export scan
+ ******************************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <CUnit/Basic.h>
+#include <CUnit/Automated.h>
+#include <CUnit/Console.h>
+
+#include "etmemd_scan.h"
+#include "etmemd_project.h"
+#include "etmemd_engine.h"
+
+static struct task_pid *alloc_tkpid(unsigned int pid, struct task *tk)
+{
+ struct task_pid *tpid = NULL;
+
+ tpid = (struct task_pid *)calloc(1, sizeof(struct task_pid));
+ CU_ASSERT_PTR_NOT_NULL(tpid);
+ tpid->pid = pid;
+ tpid->tk = tk;
+
+ return tpid;
+}
+
+
+static struct task *alloc_tk(int loop, int sleep)
+{
+ struct task *tk = NULL;
+ struct project *proj = NULL;
+ struct engine *eng = NULL;
+
+ proj = (struct project *)calloc(1, sizeof(struct project));
+ CU_ASSERT_PTR_NOT_NULL(proj);
+
+ proj->loop = loop;
+ proj->sleep = sleep;
+
+ tk = (struct task *)calloc(1, sizeof(struct task));
+ CU_ASSERT_PTR_NOT_NULL(tk);
+
+ eng = calloc(1, sizeof(struct engine));
+ eng->name = "cslide";
+
+ eng->proj = proj;
+ tk->eng = eng;
+
+ return tk;
+}
+
+void check_vmas(struct vmas *vmas)
+{
+ CU_ASSERT_NOT_EQUAL(vmas->vma_cnt, 0);
+
+ int i;
+ struct vma *curr_vma = NULL;
+
+ curr_vma = vmas->vma_list;
+ for (i = 0; i < vmas->vma_cnt; i++) {
+ CU_ASSERT_PTR_NOT_NULL(curr_vma);
+ curr_vma = curr_vma->next;
+ }
+}
+
+static void test_get_vmas_invalid(void)
+{
+ const char *pid = "1";
+ char *vmflags_array[10] = {"rd"};
+ int vmflag_num = 1;
+ int is_anon_only = false;
+ struct vmas *vmas = NULL;
+
+ CU_ASSERT_EQUAL(etmemd_scan_init(), 0);
+
+ // non-exist pid
+ vmas = etmemd_get_vmas("0", vmflags_array, vmflag_num, is_anon_only);
+ CU_ASSERT_PTR_NULL(vmas);
+
+ // pid is NULL
+ vmas = etmemd_get_vmas(NULL, vmflags_array, vmflag_num, is_anon_only);
+ CU_ASSERT_PTR_NULL(vmas);
+
+ // pid contains invalid characters
+ vmas = etmemd_get_vmas("1-", vmflags_array, vmflag_num, is_anon_only);
+ CU_ASSERT_PTR_NULL(vmas);
+
+ // vmflags contains space
+ vmflags_array[0] = "r ";
+ vmas = etmemd_get_vmas(pid, vmflags_array, vmflag_num, is_anon_only);
+ CU_ASSERT_PTR_NULL(vmas);
+
+ // vmflags length is not 2
+ vmflags_array[0] = "r";
+ vmas = etmemd_get_vmas(pid, vmflags_array, vmflag_num, is_anon_only);
+ CU_ASSERT_PTR_NULL(vmas);
+
+ // vmflags is NULL
+ vmflags_array[0] = NULL;
+ vmas = etmemd_get_vmas(pid, vmflags_array, vmflag_num, is_anon_only);
+ CU_ASSERT_PTR_NULL(vmas);
+
+ // test free NULL
+ vmas = NULL;
+ etmemd_free_vmas(vmas);
+
+ etmemd_scan_exit();
+}
+
+
+static void test_get_vmas_valid(void)
+{
+ const char *pid = "1";
+ char *vmflags_array[10] = {"rd"};
+ int vmflag_num = 1;
+ int is_anon_only = false;
+ struct vmas *vmas = NULL;
+ struct vma *curr_vma = NULL;
+ int i;
+
+ // get vmas without init
+ vmas = etmemd_get_vmas(pid, vmflags_array, vmflag_num, is_anon_only);
+
+ CU_ASSERT_PTR_NOT_NULL(vmas);
+ check_vmas(vmas);
+
+ etmemd_free_vmas(vmas);
+
+ // get vmas with init
+ CU_ASSERT_EQUAL(etmemd_scan_init(), 0);
+
+ vmas = etmemd_get_vmas(pid, vmflags_array, vmflag_num, is_anon_only);
+
+ CU_ASSERT_PTR_NOT_NULL(vmas);
+ check_vmas(vmas);
+
+ etmemd_free_vmas(vmas);
+
+ vmas = get_vmas("1");
+ CU_ASSERT_PTR_NOT_NULL(vmas);
+ CU_ASSERT_NOT_EQUAL(vmas->vma_cnt, 0);
+
+ curr_vma = vmas->vma_list;
+ for (i = 0; i < vmas->vma_cnt; i++) {
+ CU_ASSERT_PTR_NOT_NULL(curr_vma);
+ curr_vma = curr_vma->next;
+ }
+
+ free_vmas(vmas);
+ etmemd_scan_exit();
+}
+
+static void test_get_vmas(void)
+{
+ test_get_vmas_invalid();
+ test_get_vmas_valid();
+}
+
+static void test_get_page_refs_invalid(void)
+{
+ CU_ASSERT_EQUAL(etmemd_scan_init(), 0);
+
+ const char *pid = "1";
+ char *vmflags_array[10] = {"rd"};
+ int vmflag_num = 1;
+ int is_anon_only = false;
+ struct vmas *vmas = NULL;
+ struct page_refs *page_refs = NULL;
+ int flags = SCAN_AS_HUGE | SCAN_IGN_HOST;
+
+ // free null pointer
+ etmemd_free_page_refs(page_refs);
+
+ // vmas is NULL
+ CU_ASSERT_EQUAL(etmemd_get_page_refs(vmas, pid, &page_refs, flags), -1);
+
+ // vmas address range invalid
+ vmas = (struct vmas *)calloc(1, sizeof(struct vmas));
+ CU_ASSERT_PTR_NOT_NULL(vmas);
+ vmas->vma_cnt = 1;
+
+ struct vma *vma = (struct vma *)calloc(1, sizeof(struct vma));
+ CU_ASSERT_PTR_NOT_NULL(vma);
+ vma->start = 0x0ff;
+ vma->end = 0x000;
+ vma->next = NULL;
+ vmas->vma_list = vma;
+
+ CU_ASSERT_EQUAL(etmemd_get_page_refs(vmas, pid, &page_refs, flags), -1);
+ etmemd_free_vmas(vmas);
+
+ vmas = etmemd_get_vmas(pid, vmflags_array, vmflag_num, is_anon_only);
+ CU_ASSERT_PTR_NOT_NULL(vmas);
+ check_vmas(vmas);
+
+ // pid not exist
+ CU_ASSERT_EQUAL(etmemd_get_page_refs(vmas, "0", &page_refs, flags), -1);
+ CU_ASSERT_PTR_NULL(page_refs);
+
+ // pid is NULL
+ CU_ASSERT_EQUAL(etmemd_get_page_refs(vmas, NULL, &page_refs, flags), -1);
+ CU_ASSERT_PTR_NULL(page_refs);
+
+ // pid contains invalid chars
+ CU_ASSERT_EQUAL(etmemd_get_page_refs(vmas, "--", &page_refs, flags), -1);
+ CU_ASSERT_PTR_NULL(page_refs);
+
+ etmemd_free_page_refs(page_refs);
+ etmemd_free_vmas(vmas);
+ etmemd_scan_exit();
+}
+
+static void test_get_page_refs_valid()
+{
+ CU_ASSERT_EQUAL(etmemd_scan_init(), 0);
+
+ const char *pid = "1";
+ char *vmflags_array[10] = {"rd"};
+ int vmflag_num = 1;
+ int is_anon_only = false;
+ struct vmas *vmas = NULL;
+ struct page_refs *page_refs = NULL;
+ int flags = SCAN_AS_HUGE | SCAN_IGN_HOST;
+
+ vmas = etmemd_get_vmas(pid, vmflags_array, vmflag_num, is_anon_only);
+ CU_ASSERT_PTR_NOT_NULL(vmas);
+ check_vmas(vmas);
+
+ CU_ASSERT_EQUAL(etmemd_get_page_refs(vmas, pid, &page_refs, flags), 0);
+ CU_ASSERT_PTR_NOT_NULL(page_refs);
+
+ unsigned long use_rss;
+
+ CU_ASSERT_EQUAL(get_page_refs(vmas, pid, &page_refs, &use_rss, 0), 0);
+ CU_ASSERT_PTR_NOT_NULL(page_refs);
+ CU_ASSERT_NOT_EQUAL(use_rss, 0);
+
+ etmemd_free_page_refs(page_refs);
+ etmemd_free_vmas(vmas);
+ etmemd_scan_exit();
+}
+
+static void test_get_page_refs(void)
+{
+ test_get_page_refs_invalid();
+ test_get_page_refs_valid();
+}
+
+static void test_scan_error(void)
+{
+ unsigned int pid_error = 1111111111;
+ int loop = 1;
+ int sleep = 1;
+ struct task_pid *tpid = NULL;
+ struct task *tk = NULL;
+
+ tk = alloc_tk(loop, sleep);
+ tpid = alloc_tkpid(pid_error, tk);
+
+ CU_ASSERT_PTR_NULL(etmemd_do_scan(tpid, NULL));
+ CU_ASSERT_PTR_NULL(etmemd_do_scan(tpid, tk));
+
+ free(tk);
+ free(tpid);
+}
+
+static void test_etmem_scan_ok(void)
+{
+ unsigned int pid_ok = 1;
+ int loop = 1;
+ int sleep = 1;
+ struct page_refs *page_refs = NULL;
+ struct task_pid *tpid = NULL;
+ struct task *tk = NULL;
+
+ tk = alloc_tk(loop, sleep);
+ tpid = alloc_tkpid(pid_ok, tk);
+
+ CU_ASSERT_EQUAL(etmemd_scan_init(), 0);
+
+ page_refs = etmemd_do_scan(tpid, tk);
+ CU_ASSERT_PTR_NOT_NULL(page_refs);
+ free(tk);
+ free(tpid);
+ clean_page_refs_unexpected(&page_refs);
+ CU_ASSERT_PTR_NULL(page_refs);
+ etmemd_scan_exit();
+}
+
+static void test_add_pg_to_mem_grade()
+{
+ const char *pid = "1";
+ struct vmas *vma = NULL;
+ struct page_refs *page_refs = NULL;
+ struct page_refs *list = NULL;
+
+ CU_ASSERT_EQUAL(etmemd_scan_init(), 0);
+
+ vma = get_vmas(pid);
+ CU_ASSERT_EQUAL(get_page_refs(vma, pid, &page_refs, NULL, 0), 0);
+ page_refs = add_page_refs_into_memory_grade(page_refs, &list);
+ CU_ASSERT_PTR_NOT_NULL(page_refs);
+ CU_ASSERT_PTR_NOT_NULL(list);
+
+ free(list);
+ etmemd_free_page_refs(page_refs);
+ free_vmas(vma);
+ etmemd_scan_exit();
+}
+
+typedef enum {
+ CUNIT_SCREEN = 0,
+ CUNIT_XMLFILE,
+ CUNIT_CONSOLE
+} cu_run_mode;
+
+int main(int argc, const char **argv)
+{
+ CU_pSuite suite;
+ CU_pTest pTest;
+ unsigned int num_failures;
+ cu_run_mode cunit_mode = CUNIT_SCREEN;
+ int error_num;
+
+ if (argc > 1) {
+ cunit_mode = atoi(argv[1]);
+ }
+
+ if (CU_initialize_registry() != CUE_SUCCESS) {
+ return CU_get_error();
+ }
+
+ suite = CU_add_suite("etmem_scan_ops", NULL, NULL);
+ if (suite == NULL) {
+ goto ERROR;
+ }
+
+ if (CU_ADD_TEST(suite, test_get_vmas) == NULL ||
+ CU_ADD_TEST(suite, test_get_page_refs) == NULL ||
+ CU_ADD_TEST(suite, test_scan_error) == NULL ||
+ CU_ADD_TEST(suite, test_etmem_scan_ok) == NULL ||
+ CU_ADD_TEST(suite, test_add_pg_to_mem_grade) == NULL) {
+ goto ERROR;
+ }
+
+ switch (cunit_mode) {
+ case CUNIT_SCREEN:
+ CU_basic_set_mode(CU_BRM_VERBOSE);
+ CU_basic_run_tests();
+ break;
+ case CUNIT_XMLFILE:
+ CU_set_output_filename("etmemd_scan.c");
+ CU_automated_run_tests();
+ break;
+ case CUNIT_CONSOLE:
+ CU_console_run_tests();
+ break;
+ default:
+ printf("not support cunit mode, only support: 0 or 1\n");
+ goto ERROR;
+ }
+
+ num_failures = CU_get_number_of_failures();
+ CU_cleanup_registry();
+ return num_failures;
+
+ERROR:
+ error_num = CU_get_error();
+ CU_cleanup_registry();
+ return -error_num;
+}
--
1.8.3.1

File diff suppressed because it is too large Load Diff

View File

@ -1,253 +0,0 @@
From 531e313796c9bddc1571f78e858c5bc431b65068 Mon Sep 17 00:00:00 2001
From: liubo <liubo254@huawei.com>
Date: Tue, 14 Dec 2021 11:09:51 +0800
Subject: [PATCH 08/33] add code of testcase for etmem log ops
---
.../test/etmem_common_func_llt_test/CMakeLists.txt | 3 +-
.../etmem_common_func_llt.c | 3 +-
etmem/test/etmem_log_ops_llt_test/CMakeLists.txt | 26 +++++
.../etmem_log_ops_llt_test/etmem_log_ops_llt.c | 112 +++++++++++++++++++++
.../test/etmem_project_ops_llt_test/CMakeLists.txt | 3 +-
.../etmem_project_ops_llt.c | 3 +-
etmem/test/etmem_scan_ops_llt_test/CMakeLists.txt | 4 +-
.../etmem_scan_ops_llt_test/etmem_scan_ops_llt.c | 3 +-
8 files changed, 147 insertions(+), 10 deletions(-)
create mode 100644 etmem/test/etmem_log_ops_llt_test/CMakeLists.txt
create mode 100644 etmem/test/etmem_log_ops_llt_test/etmem_log_ops_llt.c
diff --git a/etmem/test/etmem_common_func_llt_test/CMakeLists.txt b/etmem/test/etmem_common_func_llt_test/CMakeLists.txt
index be3b365..205d460 100644
--- a/etmem/test/etmem_common_func_llt_test/CMakeLists.txt
+++ b/etmem/test/etmem_common_func_llt_test/CMakeLists.txt
@@ -21,7 +21,6 @@ INCLUDE_DIRECTORIES(${GLIB2_INCLUDE_DIRS})
SET(EXE etmem_common_func_llt)
-add_executable(${EXE}
-etmem_common_func_llt.c)
+add_executable(${EXE} etmem_common_func_llt.c)
target_link_libraries(${EXE} cunit ${BUILD_DIR}/lib/libetmemd.so pthread dl rt boundscheck numa ${GLIB2_LIBRARIES})
diff --git a/etmem/test/etmem_common_func_llt_test/etmem_common_func_llt.c b/etmem/test/etmem_common_func_llt_test/etmem_common_func_llt.c
index 2bb5b11..f195d4d 100644
--- a/etmem/test/etmem_common_func_llt_test/etmem_common_func_llt.c
+++ b/etmem/test/etmem_common_func_llt_test/etmem_common_func_llt.c
@@ -300,7 +300,8 @@ int main(int argc, const char **argv)
CU_console_run_tests();
break;
default:
- printf("not support cunit mode, only support: 0 or 1\n");
+ printf("not support cunit mode, only support: "
+ "0 for CUNIT_SCREEN, 1 for CUNIT_XMLFILE, 2 for CUNIT_CONSOLE\n");
goto ERROR;
}
diff --git a/etmem/test/etmem_log_ops_llt_test/CMakeLists.txt b/etmem/test/etmem_log_ops_llt_test/CMakeLists.txt
new file mode 100644
index 0000000..322fe0f
--- /dev/null
+++ b/etmem/test/etmem_log_ops_llt_test/CMakeLists.txt
@@ -0,0 +1,26 @@
+# /******************************************************************************
+# * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+# * etmem is licensed under the Mulan PSL v2.
+# * You can use this software according to the terms and conditions of the Mulan PSL v2.
+# * You may obtain a copy of Mulan PSL v2 at:
+# * http://license.coscl.org.cn/MulanPSL2
+# * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+# * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+# * PURPOSE.
+# * See the Mulan PSL v2 for more details.
+# * Author: liubo
+# * Create: 2021-12-10
+# * Description: CMakefileList for etmem_log_ops_llt to compile
+# ******************************************************************************/
+
+project(etmem)
+
+INCLUDE_DIRECTORIES(../../inc/etmem_inc)
+INCLUDE_DIRECTORIES(../../inc/etmemd_inc)
+INCLUDE_DIRECTORIES(${GLIB2_INCLUDE_DIRS})
+
+SET(EXE etmem_log_ops_llt)
+
+add_executable(${EXE} etmem_log_ops_llt.c)
+
+target_link_libraries(${EXE} cunit ${BUILD_DIR}/lib/libetmemd.so pthread dl rt boundscheck numa ${GLIB2_LIBRARIES})
diff --git a/etmem/test/etmem_log_ops_llt_test/etmem_log_ops_llt.c b/etmem/test/etmem_log_ops_llt_test/etmem_log_ops_llt.c
new file mode 100644
index 0000000..e9a7402
--- /dev/null
+++ b/etmem/test/etmem_log_ops_llt_test/etmem_log_ops_llt.c
@@ -0,0 +1,112 @@
+/******************************************************************************
+ * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+ * etmem is licensed under the Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+ * PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * Author: liubo
+ * Create: 2021-12-10
+ * Description: This is a source file of the unit test for log functions in etmem.
+ ******************************************************************************/
+
+#include <sys/file.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "etmemd_log.h"
+
+#include <CUnit/Basic.h>
+#include <CUnit/Automated.h>
+#include <CUnit/Console.h>
+
+#define ETMEMD_LOG_WRONG (-1)
+
+static void test_basic_log_level(void)
+{
+ CU_ASSERT_EQUAL(etmemd_init_log_level(ETMEMD_LOG_WRONG), -1);
+ CU_ASSERT_EQUAL(etmemd_init_log_level(ETMEMD_LOG_DEBUG), 0);
+ CU_ASSERT_EQUAL(etmemd_init_log_level(ETMEMD_LOG_INFO), 0);
+ CU_ASSERT_EQUAL(etmemd_init_log_level(ETMEMD_LOG_WARN), 0);
+ CU_ASSERT_EQUAL(etmemd_init_log_level(ETMEMD_LOG_ERR), 0);
+ CU_ASSERT_EQUAL(etmemd_init_log_level(ETMEMD_LOG_INVAL), -1);
+}
+
+static void test_etmem_log_print(void)
+{
+ CU_ASSERT_EQUAL(etmemd_init_log_level(ETMEMD_LOG_DEBUG), 0);
+ etmemd_log(ETMEMD_LOG_DEBUG, "test_etmem_log_debug_level\n");
+ CU_ASSERT_EQUAL(etmemd_init_log_level(ETMEMD_LOG_INFO), 0);
+ etmemd_log(ETMEMD_LOG_INFO, "test_etmem_log_info_level\n");
+ CU_ASSERT_EQUAL(etmemd_init_log_level(ETMEMD_LOG_WARN), 0);
+ etmemd_log(ETMEMD_LOG_WARN, "test_etmem_log_warn_level\n");
+ CU_ASSERT_EQUAL(etmemd_init_log_level(ETMEMD_LOG_ERR), 0);
+ etmemd_log(ETMEMD_LOG_ERR, "test_etmem_log_error_level\n");
+ CU_ASSERT_EQUAL(etmemd_init_log_level(ETMEMD_LOG_INVAL), -1);
+ etmemd_log(ETMEMD_LOG_INVAL, "test_etmem_log_interval_level\n");
+}
+
+typedef enum {
+ CUNIT_SCREEN = 0,
+ CUNIT_XMLFILE,
+ CUNIT_CONSOLE
+} cu_run_mode;
+
+int main(int argc, const char **argv)
+{
+ CU_pSuite suite;
+ CU_pTest pTest;
+ unsigned int num_failures;
+ cu_run_mode cunit_mode = CUNIT_SCREEN;
+ int error_num;
+
+ if (argc > 1) {
+ cunit_mode = atoi(argv[1]);
+ }
+
+ if (CU_initialize_registry() != CUE_SUCCESS) {
+ return -CU_get_error();
+ }
+
+ suite = CU_add_suite("etmem_log_ops", NULL, NULL);
+ if (suite == NULL) {
+ goto ERROR;
+ }
+
+ if (CU_ADD_TEST(suite, test_basic_log_level) == NULL ||
+ CU_ADD_TEST(suite, test_etmem_log_print) == NULL) {
+ printf("CU_ADD_TEST fail. \n");
+ goto ERROR;
+ }
+
+ switch (cunit_mode) {
+ case CUNIT_SCREEN:
+ CU_basic_set_mode(CU_BRM_VERBOSE);
+ CU_basic_run_tests();
+ break;
+ case CUNIT_XMLFILE:
+ CU_set_output_filename("etmemd_log.c");
+ CU_automated_run_tests();
+ break;
+ case CUNIT_CONSOLE:
+ CU_console_run_tests();
+ break;
+ default:
+ printf("not support cunit mode, only support: "
+ "0 for CUNIT_SCREEN, 1 for CUNIT_XMLFILE, 2 for CUNIT_CONSOLE\n");
+ goto ERROR;
+ }
+
+ num_failures = CU_get_number_of_failures();
+ CU_cleanup_registry();
+ return num_failures;
+
+ERROR:
+ error_num = CU_get_error();
+ CU_cleanup_registry();
+ return -error_num;
+}
diff --git a/etmem/test/etmem_project_ops_llt_test/CMakeLists.txt b/etmem/test/etmem_project_ops_llt_test/CMakeLists.txt
index 70cd530..ff3f310 100644
--- a/etmem/test/etmem_project_ops_llt_test/CMakeLists.txt
+++ b/etmem/test/etmem_project_ops_llt_test/CMakeLists.txt
@@ -22,7 +22,6 @@ INCLUDE_DIRECTORIES(${GLIB2_INCLUDE_DIRS})
SET(EXE etmem_project_ops_llt)
-add_executable(${EXE}
-etmem_project_ops_llt.c)
+add_executable(${EXE} etmem_project_ops_llt.c)
target_link_libraries(${EXE} cunit ${BUILD_DIR}/lib/libetmemd.so ${BUILD_DIR}/lib/libtest.so pthread dl rt boundscheck numa ${GLIB2_LIBRARIES})
diff --git a/etmem/test/etmem_project_ops_llt_test/etmem_project_ops_llt.c b/etmem/test/etmem_project_ops_llt_test/etmem_project_ops_llt.c
index edd2330..a01e8e8 100644
--- a/etmem/test/etmem_project_ops_llt_test/etmem_project_ops_llt.c
+++ b/etmem/test/etmem_project_ops_llt_test/etmem_project_ops_llt.c
@@ -453,7 +453,8 @@ int main(int argc, const char **argv)
CU_console_run_tests();
break;
default:
- printf("not support cunit mode, only support: 0 or 1\n");
+ printf("not support cunit mode, only support: "
+ "0 for CUNIT_SCREEN, 1 for CUNIT_XMLFILE, 2 for CUNIT_CONSOLE\n");
goto ERROR;
}
diff --git a/etmem/test/etmem_scan_ops_llt_test/CMakeLists.txt b/etmem/test/etmem_scan_ops_llt_test/CMakeLists.txt
index c6ff96c..b5378b8 100644
--- a/etmem/test/etmem_scan_ops_llt_test/CMakeLists.txt
+++ b/etmem/test/etmem_scan_ops_llt_test/CMakeLists.txt
@@ -21,8 +21,6 @@ INCLUDE_DIRECTORIES(${GLIB2_INCLUDE_DIRS})
SET(EXE etmem_scan_ops_llt)
-add_executable(etmem_scan_ops_llt
- etmem_scan_ops_llt.c
- )
+add_executable(${EXE} etmem_scan_ops_llt.c)
target_link_libraries(${EXE} cunit ${BUILD_DIR}/lib/libetmemd.so pthread dl rt libboundscheck numa ${GLIB2_LIBRARIES})
diff --git a/etmem/test/etmem_scan_ops_llt_test/etmem_scan_ops_llt.c b/etmem/test/etmem_scan_ops_llt_test/etmem_scan_ops_llt.c
index 1856072..0cd2ecc 100644
--- a/etmem/test/etmem_scan_ops_llt_test/etmem_scan_ops_llt.c
+++ b/etmem/test/etmem_scan_ops_llt_test/etmem_scan_ops_llt.c
@@ -368,7 +368,8 @@ int main(int argc, const char **argv)
CU_console_run_tests();
break;
default:
- printf("not support cunit mode, only support: 0 or 1\n");
+ printf("not support cunit mode, only support: "
+ "0 for CUNIT_SCREEN, 1 for CUNIT_XMLFILE, 2 for CUNIT_CONSOLE\n");
goto ERROR;
}
--
1.8.3.1

View File

@ -1,29 +0,0 @@
From 31731fdc3fbd8afd8daeba2138344568cbd6a238 Mon Sep 17 00:00:00 2001
From: liubo <liubo254@huawei.com>
Date: Tue, 21 Dec 2021 21:16:52 +0800
Subject: [PATCH 10/33] add make install support to CMakeList
---
etmem/CMakeLists.txt | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/etmem/CMakeLists.txt b/etmem/CMakeLists.txt
index b5eb83e..9fba791 100644
--- a/etmem/CMakeLists.txt
+++ b/etmem/CMakeLists.txt
@@ -123,3 +123,12 @@ if( ${ARCHITECTURE} STREQUAL "aarch64" )
else()
target_compile_options(etmemd_scan PRIVATE -march=core-avx-i -m64)
endif()
+
+install(TARGETS etmem etmemd
+ PERMISSIONS OWNER_READ OWNER_EXECUTE
+ RUNTIME DESTINATION /usr/bin)
+
+install(DIRECTORY ${PROJECT_SOURCE_DIR}/conf/
+ DIRECTORY_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE
+ FILE_PERMISSIONS OWNER_READ OWNER_WRITE
+ DESTINATION /etc/etmem)
--
1.8.3.1

File diff suppressed because it is too large Load Diff

View File

@ -1,58 +0,0 @@
From 37264d5a2f7fe27092b0f8d2e834a70e3108a68d Mon Sep 17 00:00:00 2001
From: liubo <liubo254@huawei.com>
Date: Sat, 15 Jan 2022 15:01:47 +0800
Subject: [PATCH 12/33] fix etmem build problem
---
etmem/src/etmemd_src/etmemd_memdcd.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/etmem/src/etmemd_src/etmemd_memdcd.c b/etmem/src/etmemd_src/etmemd_memdcd.c
index 28590e2..7e2f657 100644
--- a/etmem/src/etmemd_src/etmemd_memdcd.c
+++ b/etmem/src/etmemd_src/etmemd_memdcd.c
@@ -243,6 +243,7 @@ static struct page_refs *memdcd_do_scan(const struct task_pid *tpid, const struc
int ret = 0;
char pid[PID_STR_MAX_LEN] = {0};
char *us = "us";
+ struct page_scan *page_scan = NULL;
if(tpid == NULL) {
etmemd_log(ETMEMD_LOG_ERR, "task pid is null\n");
@@ -254,6 +255,8 @@ static struct page_refs *memdcd_do_scan(const struct task_pid *tpid, const struc
return NULL;
}
+ page_scan = (struct page_scan *)tk->eng->proj->scan_param;
+
if (snprintf_s(pid, PID_STR_MAX_LEN, PID_STR_MAX_LEN - 1, "%u", tpid->pid) <= 0) {
etmemd_log(ETMEMD_LOG_ERR, "snprintf pid fail %u", tpid->pid);
return NULL;
@@ -266,7 +269,7 @@ static struct page_refs *memdcd_do_scan(const struct task_pid *tpid, const struc
}
/* loop for scanning idle_pages to get result of memory access. */
- for (i = 0; i < tk->eng->proj->loop; i++) {
+ for (i = 0; i < page_scan->loop; i++) {
ret = get_page_refs(vmas, pid, &page_refs, NULL, 0);
if (ret != 0) {
etmemd_log(ETMEMD_LOG_ERR, "scan operation failed\n");
@@ -275,7 +278,7 @@ static struct page_refs *memdcd_do_scan(const struct task_pid *tpid, const struc
page_refs = NULL;
break;
}
- sleep((unsigned)tk->eng->proj->sleep);
+ sleep((unsigned)page_scan->sleep);
}
free_vmas(vmas);
@@ -419,4 +422,4 @@ int fill_engine_type_memdcd(struct engine *eng, GKeyFile *config)
eng->engine_type = MEMDCD_ENGINE;
eng->name = "memdcd";
return 0;
-}
\ No newline at end of file
+}
--
1.8.3.1

View File

@ -1,864 +0,0 @@
From 95029b0ae49082d660330042c6c2becc9133124d Mon Sep 17 00:00:00 2001
From: liubo <liubo254@huawei.com>
Date: Thu, 3 Mar 2022 10:25:08 +0800
Subject: [PATCH 13/33] etmem: add code of testcase
add code of testcase for etmem scan function
add code of testcase for etmem threadpool function
add code of testcase for etmem threadtimer function
Signed-off-by: liubo <liubo254@huawei.com>
---
.../etmem_scan_ops_export_llt_test/CMakeLists.txt | 26 ++
.../etmem_scan_ops_export_llt.c | 279 +++++++++++++++++++++
.../etmem_threadpool_ops_llt_test/CMakeLists.txt | 26 ++
.../etmem_threadpool_ops_llt.c | 260 +++++++++++++++++++
etmem/test/etmem_timer_ops_llt_test/CMakeLists.txt | 26 ++
.../etmem_timer_ops_llt_test/etmem_timer_ops_llt.c | 183 ++++++++++++++
6 files changed, 800 insertions(+)
create mode 100644 etmem/test/etmem_scan_ops_export_llt_test/CMakeLists.txt
create mode 100644 etmem/test/etmem_scan_ops_export_llt_test/etmem_scan_ops_export_llt.c
create mode 100644 etmem/test/etmem_threadpool_ops_llt_test/CMakeLists.txt
create mode 100644 etmem/test/etmem_threadpool_ops_llt_test/etmem_threadpool_ops_llt.c
create mode 100644 etmem/test/etmem_timer_ops_llt_test/CMakeLists.txt
create mode 100644 etmem/test/etmem_timer_ops_llt_test/etmem_timer_ops_llt.c
diff --git a/etmem/test/etmem_scan_ops_export_llt_test/CMakeLists.txt b/etmem/test/etmem_scan_ops_export_llt_test/CMakeLists.txt
new file mode 100644
index 0000000..be68154
--- /dev/null
+++ b/etmem/test/etmem_scan_ops_export_llt_test/CMakeLists.txt
@@ -0,0 +1,26 @@
+# /******************************************************************************
+# * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+# * etmem is licensed under the Mulan PSL v2.
+# * You can use this software according to the terms and conditions of the Mulan PSL v2.
+# * You may obtain a copy of Mulan PSL v2 at:
+# * http://license.coscl.org.cn/MulanPSL2
+# * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+# * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+# * PURPOSE.
+# * See the Mulan PSL v2 for more details.
+# * Author: shikemeng
+# * Create: 2021-11-30
+# * Description: CMakefileList for etmem_scan_ops_llt_test
+# ******************************************************************************/
+
+project(etmem)
+
+INCLUDE_DIRECTORIES(../../inc/etmem_inc)
+INCLUDE_DIRECTORIES(../../inc/etmemd_inc)
+INCLUDE_DIRECTORIES(${GLIB2_INCLUDE_DIRS})
+
+SET(EXE etmem_scan_ops_export_llt)
+
+add_executable(${EXE} etmem_scan_ops_export_llt.c)
+
+target_link_libraries(${EXE} cunit ${BUILD_DIR}/lib/libetmemd.so pthread dl rt libboundscheck numa ${GLIB2_LIBRARIES})
diff --git a/etmem/test/etmem_scan_ops_export_llt_test/etmem_scan_ops_export_llt.c b/etmem/test/etmem_scan_ops_export_llt_test/etmem_scan_ops_export_llt.c
new file mode 100644
index 0000000..e8e6098
--- /dev/null
+++ b/etmem/test/etmem_scan_ops_export_llt_test/etmem_scan_ops_export_llt.c
@@ -0,0 +1,279 @@
+/******************************************************************************
+ * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+ * etmem is licensed under the Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+ * PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * Author: yangkunlin
+ * Create: 2021-11-30
+ * Description: test for the export scan library
+ ******************************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <CUnit/Basic.h>
+#include <CUnit/Automated.h>
+#include <CUnit/Console.h>
+
+#include "etmemd_scan_export.h"
+
+/* normal init and exit */
+static void test_etmem_exp_scan_001(void)
+{
+ /* for test of exit without init*/
+ etmemd_scan_exit();
+
+ CU_ASSERT_EQUAL(etmemd_scan_init(), 0);
+ etmemd_scan_exit();
+}
+
+static void test_etmem_exp_scan_002(void)
+{
+ /* for test of exit without init*/
+ etmemd_scan_exit();
+
+ CU_ASSERT_EQUAL(etmemd_scan_init(), 0);
+
+ /* init again before exit */
+ CU_ASSERT_NOT_EQUAL(etmemd_scan_init(), 0);
+ etmemd_scan_exit();
+}
+
+static void check_vmas(struct vmas *vmas)
+{
+ int i;
+ struct vma *curr_vma = NULL;
+
+ CU_ASSERT_NOT_EQUAL(vmas->vma_cnt, 0);
+
+ curr_vma = vmas->vma_list;
+ for (i = 0; i < vmas->vma_cnt; i++) {
+ CU_ASSERT_PTR_NOT_NULL(curr_vma);
+ curr_vma = curr_vma->next;
+ }
+}
+
+/* test invalid get_vmas */
+static void test_etmem_exp_scan_004(void)
+{
+ const char *pid = "1";
+ char *vmflags_array[10] = {"rd"};
+ int vmflag_num = 1;
+ int is_anon_only = false;
+ struct vmas *vmas = NULL;
+
+ CU_ASSERT_EQUAL(etmemd_scan_init(), 0);
+
+ /* non-exist pid */
+ vmas = etmemd_get_vmas("0", vmflags_array, vmflag_num, is_anon_only);
+ CU_ASSERT_PTR_NULL(vmas);
+
+ /* pid is NULL */
+ vmas = etmemd_get_vmas(NULL, vmflags_array, vmflag_num, is_anon_only);
+ CU_ASSERT_PTR_NULL(vmas);
+
+ /* pid contains invalid characters */
+ vmas = etmemd_get_vmas("1-", vmflags_array, vmflag_num, is_anon_only);
+ CU_ASSERT_PTR_NULL(vmas);
+
+ /* vmflags contains space */
+ vmflags_array[0] = "r ";
+ vmas = etmemd_get_vmas(pid, vmflags_array, vmflag_num, is_anon_only);
+ CU_ASSERT_PTR_NULL(vmas);
+
+ /* vmflags length is not 2 */
+ vmflags_array[0] = "rd ";
+ vmas = etmemd_get_vmas(pid, vmflags_array, vmflag_num, is_anon_only);
+ CU_ASSERT_PTR_NULL(vmas);
+
+ /* vmflags is NULL */
+ vmflags_array[0] = NULL;
+ vmas = etmemd_get_vmas(pid, vmflags_array, vmflag_num, is_anon_only);
+ CU_ASSERT_PTR_NULL(vmas);
+
+ /* test free is NULL */
+ vmas = NULL;
+ etmemd_free_vmas(vmas);
+
+ etmemd_scan_exit();
+}
+
+
+/* test valid get_vmas */
+static void test_etmem_exp_scan_003(void)
+{
+ const char *pid = "1";
+ char *vmflags_array[10] = {"rd"};
+ int vmflag_num = 1;
+ int is_anon_only = false;
+ struct vmas *vmas = NULL;
+ struct vma *curr_vma = NULL;
+ int i;
+
+ /* get vmas without init */
+ vmas = etmemd_get_vmas(pid, vmflags_array, vmflag_num, is_anon_only);
+ CU_ASSERT_PTR_NOT_NULL(vmas);
+ check_vmas(vmas);
+ etmemd_free_vmas(vmas);
+
+ /* get vmas with init */
+ CU_ASSERT_EQUAL(etmemd_scan_init(), 0);
+ vmas = etmemd_get_vmas(pid, vmflags_array, vmflag_num, is_anon_only);
+ CU_ASSERT_PTR_NOT_NULL(vmas);
+ check_vmas(vmas);
+ etmemd_free_vmas(vmas);
+ etmemd_scan_exit();
+}
+
+/* test invalid get_page_refs */
+static void test_etmem_exp_scan_006(void)
+{
+ const char *pid = "1";
+ char *vmflags_array[10] = {"rd"};
+ int vmflag_num = 1;
+ int is_anon_only = false;
+ struct vmas *vmas = NULL;
+ struct page_refs *page_refs = NULL;
+ int flags = SCAN_AS_HUGE | SCAN_IGN_HOST;
+
+ CU_ASSERT_EQUAL(etmemd_scan_init(), 0);
+
+ /* free null pointer */
+ etmemd_free_page_refs(page_refs);
+
+ /* vmas is NULL */
+ CU_ASSERT_EQUAL(etmemd_get_page_refs(vmas, pid, &page_refs, flags), -1);
+
+ /* vmas address range invalid*/
+ vmas = (struct vmas *)calloc(1, sizeof(struct vmas));
+ CU_ASSERT_PTR_NOT_NULL(vmas);
+ vmas->vma_cnt = 1;
+
+ struct vma *vma = (struct vma *)calloc(1, sizeof(struct vma));
+ CU_ASSERT_PTR_NOT_NULL(vma);
+ vma->start = 0x0ff;
+ vma->end = 0x000;
+ vma->next = NULL;
+ vmas->vma_list = vma;
+
+ CU_ASSERT_EQUAL(etmemd_get_page_refs(vmas, pid, &page_refs, flags), -1);
+ etmemd_free_vmas(vmas);
+
+ vmas = etmemd_get_vmas(pid, vmflags_array, vmflag_num, is_anon_only);
+ CU_ASSERT_PTR_NOT_NULL(vmas);
+ check_vmas(vmas);
+
+ /* pid not exist */
+ CU_ASSERT_EQUAL(etmemd_get_page_refs(vmas, "0", &page_refs, flags), -1);
+ CU_ASSERT_PTR_NULL(page_refs);
+
+ /* pid is NULL */
+ CU_ASSERT_EQUAL(etmemd_get_page_refs(vmas, NULL, &page_refs, flags), -1);
+ CU_ASSERT_PTR_NULL(page_refs);
+
+ /* pid contains invalid chars */
+ CU_ASSERT_EQUAL(etmemd_get_page_refs(vmas, "--", &page_refs, flags), -1);
+ CU_ASSERT_PTR_NULL(page_refs);
+
+ etmemd_free_page_refs(page_refs);
+ etmemd_free_vmas(vmas);
+ etmemd_scan_exit();
+}
+
+/* test valid get_page_refs */
+static void test_etmem_exp_scan_005(void)
+{
+ CU_ASSERT_EQUAL(etmemd_scan_init(), 0);
+
+ const char *pid = "1";
+ char *vmflags_array[10] = {"rd"};
+ int vmflag_num = 1;
+ int is_anon_only = false;
+ struct vmas *vmas = NULL;
+ struct page_refs *page_refs = NULL;
+ int flags = SCAN_AS_HUGE | SCAN_IGN_HOST;
+
+ vmas = etmemd_get_vmas(pid, vmflags_array, vmflag_num, is_anon_only);
+ CU_ASSERT_PTR_NOT_NULL(vmas);
+ check_vmas(vmas);
+
+ CU_ASSERT_EQUAL(etmemd_get_page_refs(vmas, pid, &page_refs, flags), 0);
+ CU_ASSERT_PTR_NOT_NULL(page_refs);
+
+ etmemd_scan_exit();
+
+ /* get_page_refs after exit */
+ CU_ASSERT_NOT_EQUAL(etmemd_get_page_refs(vmas, pid, &page_refs, flags), 0);
+
+ etmemd_free_page_refs(page_refs);
+ etmemd_free_vmas(vmas);
+}
+
+typedef enum {
+ CUNIT_SCREEN = 0,
+ CUNIT_XMLFILE,
+ CUNIT_CONSOLE
+} cu_run_mode;
+
+int main(int argc, const char **argv)
+{
+ CU_pSuite suite;
+ CU_pTest pTest;
+ unsigned int num_failures;
+ cu_run_mode cunit_mode = CUNIT_SCREEN;
+ int error_num;
+
+ if (argc > 1) {
+ cunit_mode = atoi(argv[1]);
+ }
+
+ if (CU_initialize_registry() != CUE_SUCCESS) {
+ return CU_get_error();
+ }
+
+ suite = CU_add_suite("etmem_scan_ops_exp", NULL, NULL);
+ if (suite == NULL) {
+ goto ERROR;
+ }
+
+ if (CU_ADD_TEST(suite, test_etmem_exp_scan_001) == NULL ||
+ CU_ADD_TEST(suite, test_etmem_exp_scan_002) == NULL ||
+ CU_ADD_TEST(suite, test_etmem_exp_scan_003) == NULL ||
+ CU_ADD_TEST(suite, test_etmem_exp_scan_004) == NULL ||
+ CU_ADD_TEST(suite, test_etmem_exp_scan_005) == NULL ||
+ CU_ADD_TEST(suite, test_etmem_exp_scan_006) == NULL) {
+ goto ERROR;
+ }
+
+ switch (cunit_mode) {
+ case CUNIT_SCREEN:
+ CU_basic_set_mode(CU_BRM_VERBOSE);
+ CU_basic_run_tests();
+ break;
+ case CUNIT_XMLFILE:
+ CU_set_output_filename("etmemd_scan.c");
+ CU_automated_run_tests();
+ break;
+ case CUNIT_CONSOLE:
+ CU_console_run_tests();
+ break;
+ default:
+ printf("not support cunit mode, only support: "
+ "0 for CUNIT_SCREEN, 1 for CUNIT_XMLFILE, 2 for CUNIT_CONSOLE\n");
+ goto ERROR;
+ }
+
+ num_failures = CU_get_number_of_failures();
+ CU_cleanup_registry();
+ return num_failures;
+
+ERROR:
+ error_num = CU_get_error();
+ CU_cleanup_registry();
+ return -error_num;
+}
diff --git a/etmem/test/etmem_threadpool_ops_llt_test/CMakeLists.txt b/etmem/test/etmem_threadpool_ops_llt_test/CMakeLists.txt
new file mode 100644
index 0000000..cb084cf
--- /dev/null
+++ b/etmem/test/etmem_threadpool_ops_llt_test/CMakeLists.txt
@@ -0,0 +1,26 @@
+# /******************************************************************************
+# * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+# * etmem is licensed under the Mulan PSL v2.
+# * You can use this software according to the terms and conditions of the Mulan PSL v2.
+# * You may obtain a copy of Mulan PSL v2 at:
+# * http://license.coscl.org.cn/MulanPSL2
+# * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+# * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+# * PURPOSE.
+# * See the Mulan PSL v2 for more details.
+# * Author: liubo
+# * Create: 2021-11-30
+# * Description: CMakefileList for etmem_threadpool_ops_llt_test
+# ******************************************************************************/
+
+project(etmem)
+
+INCLUDE_DIRECTORIES(../../inc/etmem_inc)
+INCLUDE_DIRECTORIES(../../inc/etmemd_inc)
+INCLUDE_DIRECTORIES(${GLIB2_INCLUDE_DIRS})
+
+SET(EXE etmem_threadpool_ops_llt)
+
+add_executable(${EXE} etmem_threadpool_ops_llt.c)
+
+target_link_libraries(${EXE} cunit ${BUILD_DIR}/lib/libetmemd.so pthread dl rt libboundscheck numa ${GLIB2_LIBRARIES})
diff --git a/etmem/test/etmem_threadpool_ops_llt_test/etmem_threadpool_ops_llt.c b/etmem/test/etmem_threadpool_ops_llt_test/etmem_threadpool_ops_llt.c
new file mode 100644
index 0000000..9917954
--- /dev/null
+++ b/etmem/test/etmem_threadpool_ops_llt_test/etmem_threadpool_ops_llt.c
@@ -0,0 +1,260 @@
+/******************************************************************************
+ * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+ * etmem is licensed under the Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+ * PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * Author: liubo
+ * Create: 2020-08-13
+ * Description: test for etmem threadpool operations
+ ******************************************************************************/
+#include <sys/file.h>
+#include <sys/sysinfo.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+#include <unistd.h>
+#include <limits.h>
+#include <glib.h>
+#include <pthread.h>
+
+#include <CUnit/Basic.h>
+#include <CUnit/Automated.h>
+#include <CUnit/Console.h>
+
+#include "etmemd_threadpool.h"
+#include "etmemd_pool_adapter.h"
+#include "etmemd_project.h"
+#include "etmemd_file.h"
+#include "etmemd_common.h"
+#include "etmemd_engine.h"
+#include "etmemd_slide.h"
+#include "etmemd_cslide.h"
+#include "securec.h"
+
+#define ADD_WORKER_NUM 100
+typedef void *(*add_worker_exector)(void *);
+
+static struct task_executor g_test_exec;
+static int g_task_exe_time = 0;
+static struct engine_ops g_test_eng_ops = {
+ .alloc_pid_params = NULL,
+ .free_pid_params = NULL,
+};
+
+static void get_threadpool_create_num(int num, int exp)
+{
+ thread_pool *pool = NULL;
+
+ pool = threadpool_create(num);
+ CU_ASSERT_PTR_NOT_NULL(pool);
+
+ CU_ASSERT_EQUAL(pool->max_thread_cap, exp);
+ threadpool_stop_and_destroy(&pool);
+}
+
+static void test_threadpool_create(void)
+{
+ int core = get_nprocs();
+
+ get_threadpool_create_num(1, 1);
+ get_threadpool_create_num(2, 2);
+ get_threadpool_create_num(2 * core, 2 * core);
+ get_threadpool_create_num(2 * core + 1, 2 * core + 1);
+
+ threadpool_notify(NULL);
+ threadpool_reset_status(NULL);
+}
+
+static void test_threadpool_delete(void)
+{
+ thread_pool *pool = NULL;
+ threadpool_stop_and_destroy(&pool);
+
+ pool = threadpool_create(1);
+ CU_ASSERT_PTR_NOT_NULL(pool);
+
+ threadpool_stop_and_destroy(&pool);
+ CU_ASSERT_PTR_NULL(pool);
+}
+
+static void *add_worker_fun(void *str)
+{
+ char *temp_str = str;
+ printf("str: %s \n", temp_str);
+ return NULL;
+}
+
+static unsigned int get_workerlist_num(const thread_pool *pool)
+{
+ unsigned int num = 0;
+ thread_worker *worker = pool->worker_list;
+
+ while (worker) {
+ num++;
+ worker = worker->next_node;
+ }
+
+ return num;
+}
+
+static void test_thpool_addwk_single(void)
+{
+ char *args = "for add worker test.\n";
+ thread_pool *pool = NULL;
+ add_worker_exector exector = add_worker_fun;
+
+ pool = threadpool_create(1);
+ CU_ASSERT_PTR_NOT_NULL(pool);
+
+ CU_ASSERT_EQUAL(threadpool_add_worker(pool, NULL, NULL), -1);
+ CU_ASSERT_EQUAL(threadpool_add_worker(pool, exector, NULL), -1);
+ CU_ASSERT_EQUAL(threadpool_add_worker(pool, NULL, args), -1);
+ CU_ASSERT_EQUAL(threadpool_add_worker(pool, exector, args), 0);
+
+ CU_ASSERT_PTR_NOT_NULL(pool->worker_list);
+ CU_ASSERT_EQUAL(get_workerlist_num(pool), 1);
+
+ threadpool_stop_and_destroy(&pool);
+ CU_ASSERT_PTR_NULL(pool);
+}
+
+static void test_thpool_addwk_mul(void)
+{
+ char *args = "for add worker test.\n";
+ thread_pool *pool = NULL;
+ int add_num;
+ add_worker_exector exector = add_worker_fun;
+
+ pool = threadpool_create(1);
+ CU_ASSERT_PTR_NOT_NULL(pool);
+
+ for (add_num = 0; add_num < ADD_WORKER_NUM; add_num++) {
+ CU_ASSERT_EQUAL(threadpool_add_worker(pool, exector, args), 0);
+ }
+
+ CU_ASSERT_PTR_NOT_NULL(pool->worker_list);
+ CU_ASSERT_EQUAL(__atomic_load_n(&pool->scheduing_size, __ATOMIC_SEQ_CST), ADD_WORKER_NUM);
+
+ threadpool_stop_and_destroy(&pool);
+ CU_ASSERT_PTR_NULL(pool);
+}
+
+static void init_thpool_objs(struct project *proj, struct engine *eng, struct task *tk)
+{
+ proj->interval = 1;
+ proj->start = true;
+ proj->name = "test_project";
+ eng->proj = proj;
+ eng->ops = &g_test_eng_ops;
+ tk->eng = eng;
+ tk->type = "pid";
+ tk->value = "1";
+ tk->max_threads = 10;
+}
+
+static void test_thpool_start_error(void)
+{
+ struct task tk;
+ struct engine eng;
+ struct project proj;
+
+ init_thpool_objs(&proj, &eng, &tk);
+
+ tk.max_threads = 0;
+ g_test_exec.tk = &tk;
+
+ CU_ASSERT_EQUAL(start_threadpool_work(&g_test_exec), -1);
+}
+
+static void *task_executor(void *arg)
+{
+ g_task_exe_time++;
+ return NULL;
+}
+
+static void test_thpool_start_stop(void)
+{
+ struct task tk = {0};
+ struct engine eng = {0};
+ struct project proj = {0};
+
+ init_thpool_objs(&proj, &eng, &tk);
+
+ g_test_exec.tk = &tk;
+ g_test_exec.func = task_executor;
+
+ CU_ASSERT_EQUAL(start_threadpool_work(&g_test_exec), 0);
+ /* wait threadpool to work */
+ sleep(2);
+ stop_and_delete_threadpool_work(&tk);
+}
+
+typedef enum {
+ CUNIT_SCREEN = 0,
+ CUNIT_XMLFILE,
+ CUNIT_CONSOLE
+} cu_run_mode;
+
+int main(int argc, const char **argv)
+{
+ CU_pSuite suite;
+ CU_pTest pTest;
+ unsigned int num_failures;
+ cu_run_mode cunit_mode = CUNIT_SCREEN;
+ int error_num;
+
+ if (argc > 1) {
+ cunit_mode = atoi(argv[1]);
+ }
+
+ if (CU_initialize_registry() != CUE_SUCCESS) {
+ return CU_get_error();
+ }
+
+ suite = CU_add_suite("etmem_threadpool_ops", NULL, NULL);
+ if (suite == NULL) {
+ goto ERROR;
+ }
+
+ if (CU_ADD_TEST(suite, test_threadpool_create) == NULL ||
+ CU_ADD_TEST(suite, test_threadpool_delete) == NULL ||
+ CU_ADD_TEST(suite, test_thpool_addwk_single) == NULL ||
+ CU_ADD_TEST(suite, test_thpool_addwk_mul) == NULL ||
+ CU_ADD_TEST(suite, test_thpool_start_stop) == NULL ||
+ CU_ADD_TEST(suite, test_thpool_start_error) == NULL) {
+ goto ERROR;
+ }
+
+ switch (cunit_mode) {
+ case CUNIT_SCREEN:
+ CU_basic_set_mode(CU_BRM_VERBOSE);
+ CU_basic_run_tests();
+ break;
+ case CUNIT_XMLFILE:
+ CU_set_output_filename("etmemd_threadpool.c");
+ CU_automated_run_tests();
+ break;
+ case CUNIT_CONSOLE:
+ CU_console_run_tests();
+ break;
+ default:
+ printf("not support cunit mode, only support: "
+ "0 for CUNIT_SCREEN, 1 for CUNIT_XMLFILE, 2 for CUNIT_CONSOLE\n");
+ goto ERROR;
+ }
+
+ num_failures = CU_get_number_of_failures();
+ CU_cleanup_registry();
+ return num_failures;
+
+ERROR:
+ error_num = CU_get_error();
+ CU_cleanup_registry();
+ return -error_num;
+}
diff --git a/etmem/test/etmem_timer_ops_llt_test/CMakeLists.txt b/etmem/test/etmem_timer_ops_llt_test/CMakeLists.txt
new file mode 100644
index 0000000..76aa48e
--- /dev/null
+++ b/etmem/test/etmem_timer_ops_llt_test/CMakeLists.txt
@@ -0,0 +1,26 @@
+# /******************************************************************************
+# * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+# * etmem is licensed under the Mulan PSL v2.
+# * You can use this software according to the terms and conditions of the Mulan PSL v2.
+# * You may obtain a copy of Mulan PSL v2 at:
+# * http://license.coscl.org.cn/MulanPSL2
+# * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+# * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+# * PURPOSE.
+# * See the Mulan PSL v2 for more details.
+# * Author: liubo
+# * Create: 2021-11-30
+# * Description: CMakefileList for etmem_timer_ops_llt_test
+# ******************************************************************************/
+
+project(etmem)
+
+INCLUDE_DIRECTORIES(../../inc/etmem_inc)
+INCLUDE_DIRECTORIES(../../inc/etmemd_inc)
+INCLUDE_DIRECTORIES(${GLIB2_INCLUDE_DIRS})
+
+SET(EXE etmem_timer_ops_llt)
+
+add_executable(${EXE} etmem_timer_ops_llt.c)
+
+target_link_libraries(${EXE} cunit ${BUILD_DIR}/lib/libetmemd.so pthread dl rt libboundscheck numa ${GLIB2_LIBRARIES})
diff --git a/etmem/test/etmem_timer_ops_llt_test/etmem_timer_ops_llt.c b/etmem/test/etmem_timer_ops_llt_test/etmem_timer_ops_llt.c
new file mode 100644
index 0000000..c97cdf9
--- /dev/null
+++ b/etmem/test/etmem_timer_ops_llt_test/etmem_timer_ops_llt.c
@@ -0,0 +1,183 @@
+/******************************************************************************
+ * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+ * etmem is licensed under the Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+ * PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * Author: liubo
+ * Create: 2020-08-13
+ * Description: test for etmem timer operations
+ ******************************************************************************/
+#include <sys/file.h>
+#include <sys/sysinfo.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+#include <unistd.h>
+
+#include <CUnit/Basic.h>
+#include <CUnit/Automated.h>
+#include <CUnit/Console.h>
+
+#include "etmemd_threadtimer.h"
+
+static int g_timer_exec_time = 0;
+
+typedef void *(*timer_exector)(void *);
+
+static void get_timer_expired_time(int time, int exp)
+{
+ timer_thread *timer = NULL;
+
+ timer = thread_timer_create(time);
+ CU_ASSERT_PTR_NOT_NULL(timer);
+
+ CU_ASSERT_EQUAL(timer->expired_time, exp);
+ thread_timer_destroy(&timer);
+}
+
+static void test_timer_create_delete(void)
+{
+ timer_thread *timer = NULL;
+ thread_timer_destroy(&timer);
+
+ get_timer_expired_time(1, 1);
+ get_timer_expired_time(2, 2);
+ get_timer_expired_time(50, 50);
+ get_timer_expired_time(1199, 1199);
+ get_timer_expired_time(1201, 1201);
+}
+
+static void *threadtimer_exector(void *str)
+{
+ char *temp_str = str;
+ printf("threadtimer_exector: %s\n", temp_str);
+ g_timer_exec_time++;
+ return NULL;
+}
+
+static void test_timer_start_error(void)
+{
+ char *timer_args = "for timer start test.\n";
+ timer_exector exector = threadtimer_exector;
+ timer_thread *timer = NULL;
+
+ timer = thread_timer_create(60);
+ CU_ASSERT_PTR_NOT_NULL(timer);
+
+ CU_ASSERT_EQUAL(thread_timer_start(NULL, NULL, NULL), -1);
+ CU_ASSERT_EQUAL(thread_timer_start(timer, NULL, NULL), -1);
+ CU_ASSERT_EQUAL(thread_timer_start(timer, exector, NULL), -1);
+ CU_ASSERT_EQUAL(thread_timer_start(timer, NULL, timer_args), -1);
+ CU_ASSERT_EQUAL(thread_timer_start(timer, exector, timer_args), 0);
+ CU_ASSERT_FALSE(timer->down);
+ CU_ASSERT_EQUAL(thread_timer_start(timer, exector, timer_args), 0);
+
+ thread_timer_destroy(&timer);
+ thread_timer_stop(timer);
+}
+
+static void test_timer_start_ok(void)
+{
+ char *timer_args = "for timer start test.\n";
+ timer_exector exector = threadtimer_exector;
+ timer_thread *timer = NULL;
+
+ timer = thread_timer_create(1);
+ CU_ASSERT_PTR_NOT_NULL(timer);
+
+ CU_ASSERT_EQUAL(thread_timer_start(timer, exector, timer_args), 0);
+ CU_ASSERT_FALSE(timer->down);
+
+ sleep(2);
+ CU_ASSERT_NOT_EQUAL(g_timer_exec_time, 0);
+
+ thread_timer_stop(timer);
+ thread_timer_destroy(&timer);
+}
+
+static void test_timer_stop(void)
+{
+ char *timer_args = "for timer start test.\n";
+ timer_exector exector = threadtimer_exector;
+ timer_thread *timer = NULL;
+
+ thread_timer_stop(timer);
+
+ timer = thread_timer_create(60);
+ CU_ASSERT_PTR_NOT_NULL(timer);
+
+ CU_ASSERT_EQUAL(thread_timer_start(timer, exector, timer_args), 0);
+ CU_ASSERT_FALSE(timer->down);
+
+ thread_timer_stop(timer);
+ CU_ASSERT_TRUE(timer->down);
+ thread_timer_destroy(&timer);
+}
+
+typedef enum {
+ CUNIT_SCREEN = 0,
+ CUNIT_XMLFILE,
+ CUNIT_CONSOLE
+} cu_run_mode;
+
+int main(int argc, const char **argv)
+{
+ CU_pSuite suite;
+ CU_pTest pTest;
+ unsigned int num_failures;
+ cu_run_mode cunit_mode = CUNIT_SCREEN;
+ int error_num;
+
+ if (argc > 1) {
+ cunit_mode = atoi(argv[1]);
+ }
+
+ if (CU_initialize_registry() != CUE_SUCCESS) {
+ return CU_get_error();
+ }
+
+ suite = CU_add_suite("etmem_timer_ops", NULL, NULL);
+ if (suite == NULL) {
+ goto ERROR;
+ }
+
+ if (CU_ADD_TEST(suite, test_timer_create_delete) == NULL ||
+ CU_ADD_TEST(suite, test_timer_start_error) == NULL ||
+ CU_ADD_TEST(suite, test_timer_start_ok) == NULL ||
+ CU_ADD_TEST(suite, test_timer_stop) == NULL) {
+ goto ERROR;
+ }
+
+ switch (cunit_mode) {
+ case CUNIT_SCREEN:
+ CU_basic_set_mode(CU_BRM_VERBOSE);
+ CU_basic_run_tests();
+ break;
+ case CUNIT_XMLFILE:
+ CU_set_output_filename("etmemd_threadtimer.c");
+ CU_automated_run_tests();
+ break;
+ case CUNIT_CONSOLE:
+ CU_console_run_tests();
+ break;
+ default:
+ printf("not support cunit mode, only support: "
+ "0 for CUNIT_SCREEN, 1 for CUNIT_XMLFILE, 2 for CUNIT_CONSOLE\n");
+ goto ERROR;
+ }
+
+ num_failures = CU_get_number_of_failures();
+ CU_cleanup_registry();
+ return num_failures;
+
+ERROR:
+ error_num = CU_get_error();
+ CU_cleanup_registry();
+ return -error_num;
+}
--
1.8.3.1

File diff suppressed because it is too large Load Diff

View File

@ -1,682 +0,0 @@
From 9018988c20ce1ee49d2d4458d85b72993ee39283 Mon Sep 17 00:00:00 2001
From: liubo <liubo254@huawei.com>
Date: Mon, 24 Jan 2022 03:02:41 +0800
Subject: [PATCH 15/33] etmem: add code of testcase
add code of testcase for etmem migrate functions
add testcase to etmem project function
Signed-off-by: liubo <liubo254@huawei.com>
---
etmem/test/common/test_common.c | 33 ++-
etmem/test/common/test_common.h | 72 ++++---
etmem/test/etmem_migrate_ops_llt/CMakeLists.txt | 27 +++
.../etmem_migrate_ops_llt/etmem_migrate_ops_llt.c | 226 +++++++++++++++++++++
.../etmem_project_ops_llt.c | 161 ++++++++++++++-
.../etmem_scan_ops_llt_test/etmem_scan_ops_llt.c | 4 +-
6 files changed, 484 insertions(+), 39 deletions(-)
create mode 100644 etmem/test/etmem_migrate_ops_llt/CMakeLists.txt
create mode 100644 etmem/test/etmem_migrate_ops_llt/etmem_migrate_ops_llt.c
diff --git a/etmem/test/common/test_common.c b/etmem/test/common/test_common.c
index 4551177..4bd3fc3 100644
--- a/etmem/test/common/test_common.c
+++ b/etmem/test/common/test_common.c
@@ -63,6 +63,18 @@ void construct_proj_file(struct proj_test_param *param)
if (param->sleep != NULL) {
CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_SLEEP, param->sleep), -1);
}
+ if (param->sysmem_threshold != NULL) {
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_SYSMEM_THRESHOLD,
+ param->sysmem_threshold), -1);
+ }
+ if (param->swapcache_high_wmark != NULL) {
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_SWAPCACHE_HIGH_WMARK,
+ param->swapcache_high_wmark), -1);
+ }
+ if (param->swapcache_low_wmark != NULL) {
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_SWAPCACHE_LOW_WMARK,
+ param->swapcache_low_wmark), -1);
+ }
fclose(file);
}
@@ -83,12 +95,15 @@ void init_proj_param(struct proj_test_param *param)
param->sleep = "1";
param->interval = "1";
param->loop = "1";
+ param->sysmem_threshold = NULL;
+ param->swapcache_high_wmark = NULL;
+ param->swapcache_low_wmark = NULL;
param->file_name = TMP_PROJ_CONFIG;
param->proj_name = DEFAULT_PROJ;
param->expt = OPT_SUCCESS;
}
-void do_add_proj_test(struct proj_test_param * param)
+void do_add_proj_test(struct proj_test_param *param)
{
GKeyFile *config = NULL;
@@ -155,16 +170,16 @@ void construct_task_file(struct task_test_param *param)
CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_NAME, param->name), -1);
}
if (param->proj != NULL) {
- CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_PROJ, param->name), -1);
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_PROJ, param->proj), -1);
}
if (param->eng != NULL) {
- CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_ENG, param->name), -1);
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_ENG, param->eng), -1);
}
if (param->type != NULL) {
- CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_TYPE, param->name), -1);
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_TYPE, param->type), -1);
}
if (param->value != NULL) {
- CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_VALUE, param->name), -1);
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_VALUE, param->value), -1);
}
fclose(file);
}
@@ -174,6 +189,8 @@ void init_slide_task(struct slide_task_test_param *param)
init_task_param(&param->task_param, "slide");
param->max_threads = "1";
param->T = "1";
+ param->swap_flag = NULL;
+ param->swap_threshold = NULL;
}
void add_slide_task(struct slide_task_test_param *param)
@@ -189,6 +206,12 @@ void add_slide_task(struct slide_task_test_param *param)
if (param->T != NULL) {
CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_T, param->T), -1);
}
+ if (param->swap_flag != NULL) {
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_SWAP_FLAG, param->swap_flag), -1);
+ }
+ if (param->swap_threshold != NULL) {
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_SWAP_THRESHOLD, param->swap_threshold), -1);
+ }
fclose(file);
}
diff --git a/etmem/test/common/test_common.h b/etmem/test/common/test_common.h
index 009c458..1ba20c7 100644
--- a/etmem/test/common/test_common.h
+++ b/etmem/test/common/test_common.h
@@ -20,43 +20,51 @@
#include "etmemd_project.h"
-#define CONFIG_NAME "name=%s\n"
-#define CONFIG_INTERVAL "interval=%s\n"
-#define CONFIG_LOOP "loop=%s\n"
-#define CONFIG_SLEEP "sleep=%s\n"
-#define TMP_PROJ_CONFIG "proj_tmp.config"
-#define DEFAULT_PROJ "default_proj"
-
-#define CONFIG_PROJ "project=%s\n"
-#define TMP_ENG_CONFIG "eng_tmp.config"
-
-#define CONFIG_ENG "engine=%s\n"
-#define CONFIG_TYPE "type=%s\n"
-#define CONFIG_VALUE "value=%s\n"
-#define TMP_TASK_CONFIG "task_tmp.config"
-#define DEFAULT_TASK "default_task"
-
-#define CONFIG_MAX_THREADS "max_threads=%s\n"
-#define CONFIG_T "T=%s\n"
-
-#define CONFIG_NODE_PAIR "node_pair=%s\n"
-#define CONFIG_THRESH "hot_threshold=%s\n"
-#define CONFIG_QUOTA "node_mig_quota=%s\n"
-#define CONFIG_RESV "node_hot_reserve=%s\n"
-
-#define CONFIG_VM_FLAGS "vm_flags=%s\n"
-#define CONFIG_ANON_ONLY "anon_only=%s\n"
-#define CONFIG_IGN_HOST "igno_host=%s\n"
-
-#define ONE_NODE_PAIR 2
-#define TWO_NODE_PAIR 4
-#define THREE_NODE_PAIR 5
+#define CONFIG_NAME "name=%s\n"
+#define CONFIG_INTERVAL "interval=%s\n"
+#define CONFIG_LOOP "loop=%s\n"
+#define CONFIG_SLEEP "sleep=%s\n"
+#define CONFIG_SYSMEM_THRESHOLD "sysmem_threshold=%s\n"
+#define CONFIG_SWAPCACHE_HIGH_WMARK "swapcache_high_wmark=%s\n"
+#define CONFIG_SWAPCACHE_LOW_WMARK "swapcache_low_wmark=%s\n"
+#define TMP_PROJ_CONFIG "proj_tmp.config"
+#define DEFAULT_PROJ "default_proj"
+
+#define CONFIG_PROJ "project=%s\n"
+#define TMP_ENG_CONFIG "eng_tmp.config"
+
+#define CONFIG_ENG "engine=%s\n"
+#define CONFIG_TYPE "type=%s\n"
+#define CONFIG_VALUE "value=%s\n"
+#define TMP_TASK_CONFIG "task_tmp.config"
+#define DEFAULT_TASK "default_task"
+
+#define CONFIG_MAX_THREADS "max_threads=%s\n"
+#define CONFIG_T "T=%s\n"
+#define CONFIG_SWAP_FLAG "swap_flag=%s\n"
+#define CONFIG_SWAP_THRESHOLD "swap_threshold=%s\n"
+
+#define CONFIG_NODE_PAIR "node_pair=%s\n"
+#define CONFIG_THRESH "hot_threshold=%s\n"
+#define CONFIG_QUOTA "node_mig_quota=%s\n"
+#define CONFIG_RESV "node_hot_reserve=%s\n"
+
+#define CONFIG_VM_FLAGS "vm_flags=%s\n"
+#define CONFIG_ANON_ONLY "anon_only=%s\n"
+#define CONFIG_IGN_HOST "ign_host=%s\n"
+
+#define ONE_NODE_PAIR 2
+#define TWO_NODE_PAIR 4
+#define THREE_NODE_PAIR 6
struct proj_test_param {
const char *sleep;
const char *interval;
const char *loop;
+ const char *sysmem_threshold;
+ const char *swapcache_high_wmark;
+ const char *swapcache_low_wmark;
const char *proj_name;
const char *file_name;
enum opt_result expt;
@@ -81,6 +89,8 @@ struct slide_task_test_param {
struct task_test_param task_param;
const char *max_threads;
const char *T;
+ const char *swap_flag;
+ const char *swap_threshold;
};
struct cslide_eng_test_param {
diff --git a/etmem/test/etmem_migrate_ops_llt/CMakeLists.txt b/etmem/test/etmem_migrate_ops_llt/CMakeLists.txt
new file mode 100644
index 0000000..a9487af
--- /dev/null
+++ b/etmem/test/etmem_migrate_ops_llt/CMakeLists.txt
@@ -0,0 +1,27 @@
+# /******************************************************************************
+# * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+# * etmem is licensed under the Mulan PSL v2.
+# * You can use this software according to the terms and conditions of the Mulan PSL v2.
+# * You may obtain a copy of Mulan PSL v2 at:
+# * http://license.coscl.org.cn/MulanPSL2
+# * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+# * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+# * PURPOSE.
+# * See the Mulan PSL v2 for more details.
+# * Author: liubo
+# * Create: 2021-12-10
+# * Description: CMakefileList for etmem_migrate_ops_llt to compile
+# ******************************************************************************/
+
+project(etmem)
+
+INCLUDE_DIRECTORIES(../../inc/etmem_inc)
+INCLUDE_DIRECTORIES(../../inc/etmemd_inc)
+INCLUDE_DIRECTORIES(${GLIB2_INCLUDE_DIRS})
+
+SET(EXE etmem_migrate_ops_llt)
+
+add_executable(${EXE} etmem_migrate_ops_llt.c)
+
+set_target_properties(${EXE} PROPERTIES LINK_FLAGS "-Wl,--wrap,get_mem_from_proc_file")
+target_link_libraries(${EXE} cunit ${BUILD_DIR}/lib/libetmemd.so pthread dl rt boundscheck numa ${GLIB2_LIBRARIES})
diff --git a/etmem/test/etmem_migrate_ops_llt/etmem_migrate_ops_llt.c b/etmem/test/etmem_migrate_ops_llt/etmem_migrate_ops_llt.c
new file mode 100644
index 0000000..2758680
--- /dev/null
+++ b/etmem/test/etmem_migrate_ops_llt/etmem_migrate_ops_llt.c
@@ -0,0 +1,226 @@
+/******************************************************************************
+ * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+ * etmem is licensed under the Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+ * PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * Author: liubo
+ * Create: 2021-08-14
+ * Description: This is a source file of the unit test for log functions in etmem.
+ ******************************************************************************/
+
+#include <sys/file.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "etmemd.h"
+#include "etmemd_migrate.h"
+#include "etmemd_scan.h"
+#include "etmemd_project_exp.h"
+#include "etmemd_engine_exp.h"
+#include "etmemd_task_exp.h"
+#include "etmemd_task.h"
+
+#include <CUnit/Basic.h>
+#include <CUnit/Automated.h>
+#include <CUnit/Console.h>
+
+#define WATER_LINE_TEMP 2
+
+/* Function replacement used for mock test. This function is used only in dt. */
+int get_mem_from_proc_file(const char *pid, const char *file_name,
+ unsigned long *data, const char *cmpstr)
+{
+ *data = 100;
+ return 0;
+}
+
+void init_task_pid_param(struct task_pid *param)
+{
+ param->pid = 1;
+ param->rt_swapin_rate = 0.0;
+ param->params = NULL;
+ param->next = NULL;
+}
+
+static struct memory_grade *get_memory_grade(void)
+{
+ struct memory_grade *memory_grade = NULL;
+ struct vmas *vmas = NULL;
+ struct page_refs *page_refs = NULL;
+ const char *pid = "1";
+
+ init_g_page_size();
+ vmas = get_vmas(pid);
+ CU_ASSERT_PTR_NOT_NULL(vmas);
+ CU_ASSERT_EQUAL(get_page_refs(vmas, pid, &page_refs, NULL, NULL), 0);
+ free(vmas);
+ vmas = NULL;
+
+ memory_grade = (struct memory_grade *)calloc(1, sizeof(struct memory_grade));
+ CU_ASSERT_PTR_NOT_NULL(memory_grade);
+
+ while (page_refs != NULL)
+ {
+ if ((page_refs)->count >= WATER_LINE_TEMP) {
+ page_refs = add_page_refs_into_memory_grade(page_refs, &memory_grade->hot_pages);
+ continue;
+ }
+ page_refs = add_page_refs_into_memory_grade(page_refs, &memory_grade->cold_pages);
+ }
+
+ return memory_grade;
+}
+
+static void test_etmem_migrate_error(void)
+{
+ struct memory_grade *memory_grade = NULL;
+
+ memory_grade = (struct memory_grade *)calloc(1, sizeof(struct memory_grade));
+ CU_ASSERT_PTR_NOT_NULL(memory_grade);
+
+ CU_ASSERT_EQUAL(etmemd_grade_migrate("", memory_grade), 0);
+ CU_ASSERT_EQUAL(etmemd_grade_migrate("no123", memory_grade), 0);
+
+ free(memory_grade);
+
+ memory_grade = get_memory_grade();
+ CU_ASSERT_PTR_NOT_NULL(memory_grade);
+ CU_ASSERT_EQUAL(etmemd_grade_migrate("", memory_grade), -1);
+ CU_ASSERT_EQUAL(etmemd_grade_migrate("no123", memory_grade), -1);
+
+ clean_memory_grade_unexpected(&memory_grade);
+ CU_ASSERT_PTR_NULL(memory_grade);
+}
+
+static void test_etmem_migrate_ok(void)
+{
+ struct memory_grade *memory_grade = NULL;
+
+ memory_grade = get_memory_grade();
+ CU_ASSERT_PTR_NOT_NULL(memory_grade);
+ CU_ASSERT_EQUAL(etmemd_grade_migrate("1", memory_grade), -1);
+
+ clean_memory_grade_unexpected(&memory_grade);
+ CU_ASSERT_PTR_NULL(memory_grade);
+}
+
+static void test_etmemd_reclaim_swapcache_error(void)
+{
+ struct project proj = {0};
+ struct engine eng = {0};
+ struct task tk = {0};
+ struct task_pid tk_pid = {0};
+
+ proj.swapcache_high_wmark = 5;
+ proj.swapcache_low_wmark = 3;
+ tk_pid.tk = &tk;
+ tk.eng = &eng;
+ eng.proj = &proj;
+
+ CU_ASSERT_EQUAL(etmemd_reclaim_swapcache(NULL), -1);
+
+ init_task_pid_param(&tk_pid);
+ tk_pid.pid = 0;
+ proj.wmark_set = false;
+ CU_ASSERT_EQUAL(etmemd_reclaim_swapcache(&tk_pid), -1);
+
+ tk_pid.pid = 0;
+ proj.wmark_set = true;
+ CU_ASSERT_EQUAL(etmemd_reclaim_swapcache(&tk_pid), -1);
+}
+
+static void test_etmemd_reclaim_swapcache_ok(void)
+{
+ struct project proj = {0};
+ struct engine eng = {0};
+ struct task tk = {0};
+ struct task_pid tk_pid = {0};
+
+ tk_pid.tk = &tk;
+ tk.eng = &eng;
+ eng.proj = &proj;
+
+ init_task_pid_param(&tk_pid);
+ proj.swapcache_high_wmark = -1;
+ proj.swapcache_low_wmark = -1;
+ CU_ASSERT_EQUAL(etmemd_reclaim_swapcache(&tk_pid), 0);
+
+ proj.swapcache_high_wmark = 100;
+ proj.swapcache_low_wmark = 3;
+ CU_ASSERT_EQUAL(etmemd_reclaim_swapcache(&tk_pid), 0);
+
+ init_task_pid_param(&tk_pid);
+ proj.swapcache_high_wmark = 5;
+ proj.swapcache_low_wmark = 3;
+ proj.wmark_set = false;
+ CU_ASSERT_EQUAL(etmemd_reclaim_swapcache(&tk_pid), 0);
+}
+
+typedef enum {
+ CUNIT_SCREEN = 0,
+ CUNIT_XMLFILE,
+ CUNIT_CONSOLE
+} cu_run_mode;
+
+int main(int argc, const char **argv)
+{
+ CU_pSuite suite;
+ CU_pTest pTest;
+ unsigned int num_failures;
+ cu_run_mode cunit_mode = CUNIT_SCREEN;
+ int error_num;
+
+ if (argc > 1) {
+ cunit_mode = atoi(argv[1]);
+ }
+
+ if (CU_initialize_registry() != CUE_SUCCESS) {
+ return -CU_get_error();
+ }
+
+ suite = CU_add_suite("etmem_migrate_ops", NULL, NULL);
+ if (suite == NULL) {
+ goto ERROR;
+ }
+
+ if (CU_ADD_TEST(suite, test_etmem_migrate_error) == NULL ||
+ CU_ADD_TEST(suite, test_etmem_migrate_ok) == NULL ||
+ CU_ADD_TEST(suite, test_etmemd_reclaim_swapcache_error) == NULL ||
+ CU_ADD_TEST(suite, test_etmemd_reclaim_swapcache_ok) == NULL) {
+ printf("CU_ADD_TEST fail. \n");
+ goto ERROR;
+ }
+
+ switch (cunit_mode) {
+ case CUNIT_SCREEN:
+ CU_basic_set_mode(CU_BRM_VERBOSE);
+ CU_basic_run_tests();
+ break;
+ case CUNIT_XMLFILE:
+ CU_set_output_filename("etmemd_migrate.c");
+ CU_automated_run_tests();
+ break;
+ case CUNIT_CONSOLE:
+ CU_console_run_tests();
+ break;
+ default:
+ printf("not support cunit mode, only support: "
+ "0 for CUNIT_SCREEN, 1 for CUNIT_XMLFILE, 2 for CUNIT_CONSOLE\n");
+ goto ERROR;
+ }
+
+ num_failures = CU_get_number_of_failures();
+ CU_cleanup_registry();
+ return num_failures;
+
+ERROR:
+ error_num = CU_get_error();
+ CU_cleanup_registry();
+ return -error_num;
+}
diff --git a/etmem/test/etmem_project_ops_llt_test/etmem_project_ops_llt.c b/etmem/test/etmem_project_ops_llt_test/etmem_project_ops_llt.c
index a01e8e8..65c1fc6 100644
--- a/etmem/test/etmem_project_ops_llt_test/etmem_project_ops_llt.c
+++ b/etmem/test/etmem_project_ops_llt_test/etmem_project_ops_llt.c
@@ -117,6 +117,161 @@ static void etmem_pro_add_interval(void)
destroy_proj_config(config);
}
+static void etmem_pro_add_sysmem_threshold_error(void)
+{
+ struct proj_test_param param;
+ GKeyFile *config = NULL;
+
+ init_proj_param(&param);
+
+ param.sysmem_threshold = "101";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_INVAL);
+ destroy_proj_config(config);
+
+ param.sysmem_threshold = "abc";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_INVAL);
+ destroy_proj_config(config);
+
+ param.sysmem_threshold = "a10b";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_INVAL);
+ destroy_proj_config(config);
+
+ param.sysmem_threshold = "10a";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_INVAL);
+ destroy_proj_config(config);
+
+ param.sysmem_threshold = "-1";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_INVAL);
+ destroy_proj_config(config);
+}
+
+static void etmem_pro_add_sysmem_threshold_ok(void)
+{
+ struct proj_test_param param;
+ GKeyFile *config = NULL;
+
+ init_proj_param(&param);
+
+ param.sysmem_threshold = "0";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_SUCCESS);
+ CU_ASSERT_EQUAL(etmemd_project_remove(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+
+ param.sysmem_threshold = "1";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_SUCCESS);
+ CU_ASSERT_EQUAL(etmemd_project_remove(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+
+ param.sysmem_threshold = "2";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_SUCCESS);
+ CU_ASSERT_EQUAL(etmemd_project_remove(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+
+ param.sysmem_threshold = "99";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_SUCCESS);
+ CU_ASSERT_EQUAL(etmemd_project_remove(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+
+ param.sysmem_threshold = "100";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_SUCCESS);
+ CU_ASSERT_EQUAL(etmemd_project_remove(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+}
+
+static void etmem_pro_add_swapcache_mark_error(void)
+{
+ struct proj_test_param param;
+ GKeyFile *config = NULL;
+
+ init_proj_param(&param);
+
+ param.swapcache_high_wmark = "-1";
+ param.swapcache_low_wmark = "-1";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_INVAL);
+ destroy_proj_config(config);
+
+ param.swapcache_high_wmark = "1";
+ param.swapcache_low_wmark = "-1";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_INVAL);
+ destroy_proj_config(config);
+
+ param.swapcache_high_wmark = "-1";
+ param.swapcache_low_wmark = "1";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_INVAL);
+ destroy_proj_config(config);
+
+ param.swapcache_high_wmark = "1";
+ param.swapcache_low_wmark = "2";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_INVAL);
+ destroy_proj_config(config);
+
+ param.swapcache_high_wmark = "101";
+ param.swapcache_low_wmark = "100";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_INVAL);
+ destroy_proj_config(config);
+
+ param.swapcache_high_wmark = "100";
+ param.swapcache_low_wmark = "101";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_INVAL);
+ destroy_proj_config(config);
+
+ param.swapcache_high_wmark = "101";
+ param.swapcache_low_wmark = "101";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_INVAL);
+ destroy_proj_config(config);
+
+ param.swapcache_high_wmark = "5";
+ param.swapcache_low_wmark = NULL;
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_INVAL);
+ destroy_proj_config(config);
+
+ param.swapcache_high_wmark = NULL;
+ param.swapcache_low_wmark = "5";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_INVAL);
+ destroy_proj_config(config);
+}
+
+static void etmem_pro_add_swapcache_mark_ok(void)
+{
+ struct proj_test_param param;
+ GKeyFile *config = NULL;
+
+ init_proj_param(&param);
+
+ param.swapcache_high_wmark = "2";
+ param.swapcache_low_wmark = "1";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_SUCCESS);
+ CU_ASSERT_EQUAL(etmemd_project_remove(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+
+ param.swapcache_high_wmark = "100";
+ param.swapcache_low_wmark = "99";
+ config = construct_proj_config(&param);
+ CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_SUCCESS);
+ CU_ASSERT_EQUAL(etmemd_project_remove(config), OPT_SUCCESS);
+ destroy_proj_config(config);
+}
+
static void etmem_pro_add_loop(void)
{
struct proj_test_param param;
@@ -231,6 +386,8 @@ void test_etmem_prj_add_error(void)
etmem_pro_add_loop();
etmem_pro_add_sleep();
etmem_pro_lack_loop();
+ etmem_pro_add_sysmem_threshold_error();
+ etmem_pro_add_swapcache_mark_error();
}
void test_etmem_prj_del_error(void)
@@ -256,6 +413,8 @@ static void add_project_once(void)
struct proj_test_param param;
GKeyFile *config = NULL;
+ etmem_pro_add_sysmem_threshold_ok();
+ etmem_pro_add_swapcache_mark_ok();
init_proj_param(&param);
CU_ASSERT_EQUAL(etmemd_project_show(NULL, 0), OPT_PRO_NOEXIST);
@@ -348,7 +507,7 @@ void test_etmem_mig_stop_error(void)
CU_ASSERT_EQUAL(etmemd_migrate_stop(""), OPT_PRO_NOEXIST);
CU_ASSERT_EQUAL(etmemd_migrate_stop("ETMEM"), OPT_PRO_NOEXIST);
CU_ASSERT_EQUAL(etmemd_migrate_stop("ET^$%*MEM"), OPT_PRO_NOEXIST);
-
+
param.proj_name = "add_for_migrate_stop_test";
do_add_proj_test(&param);
diff --git a/etmem/test/etmem_scan_ops_llt_test/etmem_scan_ops_llt.c b/etmem/test/etmem_scan_ops_llt_test/etmem_scan_ops_llt.c
index 0cd2ecc..84fcf69 100644
--- a/etmem/test/etmem_scan_ops_llt_test/etmem_scan_ops_llt.c
+++ b/etmem/test/etmem_scan_ops_llt_test/etmem_scan_ops_llt.c
@@ -243,7 +243,7 @@ static void test_get_page_refs_valid()
unsigned long use_rss;
- CU_ASSERT_EQUAL(get_page_refs(vmas, pid, &page_refs, &use_rss, 0), 0);
+ CU_ASSERT_EQUAL(get_page_refs(vmas, pid, &page_refs, &use_rss, NULL), 0);
CU_ASSERT_PTR_NOT_NULL(page_refs);
CU_ASSERT_NOT_EQUAL(use_rss, 0);
@@ -309,7 +309,7 @@ static void test_add_pg_to_mem_grade()
CU_ASSERT_EQUAL(etmemd_scan_init(), 0);
vma = get_vmas(pid);
- CU_ASSERT_EQUAL(get_page_refs(vma, pid, &page_refs, NULL, 0), 0);
+ CU_ASSERT_EQUAL(get_page_refs(vma, pid, &page_refs, NULL, NULL), 0);
page_refs = add_page_refs_into_memory_grade(page_refs, &list);
CU_ASSERT_PTR_NOT_NULL(page_refs);
CU_ASSERT_PTR_NOT_NULL(list);
--
1.8.3.1

View File

@ -1,415 +0,0 @@
From 9707219f4ec2b12012620a3e5cec90b61a3ca2c4 Mon Sep 17 00:00:00 2001
From: liubo <liubo254@huawei.com>
Date: Tue, 18 Jan 2022 11:03:13 +0800
Subject: [PATCH 16/33] etmem: add sysmem_threshold and swap_threshold
parameters to etmem
As a memory expansion tool, etmem performs memory swap operation
for the target process by default after it is enabled. However,
in some specific scenarios, in order to obtain the ultimate
performance of the business, it is necessary to consider
the timing of memory swapping by etmem.
Add the sysmem_threshold parameter to control the start and
stop of memory swap out when the system available memory
meets the requirements.
Add the swap_threshold parameter to limit the absolute
value of the memory size reserved by the process in DRAM.
When the target process memory is lower than this value, do not
swap out any memory.
Signed-off-by: liubo <liubo254@huawei.com>
---
etmem/conf/slide_conf.yaml | 2 +
etmem/inc/etmemd_inc/etmemd_common.h | 10 +++
etmem/inc/etmemd_inc/etmemd_project_exp.h | 1 +
etmem/inc/etmemd_inc/etmemd_slide.h | 1 +
etmem/src/etmemd_src/etmemd_common.c | 58 +++++++++++++-
etmem/src/etmemd_src/etmemd_project.c | 32 ++++++--
etmem/src/etmemd_src/etmemd_slide.c | 123 ++++++++++++++++++++++++++++++
7 files changed, 220 insertions(+), 7 deletions(-)
diff --git a/etmem/conf/slide_conf.yaml b/etmem/conf/slide_conf.yaml
index 75f0220..511d657 100644
--- a/etmem/conf/slide_conf.yaml
+++ b/etmem/conf/slide_conf.yaml
@@ -4,6 +4,7 @@ scan_type=page
loop=1
interval=1
sleep=1
+sysmem_threshold=50
[engine]
name=slide
@@ -17,3 +18,4 @@ type=name
value=mysql
T=1
max_threads=1
+swap_threshold=10g
diff --git a/etmem/inc/etmemd_inc/etmemd_common.h b/etmem/inc/etmemd_inc/etmemd_common.h
index 8d18f8a..576d38a 100644
--- a/etmem/inc/etmemd_inc/etmemd_common.h
+++ b/etmem/inc/etmemd_inc/etmemd_common.h
@@ -21,6 +21,7 @@
#define PROC_PATH "/proc/"
#define STATUS_FILE "/status"
+#define PROC_MEMINFO "meminfo"
#define SWAPIN "SwapIN"
#define VMRSS "VmRSS"
#define VMSWAP "VmSwap"
@@ -30,14 +31,21 @@
#define ETMEMD_MAX_PARAMETER_NUM 6
#define BYTE_TO_KB(s) ((s) >> 10)
#define KB_TO_BYTE(s) ((s) << 10)
+#define CONVERT_GB_2_KB (1024 * 1024)
#define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
/* in some system the max length of pid may be larger than 5, so we use 10 herr */
#define PID_STR_MAX_LEN 10
+#define SWAP_THRESHOLD_MAX_LEN 10
#define PIPE_FD_LEN 2
+enum swap_type {
+ DONT_SWAP = 0,
+ DO_SWAP,
+};
+
/*
* function: parse cmdline passed to etmemd server.
*
@@ -65,4 +73,6 @@ int get_mem_from_proc_file(const char *pid, const char *file_name, unsigned long
int dprintf_all(int fd, const char *format, ...);
+int get_swap_threshold_inKB(char *string);
+
#endif
diff --git a/etmem/inc/etmemd_inc/etmemd_project_exp.h b/etmem/inc/etmemd_inc/etmemd_project_exp.h
index 8740f7e..fc3c85e 100644
--- a/etmem/inc/etmemd_inc/etmemd_project_exp.h
+++ b/etmem/inc/etmemd_inc/etmemd_project_exp.h
@@ -42,6 +42,7 @@ struct project {
char *name;
enum scan_type type;
void *scan_param;
+ int sysmem_threshold;
bool start;
struct engine *engs;
diff --git a/etmem/inc/etmemd_inc/etmemd_slide.h b/etmem/inc/etmemd_inc/etmemd_slide.h
index 93de502..7c80502 100644
--- a/etmem/inc/etmemd_inc/etmemd_slide.h
+++ b/etmem/inc/etmemd_inc/etmemd_slide.h
@@ -22,6 +22,7 @@
struct slide_params {
struct task_executor *executor;
int t; /* watermark */
+ int swap_threshold;
uint8_t dram_percent;
};
diff --git a/etmem/src/etmemd_src/etmemd_common.c b/etmem/src/etmemd_src/etmemd_common.c
index ebf6232..caa5826 100644
--- a/etmem/src/etmemd_src/etmemd_common.c
+++ b/etmem/src/etmemd_src/etmemd_common.c
@@ -256,7 +256,7 @@ static char *etmemd_get_proc_file_str(const char *pid, const char *file)
char *file_name = NULL;
size_t file_str_size;
- file_str_size = strlen(PROC_PATH) + strlen(pid) + strlen(file) + 1;
+ file_str_size = strlen(PROC_PATH) + strlen(file) + 1 + (pid == NULL ? 0 : strlen(pid));
file_name = (char *)calloc(file_str_size, sizeof(char));
if (file_name == NULL) {
etmemd_log(ETMEMD_LOG_ERR, "malloc for %s path fail\n", file);
@@ -264,7 +264,7 @@ static char *etmemd_get_proc_file_str(const char *pid, const char *file)
}
if (snprintf_s(file_name, file_str_size, file_str_size - 1,
- "%s%s%s", PROC_PATH, pid, file) == -1) {
+ "%s%s%s", PROC_PATH, pid ? pid : "", file) == -1) {
etmemd_log(ETMEMD_LOG_ERR, "snprintf for %s fail\n", file);
free(file_name);
return NULL;
@@ -495,3 +495,57 @@ unsigned long get_pagesize(void)
return (unsigned long)pagesize;
}
+
+int get_swap_threshold_inKB(char *string)
+{
+ int len;
+ int i;
+ int ret = -1;
+ char *swap_threshold_string = NULL;
+ int swap_threshold_inGB;
+ int swap_threshold_inKB;
+
+ if (string == NULL) {
+ goto out;
+ }
+
+ len = strlen(string);
+ if (len > SWAP_THRESHOLD_MAX_LEN) {
+ etmemd_log(ETMEMD_LOG_ERR, "swap_threshold string is too long.\n");
+ goto out;
+ }
+
+ swap_threshold_string = (char *)calloc(len, sizeof(char));
+ if (swap_threshold_string == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "calloc swap_threshold_string fail.\n");
+ goto out;
+ }
+
+ for (i = 0; i < len - 1; i++) {
+ if (isdigit(string[i])) {
+ swap_threshold_string[i] = string[i];
+ continue;
+ }
+ etmemd_log(ETMEMD_LOG_ERR, "the swap_threshold contain wrong parameter.\n");
+ goto free_out;
+ }
+
+ if (string[i] != 'g' && string[i] != 'G') {
+ etmemd_log(ETMEMD_LOG_ERR, "the swap_threshold should in G or g.\n");
+ goto free_out;
+ }
+
+ if (get_int_value(swap_threshold_string, &swap_threshold_inGB) != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "get_int_value swap_threshold faild.\n");
+ goto free_out;
+ }
+
+ swap_threshold_inKB = swap_threshold_inGB * CONVERT_GB_2_KB;
+ ret = swap_threshold_inKB;
+
+free_out:
+ free(swap_threshold_string);
+
+out:
+ return ret;
+}
diff --git a/etmem/src/etmemd_src/etmemd_project.c b/etmem/src/etmemd_src/etmemd_project.c
index fa4293b..459e140 100644
--- a/etmem/src/etmemd_src/etmemd_project.c
+++ b/etmem/src/etmemd_src/etmemd_project.c
@@ -30,12 +30,13 @@
#include "etmemd_file.h"
#include "etmemd_log.h"
-#define MAX_INTERVAL_VALUE 1200
-#define MAX_SLEEP_VALUE 1200
-#define MAX_LOOP_VALUE 120
+#define MAX_INTERVAL_VALUE 1200
+#define MAX_SLEEP_VALUE 1200
+#define MAX_LOOP_VALUE 120
+#define MAX_SYSMEM_THRESHOLD_VALUE 100
-#define MAX_OBJ_NAME_LEN 64
-#define MIN_NR_MIN_VAL 3
+#define MAX_OBJ_NAME_LEN 64
+#define MIN_NR_MIN_VAL 3
static SLIST_HEAD(project_list, project) g_projects = SLIST_HEAD_INITIALIZER(g_projects);
@@ -630,9 +631,27 @@ static int fill_project_scan_type(void *obj, void *val)
return 0;
}
+/* fill the project parameter: sysmem_threshold
+ * sysmem_threshold: [0, 100]. do not swap any memory out if system free memory is higher than sysmem_threshold */
+static int fill_project_sysmem_threshold(void *obj, void *val)
+{
+ struct project *proj = (struct project *)obj;
+ int sysmem_threshold = parse_to_int(val);
+
+ if (sysmem_threshold < 0 || sysmem_threshold > MAX_SYSMEM_THRESHOLD_VALUE) {
+ etmemd_log(ETMEMD_LOG_WARN, "invaild project sysmem_threshold value %d, it must between 0 and 100.\n",
+ sysmem_threshold, MAX_SYSMEM_THRESHOLD_VALUE);
+ sysmem_threshold = -1;
+ }
+
+ proj->sysmem_threshold = sysmem_threshold;
+ return 0;
+}
+
static struct config_item g_project_config_items[] = {
{"name", STR_VAL, fill_project_name, false},
{"scan_type", STR_VAL, fill_project_scan_type, false},
+ {"sysmem_threshold", INT_VAL, fill_project_sysmem_threshold, true},
};
static void clear_project(struct project *proj)
@@ -688,6 +707,9 @@ enum opt_result etmemd_project_add(GKeyFile *config)
etmemd_log(ETMEMD_LOG_ERR, "alloc memory for project fail\n");
return OPT_INTER_ERR;
}
+
+ proj->sysmem_threshold = -1;
+
if (project_fill_by_conf(config, proj) != 0) {
etmemd_log(ETMEMD_LOG_ERR, "fill project from configuration file fail\n");
free(proj);
diff --git a/etmem/src/etmemd_src/etmemd_slide.c b/etmem/src/etmemd_src/etmemd_slide.c
index 8362224..cbc4b17 100644
--- a/etmem/src/etmemd_src/etmemd_slide.c
+++ b/etmem/src/etmemd_src/etmemd_slide.c
@@ -17,6 +17,7 @@
#include <stdio.h>
#include <string.h>
#include <malloc.h>
+#include <unistd.h>
#include "securec.h"
#include "etmemd_log.h"
@@ -106,6 +107,104 @@ static int slide_do_migrate(unsigned int pid, const struct memory_grade *memory_
return ret;
}
+static int check_sysmem_lower_threshold(struct task_pid *tk_pid)
+{
+ unsigned long mem_total;
+ unsigned long mem_free;
+ int vm_cmp;
+ int ret;
+
+ ret = get_mem_from_proc_file(NULL, PROC_MEMINFO, &mem_total, "MemTotal");
+ if (ret != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "get memtotal fail\n");
+ return DONT_SWAP;
+ }
+
+ ret = get_mem_from_proc_file(NULL, PROC_MEMINFO, &mem_free, "MemFree");
+ if (ret != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "get memfree fail\n");
+ return DONT_SWAP;
+ }
+
+ /* Calculate the free memory percentage in 0 - 100 */
+ vm_cmp = (mem_free * 100) / mem_total;
+ if (vm_cmp < tk_pid->tk->eng->proj->sysmem_threshold) {
+ return DO_SWAP;
+ }
+
+ return DONT_SWAP;
+}
+
+static int check_pid_should_swap(const char *pid, unsigned long vmrss, const struct task_pid *tk_pid)
+{
+ unsigned long vmswap;
+ unsigned long vmcmp;
+ int ret;
+
+ ret = get_mem_from_proc_file(pid, STATUS_FILE, &vmswap, "VmSwap");
+ if (ret != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "get VmSwap fail\n");
+ return DONT_SWAP;
+ }
+
+ /* Calculate the total amount of memory that can be swappout for the current process
+ * and check whether the memory is larger than the current swapout amount.
+ * If true, continue swap-out; otherwise, abort the swap-out process. */
+ vmcmp = (vmrss + vmswap) / 100 * tk_pid->tk->eng->proj->sysmem_threshold;
+ if (vmcmp > vmswap) {
+ return DO_SWAP;
+ }
+
+ return DONT_SWAP;
+}
+
+static int check_pidmem_lower_threshold(struct task_pid *tk_pid)
+{
+ struct slide_params *params = NULL;
+ unsigned long vmrss;
+ int ret;
+ char pid_str[PID_STR_MAX_LEN] = {0};
+
+ params = (struct slide_params *)tk_pid->tk->params;
+ if (params == NULL) {
+ return DONT_SWAP;
+ }
+
+ if (snprintf_s(pid_str, PID_STR_MAX_LEN, PID_STR_MAX_LEN - 1, "%u", tk_pid->pid) <= 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "snprintf pid fail %u", tk_pid->pid);
+ return DONT_SWAP;
+ }
+
+ ret = get_mem_from_proc_file(pid_str, STATUS_FILE, &vmrss, "VmRSS");
+ if (ret != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "get VmRSS fail\n");
+ return DONT_SWAP;
+ }
+
+ if (params->swap_threshold == 0) {
+ return check_pid_should_swap(pid_str, vmrss, tk_pid);
+ }
+
+ if ((int)vmrss > params->swap_threshold) {
+ return DO_SWAP;
+ }
+
+ return DONT_SWAP;
+}
+
+static int check_should_swap(struct task_pid *tk_pid)
+{
+ if (tk_pid->tk->eng->proj->sysmem_threshold == -1) {
+ return DO_SWAP;
+ }
+
+ if (check_sysmem_lower_threshold(tk_pid) == DONT_SWAP) {
+ return DONT_SWAP;
+ }
+
+ return check_pidmem_lower_threshold(tk_pid);
+}
+
static void *slide_executor(void *arg)
{
struct task_pid *tk_pid = (struct task_pid *)arg;
@@ -113,6 +212,10 @@ static void *slide_executor(void *arg)
struct memory_grade *memory_grade = NULL;
struct page_sort *page_sort = NULL;
+ if (check_should_swap(tk_pid) == DONT_SWAP) {
+ return NULL;
+ }
+
/* register cleanup function in case of unexpected cancellation detected,
* and register for memory_grade first, because it needs to clean after page_refs is cleaned */
pthread_cleanup_push(clean_memory_grade_unexpected, &memory_grade);
@@ -194,8 +297,28 @@ static int fill_task_dram_percent(void *obj, void *val)
return 0;
}
+static int fill_task_swap_threshold(void *obj, void *val)
+{
+ struct slide_params *params = (struct slide_params *)obj;
+ char *swap_threshold_string = (char *)val;
+ int swap_threshold = get_swap_threshold_inKB(swap_threshold_string);
+
+ free(swap_threshold_string);
+
+ if (swap_threshold < 0) {
+ etmemd_log(ETMEMD_LOG_WARN,
+ "parse swap_threshold failed.\n");
+ return -1;
+ }
+
+ params->swap_threshold = swap_threshold;
+
+ return 0;
+}
+
static struct config_item g_slide_task_config_items[] = {
{"T", INT_VAL, fill_task_threshold, false},
+ {"swap_threshold", STR_VAL, fill_task_swap_threshold, true},
{"dram_percent", INT_VAL, fill_task_dram_percent, true},
};
--
1.8.3.1

View File

@ -1,552 +0,0 @@
From 8a7c297694bfad83bdc826aea3c0fea84098a4fb Mon Sep 17 00:00:00 2001
From: liubo <liubo254@huawei.com>
Date: Tue, 18 Jan 2022 15:21:13 +0800
Subject: [PATCH 17/33] etmem: add swapcache reclaim to etmem
When etmem performs the memory swap operation, it will
occupy part of the swapcache memory. To further save
memory, the swapcache memory recovery function is
added, which depends on etmem_swap.ko
Add swapcache_high_wmark and swapcache_low_wmark field
to set the available watermark of swapcache memory.
When the swapcache memory usage is higher than high_wmark,
the swapcache memory recovery is triggered until it is less
than low wmark.
Signed-off-by: liubo <liubo254@huawei.com>
---
etmem/conf/slide_conf.yaml | 2 +
etmem/inc/etmemd_inc/etmemd_common.h | 50 ++++++++-----
etmem/inc/etmemd_inc/etmemd_migrate.h | 1 +
etmem/inc/etmemd_inc/etmemd_project_exp.h | 3 +
etmem/src/etmemd_src/etmemd_common.c | 48 +++++++------
etmem/src/etmemd_src/etmemd_cslide.c | 12 +++-
etmem/src/etmemd_src/etmemd_migrate.c | 113 +++++++++++++++++++++++++++++-
etmem/src/etmemd_src/etmemd_project.c | 56 ++++++++++++++-
etmem/src/etmemd_src/etmemd_scan.c | 14 +++-
etmem/src/etmemd_src/etmemd_slide.c | 4 ++
10 files changed, 255 insertions(+), 48 deletions(-)
diff --git a/etmem/conf/slide_conf.yaml b/etmem/conf/slide_conf.yaml
index 511d657..f55c508 100644
--- a/etmem/conf/slide_conf.yaml
+++ b/etmem/conf/slide_conf.yaml
@@ -5,6 +5,8 @@ loop=1
interval=1
sleep=1
sysmem_threshold=50
+swapcache_high_wmark=10
+swapcache_low_wmark=6
[engine]
name=slide
diff --git a/etmem/inc/etmemd_inc/etmemd_common.h b/etmem/inc/etmemd_inc/etmemd_common.h
index 576d38a..ced606e 100644
--- a/etmem/inc/etmemd_inc/etmemd_common.h
+++ b/etmem/inc/etmemd_inc/etmemd_common.h
@@ -18,34 +18,47 @@
#include <stdio.h>
#include <stdbool.h>
+#include <sys/ioctl.h>
-#define PROC_PATH "/proc/"
-#define STATUS_FILE "/status"
-#define PROC_MEMINFO "meminfo"
-#define SWAPIN "SwapIN"
-#define VMRSS "VmRSS"
-#define VMSWAP "VmSwap"
-#define FILE_LINE_MAX_LEN 1024
-#define KEY_VALUE_MAX_LEN 64
-#define DECIMAL_RADIX 10
-#define ETMEMD_MAX_PARAMETER_NUM 6
-#define BYTE_TO_KB(s) ((s) >> 10)
-#define KB_TO_BYTE(s) ((s) << 10)
-#define CONVERT_GB_2_KB (1024 * 1024)
-
-#define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
+#define PROC_PATH "/proc/"
+#define STATUS_FILE "/status"
+#define PROC_MEMINFO "meminfo"
+#define SWAPIN "SwapIN"
+#define VMRSS "VmRSS"
+#define VMSWAP "VmSwap"
+
+#define FILE_LINE_MAX_LEN 1024
+#define KEY_VALUE_MAX_LEN 64
+#define DECIMAL_RADIX 10
+#define ETMEMD_MAX_PARAMETER_NUM 6
+
+#define BYTE_TO_KB(s) ((s) >> 10)
+#define KB_TO_BYTE(s) ((s) << 10)
+#define CONVERT_GB_2_KB (1024 * 1024)
+
+#define MAX_SWAPCACHE_WMARK_VALUE 100
+
+#define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
/* in some system the max length of pid may be larger than 5, so we use 10 herr */
-#define PID_STR_MAX_LEN 10
+#define PID_STR_MAX_LEN 10
#define SWAP_THRESHOLD_MAX_LEN 10
-#define PIPE_FD_LEN 2
+#define PIPE_FD_LEN 2
+
+#define IDLE_SCAN_MAGIC 0x66
+#define IDLE_SCAN_ADD_FLAGS _IOW(IDLE_SCAN_MAGIC, 0x0, unsigned int)
enum swap_type {
DONT_SWAP = 0,
DO_SWAP,
};
+struct ioctl_para {
+ unsigned long ioctl_cmd;
+ int ioctl_parameter;
+};
+
/*
* function: parse cmdline passed to etmemd server.
*
@@ -65,7 +78,8 @@ int get_unsigned_int_value(const char *val, unsigned int *value);
int get_unsigned_long_value(const char *val, unsigned long *value);
void etmemd_safe_free(void **ptr);
-FILE *etmemd_get_proc_file(const char *pid, const char *file, int flags, const char *mode);
+FILE *etmemd_get_proc_file(const char *pid, const char *file, const char *mode);
+int etmemd_send_ioctl_cmd(FILE *fp, struct ioctl_para *request);
int get_keyword_and_value(const char *str, char *key, char *val);
unsigned long get_pagesize(void);
diff --git a/etmem/inc/etmemd_inc/etmemd_migrate.h b/etmem/inc/etmemd_inc/etmemd_migrate.h
index ef20bde..f8eb621 100644
--- a/etmem/inc/etmemd_inc/etmemd_migrate.h
+++ b/etmem/inc/etmemd_inc/etmemd_migrate.h
@@ -27,5 +27,6 @@
#define SWAP_ADDR_LEN 20
int etmemd_grade_migrate(const char* pid, const struct memory_grade *memory_grade);
+int etmemd_reclaim_swapcache(const struct task_pid *tk_pid);
unsigned long check_should_migrate(const struct task_pid *tk_pid);
#endif
diff --git a/etmem/inc/etmemd_inc/etmemd_project_exp.h b/etmem/inc/etmemd_inc/etmemd_project_exp.h
index fc3c85e..2fe8d90 100644
--- a/etmem/inc/etmemd_inc/etmemd_project_exp.h
+++ b/etmem/inc/etmemd_inc/etmemd_project_exp.h
@@ -43,7 +43,10 @@ struct project {
enum scan_type type;
void *scan_param;
int sysmem_threshold;
+ int swapcache_high_wmark;
+ int swapcache_low_wmark;
bool start;
+ bool wmark_set;
struct engine *engs;
SLIST_ENTRY(project) entry;
diff --git a/etmem/src/etmemd_src/etmemd_common.c b/etmem/src/etmemd_src/etmemd_common.c
index caa5826..bb72fd0 100644
--- a/etmem/src/etmemd_src/etmemd_common.c
+++ b/etmem/src/etmemd_src/etmemd_common.c
@@ -32,9 +32,6 @@
#include "etmemd_rpc.h"
#include "etmemd_log.h"
-#define IDLE_SCAN_MAGIC 0x66
-#define IDLE_SCAN_ADD_FLAGS _IOW(IDLE_SCAN_MAGIC, 0x0, unsigned int)
-
static void usage(void)
{
printf("\nusage of etmemd:\n"
@@ -273,10 +270,32 @@ static char *etmemd_get_proc_file_str(const char *pid, const char *file)
return file_name;
}
-FILE *etmemd_get_proc_file(const char *pid, const char *file, int flags, const char *mode)
+int etmemd_send_ioctl_cmd(FILE *fp, struct ioctl_para *request)
{
- char *file_name = NULL;
int fd = -1;
+
+ if (fp == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "send ioctl cmd fail, fp is null\n");
+ return -1;
+ }
+
+ fd = fileno(fp);
+ if (fd < 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "send ioctl cmd fail, get fd fail\n");
+ return -1;
+ }
+
+ if (request == NULL || ioctl(fd, request->ioctl_cmd, &request->ioctl_parameter) != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "send ioctl cmd fail, request is wrong\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+FILE *etmemd_get_proc_file(const char *pid, const char *file, const char *mode)
+{
+ char *file_name = NULL;
FILE *fp = NULL;
file_name = etmemd_get_proc_file_str(pid, file);
@@ -287,25 +306,8 @@ FILE *etmemd_get_proc_file(const char *pid, const char *file, int flags, const c
fp = fopen(file_name, mode);
if (fp == NULL) {
etmemd_log(ETMEMD_LOG_ERR, "open file %s fail\n", file_name);
- goto free_file_name;
- }
-
- fd = fileno(fp);
- if (fd < 0) {
- etmemd_log(ETMEMD_LOG_ERR, "get fd of file %s fail\n", file_name);
- fclose(fp);
- fp = NULL;
- goto free_file_name;
- }
-
- if (flags != 0 && ioctl(fd, IDLE_SCAN_ADD_FLAGS, &flags) != 0) {
- etmemd_log(ETMEMD_LOG_ERR, "set idle flags for %s fail with %s\n", pid, strerror(errno));
- fclose(fp);
- fp = NULL;
- goto free_file_name;
}
-free_file_name:
free(file_name);
return fp;
}
@@ -453,7 +455,7 @@ int get_mem_from_proc_file(const char *pid, const char *file_name, unsigned long
unsigned long val;
int ret = -1;
- file = etmemd_get_proc_file(pid, file_name, 0, "r");
+ file = etmemd_get_proc_file(pid, file_name, "r");
if (file == NULL) {
etmemd_log(ETMEMD_LOG_ERR, "cannot open %s for pid %s\n", file_name, pid);
return ret;
diff --git a/etmem/src/etmemd_src/etmemd_cslide.c b/etmem/src/etmemd_src/etmemd_cslide.c
index b3d1637..cbaa2e8 100644
--- a/etmem/src/etmemd_src/etmemd_cslide.c
+++ b/etmem/src/etmemd_src/etmemd_cslide.c
@@ -1280,18 +1280,28 @@ static int cslide_scan_vmas(struct cslide_pid_params *params)
uint64_t i;
int fd;
struct cslide_task_params *task_params = params->task_params;
+ struct ioctl_para ioctl_para = {
+ .ioctl_cmd = IDLE_SCAN_ADD_FLAGS,
+ .ioctl_parameter = task_params->scan_flags,
+ };
if (snprintf_s(pid, PID_STR_MAX_LEN, PID_STR_MAX_LEN - 1, "%u", params->pid) <= 0) {
etmemd_log(ETMEMD_LOG_ERR, "snpintf pid %u fail\n", params->pid);
return -1;
}
- scan_fp = etmemd_get_proc_file(pid, IDLE_SCAN_FILE, task_params->scan_flags, "r");
+ scan_fp = etmemd_get_proc_file(pid, IDLE_SCAN_FILE, "r");
if (scan_fp == NULL) {
etmemd_log(ETMEMD_LOG_ERR, "open %s file for pid %u fail\n", IDLE_SCAN_FILE, params->pid);
return -1;
}
+ if (task_params->scan_flags != 0 && etmemd_send_ioctl_cmd(scan_fp, &ioctl_para) != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "etmemd send_ioctl_cmd %s file for pid %u fail\n", IDLE_SCAN_FILE, params->pid);
+ fclose(scan_fp);
+ return -1;
+ }
+
fd = fileno(scan_fp);
if (fd == -1) {
fclose(scan_fp);
diff --git a/etmem/src/etmemd_src/etmemd_migrate.c b/etmem/src/etmemd_src/etmemd_migrate.c
index 639d570..87bfde0 100644
--- a/etmem/src/etmemd_src/etmemd_migrate.c
+++ b/etmem/src/etmemd_src/etmemd_migrate.c
@@ -15,14 +15,24 @@
#include <stdio.h>
#include <stdlib.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
#include "securec.h"
#include "etmemd.h"
#include "etmemd_migrate.h"
+#include "etmemd_project.h"
#include "etmemd_common.h"
#include "etmemd_slide.h"
#include "etmemd_log.h"
+#define RECLAIM_SWAPCACHE_MAGIC 0x77
+#define RECLAIM_SWAPCACHE_ON _IOW(RECLAIM_SWAPCACHE_MAGIC, 0x1, unsigned int)
+#define SET_SWAPCACHE_WMARK _IOW(RECLAIM_SWAPCACHE_MAGIC, 0x2, unsigned int)
+
static char *get_swap_string(struct page_refs **page_refs, int batchsize)
{
char *swap_str = NULL;
@@ -70,7 +80,7 @@ static int etmemd_migrate_mem(const char *pid, const char *grade_path, struct pa
return 0;
}
- fp = etmemd_get_proc_file(pid, grade_path, 0, "r+");
+ fp = etmemd_get_proc_file(pid, grade_path, "r+");
if (fp == NULL) {
etmemd_log(ETMEMD_LOG_ERR, "cannot open %s for pid %s\n", grade_path, pid);
return -1;
@@ -98,6 +108,107 @@ static int etmemd_migrate_mem(const char *pid, const char *grade_path, struct pa
return 0;
}
+static bool check_should_reclaim_swapcache(const struct task_pid *tk_pid)
+{
+ struct project *proj = tk_pid->tk->eng->proj;
+ unsigned long mem_total;
+ unsigned long swapcache_total;
+ int ret;
+
+ if (proj->swapcache_high_wmark == 0) {
+ return false;
+ }
+
+ ret = get_mem_from_proc_file(NULL, PROC_MEMINFO, &mem_total, "MemTotal");
+ if (ret != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "get memtotal fail\n");
+ return false;
+ }
+
+ ret = get_mem_from_proc_file(NULL, PROC_MEMINFO, &swapcache_total, "SwapCached");
+ if (ret != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "get swapcache_total fail\n");
+ return false;
+ }
+
+ if ((swapcache_total / proj->swapcache_high_wmark) <= (mem_total / MAX_SWAPCACHE_WMARK_VALUE)) {
+ return false;
+ }
+
+ return true;
+}
+
+static int set_swapcache_wmark(const struct task_pid *tk_pid, const char *pid_str)
+{
+ int swapcache_wmark;
+ struct project *proj = tk_pid->tk->eng->proj;
+ FILE *fp = NULL;
+ struct ioctl_para ioctl_para = {
+ .ioctl_cmd = SET_SWAPCACHE_WMARK,
+ };
+
+ swapcache_wmark = (proj->swapcache_low_wmark & 0x00ff) | (proj->swapcache_high_wmark << 8 & 0xff00);
+ ioctl_para.ioctl_parameter = swapcache_wmark;
+
+ fp = etmemd_get_proc_file(pid_str, COLD_PAGE, "r+");
+ if (fp == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "get proc file %s failed.\n", COLD_PAGE);
+ return -1;
+ }
+
+ if (etmemd_send_ioctl_cmd(fp, &ioctl_para) != 0) {
+ fclose(fp);
+ etmemd_log(ETMEMD_LOG_ERR, "set_swapcache_wmark for pid %u fail\n", tk_pid->pid);
+ return -1;
+ }
+
+ fclose(fp);
+ return 0;
+}
+
+int etmemd_reclaim_swapcache(const struct task_pid *tk_pid)
+{
+ char pid_str[PID_STR_MAX_LEN] = {0};
+ FILE *fp = NULL;
+ struct ioctl_para ioctl_para = {
+ .ioctl_cmd = RECLAIM_SWAPCACHE_ON,
+ .ioctl_parameter = 0,
+ };
+
+ if (tk_pid == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "tk_pid is null.\n");
+ return -1;
+ }
+
+ if (!check_should_reclaim_swapcache(tk_pid)) {
+ return 0;
+ }
+
+ if (snprintf_s(pid_str, PID_STR_MAX_LEN, PID_STR_MAX_LEN - 1, "%u", tk_pid->pid) <= 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "snprintf pid fail %u", tk_pid->pid);
+ return -1;
+ }
+
+ if (!tk_pid->tk->eng->proj->wmark_set) {
+ set_swapcache_wmark(tk_pid, pid_str);
+ tk_pid->tk->eng->proj->wmark_set = true;
+ }
+
+ fp = etmemd_get_proc_file(pid_str, COLD_PAGE, "r+");
+ if (fp == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "get proc file %s fail.\n", COLD_PAGE);
+ return -1;
+ }
+
+ if (etmemd_send_ioctl_cmd(fp, &ioctl_para) != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "etmemd_reclaim_swapcache fail\n");
+ fclose(fp);
+ return -1;
+ }
+
+ fclose(fp);
+ return 0;
+}
int etmemd_grade_migrate(const char *pid, const struct memory_grade *memory_grade)
{
diff --git a/etmem/src/etmemd_src/etmemd_project.c b/etmem/src/etmemd_src/etmemd_project.c
index 459e140..72d7335 100644
--- a/etmem/src/etmemd_src/etmemd_project.c
+++ b/etmem/src/etmemd_src/etmemd_project.c
@@ -639,19 +639,64 @@ static int fill_project_sysmem_threshold(void *obj, void *val)
int sysmem_threshold = parse_to_int(val);
if (sysmem_threshold < 0 || sysmem_threshold > MAX_SYSMEM_THRESHOLD_VALUE) {
- etmemd_log(ETMEMD_LOG_WARN, "invaild project sysmem_threshold value %d, it must between 0 and 100.\n",
- sysmem_threshold, MAX_SYSMEM_THRESHOLD_VALUE);
- sysmem_threshold = -1;
+ etmemd_log(ETMEMD_LOG_ERR, "invaild project sysmem_threshold value %d, it must between 0 and 100.\n",
+ sysmem_threshold);
+ return -1;
}
proj->sysmem_threshold = sysmem_threshold;
return 0;
}
+/* fill the project parameter: swapcache_low_wmark
+ * swapcache_low_wmark: [0, 100]. */
+static int fill_project_swapcache_low_wmark(void *obj, void *val)
+{
+ struct project *proj = (struct project *)obj;
+ int swapcache_low_wmark = parse_to_int(val);
+
+ if (swapcache_low_wmark < 0 || swapcache_low_wmark > MAX_SWAPCACHE_WMARK_VALUE) {
+ etmemd_log(ETMEMD_LOG_ERR, "invaild project swapcache_low_wmark value %d, it must between 0 and 100.\n",
+ swapcache_low_wmark);
+ return -1;
+ }
+
+ proj->swapcache_low_wmark = swapcache_low_wmark;
+ return 0;
+}
+
+/* fill the project parameter: swapcache_high_wmark
+ * swapcache_high_wmark: (0, 100]. */
+static int fill_project_swapcache_high_wmark(void *obj, void *val)
+{
+ struct project *proj = (struct project *)obj;
+ int swapcache_high_wmark = parse_to_int(val);
+
+ if (swapcache_high_wmark < 0 || swapcache_high_wmark > MAX_SWAPCACHE_WMARK_VALUE) {
+ etmemd_log(ETMEMD_LOG_ERR, "invaild project swapcache_high_wmark value %d, it must between 0 and 100.\n",
+ swapcache_high_wmark);
+ return -1;
+ }
+
+ proj->swapcache_high_wmark = swapcache_high_wmark;
+ return 0;
+}
+
+static bool check_swapcache_wmark_valid(struct project *proj)
+{
+ if (proj->swapcache_low_wmark > proj->swapcache_high_wmark) {
+ return false;
+ }
+
+ return true;
+}
+
static struct config_item g_project_config_items[] = {
{"name", STR_VAL, fill_project_name, false},
{"scan_type", STR_VAL, fill_project_scan_type, false},
{"sysmem_threshold", INT_VAL, fill_project_sysmem_threshold, true},
+ {"swapcache_high_wmark", INT_VAL, fill_project_swapcache_high_wmark, true},
+ {"swapcache_low_wmark", INT_VAL, fill_project_swapcache_low_wmark, true},
};
static void clear_project(struct project *proj)
@@ -675,6 +720,11 @@ static int project_fill_by_conf(GKeyFile *config, struct project *proj)
return -1;
}
+ if (!check_swapcache_wmark_valid(proj)) {
+ etmemd_log(ETMEMD_LOG_ERR, "swapcache wmark is not valid, low wmark: %d, high wmark: %d",
+ proj->swapcache_low_wmark, proj->swapcache_high_wmark);
+ return -1;
+ }
return 0;
}
diff --git a/etmem/src/etmemd_src/etmemd_scan.c b/etmem/src/etmemd_src/etmemd_scan.c
index 3ee018e..a1f8cdc 100644
--- a/etmem/src/etmemd_src/etmemd_scan.c
+++ b/etmem/src/etmemd_src/etmemd_scan.c
@@ -359,7 +359,7 @@ struct vmas *get_vmas_with_flags(const char *pid, char *vmflags_array[], int vmf
return NULL;
}
- fp = etmemd_get_proc_file(pid, maps_file, 0, "r");
+ fp = etmemd_get_proc_file(pid, maps_file, "r");
if (fp == NULL) {
etmemd_log(ETMEMD_LOG_ERR, "open %s file of %s fail\n", maps_file, pid);
free(ret_vmas);
@@ -680,13 +680,23 @@ int get_page_refs(const struct vmas *vmas, const char *pid, struct page_refs **p
struct vma *vma = vmas->vma_list;
struct page_refs **tmp_page_refs = NULL;
struct walk_address walk_address = {0, 0, 0};
+ struct ioctl_para ioctl_para = {
+ .ioctl_cmd = IDLE_SCAN_ADD_FLAGS,
+ .ioctl_parameter = flags,
+ };
- scan_fp = etmemd_get_proc_file(pid, IDLE_SCAN_FILE, flags, "r");
+ scan_fp = etmemd_get_proc_file(pid, IDLE_SCAN_FILE, "r");
if (scan_fp == NULL) {
etmemd_log(ETMEMD_LOG_ERR, "open %s file fail\n", IDLE_SCAN_FILE);
return -1;
}
+ if (flags != 0 && etmemd_send_ioctl_cmd(scan_fp, &ioctl_para) != 0) {
+ fclose(scan_fp);
+ etmemd_log(ETMEMD_LOG_ERR, "etmemd_send_ioctl_cmd %s file for pid %s fail\n", IDLE_SCAN_FILE, pid);
+ return -1;
+ }
+
fd = fileno(scan_fp);
if (fd == -1) {
etmemd_log(ETMEMD_LOG_ERR, "fileno file fail\n");
diff --git a/etmem/src/etmemd_src/etmemd_slide.c b/etmem/src/etmemd_src/etmemd_slide.c
index cbc4b17..c478fbd 100644
--- a/etmem/src/etmemd_src/etmemd_slide.c
+++ b/etmem/src/etmemd_src/etmemd_slide.c
@@ -256,6 +256,10 @@ scan_out:
etmemd_log(ETMEMD_LOG_DEBUG, "slide migrate for pid %u fail\n", tk_pid->pid);
}
+ if (etmemd_reclaim_swapcache(tk_pid) != 0) {
+ etmemd_log(ETMEMD_LOG_DEBUG, "etmemd_reclaim_swapcache pid %u fail\n", tk_pid->pid);
+ }
+
exit:
/* clean memory_grade here */
pthread_cleanup_pop(1);
--
1.8.3.1

View File

@ -1,434 +0,0 @@
From d6e4942b34bbcbfaec8b0d4702f0e385f8d267f1 Mon Sep 17 00:00:00 2001
From: liubo <liubo254@huawei.com>
Date: Tue, 18 Jan 2022 15:55:29 +0800
Subject: [PATCH 18/33] etmem: add swap flag to support specified page swap out
The existing memory expansion tool etmem swaps out
all pages that can be swapped out for the process by
default, unless the page is marked with lock flag.
The function of swapping out specified pages is add.
The process adds special flag for pages to be swapped
out. This function depends on etmem_scan module.
Added swap_flag field to indicate that a tagged swap
out is used for this process instead of the default
swap out.
Signed-off-by: liubo <liubo254@huawei.com>
---
etmem/conf/slide_conf.yaml | 1 +
etmem/inc/etmemd_inc/etmemd_common.h | 14 +++-----------
etmem/inc/etmemd_inc/etmemd_scan.h | 9 +++++++--
etmem/inc/etmemd_inc/etmemd_scan_exp.h | 1 +
etmem/inc/etmemd_inc/etmemd_slide.h | 7 ++++++-
etmem/inc/etmemd_inc/etmemd_task_exp.h | 1 +
etmem/src/etmemd_src/etmemd_common.c | 34 +++++++++++++++++++---------------
etmem/src/etmemd_src/etmemd_migrate.c | 8 ++++++--
etmem/src/etmemd_src/etmemd_scan.c | 24 ++++++++++++++++--------
etmem/src/etmemd_src/etmemd_slide.c | 12 ++++++------
etmem/src/etmemd_src/etmemd_task.c | 23 +++++++++++++++++++++++
11 files changed, 89 insertions(+), 45 deletions(-)
diff --git a/etmem/conf/slide_conf.yaml b/etmem/conf/slide_conf.yaml
index f55c508..8169b7d 100644
--- a/etmem/conf/slide_conf.yaml
+++ b/etmem/conf/slide_conf.yaml
@@ -21,3 +21,4 @@ value=mysql
T=1
max_threads=1
swap_threshold=10g
+swap_flag=yes
diff --git a/etmem/inc/etmemd_inc/etmemd_common.h b/etmem/inc/etmemd_inc/etmemd_common.h
index ced606e..03792a7 100644
--- a/etmem/inc/etmemd_inc/etmemd_common.h
+++ b/etmem/inc/etmemd_inc/etmemd_common.h
@@ -34,7 +34,7 @@
#define BYTE_TO_KB(s) ((s) >> 10)
#define KB_TO_BYTE(s) ((s) << 10)
-#define CONVERT_GB_2_KB (1024 * 1024)
+#define GB_TO_KB(s) ((s) << 20)
#define MAX_SWAPCACHE_WMARK_VALUE 100
@@ -46,17 +46,9 @@
#define PIPE_FD_LEN 2
-#define IDLE_SCAN_MAGIC 0x66
-#define IDLE_SCAN_ADD_FLAGS _IOW(IDLE_SCAN_MAGIC, 0x0, unsigned int)
-
-enum swap_type {
- DONT_SWAP = 0,
- DO_SWAP,
-};
-
struct ioctl_para {
unsigned long ioctl_cmd;
- int ioctl_parameter;
+ unsigned int ioctl_parameter;
};
/*
@@ -87,6 +79,6 @@ int get_mem_from_proc_file(const char *pid, const char *file_name, unsigned long
int dprintf_all(int fd, const char *format, ...);
-int get_swap_threshold_inKB(char *string);
+int get_swap_threshold_inKB(const char *string, unsigned long *value);
#endif
diff --git a/etmem/inc/etmemd_inc/etmemd_scan.h b/etmem/inc/etmemd_inc/etmemd_scan.h
index 9e5bcc4..7c25152 100644
--- a/etmem/inc/etmemd_inc/etmemd_scan.h
+++ b/etmem/inc/etmemd_inc/etmemd_scan.h
@@ -20,6 +20,7 @@
#include "etmemd.h"
#include "etmemd_task.h"
#include "etmemd_scan_exp.h"
+#include "etmemd_common.h"
#define VMA_SEG_CNT_MAX 6
#define VMA_PERMS_STR_LEN 5
@@ -34,7 +35,10 @@
#define SMAPS_FILE "/smaps"
#define VMFLAG_HEAD "VmFlags"
-#define ALL_SCAN_FLAGS (SCAN_AS_HUGE | SCAN_IGN_HOST)
+#define IDLE_SCAN_MAGIC 0x66
+#define IDLE_SCAN_ADD_FLAGS _IOW(IDLE_SCAN_MAGIC, 0x0, unsigned int)
+#define VMA_SCAN_ADD_FLAGS _IOW(IDLE_SCAN_MAGIC, 0x2, unsigned int)
+#define ALL_SCAN_FLAGS (SCAN_AS_HUGE | SCAN_IGN_HOST | VMA_SCAN_FLAG)
enum page_idle_type {
PTE_ACCESS = 0, /* 4k page */
@@ -70,7 +74,8 @@ struct page_refs *etmemd_do_scan(const struct task_pid *tpid, const struct task
void free_vmas(struct vmas *vmas);
struct page_refs **walk_vmas(int fd, struct walk_address *walk_address, struct page_refs **pf, unsigned long *use_rss);
-int get_page_refs(const struct vmas *vmas, const char *pid, struct page_refs **page_refs, unsigned long *use_rss, int flags);
+int get_page_refs(const struct vmas *vmas, const char *pid, struct page_refs **page_refs,
+ unsigned long *use_rss, struct ioctl_para *ioctl_para);
int split_vmflags(char ***vmflags_array, char *vmflags);
struct vmas *get_vmas_with_flags(const char *pid, char **vmflags_array, int vmflags_num, bool is_anon_only);
diff --git a/etmem/inc/etmemd_inc/etmemd_scan_exp.h b/etmem/inc/etmemd_inc/etmemd_scan_exp.h
index 1fd4379..7be925c 100644
--- a/etmem/inc/etmemd_inc/etmemd_scan_exp.h
+++ b/etmem/inc/etmemd_inc/etmemd_scan_exp.h
@@ -25,6 +25,7 @@
#define SCAN_AS_HUGE 0100000000 /* treat normal vm page as vm hugepage */
#define SCAN_IGN_HOST 0200000000 /* ignore host access when scan vm */
+#define VMA_SCAN_FLAG 0x1000 /* scan the specifics vma with flag */
enum {
VMA_STAT_READ = 0,
diff --git a/etmem/inc/etmemd_inc/etmemd_slide.h b/etmem/inc/etmemd_inc/etmemd_slide.h
index 7c80502..726c721 100644
--- a/etmem/inc/etmemd_inc/etmemd_slide.h
+++ b/etmem/inc/etmemd_inc/etmemd_slide.h
@@ -22,10 +22,15 @@
struct slide_params {
struct task_executor *executor;
int t; /* watermark */
- int swap_threshold;
+ unsigned long swap_threshold;
uint8_t dram_percent;
};
+enum swap_type {
+ DONT_SWAP = 0,
+ DO_SWAP,
+};
+
int fill_engine_type_slide(struct engine *eng, GKeyFile *config);
#endif
diff --git a/etmem/inc/etmemd_inc/etmemd_task_exp.h b/etmem/inc/etmemd_inc/etmemd_task_exp.h
index 33d505a..6f775b6 100644
--- a/etmem/inc/etmemd_inc/etmemd_task_exp.h
+++ b/etmem/inc/etmemd_inc/etmemd_task_exp.h
@@ -29,6 +29,7 @@ struct task {
char *value;
char *name;
int max_threads;
+ int swap_flag;
struct task_pid *pids;
struct engine *eng;
diff --git a/etmem/src/etmemd_src/etmemd_common.c b/etmem/src/etmemd_src/etmemd_common.c
index bb72fd0..dfbae6d 100644
--- a/etmem/src/etmemd_src/etmemd_common.c
+++ b/etmem/src/etmemd_src/etmemd_common.c
@@ -261,7 +261,7 @@ static char *etmemd_get_proc_file_str(const char *pid, const char *file)
}
if (snprintf_s(file_name, file_str_size, file_str_size - 1,
- "%s%s%s", PROC_PATH, pid ? pid : "", file) == -1) {
+ "%s%s%s", PROC_PATH, pid == NULL ? "" : pid, file) == -1) {
etmemd_log(ETMEMD_LOG_ERR, "snprintf for %s fail\n", file);
free(file_name);
return NULL;
@@ -274,8 +274,8 @@ int etmemd_send_ioctl_cmd(FILE *fp, struct ioctl_para *request)
{
int fd = -1;
- if (fp == NULL) {
- etmemd_log(ETMEMD_LOG_ERR, "send ioctl cmd fail, fp is null\n");
+ if (fp == NULL || request == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "send ioctl cmd fail, para is null\n");
return -1;
}
@@ -285,8 +285,8 @@ int etmemd_send_ioctl_cmd(FILE *fp, struct ioctl_para *request)
return -1;
}
- if (request == NULL || ioctl(fd, request->ioctl_cmd, &request->ioctl_parameter) != 0) {
- etmemd_log(ETMEMD_LOG_ERR, "send ioctl cmd fail, request is wrong\n");
+ if (ioctl(fd, request->ioctl_cmd, &request->ioctl_parameter) != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "ioctl failed\n");
return -1;
}
@@ -298,6 +298,11 @@ FILE *etmemd_get_proc_file(const char *pid, const char *file, const char *mode)
char *file_name = NULL;
FILE *fp = NULL;
+ if (file == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "etmemd_get_proc_file file should not be NULL\n");
+ return NULL;
+ }
+
file_name = etmemd_get_proc_file_str(pid, file);
if (file_name == NULL) {
return NULL;
@@ -498,22 +503,21 @@ unsigned long get_pagesize(void)
return (unsigned long)pagesize;
}
-int get_swap_threshold_inKB(char *string)
+int get_swap_threshold_inKB(const char *string, unsigned long *value)
{
int len;
int i;
int ret = -1;
char *swap_threshold_string = NULL;
- int swap_threshold_inGB;
- int swap_threshold_inKB;
+ unsigned long swap_threshold_inGB;
- if (string == NULL) {
+ if (string == NULL || value == NULL) {
goto out;
}
len = strlen(string);
- if (len > SWAP_THRESHOLD_MAX_LEN) {
- etmemd_log(ETMEMD_LOG_ERR, "swap_threshold string is too long.\n");
+ if (len == 0 || len > SWAP_THRESHOLD_MAX_LEN) {
+ etmemd_log(ETMEMD_LOG_ERR, "swap_threshold string is invalid.\n");
goto out;
}
@@ -537,13 +541,13 @@ int get_swap_threshold_inKB(char *string)
goto free_out;
}
- if (get_int_value(swap_threshold_string, &swap_threshold_inGB) != 0) {
- etmemd_log(ETMEMD_LOG_ERR, "get_int_value swap_threshold faild.\n");
+ if (get_unsigned_long_value(swap_threshold_string, &swap_threshold_inGB) != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "get_unsigned_long_value swap_threshold faild.\n");
goto free_out;
}
- swap_threshold_inKB = swap_threshold_inGB * CONVERT_GB_2_KB;
- ret = swap_threshold_inKB;
+ *value = GB_TO_KB(swap_threshold_inGB);
+ ret = 0;
free_out:
free(swap_threshold_string);
diff --git a/etmem/src/etmemd_src/etmemd_migrate.c b/etmem/src/etmemd_src/etmemd_migrate.c
index 87bfde0..a5cce41 100644
--- a/etmem/src/etmemd_src/etmemd_migrate.c
+++ b/etmem/src/etmemd_src/etmemd_migrate.c
@@ -131,7 +131,8 @@ static bool check_should_reclaim_swapcache(const struct task_pid *tk_pid)
return false;
}
- if ((swapcache_total / proj->swapcache_high_wmark) <= (mem_total / MAX_SWAPCACHE_WMARK_VALUE)) {
+ if (swapcache_total == 0 ||
+ (mem_total / swapcache_total) >= (unsigned long)(MAX_SWAPCACHE_WMARK_VALUE / proj->swapcache_high_wmark)) {
return false;
}
@@ -190,7 +191,10 @@ int etmemd_reclaim_swapcache(const struct task_pid *tk_pid)
}
if (!tk_pid->tk->eng->proj->wmark_set) {
- set_swapcache_wmark(tk_pid, pid_str);
+ if (set_swapcache_wmark(tk_pid, pid_str) != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "set_swapcache_wmark for pid %u fail\n", tk_pid->pid);
+ return -1;
+ }
tk_pid->tk->eng->proj->wmark_set = true;
}
diff --git a/etmem/src/etmemd_src/etmemd_scan.c b/etmem/src/etmemd_src/etmemd_scan.c
index a1f8cdc..e06ba92 100644
--- a/etmem/src/etmemd_src/etmemd_scan.c
+++ b/etmem/src/etmemd_src/etmemd_scan.c
@@ -672,7 +672,8 @@ struct page_refs **walk_vmas(int fd,
* this parameter is used only in the dynamic engine to calculate the swap-in rate.
* In other policies, NULL can be directly transmitted.
* */
-int get_page_refs(const struct vmas *vmas, const char *pid, struct page_refs **page_refs, unsigned long *use_rss, int flags)
+int get_page_refs(const struct vmas *vmas, const char *pid, struct page_refs **page_refs,
+ unsigned long *use_rss, struct ioctl_para *ioctl_para)
{
u_int64_t i;
FILE *scan_fp = NULL;
@@ -680,10 +681,6 @@ int get_page_refs(const struct vmas *vmas, const char *pid, struct page_refs **p
struct vma *vma = vmas->vma_list;
struct page_refs **tmp_page_refs = NULL;
struct walk_address walk_address = {0, 0, 0};
- struct ioctl_para ioctl_para = {
- .ioctl_cmd = IDLE_SCAN_ADD_FLAGS,
- .ioctl_parameter = flags,
- };
scan_fp = etmemd_get_proc_file(pid, IDLE_SCAN_FILE, "r");
if (scan_fp == NULL) {
@@ -691,7 +688,8 @@ int get_page_refs(const struct vmas *vmas, const char *pid, struct page_refs **p
return -1;
}
- if (flags != 0 && etmemd_send_ioctl_cmd(scan_fp, &ioctl_para) != 0) {
+ if (ioctl_para != NULL && ioctl_para->ioctl_parameter != 0
+ && etmemd_send_ioctl_cmd(scan_fp, ioctl_para) != 0) {
fclose(scan_fp);
etmemd_log(ETMEMD_LOG_ERR, "etmemd_send_ioctl_cmd %s file for pid %s fail\n", IDLE_SCAN_FILE, pid);
return -1;
@@ -734,6 +732,7 @@ int get_page_refs(const struct vmas *vmas, const char *pid, struct page_refs **p
int etmemd_get_page_refs(const struct vmas *vmas, const char *pid, struct page_refs **page_refs, int flags)
{
+ struct ioctl_para ioctl_para;
if (!g_exp_scan_inited) {
etmemd_log(ETMEMD_LOG_ERR, "scan module is not inited before etmemd_get_page_refs\n");
return -1;
@@ -744,7 +743,10 @@ int etmemd_get_page_refs(const struct vmas *vmas, const char *pid, struct page_r
return -1;
}
- return get_page_refs(vmas, pid, page_refs, NULL, flags & ALL_SCAN_FLAGS);
+ ioctl_para.ioctl_parameter = flags & ALL_SCAN_FLAGS;
+ ioctl_para.ioctl_cmd = IDLE_SCAN_ADD_FLAGS;
+
+ return get_page_refs(vmas, pid, page_refs, NULL, &ioctl_para);
}
void etmemd_free_page_refs(struct page_refs *pf)
@@ -765,6 +767,7 @@ struct page_refs *etmemd_do_scan(const struct task_pid *tpid, const struct task
struct page_refs *page_refs = NULL;
int ret;
char pid[PID_STR_MAX_LEN] = {0};
+ struct ioctl_para ioctl_para = {0};
if (tk == NULL) {
etmemd_log(ETMEMD_LOG_ERR, "task struct is null for pid %u\n", tpid->pid);
@@ -785,9 +788,14 @@ struct page_refs *etmemd_do_scan(const struct task_pid *tpid, const struct task
return NULL;
}
+ ioctl_para.ioctl_cmd = VMA_SCAN_ADD_FLAGS;
+ if (tk->swap_flag != 0) {
+ ioctl_para.ioctl_parameter = VMA_SCAN_FLAG;
+ }
+
/* loop for scanning idle_pages to get result of memory access. */
for (i = 0; i < page_scan->loop; i++) {
- ret = get_page_refs(vmas, pid, &page_refs, NULL, 0);
+ ret = get_page_refs(vmas, pid, &page_refs, NULL, &ioctl_para);
if (ret != 0) {
etmemd_log(ETMEMD_LOG_ERR, "scan operation failed\n");
/* free page_refs nodes already exist */
diff --git a/etmem/src/etmemd_src/etmemd_slide.c b/etmem/src/etmemd_src/etmemd_slide.c
index c478fbd..236778a 100644
--- a/etmem/src/etmemd_src/etmemd_slide.c
+++ b/etmem/src/etmemd_src/etmemd_slide.c
@@ -185,7 +185,7 @@ static int check_pidmem_lower_threshold(struct task_pid *tk_pid)
return check_pid_should_swap(pid_str, vmrss, tk_pid);
}
- if ((int)vmrss > params->swap_threshold) {
+ if (vmrss > params->swap_threshold) {
return DO_SWAP;
}
@@ -305,16 +305,16 @@ static int fill_task_swap_threshold(void *obj, void *val)
{
struct slide_params *params = (struct slide_params *)obj;
char *swap_threshold_string = (char *)val;
- int swap_threshold = get_swap_threshold_inKB(swap_threshold_string);
+ unsigned long swap_threshold;
- free(swap_threshold_string);
-
- if (swap_threshold < 0) {
+ if (get_swap_threshold_inKB(swap_threshold_string, &swap_threshold) != 0) {
etmemd_log(ETMEMD_LOG_WARN,
"parse swap_threshold failed.\n");
+ free(swap_threshold_string);
return -1;
}
-
+
+ free(swap_threshold_string);
params->swap_threshold = swap_threshold;
return 0;
diff --git a/etmem/src/etmemd_src/etmemd_task.c b/etmem/src/etmemd_src/etmemd_task.c
index 618245e..2a8cb3e 100644
--- a/etmem/src/etmemd_src/etmemd_task.c
+++ b/etmem/src/etmemd_src/etmemd_task.c
@@ -470,10 +470,33 @@ static int fill_task_threads(void *obj, void *val)
return 0;
}
+static int fill_task_swap_flag(void *obj, void *val)
+{
+ struct task *tk = (struct task *)obj;
+ char *swap_flag = (char *)val;
+
+ if (strcmp(swap_flag, "yes") == 0) {
+ tk->swap_flag = 1;
+ free(val);
+ return 0;
+ }
+
+ if (strcmp(swap_flag, "no") == 0) {
+ tk->swap_flag = 0;
+ free(val);
+ return 0;
+ }
+
+ free(val);
+ etmemd_log(ETMEMD_LOG_ERR, "swap_flag para is not valid.\n");
+ return -1;
+}
+
struct config_item g_task_config_items[] = {
{"name", STR_VAL, fill_task_name, false},
{"type", STR_VAL, fill_task_type, false},
{"value", STR_VAL, fill_task_value, false},
+ {"swap_flag", STR_VAL, fill_task_swap_flag, true},
{"max_threads", INT_VAL, fill_task_threads, true},
};
--
1.8.3.1

View File

@ -1,93 +0,0 @@
From fff3255965293f42b9b6af79d0766110411c49d4 Mon Sep 17 00:00:00 2001
From: liubo <liubo254@huawei.com>
Date: Sat, 12 Feb 2022 10:15:28 +0800
Subject: [PATCH 19/33] etmem: fix the swapcache wmark configuration parse
error
swapcache_high_wmark and swapcache_low_wmark should
appear in pairs, missing either part should report
an error.
In addition, swapcache_high_wmark should be greater
than swapcache_low_wmark.
Signed-off-by: liubo <liubo254@huawei.com>
---
etmem/src/etmemd_src/etmemd_migrate.c | 2 +-
etmem/src/etmemd_src/etmemd_project.c | 20 ++++++++++++++------
2 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/etmem/src/etmemd_src/etmemd_migrate.c b/etmem/src/etmemd_src/etmemd_migrate.c
index a5cce41..a143c5e 100644
--- a/etmem/src/etmemd_src/etmemd_migrate.c
+++ b/etmem/src/etmemd_src/etmemd_migrate.c
@@ -115,7 +115,7 @@ static bool check_should_reclaim_swapcache(const struct task_pid *tk_pid)
unsigned long swapcache_total;
int ret;
- if (proj->swapcache_high_wmark == 0) {
+ if (proj->swapcache_high_wmark == -1 || proj->swapcache_low_wmark == -1) {
return false;
}
diff --git a/etmem/src/etmemd_src/etmemd_project.c b/etmem/src/etmemd_src/etmemd_project.c
index 72d7335..e238e66 100644
--- a/etmem/src/etmemd_src/etmemd_project.c
+++ b/etmem/src/etmemd_src/etmemd_project.c
@@ -649,13 +649,13 @@ static int fill_project_sysmem_threshold(void *obj, void *val)
}
/* fill the project parameter: swapcache_low_wmark
- * swapcache_low_wmark: [0, 100]. */
+ * swapcache_low_wmark: (0, 100]. */
static int fill_project_swapcache_low_wmark(void *obj, void *val)
{
struct project *proj = (struct project *)obj;
int swapcache_low_wmark = parse_to_int(val);
- if (swapcache_low_wmark < 0 || swapcache_low_wmark > MAX_SWAPCACHE_WMARK_VALUE) {
+ if (swapcache_low_wmark <= 0 || swapcache_low_wmark > MAX_SWAPCACHE_WMARK_VALUE) {
etmemd_log(ETMEMD_LOG_ERR, "invaild project swapcache_low_wmark value %d, it must between 0 and 100.\n",
swapcache_low_wmark);
return -1;
@@ -672,7 +672,7 @@ static int fill_project_swapcache_high_wmark(void *obj, void *val)
struct project *proj = (struct project *)obj;
int swapcache_high_wmark = parse_to_int(val);
- if (swapcache_high_wmark < 0 || swapcache_high_wmark > MAX_SWAPCACHE_WMARK_VALUE) {
+ if (swapcache_high_wmark <= 0 || swapcache_high_wmark > MAX_SWAPCACHE_WMARK_VALUE) {
etmemd_log(ETMEMD_LOG_ERR, "invaild project swapcache_high_wmark value %d, it must between 0 and 100.\n",
swapcache_high_wmark);
return -1;
@@ -684,11 +684,17 @@ static int fill_project_swapcache_high_wmark(void *obj, void *val)
static bool check_swapcache_wmark_valid(struct project *proj)
{
- if (proj->swapcache_low_wmark > proj->swapcache_high_wmark) {
- return false;
+ if (proj->swapcache_high_wmark == -1 && proj->swapcache_low_wmark == -1) {
+ return true;
}
- return true;
+ if ((proj->swapcache_high_wmark > 0) &&
+ (proj->swapcache_low_wmark > 0) &&
+ (proj->swapcache_high_wmark > proj->swapcache_low_wmark)) {
+ return true;
+ }
+
+ return false;
}
static struct config_item g_project_config_items[] = {
@@ -759,6 +765,8 @@ enum opt_result etmemd_project_add(GKeyFile *config)
}
proj->sysmem_threshold = -1;
+ proj->swapcache_high_wmark = -1;
+ proj->swapcache_low_wmark = -1;
if (project_fill_by_conf(config, proj) != 0) {
etmemd_log(ETMEMD_LOG_ERR, "fill project from configuration file fail\n");
--
1.8.3.1

View File

@ -1,108 +0,0 @@
From 1ebeebf02a171d0029e70ee67270a8f7dab3e04e Mon Sep 17 00:00:00 2001
From: liubo <liubo254@huawei.com>
Date: Thu, 24 Feb 2022 01:13:17 +0000
Subject: [PATCH 20/33] etmem: update README.md.
Add the usage constraints of etmem,
and introduce some added configuration file parameters
Signed-off-by: liubo <liubo254@huawei.com>
---
README.md | 45 ++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 40 insertions(+), 5 deletions(-)
diff --git a/README.md b/README.md
index 93631a1..49287f9 100644
--- a/README.md
+++ b/README.md
@@ -29,6 +29,30 @@ etmem内存分级扩展技术通过DRAM+内存压缩/高性能存储新介质
$ make
+## 注意事项
+### 运行依赖
+etmem作为内存扩展工具需要依赖于内核态的特性支持为了可以识别内存访问情况和支持主动将内存写入swap分区来达到内存垂直扩展的需求etmem在运行时需要插入etmem_scan和etmem_swap模块
+
+```
+modprobe etmem_scan
+modprobe etmem_swap
+```
+openuler21.03、21.09、20.03 LTS SP2以及20.03 LTS SP3均支持etmem内存扩展相关特性可以直接使用以上内核。
+
+### 权限限制
+运行etmem进程需要root权限root用户具有系统最高权限在使用root用户进行操作时请严格按照操作指导进行操作避免其他操作造成系统管理及安全风险。
+
+### 使用约束
+
+- etmem的客户端和服务端需要在同一个服务器上部署不支持跨服务器通信的场景。
+- etmem仅支持扫描进程名小于或等于15个字符长度的目标进程。
+- 在使用AEP介质进行内存扩展的时候依赖于系统可以正确识别AEP设备并将AEP设备初始化为numa node。并且配置文件中的vm_flags字段只能配置为ht。
+- 引擎私有命令仅针对对应引擎和引擎下的任务有效比如cslide所支持的showhostpages和showtaskpages。
+- 第三方策略实现代码中eng_mgt_func接口中的fd不能写入0xff和0xfe字。
+- 支持在一个工程内添加多个不同的第三方策略动态库以配置文件中的eng_name来区分。
+- 禁止并发扫描同一个进程。未加载etmem_scan和etmem_swap ko时禁止使用/proc/xxx/idle_pages和/proc/xxx/swap_pages文件
+
+
## 使用说明
### 启动etmemd进程
@@ -63,7 +87,14 @@ options
在运行etmem进程之前需要管理员预先规划哪些进程需要做内存扩展将进程信息配置到etmem配置文件中并配置内存扫描的周期、扫描次数、内存冷热阈值等信息。
-配置文件的示例文件在源码包中放置在源码根目录的conf/example_conf.yaml建议在使用时放置在/etc/etmem/目录下,示例内容为:
+配置文件的示例文件在源码包中,放置在/etc/etmem文件路径下按照功能划分为3个示例文件
+
+```
+/etc/etmem/cslide_conf.yaml
+/etc/etmem/slide_conf.yaml
+/etc/etmem/thirdparty_conf.yaml
+```
+示例内容分别为:
```
[project]
@@ -132,6 +163,9 @@ task_private_key=task_private_value
| loop | 内存扫描的循环次数 | 是 | 是 | 1~10 | loop=3 //扫描3次 |
| interval | 每次内存扫描的时间间隔 | 是 | 是 | 1~1200 | interval=5 //每次扫描之间间隔5s |
| sleep | 每个内存扫描+操作的大周期之间时间间隔 | 是 | 是 | 1~1200 | sleep=10 //每次大周期之间间隔10s |
+| sysmem_threshold| slide engine的配置项系统内存换出阈值 | 否 | 是 | 0~100 | sysmem_threshold=50 //系统内存剩余量小于50%时etmem才会触发内存换出|
+| swapcache_high_wmark| slide engine的配置项swacache可以占用系统内存的比例高水线 | 否 | 是 | 1~100 | swapcache_high_wmark=5 //swapcache内存占用量可以为系统内存的5%超过该比例etmem会触发swapcache回收<br> 注: swapcache_high_wmark需要大于swapcache_low_wmark|
+| swapcache_low_wmark| slide engine的配置项swacache可以占用系统内存的比例低水线 | 否 | 是 | [1~swapcache_high_wmark) | swapcache_low_wmark=3 //触发swapcache回收后系统会将swapcache内存占用量回收到低于3%|
| [engine] | engine公用配置段起始标识 | 否 | 否 | NA | engine参数的开头标识表示下面的参数直到另外的[xxx]或文件结尾为止的范围内均为engine section的参数 |
| project | 声明所在的project | 是 | 是 | 64个字以内的字符串 | 已经存在名字为test的project则可以写为project=test |
| engine | 声明所在的engine | 是 | 是 | slide/cslide/thridparty | 声明使用的是slide或cslide或thirdparty策略 |
@@ -155,7 +189,8 @@ task_private_key=task_private_value
| anon_only | engine为cslide的task配置项标识是否只扫描匿名页 | 否 | 是 | yes/no | anon_only=no //配置为yes时只扫描匿名页配置为no时非匿名页也会扫描 |
| ign_host | engine为cslide的task配置项标识是否忽略host上的页表扫描信息 | 否 | 是 | yes/no | ign_host=no //yes为忽略no为不忽略 |
| task_private_key | engine为thirdparty的task配置项预留给第三方策略的task解析私有参数的配置项选配 | 否 | 否 | 根据第三方策略私有参数自行限制 | 根据第三方策略私有task参数自行配置 |
-
+| swap_threshold |slide engine的配置项进程内存换出阈值 | 否 | 是 | 进程可用内存绝对值 | swap_threshold=10g //进程占用内存在低于10g时不会触发换出。<br>当前版本下仅支持g/G作为内存绝对值单位。与sysmem_threshold配合使用仅系统内存低于阈值时进行白名单中进程阈值判断 |
+| swap_flag|slide engine的配置项进程指定内存换出 | 否 | 是 | yes/no | swap_flag=yes//使能进程指定内存换出 |
### etmem project/engine/task对象的创建和删除
@@ -172,11 +207,11 @@ task_private_key=task_private_value
添加对象:
-etmem obj add -f /etc/example_config.yaml -s etmemd_socket
+etmem obj add -f /etc/etmem/slide_conf.yaml -s etmemd_socket
删除对象:
-etmem obj del -f /etc/example_config.yaml -s etmemd_socket
+etmem obj del -f /etc/etmem/slide_conf.yaml -s etmemd_socket
打印帮助:
@@ -491,4 +526,4 @@ etmem engine showhostpages -n proj_name -e cslide -s etmemd_socket
1. Fork本仓库
2. 新建个人分支
3. 提交代码
-4. 新建Pull Request
\ No newline at end of file
+4. 新建Pull Request
--
1.8.3.1

View File

@ -1,520 +0,0 @@
From 6847808d04c18a76db6bbf38ac6e421a5fac8b7c Mon Sep 17 00:00:00 2001
From: liubo <liubo254@huawei.com>
Date: Mon, 24 Jan 2022 03:50:17 +0800
Subject: [PATCH 21/33] etmem: add code of testcase
add code of testcase of etmem socket functions.
Signed-off-by: liubo <liubo254@huawei.com>
---
etmem/test/conf/conf_cslide/task.config | 16 +-
etmem/test/etmem_migrate_ops_llt/CMakeLists.txt | 54 ++--
.../etmem_migrate_ops_llt/etmem_migrate_ops_llt.c | 5 +-
.../test/etmem_socket_ops_llt_test/CMakeLists.txt | 26 ++
.../etmem_socket_ops_llt.c | 356 +++++++++++++++++++++
5 files changed, 419 insertions(+), 38 deletions(-)
create mode 100644 etmem/test/etmem_socket_ops_llt_test/CMakeLists.txt
create mode 100644 etmem/test/etmem_socket_ops_llt_test/etmem_socket_ops_llt.c
diff --git a/etmem/test/conf/conf_cslide/task.config b/etmem/test/conf/conf_cslide/task.config
index 336be39..9719cb6 100644
--- a/etmem/test/conf/conf_cslide/task.config
+++ b/etmem/test/conf/conf_cslide/task.config
@@ -1,9 +1,9 @@
-[task]
-project=test
-engine=cslide
-name=background1
-type=pid
-value=1
-vm_flags=ht
-anon_only=no
+[task]
+project=test
+engine=cslide
+name=background1
+type=pid
+value=1
+vm_flags=ht
+anon_only=no
ign_host=yes
\ No newline at end of file
diff --git a/etmem/test/etmem_migrate_ops_llt/CMakeLists.txt b/etmem/test/etmem_migrate_ops_llt/CMakeLists.txt
index a9487af..d998af7 100644
--- a/etmem/test/etmem_migrate_ops_llt/CMakeLists.txt
+++ b/etmem/test/etmem_migrate_ops_llt/CMakeLists.txt
@@ -1,27 +1,27 @@
-# /******************************************************************************
-# * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
-# * etmem is licensed under the Mulan PSL v2.
-# * You can use this software according to the terms and conditions of the Mulan PSL v2.
-# * You may obtain a copy of Mulan PSL v2 at:
-# * http://license.coscl.org.cn/MulanPSL2
-# * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
-# * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
-# * PURPOSE.
-# * See the Mulan PSL v2 for more details.
-# * Author: liubo
-# * Create: 2021-12-10
-# * Description: CMakefileList for etmem_migrate_ops_llt to compile
-# ******************************************************************************/
-
-project(etmem)
-
-INCLUDE_DIRECTORIES(../../inc/etmem_inc)
-INCLUDE_DIRECTORIES(../../inc/etmemd_inc)
-INCLUDE_DIRECTORIES(${GLIB2_INCLUDE_DIRS})
-
-SET(EXE etmem_migrate_ops_llt)
-
-add_executable(${EXE} etmem_migrate_ops_llt.c)
-
-set_target_properties(${EXE} PROPERTIES LINK_FLAGS "-Wl,--wrap,get_mem_from_proc_file")
-target_link_libraries(${EXE} cunit ${BUILD_DIR}/lib/libetmemd.so pthread dl rt boundscheck numa ${GLIB2_LIBRARIES})
+# /******************************************************************************
+# * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+# * etmem is licensed under the Mulan PSL v2.
+# * You can use this software according to the terms and conditions of the Mulan PSL v2.
+# * You may obtain a copy of Mulan PSL v2 at:
+# * http://license.coscl.org.cn/MulanPSL2
+# * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+# * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+# * PURPOSE.
+# * See the Mulan PSL v2 for more details.
+# * Author: liubo
+# * Create: 2021-12-10
+# * Description: CMakefileList for etmem_migrate_ops_llt to compile
+# ******************************************************************************/
+
+project(etmem)
+
+INCLUDE_DIRECTORIES(../../inc/etmem_inc)
+INCLUDE_DIRECTORIES(../../inc/etmemd_inc)
+INCLUDE_DIRECTORIES(${GLIB2_INCLUDE_DIRS})
+
+SET(EXE etmem_migrate_ops_llt)
+
+add_executable(${EXE} etmem_migrate_ops_llt.c)
+
+set_target_properties(${EXE} PROPERTIES LINK_FLAGS "-Wl,--wrap,get_mem_from_proc_file")
+target_link_libraries(${EXE} cunit ${BUILD_DIR}/lib/libetmemd.so pthread dl rt boundscheck numa ${GLIB2_LIBRARIES})
diff --git a/etmem/test/etmem_migrate_ops_llt/etmem_migrate_ops_llt.c b/etmem/test/etmem_migrate_ops_llt/etmem_migrate_ops_llt.c
index 2758680..5c9b0d4 100644
--- a/etmem/test/etmem_migrate_ops_llt/etmem_migrate_ops_llt.c
+++ b/etmem/test/etmem_migrate_ops_llt/etmem_migrate_ops_llt.c
@@ -65,8 +65,7 @@ static struct memory_grade *get_memory_grade(void)
memory_grade = (struct memory_grade *)calloc(1, sizeof(struct memory_grade));
CU_ASSERT_PTR_NOT_NULL(memory_grade);
- while (page_refs != NULL)
- {
+ while (page_refs != NULL) {
if ((page_refs)->count >= WATER_LINE_TEMP) {
page_refs = add_page_refs_into_memory_grade(page_refs, &memory_grade->hot_pages);
continue;
@@ -104,7 +103,7 @@ static void test_etmem_migrate_ok(void)
memory_grade = get_memory_grade();
CU_ASSERT_PTR_NOT_NULL(memory_grade);
- CU_ASSERT_EQUAL(etmemd_grade_migrate("1", memory_grade), -1);
+ CU_ASSERT_EQUAL(etmemd_grade_migrate("1", memory_grade), 0);
clean_memory_grade_unexpected(&memory_grade);
CU_ASSERT_PTR_NULL(memory_grade);
diff --git a/etmem/test/etmem_socket_ops_llt_test/CMakeLists.txt b/etmem/test/etmem_socket_ops_llt_test/CMakeLists.txt
new file mode 100644
index 0000000..7cc5343
--- /dev/null
+++ b/etmem/test/etmem_socket_ops_llt_test/CMakeLists.txt
@@ -0,0 +1,26 @@
+# /******************************************************************************
+# * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+# * etmem is licensed under the Mulan PSL v2.
+# * You can use this software according to the terms and conditions of the Mulan PSL v2.
+# * You may obtain a copy of Mulan PSL v2 at:
+# * http://license.coscl.org.cn/MulanPSL2
+# * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+# * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+# * PURPOSE.
+# * See the Mulan PSL v2 for more details.
+# * Author: liubo
+# * Create: 2021-12-10
+# * Description: CMakefileList for etmem_log_ops_llt to compile
+# ******************************************************************************/
+
+project(etmem)
+
+INCLUDE_DIRECTORIES(../../inc/etmem_inc)
+INCLUDE_DIRECTORIES(../../inc/etmemd_inc)
+INCLUDE_DIRECTORIES(${GLIB2_INCLUDE_DIRS})
+
+SET(EXE etmem_socket_ops_llt)
+
+add_executable(${EXE} etmem_socket_ops_llt.c)
+
+target_link_libraries(${EXE} cunit ${BUILD_DIR}/lib/libetmemd.so pthread dl rt boundscheck numa ${GLIB2_LIBRARIES})
diff --git a/etmem/test/etmem_socket_ops_llt_test/etmem_socket_ops_llt.c b/etmem/test/etmem_socket_ops_llt_test/etmem_socket_ops_llt.c
new file mode 100644
index 0000000..387ffd1
--- /dev/null
+++ b/etmem/test/etmem_socket_ops_llt_test/etmem_socket_ops_llt.c
@@ -0,0 +1,356 @@
+/******************************************************************************
+ * Copyright (c) Huawei Technologies Co., Ltd. 2019-2021. All rights reserved.
+ * etmem is licensed under the Mulan PSL v2.
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
+ * You may obtain a copy of Mulan PSL v2 at:
+ * http://license.coscl.org.cn/MulanPSL2
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
+ * PURPOSE.
+ * See the Mulan PSL v2 for more details.
+ * Author: liubo
+ * Create: 2021-08-14
+ * Description: This is a source file of the unit test for rpc functions in etmem.
+ ******************************************************************************/
+
+#include <sys/file.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <pthread.h>
+#include <unistd.h>
+
+#include <CUnit/Basic.h>
+#include <CUnit/Automated.h>
+#include <CUnit/Console.h>
+
+#include "etmem_common.h"
+#include "etmem_rpc.h"
+#include "etmemd_rpc.h"
+#include "securec.h"
+#include "etmem.h"
+
+#define SOCK_NAME_MAX_LEN 108
+#define RPC_SEND_FILE_MAX 512
+#define SLEEP_TIME_ONE_T_US 1000
+
+static char *get_length_str(unsigned int length)
+{
+ char *result = NULL;
+ unsigned char i = 'a';
+ unsigned int j;
+ result = (char *)calloc(length + 1, sizeof(char));
+ if (result == NULL) {
+ return NULL;
+ }
+
+ for (j = 0; j < length; j++) {
+ result[j] = i;
+ }
+
+ return result;
+}
+
+static void test_sock_name_error(void)
+{
+ char *name = NULL;
+ CU_ASSERT_EQUAL(etmemd_parse_sock_name(NULL), -1);
+ CU_ASSERT_EQUAL(etmemd_parse_sock_name(""), -1);
+ CU_ASSERT_EQUAL(etmemd_parse_sock_name("name"), 0);
+
+ name = get_length_str(SOCK_NAME_MAX_LEN - 1);
+ CU_ASSERT_PTR_NOT_NULL(name);
+ CU_ASSERT_EQUAL(etmemd_parse_sock_name(name), -1);
+ free(name);
+
+ name = get_length_str(SOCK_NAME_MAX_LEN);
+ CU_ASSERT_PTR_NOT_NULL(name);
+ CU_ASSERT_EQUAL(etmemd_parse_sock_name(name), -1);
+ free(name);
+
+ name = get_length_str(SOCK_NAME_MAX_LEN + 1);
+ CU_ASSERT_PTR_NOT_NULL(name);
+ CU_ASSERT_EQUAL(etmemd_parse_sock_name(name), -1);
+ free(name);
+}
+
+static void test_sock_name_ok(void)
+{
+ char *name = NULL;
+
+ CU_ASSERT_EQUAL(etmemd_parse_sock_name("name"), 0);
+ CU_ASSERT_EQUAL(etmemd_parse_sock_name("n"), 0);
+
+ name = get_length_str(SOCK_NAME_MAX_LEN - 2);
+ CU_ASSERT_PTR_NOT_NULL(name);
+ CU_ASSERT_EQUAL(etmemd_parse_sock_name(name), 0);
+ free(name);
+}
+
+void *etmemd_rpc_server_start(void *msg)
+{
+ char *socket_name = (char *)msg;
+ CU_ASSERT_EQUAL(etmemd_parse_sock_name(socket_name), -1);
+ etmemd_rpc_server();
+}
+
+void *etmemd_rpc_server_start_ok(void *msg)
+{
+ char *socket_name = (char *)msg;
+ CU_ASSERT_EQUAL(etmemd_parse_sock_name(socket_name), 0);
+ etmemd_rpc_server();
+}
+
+static struct mem_proj *alloc_proj(int cmd, char *proj_name,
+ char *file_name, char *sock_name)
+{
+ struct mem_proj *proj = NULL;
+ proj = (struct mem_proj *)calloc(1, sizeof(struct mem_proj));
+ CU_ASSERT_PTR_NOT_NULL(proj);
+
+ proj->cmd = cmd;
+ proj->file_name = file_name;
+ proj->proj_name = proj_name;
+ proj->sock_name = sock_name;
+
+ return proj;
+}
+
+static int etmem_socket_client(int cmd, char *proj_name,
+ char *file_name, char *sock_name)
+{
+ int ret;
+ struct mem_proj *proj = NULL;
+ proj = alloc_proj(cmd, proj_name, file_name, sock_name);
+ ret = etmem_rpc_client(proj);
+ free(proj);
+ if (ret == 0) {
+ return 0;
+ }
+ return -1;
+}
+
+static void etmem_pro_add_error(void)
+{
+ char *file_name = NULL;
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_ADD, NULL, NULL, ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_ADD, NULL, "", ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_ADD, NULL, "file_name", ""), -1);
+ file_name = get_length_str(RPC_SEND_FILE_MAX);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_ADD, NULL, file_name, ""), -1);
+ free(file_name);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_ADD, NULL, "file_name", "sock_name"), -1);
+
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_ADD, "", NULL, ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_ADD, "", "", ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_ADD, "", "file_name", ""), -1);
+ file_name = get_length_str(RPC_SEND_FILE_MAX);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_ADD, "", file_name, ""), -1);
+ free(file_name);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_ADD, "", "file_name", "sock_name"), -1);
+
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_ADD, "test", NULL, ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_ADD, "test", "", ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_ADD, "test", "file_name", ""), -1);
+ file_name = get_length_str(RPC_SEND_FILE_MAX);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_ADD, "test", file_name, ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_ADD, "test", "file_name", "sock_name"), -1);
+ free(file_name);
+}
+
+static void etmem_pro_del_error(void)
+{
+ char *file_name = NULL;
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_DEL, NULL, NULL, ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_DEL, NULL, "", ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_DEL, NULL, "file_name", ""), -1);
+ file_name = get_length_str(RPC_SEND_FILE_MAX);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_DEL, NULL, file_name, ""), -1);
+ free(file_name);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_DEL, NULL, "file_name", "sock_name"), -1);
+
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_DEL, "", NULL, ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_DEL, "", "", ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_DEL, "", "file_name", ""), -1);
+ file_name = get_length_str(RPC_SEND_FILE_MAX);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_DEL, "", file_name, ""), -1);
+ free(file_name);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_DEL, "", "file_name", "sock_name"), -1);
+
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_DEL, "test", NULL, ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_DEL, "test", "", ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_DEL, "test", "file_name", ""), -1);
+ file_name = get_length_str(RPC_SEND_FILE_MAX);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_DEL, "test", file_name, ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_DEL, "test", "file_name", "sock_name"), -1);
+ free(file_name);
+}
+
+static void etmem_pro_start_error(void)
+{
+ char *file_name = NULL;
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_START, NULL, NULL, ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_START, NULL, "", ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_START, NULL, "file_name", ""), -1);
+ file_name = get_length_str(RPC_SEND_FILE_MAX);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_START, NULL, file_name, ""), -1);
+ free(file_name);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_START, NULL, "file_name", "sock_name"), -1);
+
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_START, "", NULL, ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_START, "", "", ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_START, "", "file_name", ""), -1);
+ file_name = get_length_str(RPC_SEND_FILE_MAX);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_START, "", file_name, ""), -1);
+ free(file_name);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_START, "", "file_name", "sock_name"), -1);
+
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_START, "test", NULL, ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_START, "test", "", ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_START, "test", "file_name", ""), -1);
+ file_name = get_length_str(RPC_SEND_FILE_MAX);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_START, "test", file_name, ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_START, "test", "file_name", "sock_name"), -1);
+ free(file_name);
+}
+
+static void etmem_pro_stop_error(void)
+{
+ char *file_name = NULL;
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_STOP, NULL, NULL, ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_STOP, NULL, "", ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_STOP, NULL, "file_name", ""), -1);
+ file_name = get_length_str(RPC_SEND_FILE_MAX);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_STOP, NULL, file_name, ""), -1);
+ free(file_name);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_STOP, NULL, "file_name", "sock_name"), -1);
+
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_STOP, "", NULL, ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_STOP, "", "", ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_STOP, "", "file_name", ""), -1);
+ file_name = get_length_str(RPC_SEND_FILE_MAX);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_STOP, "", file_name, ""), -1);
+ free(file_name);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_STOP, "", "file_name", "sock_name"), -1);
+
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_STOP, "test", NULL, ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_STOP, "test", "", ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_STOP, "test", "file_name", ""), -1);
+ file_name = get_length_str(RPC_SEND_FILE_MAX);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_STOP, "test", file_name, ""), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_STOP, "test", "file_name", "sock_name"), -1);
+ free(file_name);
+}
+
+static void test_socket_client_error(void)
+{
+ struct mem_proj *proj = NULL;
+ char *project_name = NULL;
+ char *file_name = NULL;
+ char *sock_name = NULL;
+ char *msg = "etmem_error_sock";
+
+ pthread_t etmem_socket_test;
+
+ CU_ASSERT_EQUAL(pthread_create(&etmem_socket_test, NULL, etmemd_rpc_server_start, NULL), EOK);
+ CU_ASSERT_EQUAL(pthread_create(&etmem_socket_test, NULL,
+ etmemd_rpc_server_start_ok, (void *)msg), EOK);
+ usleep(SLEEP_TIME_ONE_T_US);
+ etmem_pro_add_error();
+ etmem_pro_del_error();
+ etmem_pro_start_error();
+ etmem_pro_stop_error();
+
+ etmemd_handle_signal();
+}
+
+static void test_socket_client_ok(void)
+{
+ struct mem_proj *proj = NULL;
+ char *project_name = NULL;
+ char *file_name = NULL;
+ char *sock_name = NULL;
+ char *msg = "etmem_ok_sock";
+
+ pthread_t etmem_socket_test_ok;
+
+ CU_ASSERT_EQUAL(pthread_create(&etmem_socket_test_ok, NULL,
+ etmemd_rpc_server_start_ok, (void *)msg), EOK);
+ usleep(SLEEP_TIME_ONE_T_US);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_ADD, "test",
+ "../conf/conf_slide/config_file", msg), 0);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_SHOW, "test",
+ "../conf/conf_slide/config_file", msg), 0);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_START, "test",
+ "../conf/conf_slide/config_file", msg), 0);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_STOP, "test",
+ "../conf/conf_slide/config_file", msg), 0);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_DEL, "test",
+ "../conf/conf_slide/config_file", msg), 0);
+
+ etmemd_handle_signal();
+}
+
+typedef enum {
+ CUNIT_SCREEN = 0,
+ CUNIT_XMLFILE,
+ CUNIT_CONSOLE
+} cu_run_mode;
+
+int main(int argc, const char **argv)
+{
+ CU_pSuite suite;
+ CU_pTest pTest;
+ unsigned int num_failures;
+ cu_run_mode cunit_mode = CUNIT_SCREEN;
+ int error_num;
+
+ if (argc > 1) {
+ cunit_mode = atoi(argv[1]);
+ }
+
+ if (CU_initialize_registry() != CUE_SUCCESS) {
+ return -CU_get_error();
+ }
+
+ suite = CU_add_suite("etmem_socket_ops", NULL, NULL);
+ if (suite == NULL) {
+ goto ERROR;
+ }
+
+ if (CU_ADD_TEST(suite, test_sock_name_error) == NULL ||
+ CU_ADD_TEST(suite, test_sock_name_ok) == NULL ||
+ CU_ADD_TEST(suite, test_socket_client_error) == NULL ||
+ CU_ADD_TEST(suite, test_socket_client_ok) == NULL) {
+ printf("CU_ADD_TEST fail. \n");
+ goto ERROR;
+ }
+
+ switch (cunit_mode) {
+ case CUNIT_SCREEN:
+ CU_basic_set_mode(CU_BRM_VERBOSE);
+ CU_basic_run_tests();
+ break;
+ case CUNIT_XMLFILE:
+ CU_set_output_filename("etmemd_rpc.c");
+ CU_automated_run_tests();
+ break;
+ case CUNIT_CONSOLE:
+ CU_console_run_tests();
+ break;
+ default:
+ printf("not support cunit mode, only support: "
+ "0 for CUNIT_SCREEN, 1 for CUNIT_XMLFILE, 2 for CUNIT_CONSOLE\n");
+ goto ERROR;
+ }
+
+ num_failures = CU_get_number_of_failures();
+ CU_cleanup_registry();
+ return num_failures;
+
+ERROR:
+ error_num = CU_get_error();
+ CU_cleanup_registry();
+ return -error_num;
+}
--
1.8.3.1

File diff suppressed because it is too large Load Diff

View File

@ -1,308 +0,0 @@
From 2d15999e02c34c2580bb8744a143806e4391338e Mon Sep 17 00:00:00 2001
From: liubo <liubo254@huawei.com>
Date: Mon, 24 Jan 2022 07:52:02 +0800
Subject: [PATCH 23/33] etmem: add testcode script
add test.sh, the testcode compile and run script, for etmem.
Signed-off-by: liubo <liubo254@huawei.com>
---
etmem/test/test.sh | 286 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 286 insertions(+)
create mode 100644 etmem/test/test.sh
diff --git a/etmem/test/test.sh b/etmem/test/test.sh
new file mode 100644
index 0000000..55a8cd9
--- /dev/null
+++ b/etmem/test/test.sh
@@ -0,0 +1,286 @@
+#!/bin/bash
+
+run_test_exit_value=0
+usage()
+{
+ echo "Usage: sh test.sh [OPTIONS]"
+ echo "Use test.sh to control test operation"
+ echo
+ echo "Misc:"
+ echo " -h, --help Print this help, then exit"
+ echo
+ echo "Compile Options:"
+ echo " -m, --cmake <option> use cmake genenate Makefile, eg: -m(default), -mcoverage, -masan, --cmake, --cmake=coverage"
+ echo " -c, --compile Enable compile"
+ echo " -e, --empty Enable compile empty(make clean)"
+ echo
+ echo "TestRun Options"
+ echo " -r, --run <option> Run all test, eg: -r, -rscreen(default), -rxml, --run, --run=screen, --run=xml"
+ echo " -s, --specify FILE Only Run specify test executable FILE, eg: -smemory_test, --specify=memory_test"
+ echo
+ echo "Coverage Options"
+ echo " -t, --cover-report <option> Enable coverage report. eg: -t, -thtml(default), -ttxt, --cover-report, --cover-report=html, --cover-report=txt"
+ echo " -f, --cover-file FILE Specified FILE coverage report, eg: -fmemory.c, --cover-file=memory.c"
+ echo
+}
+
+ARGS=`getopt -o "hcer::m::t::s:f:" -l "help,cmake::,empty,cover-report::,run::,specify:,cover-file:" -n "test.sh" -- "$@"`
+if [ $? != 0 ]; then
+ usage
+ exit 1
+fi
+
+eval set -- "${ARGS}"
+
+if [ x"$ARGS" = x" --" ]; then
+ # set default value
+ COMPILE_ENABLE=no
+ COVERAGE_ENABLE=no
+ ASAN_ENABLE=no
+ CLEAN_ENABLE=no
+ RUN_TEST=yes
+ RUN_MODE=screen # value: screen or xml
+ COVER_REPORT_ENABLE=no
+fi
+
+while true; do
+ case "${1}" in
+ -h|--help)
+ usage; exit 0;;
+ -m|--cmake)
+ CMAKE_ENABLE=yes
+ case "$2" in
+ "") shift 2;;
+ coverage) COVERAGE_ENABLE=yes; shift 2;;
+ asan) ASAN_ENABLE=yes; shift 2;;
+ *) echo -e "\033[;31mError\033[0m param: $2"; exit 1;;
+ esac;;
+ -c|--compile)
+ COMPILE_ENABLE=yes
+ shift;;
+ -e|--empty)
+ CLEAN_ENABLE=yes
+ shift;;
+ -r|--run)
+ RUN_TEST=yes
+ case "$2" in
+ "") RUN_MODE=screen; shift 2;;
+ screen) RUN_MODE=screen; shift 2;;
+ xml) RUN_MODE=xml; shift 2;;
+ *)echo -e "\033[;31mError\033[0m param: $2"; exit 1;;
+ esac;;
+ -t|--cover-report)
+ COVER_REPORT_ENABLE=yes
+ case "$2" in
+ "") COVER_STYLE=html;shift 2;;
+ html) COVER_STYLE=html;shift 2;;
+ txt) COVER_STYLE=txt;shift 2;;
+ *)echo -e "\033[;31mError\033[0m param: $2"; exit 1;;
+ esac;;
+ -s|--specify)
+ SPECIFY=$2
+ shift 2;;
+ -f|--cover-file)
+ COVER_FILE=$2
+ shift 2;;
+ --)
+ shift; break;;
+ esac
+done
+
+function test_clean()
+{
+ echo ------------------ clean begin -----------------
+ rm build -rf
+ rm ../build -rf
+ echo ------------------ clean end ------------------
+}
+
+function test_cmake()
+{
+ local CMAKE_OPTION="-DCMAKE_BUILD_TYPE=Debug"
+ CMAKE_OPTION="${CMAKE_OPTION} -DCONFIG_DEBUG=1"
+
+ echo --------------- cmake begin --------------------
+ if [ x"${COVERAGE_ENABLE}" = x"yes" ]; then
+ CMAKE_OPTION="${CMAKE_OPTION} -DCOVERAGE_ENABLE=1"
+ fi
+
+ if [ x"${ASAN_ENABLE}" = x"yes" ]; then
+ CMAKE_OPTION="${CMAKE_OPTION} -DASAN_ENABLE=1"
+ fi
+
+ if [ ! -d build ]; then
+ mkdir build
+ fi
+
+ cd build
+ cmake .. ${CMAKE_OPTION}
+ cd -
+ echo --------------- cmake end --------------------
+ echo
+}
+
+function test_compile()
+{
+ echo --------------- compile begin --------------------
+ if [ -d build ]; then
+ cd build
+ make
+ cd -
+ else
+ echo -e "<build> directory \033[;31mnot exist\033[0m, pls check!"
+ fi
+ echo --------------- compile end --------------------
+ echo
+}
+
+function test_run_all()
+{
+ echo --------------- run test begin --------------------
+ if [ ! -d build ]; then
+ echo -e "<build> directory \033[;31mnot exist\033[0m, pls check!"
+ exit 1
+ fi
+
+ cd build
+ \cp -rf bin/etmem /usr/bin/
+ \cp -rf bin/etmem /usr/bin/
+ if [ x"${RUN_MODE}" = x"screen" ]; then
+ RUN_MODE=0
+ elif [ x"${RUN_MODE}" = x"xml" ]; then
+ RUN_MODE=1
+ elif [ x"${RUN_MODE}" = x"" ]; then
+ RUN_MODE=0
+ else
+ echo -e "\033[;31mnot suport\033[0m run mode <${RUN_MODE}>"
+ usage
+ cd -
+ exit 1
+ fi
+
+ if [ x"${SPECIFY}" = x"" ]; then
+ SPECIFY=`find -name "*_llt"` # run all test
+ else
+ SPECIFY=`find -name "${SPECIFY}"` # run one test
+ fi
+
+ TEST_LOG=test_result.log
+ >$TEST_LOG
+
+ SLIDE_LOG=test_slide.log
+ >$SLIDE_LOG
+
+ for TEST in $SPECIFY; do
+ echo $TEST
+ $TEST $RUN_MODE
+ if [ $? != 0 ]; then
+ run_test_exit_value=1
+ echo failed $TEST >> $TEST_LOG
+ else
+ echo passed $TEST >> $TEST_LOG
+ fi
+ done
+
+ echo
+ echo '#################test result begin##################'
+ sed 's/passed/\x1b[32m&\x1b[0m/g; s/^failed/\x1b[31m&\x1b[0m/g' $TEST_LOG
+ echo '#################test result end ##################'
+ echo
+ echo --------------- run test end --------------------
+ echo
+ cd -
+ if [ ${run_test_exit_value} != 0 ]; then
+ exit 1
+ fi
+}
+
+function geneate_coverage()
+{
+ local target_dir=$(dirname `pwd`)
+
+ echo --------------- geneate coverage begin --------------------
+ if [ x"${COVER_STYLE}" = x"txt" ]; then
+ if [ ! -d ${target_dir}/build/coverage/txt ]; then
+ mkdir -p ${target_dir}/build/coverage/txt
+ fi
+
+ GCDAS=`find ${target_dir} -name "${COVER_FILE}.gcda"`
+ echo ${COVER_FILE}.gcda
+ if [ x"$GCDAS" = x"" ]; then
+ echo -e "\033[;31mnot find\033[0m ${COVER_FILE}.gcda"
+ echo
+ cd -
+ exit 1
+ fi
+
+ cd ${target_dir}/build/coverage/txt
+ for GCDA in $GCDAS; do
+ gcov $GCDA
+ done
+ cd -
+
+ find ${target_dir} -name "*.h.gcov" | xargs rm -f
+ echo '###########################################'
+ find ${target_dir} -name "${COVER_FILE}.gcov"
+ echo '###########################################'
+ elif [ x"${COVER_STYLE}" = x"html" ]; then
+ if [ -d ${target_dir}/build/coverage/html ]; then
+ rm -rf ${target_dir}/build/coverage/html
+ fi
+ mkdir -p ${target_dir}/build/coverage/html
+ if [ x"${COVER_FILE}" = x"" ]; then
+ LCOV_CMD="-d ${target_dir}"
+ else
+ GCDAS=`find ${target_dir} -name "${COVER_FILE}.gcda"`
+ if [ $? != 0 ]; then
+ echo -e "\033[;31mnot find\033[0m ${COVER_FILE}.gcda"
+ exit 1
+ fi
+
+ for GCDA in ${GCDAS}; do
+ TMP_STR=" -d ${GCDA}";
+ LCOV_CMD="${LCOV_CMD} ${TMP_STR}";
+ done
+ fi
+
+ lcov -c ${LCOV_CMD} -b $(dirname $(pwd)) --no-external --exclude '*_llt.c' --exclude '*my_engine.c' --exclude '*test_common.c' --exclude '*etmemd_file.h' -o ${target_dir}/build/coverage/html/coverage.info --rc lcov_branch_coverage=1 --ignore-errors gcov --ignore-errors source --ignore-errors graph
+ if [ $? != 0 ]; then
+ echo -e "lcov generate coverage.info \033[;31mfail\033[0m."
+ exit 1
+ fi
+
+ genhtml ${target_dir}/build/coverage/html/coverage.info -o ${target_dir}/build/coverage/html --branch-coverage --rc lcov_branch_coverage=1 -s --legend --ignore-errors source
+ if [ $? != 0 ]; then
+ echo -e "genhtml \033[;31mfail\033[m."
+ exit 1
+ fi
+ chmod 755 -R ${target_dir}/build/coverage/html
+ fi
+ echo --------------- geneate coverage end --------------------
+}
+
+start_seconds=$(date --date="`date +'%Y-%m-%d %H:%M:%S'`" +%s)
+
+if [ x"${CLEAN_ENABLE}" = x"yes" ]; then
+ test_clean
+fi
+
+if [ x"${CMAKE_ENABLE}" = x"yes" ]; then
+ test_cmake
+fi
+
+if [ x"${COMPILE_ENABLE}" = x"yes" ]; then
+ test_compile
+fi
+
+if [ x"${RUN_TEST}" = x"yes" ]; then
+ test_run_all
+fi
+
+if [ x"${COVER_REPORT_ENABLE}" = x"yes" ]; then
+ geneate_coverage
+fi
+
+end_seconds=$(date --date="`date +'%Y-%m-%d %H:%M:%S'`" +%s)
+echo -e "\033[;36muse seconds: $((end_seconds-start_seconds))\033[0m"
--
1.8.3.1

File diff suppressed because it is too large Load Diff

View File

@ -1,378 +0,0 @@
From 4a70847689d4afd36368cc14153e152bd13018f4 Mon Sep 17 00:00:00 2001
From: liubo <liubo254@huawei.com>
Date: Mon, 7 Mar 2022 20:18:06 +0800
Subject: [PATCH 25/33] etmem: testcode adaptation
Adapt the etmem low level testcode so that
it can be used normally in openeuler.
Fix some error in test code.
Signed-off-by: liubo <liubo254@huawei.com>
---
etmem/test/CMakeLists.txt | 4 +++-
etmem/test/common/test_common.c | 1 +
etmem/test/common/test_common.h | 1 +
etmem/test/conf/conf_cslide/proj.config | 3 ++-
etmem/test/conf/conf_slide/config_file | 1 +
.../etmem_common_func_llt_test/etmem_common_func_llt.c | 4 ++--
etmem/test/etmem_cslide_ops_llt_test/CMakeLists.txt | 2 +-
etmem/test/etmem_cslide_ops_llt_test/mem_access.c | 2 +-
.../etmem_project_ops_llt_test/etmem_project_ops_llt.c | 4 ++--
etmem/test/etmem_scan_ops_export_llt_test/CMakeLists.txt | 2 +-
etmem/test/etmem_scan_ops_llt_test/CMakeLists.txt | 2 +-
etmem/test/etmem_scan_ops_llt_test/etmem_scan_ops_llt.c | 16 ++++++++++++++--
.../test/etmem_slide_ops_llt_test/etmem_slide_ops_llt.c | 9 ---------
etmem/test/etmem_slide_ops_llt_test/test_slide_ops.sh | 0
etmem/test/etmem_socket_ops_llt_test/CMakeLists.txt | 2 +-
.../etmem_thirdparty_ops_llt.c | 8 ++++----
etmem/test/etmem_thirdparty_ops_llt_test/my_engine.c | 1 +
etmem/test/etmem_threadpool_ops_llt_test/CMakeLists.txt | 2 +-
.../etmem_threadpool_ops_llt.c | 10 +++++++++-
etmem/test/etmem_timer_ops_llt_test/CMakeLists.txt | 2 +-
20 files changed, 47 insertions(+), 29 deletions(-)
mode change 100644 => 100755 etmem/test/etmem_slide_ops_llt_test/test_slide_ops.sh
diff --git a/etmem/test/CMakeLists.txt b/etmem/test/CMakeLists.txt
index 3cc9bf6..a380e98 100644
--- a/etmem/test/CMakeLists.txt
+++ b/etmem/test/CMakeLists.txt
@@ -60,6 +60,7 @@ set(ETMEMD_CSLIDE_DEP
${ETMEMD_SRC_DIR}/etmemd_log.c
${ETMEMD_SRC_DIR}/etmemd_project.c
${ETMEMD_SRC_DIR}/etmemd_engine.c
+ ${ETMEMD_SRC_DIR}/etmemd_memdcd.c
${ETMEMD_SRC_DIR}/etmemd_slide.c
${ETMEMD_SRC_DIR}/etmemd_thirdparty.c
${ETMEMD_SRC_DIR}/etmemd_task.c
@@ -67,7 +68,8 @@ set(ETMEMD_CSLIDE_DEP
${ETMEMD_SRC_DIR}/etmemd_threadpool.c
${ETMEMD_SRC_DIR}/etmemd_threadtimer.c
${ETMEMD_SRC_DIR}/etmemd_pool_adapter.c
- ${ETMEMD_SRC_DIR}/etmemd_migrate.c)
+ ${ETMEMD_SRC_DIR}/etmemd_migrate.c
+ ${ETMEMD_SRC_DIR}/etmemd_damon.c)
set(TEST_COMMON_SRC
${TEST_COMMON_DIR}/test_common.c)
diff --git a/etmem/test/common/test_common.c b/etmem/test/common/test_common.c
index 4bd3fc3..db3b843 100644
--- a/etmem/test/common/test_common.c
+++ b/etmem/test/common/test_common.c
@@ -51,6 +51,7 @@ void construct_proj_file(struct proj_test_param *param)
file = fopen(param->file_name, "w+");
CU_ASSERT_PTR_NOT_NULL(file);
CU_ASSERT_NOT_EQUAL(fprintf(file, "[project]\n"), -1);
+ CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_SCAN_TYPE, "page"), -1);
if (param->proj_name != NULL) {
CU_ASSERT_NOT_EQUAL(fprintf(file, CONFIG_NAME, param->proj_name), -1);
}
diff --git a/etmem/test/common/test_common.h b/etmem/test/common/test_common.h
index 1ba20c7..2a42f78 100644
--- a/etmem/test/common/test_common.h
+++ b/etmem/test/common/test_common.h
@@ -21,6 +21,7 @@
#include "etmemd_project.h"
#define CONFIG_NAME "name=%s\n"
+#define CONFIG_SCAN_TYPE "scan_type=%s\n"
#define CONFIG_INTERVAL "interval=%s\n"
#define CONFIG_LOOP "loop=%s\n"
#define CONFIG_SLEEP "sleep=%s\n"
diff --git a/etmem/test/conf/conf_cslide/proj.config b/etmem/test/conf/conf_cslide/proj.config
index 1174df3..ca002ee 100644
--- a/etmem/test/conf/conf_cslide/proj.config
+++ b/etmem/test/conf/conf_cslide/proj.config
@@ -1,5 +1,6 @@
[project]
name=test
+scan_type=page
loop=3
interval=1
-sleep=1
\ No newline at end of file
+sleep=1
diff --git a/etmem/test/conf/conf_slide/config_file b/etmem/test/conf/conf_slide/config_file
index 5d9f965..b7eaae9 100644
--- a/etmem/test/conf/conf_slide/config_file
+++ b/etmem/test/conf/conf_slide/config_file
@@ -1,5 +1,6 @@
[project]
name=test
+scan_type=page
loop=1
interval=1
sleep=1
diff --git a/etmem/test/etmem_common_func_llt_test/etmem_common_func_llt.c b/etmem/test/etmem_common_func_llt_test/etmem_common_func_llt.c
index 1ba6299..3700baa 100644
--- a/etmem/test/etmem_common_func_llt_test/etmem_common_func_llt.c
+++ b/etmem/test/etmem_common_func_llt_test/etmem_common_func_llt.c
@@ -138,11 +138,11 @@ static void test_parse_cmdline_ok(void)
char *cmd_ok[] = {"./etmemd", "-l", "0", "-s", "cmd_ok"};
char *cmd_only_sock[] = {"./etmemd", "-s", "cmd_only_sock"};
- CU_ASSERT_EQUAL(etmemd_parse_cmdline(sizeof(cmd) / sizeof(cmd[0]), cmd, &is_help), 0);
+ CU_ASSERT_EQUAL(etmemd_parse_cmdline(sizeof(cmd_ok) / sizeof(cmd_ok[0]), cmd_ok, &is_help), 0);
etmemd_sock_name_free();
clean_flags(&is_help);
- CU_ASSERT_EQUAL(etmemd_parse_cmdline(sizeof(cmd_ok) / sizeof(cmd_ok[0]), cmd_ok, &is_help), 0);
+ CU_ASSERT_EQUAL(etmemd_parse_cmdline(sizeof(cmd) / sizeof(cmd[0]), cmd, &is_help), 0);
clean_flags(&is_help);
CU_ASSERT_EQUAL(etmemd_parse_cmdline(sizeof(cmd_h) / sizeof(cmd_h[0]), cmd_h, &is_help), 0);
diff --git a/etmem/test/etmem_cslide_ops_llt_test/CMakeLists.txt b/etmem/test/etmem_cslide_ops_llt_test/CMakeLists.txt
index 6ff709b..dce5a60 100644
--- a/etmem/test/etmem_cslide_ops_llt_test/CMakeLists.txt
+++ b/etmem/test/etmem_cslide_ops_llt_test/CMakeLists.txt
@@ -26,5 +26,5 @@ SET(EXE etmem_cslide_ops_llt)
add_executable(${EXE} etmem_cslide_ops_llt.c)
add_executable(mem_access mem_access.c)
-target_link_libraries(${EXE} cunit ${BUILD_DIR}/lib/libcslide.so ${BUILD_DIR}/lib/libtest.so pthread dl rt boundscheck numa ${GLIB2_LIBRARIES})
+target_link_libraries(${EXE} cunit ${BUILD_DIR}/lib/libcslide_dep.so ${BUILD_DIR}/lib/libtest.so pthread dl rt boundscheck numa ${GLIB2_LIBRARIES})
target_link_libraries(mem_access numa)
diff --git a/etmem/test/etmem_cslide_ops_llt_test/mem_access.c b/etmem/test/etmem_cslide_ops_llt_test/mem_access.c
index 56ad47e..a64d865 100644
--- a/etmem/test/etmem_cslide_ops_llt_test/mem_access.c
+++ b/etmem/test/etmem_cslide_ops_llt_test/mem_access.c
@@ -57,7 +57,7 @@ int main(int argc, char **argv)
if (argc > 3) {
dst_node = atoi(argv[1]);
- len = (long long)atoi(argv[2] << BYTE_TO_MB_SHIFT);
+ len = (long long)atoi(argv[2]) << BYTE_TO_MB_SHIFT;
is_busy = atoi(argv[3]);
} else {
printf("%s node size(MB) is busy\n", argv[0]);
diff --git a/etmem/test/etmem_project_ops_llt_test/etmem_project_ops_llt.c b/etmem/test/etmem_project_ops_llt_test/etmem_project_ops_llt.c
index 65c1fc6..8392402 100644
--- a/etmem/test/etmem_project_ops_llt_test/etmem_project_ops_llt.c
+++ b/etmem/test/etmem_project_ops_llt_test/etmem_project_ops_llt.c
@@ -417,7 +417,7 @@ static void add_project_once(void)
etmem_pro_add_swapcache_mark_ok();
init_proj_param(&param);
- CU_ASSERT_EQUAL(etmemd_project_show(NULL, 0), OPT_PRO_NOEXIST);
+ CU_ASSERT_EQUAL(etmemd_project_show(NULL, 0), OPT_SUCCESS);
config = construct_proj_config(&param);
CU_ASSERT_EQUAL(etmemd_project_add(config), OPT_SUCCESS);
@@ -429,7 +429,7 @@ static void add_project_once(void)
CU_ASSERT_EQUAL(etmemd_project_remove(config), OPT_SUCCESS);
destroy_proj_config(config);
- CU_ASSERT_EQUAL(etmemd_project_show("noexist", 0), OPT_PRO_NOEXIST);
+ CU_ASSERT_EQUAL(etmemd_project_show("noexist", 0), OPT_SUCCESS);
}
static int add_project_multiple(int proj_add_num)
diff --git a/etmem/test/etmem_scan_ops_export_llt_test/CMakeLists.txt b/etmem/test/etmem_scan_ops_export_llt_test/CMakeLists.txt
index be68154..587d621 100644
--- a/etmem/test/etmem_scan_ops_export_llt_test/CMakeLists.txt
+++ b/etmem/test/etmem_scan_ops_export_llt_test/CMakeLists.txt
@@ -23,4 +23,4 @@ SET(EXE etmem_scan_ops_export_llt)
add_executable(${EXE} etmem_scan_ops_export_llt.c)
-target_link_libraries(${EXE} cunit ${BUILD_DIR}/lib/libetmemd.so pthread dl rt libboundscheck numa ${GLIB2_LIBRARIES})
+target_link_libraries(${EXE} cunit ${BUILD_DIR}/lib/libetmemd.so pthread dl rt boundscheck numa ${GLIB2_LIBRARIES})
diff --git a/etmem/test/etmem_scan_ops_llt_test/CMakeLists.txt b/etmem/test/etmem_scan_ops_llt_test/CMakeLists.txt
index b5378b8..df50f80 100644
--- a/etmem/test/etmem_scan_ops_llt_test/CMakeLists.txt
+++ b/etmem/test/etmem_scan_ops_llt_test/CMakeLists.txt
@@ -23,4 +23,4 @@ SET(EXE etmem_scan_ops_llt)
add_executable(${EXE} etmem_scan_ops_llt.c)
-target_link_libraries(${EXE} cunit ${BUILD_DIR}/lib/libetmemd.so pthread dl rt libboundscheck numa ${GLIB2_LIBRARIES})
+target_link_libraries(${EXE} cunit ${BUILD_DIR}/lib/libetmemd.so pthread dl rt boundscheck numa ${GLIB2_LIBRARIES})
diff --git a/etmem/test/etmem_scan_ops_llt_test/etmem_scan_ops_llt.c b/etmem/test/etmem_scan_ops_llt_test/etmem_scan_ops_llt.c
index 84fcf69..cb1ccbc 100644
--- a/etmem/test/etmem_scan_ops_llt_test/etmem_scan_ops_llt.c
+++ b/etmem/test/etmem_scan_ops_llt_test/etmem_scan_ops_llt.c
@@ -42,12 +42,18 @@ static struct task *alloc_tk(int loop, int sleep)
struct task *tk = NULL;
struct project *proj = NULL;
struct engine *eng = NULL;
+ struct page_scan *page_scan = NULL;
+
+ page_scan = (struct page_scan *)calloc(1, sizeof(struct page_scan));
+ CU_ASSERT_PTR_NOT_NULL(page_scan);
proj = (struct project *)calloc(1, sizeof(struct project));
CU_ASSERT_PTR_NOT_NULL(proj);
- proj->loop = loop;
- proj->sleep = sleep;
+ proj->scan_param = page_scan;
+ proj->type = PAGE_SCAN;
+ page_scan->loop = loop;
+ page_scan->sleep = sleep;
tk = (struct task *)calloc(1, sizeof(struct task));
CU_ASSERT_PTR_NOT_NULL(tk);
@@ -272,6 +278,9 @@ static void test_scan_error(void)
CU_ASSERT_PTR_NULL(etmemd_do_scan(tpid, NULL));
CU_ASSERT_PTR_NULL(etmemd_do_scan(tpid, tk));
+ free(tk->eng->proj->scan_param);
+ free(tk->eng->proj);
+ free(tk->eng);
free(tk);
free(tpid);
}
@@ -292,6 +301,9 @@ static void test_etmem_scan_ok(void)
page_refs = etmemd_do_scan(tpid, tk);
CU_ASSERT_PTR_NOT_NULL(page_refs);
+ free(tk->eng->proj->scan_param);
+ free(tk->eng->proj);
+ free(tk->eng);
free(tk);
free(tpid);
clean_page_refs_unexpected(&page_refs);
diff --git a/etmem/test/etmem_slide_ops_llt_test/etmem_slide_ops_llt.c b/etmem/test/etmem_slide_ops_llt_test/etmem_slide_ops_llt.c
index 3a04a86..4521a60 100644
--- a/etmem/test/etmem_slide_ops_llt_test/etmem_slide_ops_llt.c
+++ b/etmem/test/etmem_slide_ops_llt_test/etmem_slide_ops_llt.c
@@ -275,9 +275,6 @@ static void test_etmem_task_swap_flag_error(void)
CU_ASSERT_EQUAL(etmemd_project_remove_task(config), OPT_SUCCESS);
destroy_slide_task_config(config);
- /* run slide_policy_interface fail */
- CU_ASSERT_EQUAL(slide_policy_interface(NULL, NULL), NULL);
-
/* run slide_do_migrate fail */
CU_ASSERT_EQUAL(slide_do_migrate(1, NULL), -1);
@@ -355,9 +352,6 @@ static void test_etmem_task_swap_threshold_error(void)
CU_ASSERT_EQUAL(etmemd_project_remove_task(config), OPT_SUCCESS);
destroy_slide_task_config(config);
- /* run slide_policy_interface fail */
- CU_ASSERT_EQUAL(slide_policy_interface(NULL, NULL), NULL);
-
/* run slide_do_migrate fail */
CU_ASSERT_EQUAL(slide_do_migrate(1, NULL), -1);
@@ -557,9 +551,6 @@ static void test_task_slide_invalid_config(void)
CU_ASSERT_EQUAL(etmemd_project_remove_task(config), OPT_SUCCESS);
destroy_slide_task_config(config);
- /* run slide_policy_interface fail */
- CU_ASSERT_EQUAL(slide_policy_interface(NULL, NULL), NULL);
-
/* run slide_do_migrate fail */
CU_ASSERT_EQUAL(slide_do_migrate(1, NULL), -1);
}
diff --git a/etmem/test/etmem_slide_ops_llt_test/test_slide_ops.sh b/etmem/test/etmem_slide_ops_llt_test/test_slide_ops.sh
old mode 100644
new mode 100755
diff --git a/etmem/test/etmem_socket_ops_llt_test/CMakeLists.txt b/etmem/test/etmem_socket_ops_llt_test/CMakeLists.txt
index 05239a0..e1d5591 100644
--- a/etmem/test/etmem_socket_ops_llt_test/CMakeLists.txt
+++ b/etmem/test/etmem_socket_ops_llt_test/CMakeLists.txt
@@ -23,4 +23,4 @@ SET(EXE etmem_socket_ops_llt)
add_executable(${EXE} etmem_socket_ops_llt.c)
-target_link_libraries(${EXE} cunit ${BUILD_DIR}/lib/libetmemd.so pthread dl rt boundscheck numa ${GLIB2_LIBRARIES})
+target_link_libraries(${EXE} cunit ${BUILD_DIR}/lib/libetmemd.so ${BUILD_DIR}/lib/libetmem.so pthread dl rt boundscheck numa ${GLIB2_LIBRARIES})
diff --git a/etmem/test/etmem_thirdparty_ops_llt_test/etmem_thirdparty_ops_llt.c b/etmem/test/etmem_thirdparty_ops_llt_test/etmem_thirdparty_ops_llt.c
index d7e7ae4..29a7e2f 100644
--- a/etmem/test/etmem_thirdparty_ops_llt_test/etmem_thirdparty_ops_llt.c
+++ b/etmem/test/etmem_thirdparty_ops_llt_test/etmem_thirdparty_ops_llt.c
@@ -160,11 +160,11 @@ void test_etmem_user_engine_0001(void)
/* test param NULL */
CU_ASSERT_EQUAL(etmemd_project_mgt_engine(NULL, NULL,
- NULL, DEFAULT_TASK, 0), OPT_SUCCESS);
+ NULL, DEFAULT_TASK, 0), OPT_INVAL);
CU_ASSERT_EQUAL(etmemd_project_mgt_engine(DEFAULT_PROJ, "no_exist_engine",
- "my_cmd", DEFAULT_TASK, 0), OPT_SUCCESS);
+ "my_cmd", DEFAULT_TASK, 0), OPT_ENG_NOEXIST);
CU_ASSERT_EQUAL(etmemd_project_mgt_engine(DEFAULT_PROJ, "my_engine",
- "my_cmd", "no_exist_task", 0), OPT_SUCCESS);
+ "my_cmd", "no_exist_task", 0), OPT_TASK_NOEXIST);
CU_ASSERT_EQUAL(etmemd_migrate_stop(DEFAULT_PROJ), OPT_SUCCESS);
@@ -219,7 +219,7 @@ static void test_etmem_user_engine_null(void)
CU_ASSERT_EQUAL(etmemd_project_add_engine(eng_config), OPT_SUCCESS);
CU_ASSERT_EQUAL(etmemd_project_add_task(task_config), OPT_SUCCESS);
CU_ASSERT_EQUAL(etmemd_migrate_start(DEFAULT_PROJ), OPT_SUCCESS);
- CU_ASSERT_EQUAL(etmemd_project_mgt_engine(DEFAULT_PROJ, "my_engine",
+ CU_ASSERT_NOT_EQUAL(etmemd_project_mgt_engine(DEFAULT_PROJ, "my_engine",
"my_cmd", DEFAULT_TASK, 0), OPT_SUCCESS);
CU_ASSERT_EQUAL(etmemd_migrate_stop(DEFAULT_PROJ), OPT_SUCCESS);
diff --git a/etmem/test/etmem_thirdparty_ops_llt_test/my_engine.c b/etmem/test/etmem_thirdparty_ops_llt_test/my_engine.c
index bd2a3bc..891e9d4 100644
--- a/etmem/test/etmem_thirdparty_ops_llt_test/my_engine.c
+++ b/etmem/test/etmem_thirdparty_ops_llt_test/my_engine.c
@@ -17,6 +17,7 @@
#include <unistd.h>
#include <string.h>
+#include "test_common.h"
#include "etmemd_thirdparty_export.h"
char *get_private_value(GKeyFile *config, char *group, char *key)
diff --git a/etmem/test/etmem_threadpool_ops_llt_test/CMakeLists.txt b/etmem/test/etmem_threadpool_ops_llt_test/CMakeLists.txt
index cb084cf..865620d 100644
--- a/etmem/test/etmem_threadpool_ops_llt_test/CMakeLists.txt
+++ b/etmem/test/etmem_threadpool_ops_llt_test/CMakeLists.txt
@@ -23,4 +23,4 @@ SET(EXE etmem_threadpool_ops_llt)
add_executable(${EXE} etmem_threadpool_ops_llt.c)
-target_link_libraries(${EXE} cunit ${BUILD_DIR}/lib/libetmemd.so pthread dl rt libboundscheck numa ${GLIB2_LIBRARIES})
+target_link_libraries(${EXE} cunit ${BUILD_DIR}/lib/libetmemd.so pthread dl rt boundscheck numa ${GLIB2_LIBRARIES})
diff --git a/etmem/test/etmem_threadpool_ops_llt_test/etmem_threadpool_ops_llt.c b/etmem/test/etmem_threadpool_ops_llt_test/etmem_threadpool_ops_llt.c
index 9917954..0b6ade1 100644
--- a/etmem/test/etmem_threadpool_ops_llt_test/etmem_threadpool_ops_llt.c
+++ b/etmem/test/etmem_threadpool_ops_llt_test/etmem_threadpool_ops_llt.c
@@ -147,7 +147,13 @@ static void test_thpool_addwk_mul(void)
static void init_thpool_objs(struct project *proj, struct engine *eng, struct task *tk)
{
- proj->interval = 1;
+ struct page_scan *page_scan = (struct page_scan *)calloc(1, sizeof(struct page_scan));
+ CU_ASSERT_PTR_NOT_NULL(page_scan);
+ proj->scan_param = page_scan;
+ proj->type = PAGE_SCAN;
+ page_scan->interval = 1;
+ page_scan->loop = 1;
+ page_scan->sleep = 1;
proj->start = true;
proj->name = "test_project";
eng->proj = proj;
@@ -170,6 +176,7 @@ static void test_thpool_start_error(void)
g_test_exec.tk = &tk;
CU_ASSERT_EQUAL(start_threadpool_work(&g_test_exec), -1);
+ free(proj.scan_param);
}
static void *task_executor(void *arg)
@@ -193,6 +200,7 @@ static void test_thpool_start_stop(void)
/* wait threadpool to work */
sleep(2);
stop_and_delete_threadpool_work(&tk);
+ free(proj.scan_param);
}
typedef enum {
diff --git a/etmem/test/etmem_timer_ops_llt_test/CMakeLists.txt b/etmem/test/etmem_timer_ops_llt_test/CMakeLists.txt
index 76aa48e..e5a815e 100644
--- a/etmem/test/etmem_timer_ops_llt_test/CMakeLists.txt
+++ b/etmem/test/etmem_timer_ops_llt_test/CMakeLists.txt
@@ -23,4 +23,4 @@ SET(EXE etmem_timer_ops_llt)
add_executable(${EXE} etmem_timer_ops_llt.c)
-target_link_libraries(${EXE} cunit ${BUILD_DIR}/lib/libetmemd.so pthread dl rt libboundscheck numa ${GLIB2_LIBRARIES})
+target_link_libraries(${EXE} cunit ${BUILD_DIR}/lib/libetmemd.so pthread dl rt boundscheck numa ${GLIB2_LIBRARIES})
--
1.8.3.1

View File

@ -1,87 +0,0 @@
From ececb8bc648391dd4ea536982d70fd7fa1984a0c Mon Sep 17 00:00:00 2001
From: Kemeng Shi <shikemeng@huawei.com>
Date: Fri, 13 May 2022 15:30:04 +0800
Subject: [PATCH 26/33] cslide: limit hot_threshold range to avoid overflow and
fix some memleak
Signed-off-by: Kemeng Shi <shikemeng@huawei.com>
---
etmem/inc/etmemd_inc/etmemd_scan.h | 1 +
etmem/src/etmemd_src/etmemd_cslide.c | 9 +++++++--
etmem/src/etmemd_src/etmemd_project.c | 1 +
etmem/src/etmemd_src/etmemd_task.c | 1 +
4 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/etmem/inc/etmemd_inc/etmemd_scan.h b/etmem/inc/etmemd_inc/etmemd_scan.h
index 7c25152..47d710f 100644
--- a/etmem/inc/etmemd_inc/etmemd_scan.h
+++ b/etmem/inc/etmemd_inc/etmemd_scan.h
@@ -59,6 +59,7 @@ enum access_type_weight {
IDLE_TYPE_WEIGHT = 0,
READ_TYPE_WEIGHT = 1,
WRITE_TYPE_WEIGHT = 3,
+ MAX_ACCESS_WEIGHT = WRITE_TYPE_WEIGHT,
};
struct walk_address {
diff --git a/etmem/src/etmemd_src/etmemd_cslide.c b/etmem/src/etmemd_src/etmemd_cslide.c
index cbaa2e8..92e1aff 100644
--- a/etmem/src/etmemd_src/etmemd_cslide.c
+++ b/etmem/src/etmemd_src/etmemd_cslide.c
@@ -566,7 +566,7 @@ static struct cslide_pid_params *alloc_pid_params(struct cslide_eng_params *eng_
{
int i;
struct cslide_pid_params *params = calloc(1, sizeof(struct cslide_pid_params));
- int count = eng_params->loop;
+ int count = eng_params->loop * MAX_ACCESS_WEIGHT;
int pair_num = eng_params->node_map.cur_num;
int node_num = eng_params->mem.node_num;
@@ -1156,7 +1156,7 @@ static void move_hot_pages(struct cslide_eng_params *eng_params, struct flow_ctr
filter.flow_enough = is_hot_enough;
filter.filter_policy = to_hot_policy;
filter.ctrl = ctrl;
- filter.count_start = eng_params->loop;
+ filter.count_start = eng_params->loop * MAX_ACCESS_WEIGHT;
filter.count_end = eng_params->hot_threshold - 1;
filter.count_step = -1;
do_filter(&filter, eng_params);
@@ -2028,6 +2028,11 @@ static int fill_hot_threshold(void *obj, void *val)
return -1;
}
+ if (t > params->loop * MAX_ACCESS_WEIGHT + 1) {
+ // limit hot_threshold to avoid overflow in do_filter
+ t = params->loop * MAX_ACCESS_WEIGHT + 1;
+ }
+
params->hot_threshold = t;
return 0;
}
diff --git a/etmem/src/etmemd_src/etmemd_project.c b/etmem/src/etmemd_src/etmemd_project.c
index e238e66..5213bbd 100644
--- a/etmem/src/etmemd_src/etmemd_project.c
+++ b/etmem/src/etmemd_src/etmemd_project.c
@@ -729,6 +729,7 @@ static int project_fill_by_conf(GKeyFile *config, struct project *proj)
if (!check_swapcache_wmark_valid(proj)) {
etmemd_log(ETMEMD_LOG_ERR, "swapcache wmark is not valid, low wmark: %d, high wmark: %d",
proj->swapcache_low_wmark, proj->swapcache_high_wmark);
+ clear_project(proj);
return -1;
}
return 0;
diff --git a/etmem/src/etmemd_src/etmemd_task.c b/etmem/src/etmemd_src/etmemd_task.c
index 2a8cb3e..649d48e 100644
--- a/etmem/src/etmemd_src/etmemd_task.c
+++ b/etmem/src/etmemd_src/etmemd_task.c
@@ -428,6 +428,7 @@ static int fill_task_type(void *obj, void *val)
char *type = (char *)val;
if (strcmp(val, "pid") != 0 && strcmp(val, "name") != 0) {
etmemd_log(ETMEMD_LOG_ERR, "invalid task type, must be pid or name.\n");
+ free(val);
return -1;
}
--
1.8.3.1

View File

@ -1,136 +0,0 @@
From 9c924ce79851c30763eec0e5f247e96d1efc7e61 Mon Sep 17 00:00:00 2001
From: liubo <liubo254@huawei.com>
Date: Tue, 17 May 2022 10:02:34 +0800
Subject: [PATCH 27/33] etmem: fix the problem of libso no permission
verification
etmem supports third-party policy injection. During the injection
process, the required so path is specified by the configuration
file.
However, in the so loading process, the lack of effective permission
verification may introduce problems.
Therefore, this patch adds permission verification during the so loading
process, and only allows root permissions to load so.
Signed-off-by: liubo <liubo254@huawei.com>
---
etmem/inc/etmemd_inc/etmemd_common.h | 4 ++-
etmem/src/etmemd_src/etmemd_common.c | 42 ++++++++++++++++++++++++++++++--
etmem/src/etmemd_src/etmemd_thirdparty.c | 11 +++++++--
3 files changed, 52 insertions(+), 5 deletions(-)
diff --git a/etmem/inc/etmemd_inc/etmemd_common.h b/etmem/inc/etmemd_inc/etmemd_common.h
index 03792a7..db71446 100644
--- a/etmem/inc/etmemd_inc/etmemd_common.h
+++ b/etmem/inc/etmemd_inc/etmemd_common.h
@@ -19,6 +19,7 @@
#include <stdio.h>
#include <stdbool.h>
#include <sys/ioctl.h>
+#include <sys/stat.h>
#define PROC_PATH "/proc/"
#define STATUS_FILE "/status"
@@ -39,6 +40,7 @@
#define MAX_SWAPCACHE_WMARK_VALUE 100
#define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
+#define S_IRWX_VALID (S_IRWXU | S_IRWXG | S_IRWXO)
/* in some system the max length of pid may be larger than 5, so we use 10 herr */
#define PID_STR_MAX_LEN 10
@@ -80,5 +82,5 @@ int get_mem_from_proc_file(const char *pid, const char *file_name, unsigned long
int dprintf_all(int fd, const char *format, ...);
int get_swap_threshold_inKB(const char *string, unsigned long *value);
-
+int file_permission_check(const char *file_path, mode_t mode);
#endif
diff --git a/etmem/src/etmemd_src/etmemd_common.c b/etmem/src/etmemd_src/etmemd_common.c
index dfbae6d..ab9a05b 100644
--- a/etmem/src/etmemd_src/etmemd_common.c
+++ b/etmem/src/etmemd_src/etmemd_common.c
@@ -22,10 +22,8 @@
#include <sys/time.h>
#include <ctype.h>
#include <unistd.h>
-#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
-#include <sys/types.h>
#include "securec.h"
#include "etmemd_common.h"
@@ -555,3 +553,43 @@ free_out:
out:
return ret;
}
+
+int file_permission_check(const char *file_path, mode_t mode)
+{
+ struct stat buf = {0};
+ mode_t file_p;
+
+ if (file_path == NULL || (mode & S_IRWX_VALID) == 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "file_permission_check failed, invalid para\n");
+ return -1;
+ }
+
+ if (access(file_path, F_OK) != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "no such file: %s\n", file_path);
+ return -1;
+ }
+
+ if (stat(file_path, &buf) != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "get file : %s stat failed.\n", file_path);
+ return -1;
+ }
+
+ if (S_ISDIR(buf.st_mode)) {
+ etmemd_log(ETMEMD_LOG_ERR, "file : %s is a dir\n", file_path);
+ return -1;
+ }
+
+ if (buf.st_uid != 0 || buf.st_gid != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "file : %s should created by root\n", file_path);
+ return -1;
+ }
+
+ file_p = buf.st_mode & S_IRWX_VALID;
+ if (file_p != mode) {
+ etmemd_log(ETMEMD_LOG_WARN, "file : %s mode is wrong.\n", file_path);
+ return -1;
+ }
+
+ return 0;
+}
+
diff --git a/etmem/src/etmemd_src/etmemd_thirdparty.c b/etmem/src/etmemd_src/etmemd_thirdparty.c
index 8d1b50e..ec417b1 100644
--- a/etmem/src/etmemd_src/etmemd_thirdparty.c
+++ b/etmem/src/etmemd_src/etmemd_thirdparty.c
@@ -91,10 +91,17 @@ static int set_engine_ops(struct engine *eng, struct thirdparty_params *params)
return -1;
}
- handler = dlopen(params->libname, RTLD_NOW | RTLD_LOCAL);
+ if (file_permission_check(resolve_path, S_IRWXU) != 0 &&
+ file_permission_check(resolve_path, S_IRUSR | S_IXUSR) != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "file : %s permissions do not meet requirements."
+ "Only support 500 or 700\n", resolve_path);
+ return -1;
+ }
+
+ handler = dlopen(resolve_path, RTLD_NOW | RTLD_LOCAL);
err = dlerror();
if (err != NULL && handler == NULL) {
- etmemd_log(ETMEMD_LOG_ERR, "load library %s fail with error: %s\n", params->libname, err);
+ etmemd_log(ETMEMD_LOG_ERR, "load library %s fail with error: %s\n", resolve_path, err);
return -1;
}
--
1.8.3.1

View File

@ -1,103 +0,0 @@
From 1e7058d6f063b57ef93664ff89aca2d0c760bcd7 Mon Sep 17 00:00:00 2001
From: liubo <liubo254@huawei.com>
Date: Tue, 24 May 2022 19:26:56 +0800
Subject: [PATCH 28/33] etmem: add config file permission check
Add permission verification and file size check in the
config file paring process.
Signed-off-by: liubo <liubo254@huawei.com>
---
etmem/inc/etmemd_inc/etmemd_common.h | 3 +++
etmem/src/etmemd_src/etmemd_common.c | 27 +++++++++++++++++++++++++++
etmem/src/etmemd_src/etmemd_rpc.c | 14 +++++++++++++-
3 files changed, 43 insertions(+), 1 deletion(-)
diff --git a/etmem/inc/etmemd_inc/etmemd_common.h b/etmem/inc/etmemd_inc/etmemd_common.h
index db71446..f3808b3 100644
--- a/etmem/inc/etmemd_inc/etmemd_common.h
+++ b/etmem/inc/etmemd_inc/etmemd_common.h
@@ -37,6 +37,7 @@
#define KB_TO_BYTE(s) ((s) << 10)
#define GB_TO_KB(s) ((s) << 20)
+#define MAX_CONFIG_FILE_SIZE (KB_TO_BYTE(10 * 1024))
#define MAX_SWAPCACHE_WMARK_VALUE 100
#define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
@@ -83,4 +84,6 @@ int dprintf_all(int fd, const char *format, ...);
int get_swap_threshold_inKB(const char *string, unsigned long *value);
int file_permission_check(const char *file_path, mode_t mode);
+int file_size_check(const char *file_path, off_t size);
+
#endif
diff --git a/etmem/src/etmemd_src/etmemd_common.c b/etmem/src/etmemd_src/etmemd_common.c
index ab9a05b..a12a43f 100644
--- a/etmem/src/etmemd_src/etmemd_common.c
+++ b/etmem/src/etmemd_src/etmemd_common.c
@@ -593,3 +593,30 @@ int file_permission_check(const char *file_path, mode_t mode)
return 0;
}
+int file_size_check(const char *file_path, off_t size)
+{
+ struct stat buf = {0};
+
+ if (file_path == NULL || size <= 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "file_size_check failed, invalid para\n");
+ return -1;
+ }
+
+ if (access(file_path, F_OK) != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "no such file: %s\n", file_path);
+ return -1;
+ }
+
+ if (stat(file_path, &buf) != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "get file : %s stat failed.\n", file_path);
+ return -1;
+ }
+
+ if (buf.st_size > size) {
+ etmemd_log(ETMEMD_LOG_WARN, "file : %s is too big.\n", file_path);
+ return -1;
+ }
+
+ return 0;
+}
+
diff --git a/etmem/src/etmemd_src/etmemd_rpc.c b/etmem/src/etmemd_src/etmemd_rpc.c
index 6b23059..780ddce 100644
--- a/etmem/src/etmemd_src/etmemd_rpc.c
+++ b/etmem/src/etmemd_src/etmemd_rpc.c
@@ -181,13 +181,25 @@ static enum opt_result handle_obj_cmd(char *file_name, enum cmd_type type)
return OPT_INVAL;
}
+ if (file_permission_check(resolve_path, S_IRUSR) != 0 &&
+ file_permission_check(resolve_path, S_IRUSR | S_IWUSR) != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "config file : %s permissions do not meet requirements."
+ "Only support 600 or 400\n", resolve_path);
+ return OPT_INVAL;
+ }
+
+ if (file_size_check(resolve_path, MAX_CONFIG_FILE_SIZE) != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "config file: %s is too big.", resolve_path);
+ return OPT_INVAL;
+ }
+
config = g_key_file_new();
if (config == NULL) {
etmemd_log(ETMEMD_LOG_ERR, "get empty config file fail\n");
return OPT_INTER_ERR;
}
- if (g_key_file_load_from_file(config, file_name, G_KEY_FILE_NONE, NULL) == FALSE) {
+ if (g_key_file_load_from_file(config, resolve_path, G_KEY_FILE_NONE, NULL) == FALSE) {
etmemd_log(ETMEMD_LOG_ERR, "load config file fail\n");
ret = OPT_INTER_ERR;
goto free_file;
--
1.8.3.1

View File

@ -1,132 +0,0 @@
From d51198f972f18ef99e887294c8c1de521ca66cf1 Mon Sep 17 00:00:00 2001
From: liubo <liubo254@huawei.com>
Date: Thu, 26 May 2022 15:26:30 +0800
Subject: [PATCH 29/33] etmem: fix problem of abnormal task value
1. When adding a task, if the task value contains
abnormal characters or the name is too long,
an error should be returned.
2. remove useless function.
Signed-off-by: liubo <liubo254@huawei.com>
---
etmem/inc/etmemd_inc/etmemd_common.h | 4 ++--
etmem/src/etmemd_src/etmemd_common.c | 39 ++++++++----------------------------
etmem/src/etmemd_src/etmemd_task.c | 7 +++++++
3 files changed, 17 insertions(+), 33 deletions(-)
diff --git a/etmem/inc/etmemd_inc/etmemd_common.h b/etmem/inc/etmemd_inc/etmemd_common.h
index f3808b3..795e600 100644
--- a/etmem/inc/etmemd_inc/etmemd_common.h
+++ b/etmem/inc/etmemd_inc/etmemd_common.h
@@ -45,6 +45,7 @@
/* in some system the max length of pid may be larger than 5, so we use 10 herr */
#define PID_STR_MAX_LEN 10
+#define NAME_STR_MAX_LEN 15
#define SWAP_THRESHOLD_MAX_LEN 10
#define PIPE_FD_LEN 2
@@ -76,7 +77,6 @@ void etmemd_safe_free(void **ptr);
FILE *etmemd_get_proc_file(const char *pid, const char *file, const char *mode);
int etmemd_send_ioctl_cmd(FILE *fp, struct ioctl_para *request);
-int get_keyword_and_value(const char *str, char *key, char *val);
unsigned long get_pagesize(void);
int get_mem_from_proc_file(const char *pid, const char *file_name, unsigned long *data, const char *cmpstr);
@@ -85,5 +85,5 @@ int dprintf_all(int fd, const char *format, ...);
int get_swap_threshold_inKB(const char *string, unsigned long *value);
int file_permission_check(const char *file_path, mode_t mode);
int file_size_check(const char *file_path, off_t size);
-
+int check_str_valid(const char *str);
#endif
diff --git a/etmem/src/etmemd_src/etmemd_common.c b/etmem/src/etmemd_src/etmemd_common.c
index a12a43f..649f472 100644
--- a/etmem/src/etmemd_src/etmemd_common.c
+++ b/etmem/src/etmemd_src/etmemd_common.c
@@ -357,54 +357,31 @@ static bool check_result_str_valid(const char *result)
return true;
}
-static unsigned long skip_colon_to_parse(const char *str, unsigned long idx)
-{
- size_t str_len = strlen(str);
-
- while (idx < str_len) {
- if (!is_valid_char_for_value(" :\t", str[idx])) {
- break;
- }
- idx += 1;
- }
-
- return idx;
-}
-
-/*
- * the caller should make sure that str is not NULL, and the content
- * of str must not contain ' ' or '\t' at the beginning and the end
- * */
-int get_keyword_and_value(const char *str, char *key, char *val)
+int check_str_valid(const char *str)
{
unsigned long idx = 0;
unsigned long end_idx;
size_t val_len;
+ char val[KEY_VALUE_MAX_LEN] = {0};
- get_valid_conf_str(str, idx, key, "%_", &end_idx);
- if (!check_result_str_valid(key)) {
- etmemd_log(ETMEMD_LOG_ERR, "get keyword of %s fail\n", str);
- return -1;
- }
- if (!is_valid_char_for_value(" :\t", str[end_idx])) {
- etmemd_log(ETMEMD_LOG_ERR, "%s contains invalid symbol in keyword\n", str);
+ if (str == NULL || strlen(str) == 0 || strlen(str) > NAME_STR_MAX_LEN) {
+ etmemd_log(ETMEMD_LOG_ERR, "input str: %s is invalid.\n", str);
return -1;
}
- etmemd_log(ETMEMD_LOG_DEBUG, "parse config get key: %s\n", key);
- /* skip the string contains ' ', '\t' and ':' between key and value */
- idx = skip_colon_to_parse(str, end_idx);
- val_len = strlen(str) - idx;
+ val_len = strlen(str);
get_valid_conf_str(str, idx, val, ".%/_-", &end_idx);
if (!check_result_str_valid(val)) {
- etmemd_log(ETMEMD_LOG_ERR, "get value of %s fail\n", str);
+ etmemd_log(ETMEMD_LOG_ERR, "get value of %s fail, contain invalid symbol\n", str);
return -1;
}
+
if (strlen(val) != val_len) {
etmemd_log(ETMEMD_LOG_ERR, "%s contains invalid symbol in value\n", str);
return -1;
}
+
etmemd_log(ETMEMD_LOG_DEBUG, "parse config get value: %s\n", val);
return 0;
diff --git a/etmem/src/etmemd_src/etmemd_task.c b/etmem/src/etmemd_src/etmemd_task.c
index 649d48e..dfe911f 100644
--- a/etmem/src/etmemd_src/etmemd_task.c
+++ b/etmem/src/etmemd_src/etmemd_task.c
@@ -440,6 +440,13 @@ static int fill_task_value(void *obj, void *val)
{
struct task *tk = (struct task *)obj;
char *value = (char *)val;
+
+ if (check_str_valid(value) != 0) {
+ etmemd_log(ETMEMD_LOG_ERR, "invalid task value, please check.\n");
+ free(val);
+ return -1;
+ }
+
tk->value = value;
return 0;
}
--
1.8.3.1

View File

@ -1,97 +0,0 @@
From d41d6ad31312da775f94a4d68b0d6c826b3476db Mon Sep 17 00:00:00 2001
From: liubo <liubo254@huawei.com>
Date: Thu, 26 May 2022 15:39:25 +0800
Subject: [PATCH 30/33] etmem: remove useless dt test code
The function get_keyword_and_value is removed,
the useless dt test code should also be removed
the same time.
Signed-off-by: liubo <liubo254@huawei.com>
---
.../etmem_common_func_llt.c | 62 ----------------------
1 file changed, 62 deletions(-)
diff --git a/etmem/test/etmem_common_func_llt_test/etmem_common_func_llt.c b/etmem/test/etmem_common_func_llt_test/etmem_common_func_llt.c
index 3700baa..93755ee 100644
--- a/etmem/test/etmem_common_func_llt_test/etmem_common_func_llt.c
+++ b/etmem/test/etmem_common_func_llt_test/etmem_common_func_llt.c
@@ -336,66 +336,6 @@ static void test_etmemd_send_ioctl_cmd_ok(void)
fclose(fp);
}
-static void test_get_key_value_error(void)
-{
- char key[KEY_VALUE_MAX_LEN] = {};
- char value[KEY_VALUE_MAX_LEN] = {};
-
- CU_ASSERT_EQUAL(get_keyword_and_value("", key, value), -1);
- CU_ASSERT_EQUAL(get_keyword_and_value("abcd", key, value), -1);
- CU_ASSERT_EQUAL(get_keyword_and_value(":1", key, value), -1);
- CU_ASSERT_EQUAL(get_keyword_and_value("a:", key, value), -1);
- CU_ASSERT_EQUAL(get_keyword_and_value("#a:1", key, value), -1);
- CU_ASSERT_EQUAL(get_keyword_and_value("a.b:1", key, value), -1);
- CU_ASSERT_EQUAL(get_keyword_and_value("loop:2*4", key, value), -1);
-}
-
-static void test_get_key_value_ok(void)
-{
- char key[KEY_VALUE_MAX_LEN] = {};
- char value[KEY_VALUE_MAX_LEN] = {};
-
- CU_ASSERT_EQUAL(get_keyword_and_value("loop:30", key, value), 0);
- CU_ASSERT_STRING_EQUAL(key, "loop");
- CU_ASSERT_STRING_EQUAL(value, "30");
- CU_ASSERT_EQUAL(get_keyword_and_value("loop 30", key, value), 0);
- CU_ASSERT_STRING_EQUAL(key, "loop");
- CU_ASSERT_STRING_EQUAL(value, "30");
- CU_ASSERT_EQUAL(get_keyword_and_value("loop\t30", key, value), 0);
- CU_ASSERT_STRING_EQUAL(key, "loop");
- CU_ASSERT_STRING_EQUAL(value, "30");
- CU_ASSERT_EQUAL(get_keyword_and_value("loop :30", key, value), 0);
- CU_ASSERT_STRING_EQUAL(key, "loop");
- CU_ASSERT_STRING_EQUAL(value, "30");
- CU_ASSERT_EQUAL(get_keyword_and_value("loop\t:30", key, value), 0);
- CU_ASSERT_STRING_EQUAL(key, "loop");
- CU_ASSERT_STRING_EQUAL(value, "30");
- CU_ASSERT_EQUAL(get_keyword_and_value("loop\t 30", key, value), 0);
- CU_ASSERT_STRING_EQUAL(key, "loop");
- CU_ASSERT_STRING_EQUAL(value, "30");
- CU_ASSERT_EQUAL(get_keyword_and_value("a_b:1", key, value), 0);
- CU_ASSERT_STRING_EQUAL(key, "a_b");
- CU_ASSERT_STRING_EQUAL(value, "1");
- CU_ASSERT_EQUAL(get_keyword_and_value("%P:1", key, value), 0);
- CU_ASSERT_STRING_EQUAL(key, "%P");
- CU_ASSERT_STRING_EQUAL(value, "1");
- CU_ASSERT_EQUAL(get_keyword_and_value("%P:0.2", key, value), 0);
- CU_ASSERT_STRING_EQUAL(key, "%P");
- CU_ASSERT_STRING_EQUAL(value, "0.2");
- CU_ASSERT_EQUAL(get_keyword_and_value("%P:20%", key, value), 0);
- CU_ASSERT_STRING_EQUAL(key, "%P");
- CU_ASSERT_STRING_EQUAL(value, "20%");
- CU_ASSERT_EQUAL(get_keyword_and_value("output:/var/run", key, value), 0);
- CU_ASSERT_STRING_EQUAL(key, "output");
- CU_ASSERT_STRING_EQUAL(value, "/var/run");
- CU_ASSERT_EQUAL(get_keyword_and_value("engine:dynamic_fb", key, value), 0);
- CU_ASSERT_STRING_EQUAL(key, "engine");
- CU_ASSERT_STRING_EQUAL(value, "dynamic_fb");
- CU_ASSERT_EQUAL(get_keyword_and_value("name:qemu-kvm", key, value), 0);
- CU_ASSERT_STRING_EQUAL(key, "name");
- CU_ASSERT_STRING_EQUAL(value, "qemu-kvm");
-}
-
typedef enum {
CUNIT_SCREEN = 0,
CUNIT_XMLFILE,
@@ -434,8 +374,6 @@ int main(int argc, const char **argv)
CU_ADD_TEST(suite, test_get_uint_value_ok) == NULL ||
CU_ADD_TEST(suite, test_get_ulong_value_error) == NULL ||
CU_ADD_TEST(suite, test_get_ulong_value_ok) == NULL ||
- CU_ADD_TEST(suite, test_get_key_value_error) == NULL ||
- CU_ADD_TEST(suite, test_get_key_value_ok) == NULL ||
CU_ADD_TEST(suite, test_parse_cmdline_error) == NULL ||
CU_ADD_TEST(suite, test_parse_cmdline_ok) == NULL ||
CU_ADD_TEST(suite, test_get_proc_file_error) == NULL ||
--
1.8.3.1

View File

@ -1,46 +0,0 @@
From 0150a6b2f6ec1b6ecb076832982677dd10403f33 Mon Sep 17 00:00:00 2001
From: liubo <liubo254@huawei.com>
Date: Fri, 27 May 2022 09:09:02 +0800
Subject: [PATCH 31/33] etmem: Fix help command
Add missing content about engine command in help
documentation.
Signed-off-by: liubo <liubo254@huawei.com>
---
etmem/src/etmem_src/etmem.c | 4 ++--
etmem/src/etmem_src/etmem_engine.c | 3 ++-
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/etmem/src/etmem_src/etmem.c b/etmem/src/etmem_src/etmem.c
index f243a75..694a477 100644
--- a/etmem/src/etmem_src/etmem.c
+++ b/etmem/src/etmem_src/etmem.c
@@ -32,8 +32,8 @@ static void usage(void)
" etmem OBJECT COMMAND\n"
" etmem help\n"
"\nParameters:\n"
- " OBJECT := { project | obj }\n"
- " COMMAND := { add | del | start | stop | show | help }\n");
+ " OBJECT := { project | obj | engine }\n"
+ " COMMAND := { add | del | start | stop | show | eng_cmd | help }\n");
}
static struct etmem_obj *etmem_obj_get(const char *name)
diff --git a/etmem/src/etmem_src/etmem_engine.c b/etmem/src/etmem_src/etmem_engine.c
index 675c38f..968f36b 100644
--- a/etmem/src/etmem_src/etmem_engine.c
+++ b/etmem/src/etmem_src/etmem_engine.c
@@ -36,7 +36,8 @@ static void engine_help(void)
" 2. socket name must be given.\n"
" 3. engine name must be given.\n"
" 4. engine cmd must be given.\n"
- " 5. eng_cmd is supported by engine own.\n");
+ " 5. eng_cmd is supported by engine own.\n"
+ " 6. cslide engine eng_cmd: showtaskpages, showhostpages.\n");
}
static void engine_parse_cmd(struct etmem_conf *conf, struct mem_proj *proj)
--
1.8.3.1

View File

@ -1,304 +0,0 @@
From 8d7951eac3650d5e8dc73cd3a7be613f895293e9 Mon Sep 17 00:00:00 2001
From: liubo <liubo254@huawei.com>
Date: Thu, 9 Jun 2022 20:35:09 +0800
Subject: [PATCH] etmem: add etmem project License and notice file
Extract the license in the secondary bubdirectory
to the project directory and add the notice file.
Signed-off-by: liubo <liubo254@huawei.com>
---
License/NOTICE | 11 ++++
memRouter/License/LICENSE | 127 ----------------------------------------------
userswap/License/LICENSE | 127 ----------------------------------------------
3 files changed, 11 insertions(+), 254 deletions(-)
create mode 100644 License/NOTICE
delete mode 100644 memRouter/License/LICENSE
delete mode 100644 userswap/License/LICENSE
diff --git a/License/NOTICE b/License/NOTICE
new file mode 100644
index 0000000..0e06f47
--- /dev/null
+++ b/License/NOTICE
@@ -0,0 +1,11 @@
+etmem License
+=================
+
+Copyright (c) 2020 OPENATOM FOUNDATION and Huawei Technologies Co., Ltd. and others. All rights reserved.
+SPDX-License-Identifier: MulanPSL-2.0
+
+etmem software is licensed under the Mulan Permissive Software LicenseVersion 2.
+
+See http://license.coscl.org.cn/MulanPSL2 for the MulanPSL-2.0 license text.
+
+See https://gitee.com/openeuler/etmem for support or download.
diff --git a/memRouter/License/LICENSE b/memRouter/License/LICENSE
deleted file mode 100644
index 0db93af..0000000
--- a/memRouter/License/LICENSE
+++ /dev/null
@@ -1,127 +0,0 @@
-木兰宽松许可证, 第2版
-
- 木兰宽松许可证, 第2版
- 2020年1月 http://license.coscl.org.cn/MulanPSL2
-
-
- 您对“软件”的复制、使用、修改及分发受木兰宽松许可证第2版“本许可证”的如下条款的约束
-
- 0. 定义
-
- “软件”是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。
-
- “贡献”是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。
-
- “贡献者”是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。
-
- “法人实体”是指提交贡献的机构及其“关联实体”。
-
- “关联实体”是指对“本许可证”下的行为方而言控制、受控制或与其共同受控制的机构此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。
-
- 1. 授予版权许可
-
- 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。
-
- 2. 授予专利许可
-
- 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。
-
- 3. 无商标许可
-
- “本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可但您为满足第4条规定的声明义务而必须使用除外。
-
- 4. 分发限制
-
- 您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。
-
- 5. 免责声明与责任限制
-
- “软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。
-
- 6. 语言
- “本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文版为准。
-
- 条款结束
-
- 如何将木兰宽松许可证第2版应用到您的软件
-
- 如果您希望将木兰宽松许可证第2版应用到您的新软件为了方便接收者查阅建议您完成如下三步
-
- 1 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字;
-
- 2 请您在软件包的一级目录下创建以“LICENSE”为名的文件将整个许可证文本放入该文件中
-
- 3 请将如下声明文本放入每个源文件的头部注释中。
-
- Copyright (c) [Year] [name of copyright holder]
- [Software Name] is licensed under Mulan PSL v2.
- You can use this software according to the terms and conditions of the Mulan PSL v2.
- You may obtain a copy of Mulan PSL v2 at:
- http://license.coscl.org.cn/MulanPSL2
- THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
- See the Mulan PSL v2 for more details.
-
-
- Mulan Permissive Software LicenseVersion 2
-
- Mulan Permissive Software LicenseVersion 2 (Mulan PSL v2)
- January 2020 http://license.coscl.org.cn/MulanPSL2
-
- Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v2 (this License) with the following terms and conditions:
-
- 0. Definition
-
- Software means the program and related documents which are licensed under this License and comprise all Contribution(s).
-
- Contribution means the copyrightable work licensed by a particular Contributor under this License.
-
- Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License.
-
- Legal Entity means the entity making a Contribution and all its Affiliates.
-
- Affiliates means entities that control, are controlled by, or are under common control with the acting entity under this License, control means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity.
-
- 1. Grant of Copyright License
-
- Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not.
-
- 2. Grant of Patent License
-
- Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution, where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed. The patent license shall not apply to any modification of the Contribution, and any other combination which includes the Contribution. If you or your Affiliates directly or indirectly institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken.
-
- 3. No Trademark License
-
- No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in Section 4.
-
- 4. Distribution Restriction
-
- You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software.
-
- 5. Disclaimer of Warranty and Limitation of Liability
-
- THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO MATTER HOW ITS CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
- 6. Language
-
- THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION SHALL PREVAIL.
-
- END OF THE TERMS AND CONDITIONS
-
- How to Apply the Mulan Permissive Software LicenseVersion 2 (Mulan PSL v2) to Your Software
-
- To apply the Mulan PSL v2 to your work, for easy identification by recipients, you are suggested to complete following three steps:
-
- i Fill in the blanks in following statement, including insert your software name, the year of the first publication of your software, and your name identified as the copyright owner;
-
- ii Create a file named “LICENSE” which contains the whole context of this License in the first directory of your software package;
-
- iii Attach the statement to the appropriate annotated syntax at the beginning of each source file.
-
-
- Copyright (c) [Year] [name of copyright holder]
- [Software Name] is licensed under Mulan PSL v2.
- You can use this software according to the terms and conditions of the Mulan PSL v2.
- You may obtain a copy of Mulan PSL v2 at:
- http://license.coscl.org.cn/MulanPSL2
- THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
- See the Mulan PSL v2 for more details.
diff --git a/userswap/License/LICENSE b/userswap/License/LICENSE
deleted file mode 100644
index 0db93af..0000000
--- a/userswap/License/LICENSE
+++ /dev/null
@@ -1,127 +0,0 @@
-木兰宽松许可证, 第2版
-
- 木兰宽松许可证, 第2版
- 2020年1月 http://license.coscl.org.cn/MulanPSL2
-
-
- 您对“软件”的复制、使用、修改及分发受木兰宽松许可证第2版“本许可证”的如下条款的约束
-
- 0. 定义
-
- “软件”是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。
-
- “贡献”是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。
-
- “贡献者”是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。
-
- “法人实体”是指提交贡献的机构及其“关联实体”。
-
- “关联实体”是指对“本许可证”下的行为方而言控制、受控制或与其共同受控制的机构此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。
-
- 1. 授予版权许可
-
- 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。
-
- 2. 授予专利许可
-
- 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。
-
- 3. 无商标许可
-
- “本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可但您为满足第4条规定的声明义务而必须使用除外。
-
- 4. 分发限制
-
- 您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。
-
- 5. 免责声明与责任限制
-
- “软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。
-
- 6. 语言
- “本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文版为准。
-
- 条款结束
-
- 如何将木兰宽松许可证第2版应用到您的软件
-
- 如果您希望将木兰宽松许可证第2版应用到您的新软件为了方便接收者查阅建议您完成如下三步
-
- 1 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字;
-
- 2 请您在软件包的一级目录下创建以“LICENSE”为名的文件将整个许可证文本放入该文件中
-
- 3 请将如下声明文本放入每个源文件的头部注释中。
-
- Copyright (c) [Year] [name of copyright holder]
- [Software Name] is licensed under Mulan PSL v2.
- You can use this software according to the terms and conditions of the Mulan PSL v2.
- You may obtain a copy of Mulan PSL v2 at:
- http://license.coscl.org.cn/MulanPSL2
- THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
- See the Mulan PSL v2 for more details.
-
-
- Mulan Permissive Software LicenseVersion 2
-
- Mulan Permissive Software LicenseVersion 2 (Mulan PSL v2)
- January 2020 http://license.coscl.org.cn/MulanPSL2
-
- Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v2 (this License) with the following terms and conditions:
-
- 0. Definition
-
- Software means the program and related documents which are licensed under this License and comprise all Contribution(s).
-
- Contribution means the copyrightable work licensed by a particular Contributor under this License.
-
- Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License.
-
- Legal Entity means the entity making a Contribution and all its Affiliates.
-
- Affiliates means entities that control, are controlled by, or are under common control with the acting entity under this License, control means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity.
-
- 1. Grant of Copyright License
-
- Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not.
-
- 2. Grant of Patent License
-
- Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution, where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed. The patent license shall not apply to any modification of the Contribution, and any other combination which includes the Contribution. If you or your Affiliates directly or indirectly institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken.
-
- 3. No Trademark License
-
- No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in Section 4.
-
- 4. Distribution Restriction
-
- You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software.
-
- 5. Disclaimer of Warranty and Limitation of Liability
-
- THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO MATTER HOW ITS CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
- 6. Language
-
- THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION SHALL PREVAIL.
-
- END OF THE TERMS AND CONDITIONS
-
- How to Apply the Mulan Permissive Software LicenseVersion 2 (Mulan PSL v2) to Your Software
-
- To apply the Mulan PSL v2 to your work, for easy identification by recipients, you are suggested to complete following three steps:
-
- i Fill in the blanks in following statement, including insert your software name, the year of the first publication of your software, and your name identified as the copyright owner;
-
- ii Create a file named “LICENSE” which contains the whole context of this License in the first directory of your software package;
-
- iii Attach the statement to the appropriate annotated syntax at the beginning of each source file.
-
-
- Copyright (c) [Year] [name of copyright holder]
- [Software Name] is licensed under Mulan PSL v2.
- You can use this software according to the terms and conditions of the Mulan PSL v2.
- You may obtain a copy of Mulan PSL v2 at:
- http://license.coscl.org.cn/MulanPSL2
- THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
- See the Mulan PSL v2 for more details.
--
1.8.3.1

View File

@ -1,51 +0,0 @@
From 4bca2f765de38ce263cf5c7507c717b04395b012 Mon Sep 17 00:00:00 2001
From: liubo <liubo254@huawei.com>
Date: Mon, 13 Jun 2022 15:59:05 +0800
Subject: [PATCH 33/33] etmem: fix memory leak
In the configuration file parsing process, if the parameter
value is not configured, the val memory should be released.
When the project is deleted, the memory of the pid list
corresponding to the task needs to be released.
Signed-off-by: liubo <liubo254@huawei.com>
---
etmem/src/etmemd_src/etmemd_file.c | 8 +++++++-
etmem/src/etmemd_src/etmemd_slide.c | 1 +
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/etmem/src/etmemd_src/etmemd_file.c b/etmem/src/etmemd_src/etmemd_file.c
index b7dc27f..d204685 100644
--- a/etmem/src/etmemd_src/etmemd_file.c
+++ b/etmem/src/etmemd_src/etmemd_file.c
@@ -35,7 +35,13 @@ static int parse_item(GKeyFile *config, char *group_name, struct config_item *it
break;
case STR_VAL:
val = (void *)g_key_file_get_string(config, group_name, item->key, &error);
- if (val == NULL || strlen(val) == 0) {
+ if (val == NULL) {
+ etmemd_log(ETMEMD_LOG_ERR, "section %s of group [%s] should not be empty\n", item->key, group_name);
+ return -1;
+ }
+
+ if (strlen(val) == 0) {
+ free(val);
etmemd_log(ETMEMD_LOG_ERR, "section %s of group [%s] should not be empty\n", item->key, group_name);
return -1;
}
diff --git a/etmem/src/etmemd_src/etmemd_slide.c b/etmem/src/etmemd_src/etmemd_slide.c
index 236778a..a3c474b 100644
--- a/etmem/src/etmemd_src/etmemd_slide.c
+++ b/etmem/src/etmemd_src/etmemd_slide.c
@@ -388,6 +388,7 @@ static void slide_stop_task(struct engine *eng, struct task *tk)
struct slide_params *params = tk->params;
stop_and_delete_threadpool_work(tk);
+ etmemd_free_task_pids(tk);
free(params->executor);
params->executor = NULL;
}
--
1.8.3.1

View File

@ -1,197 +0,0 @@
From 890906f4d42ca257a9b5c6b805b3602743eb982a Mon Sep 17 00:00:00 2001
From: liubo <liubo254@huawei.com>
Date: Mon, 1 Aug 2022 16:25:48 +0800
Subject: [PATCH] etmem: add dt test code for permission check
Add dt test code to etmem_common functions for
the config permission check.
Signed-off-by: liubo <liubo254@huawei.com>
---
.../etmem_common_func_llt.c | 54 ++++++++++++++++++-
.../etmem_scan_ops_export_llt.c | 2 +-
.../etmem_scan_ops_llt.c | 2 +-
.../etmem_slide_ops_llt.c | 14 +++++
.../etmem_socket_ops_llt.c | 8 +--
5 files changed, 73 insertions(+), 7 deletions(-)
diff --git a/etmem/test/etmem_common_func_llt_test/etmem_common_func_llt.c b/etmem/test/etmem_common_func_llt_test/etmem_common_func_llt.c
index 93755ee..7f6a6ee 100644
--- a/etmem/test/etmem_common_func_llt_test/etmem_common_func_llt.c
+++ b/etmem/test/etmem_common_func_llt_test/etmem_common_func_llt.c
@@ -18,6 +18,7 @@
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
+#include <sys/stat.h>
#include <stdbool.h>
#include <fcntl.h>
#include <limits.h>
@@ -34,7 +35,7 @@
#include "etmemd_scan.h"
#include "securec.h"
-#define RECLAIM_SWAPCACHE_MAGIC 0X77
+#define RECLAIM_SWAPCACHE_MAGIC 0x77
#define RECLAIM_SWAPCACHE_ON _IOW(RECLAIM_SWAPCACHE_MAGIC, 0x1, unsigned int)
#define SET_SWAPCACHE_WMARK _IOW(RECLAIM_SWAPCACHE_MAGIC, 0x2, unsigned int)
@@ -336,6 +337,53 @@ static void test_etmemd_send_ioctl_cmd_ok(void)
fclose(fp);
}
+static void test_check_str_error(void)
+{
+ char *str = NULL;
+
+ CU_ASSERT_EQUAL(check_str_valid(str), -1);
+ CU_ASSERT_EQUAL(check_str_valid(""), -1);
+ CU_ASSERT_EQUAL(check_str_valid(":1"), -1);
+ CU_ASSERT_EQUAL(check_str_valid("a:"), -1);
+ CU_ASSERT_EQUAL(check_str_valid("#a:1"), -1);
+ CU_ASSERT_EQUAL(check_str_valid("a.b:1"), -1);
+ CU_ASSERT_EQUAL(check_str_valid("2*4"), -1);
+ CU_ASSERT_EQUAL(check_str_valid("2&^4"), -1);
+ CU_ASSERT_EQUAL(check_str_valid("longgerthan15charchar"), -1);
+}
+
+static void test_check_str_ok(void)
+{
+ CU_ASSERT_EQUAL(check_str_valid("30"), 0);
+ CU_ASSERT_EQUAL(check_str_valid("mysqld"), 0);
+ CU_ASSERT_EQUAL(check_str_valid("swap_test"), 0);
+ CU_ASSERT_EQUAL(check_str_valid("swap-test"), 0);
+ CU_ASSERT_EQUAL(check_str_valid("swap.test"), 0);
+ CU_ASSERT_EQUAL(check_str_valid("swap%test"), 0);
+ CU_ASSERT_EQUAL(check_str_valid("swap/var/run"), 0);
+}
+
+static void test_file_check_error(void)
+{
+ char *file_path = NULL;
+
+ CU_ASSERT_EQUAL(file_size_check(file_path, MAX_CONFIG_FILE_SIZE), -1);
+ CU_ASSERT_EQUAL(file_size_check("/proc/1/status", -1), -1);
+ CU_ASSERT_EQUAL(file_size_check("/proc/1/status", 0), -1);
+ CU_ASSERT_EQUAL(file_size_check("/proc/file_dont_exist/status", MAX_CONFIG_FILE_SIZE - 1), -1);
+
+ CU_ASSERT_EQUAL(file_permission_check(file_path, S_IRWX_VALID), -1);
+ CU_ASSERT_EQUAL(file_permission_check("/proc/1/status", 0), -1);
+ CU_ASSERT_EQUAL(file_permission_check("/proc/file_dont_exist/status", S_IRWX_VALID), -1);
+ CU_ASSERT_EQUAL(file_permission_check("/proc/1", S_IRWX_VALID), -1);
+}
+
+static void test_file_check_ok(void)
+{
+ CU_ASSERT_EQUAL(file_size_check("/proc/1/status", MAX_CONFIG_FILE_SIZE), 0);
+ CU_ASSERT_EQUAL(file_permission_check("/proc/1/status", S_IRUSR | S_IRGRP | S_IROTH), 0);
+}
+
typedef enum {
CUNIT_SCREEN = 0,
CUNIT_XMLFILE,
@@ -374,6 +422,10 @@ int main(int argc, const char **argv)
CU_ADD_TEST(suite, test_get_uint_value_ok) == NULL ||
CU_ADD_TEST(suite, test_get_ulong_value_error) == NULL ||
CU_ADD_TEST(suite, test_get_ulong_value_ok) == NULL ||
+ CU_ADD_TEST(suite, test_check_str_error) == NULL ||
+ CU_ADD_TEST(suite, test_check_str_ok) == NULL ||
+ CU_ADD_TEST(suite, test_file_check_error) == NULL ||
+ CU_ADD_TEST(suite, test_file_check_ok) == NULL ||
CU_ADD_TEST(suite, test_parse_cmdline_error) == NULL ||
CU_ADD_TEST(suite, test_parse_cmdline_ok) == NULL ||
CU_ADD_TEST(suite, test_get_proc_file_error) == NULL ||
diff --git a/etmem/test/etmem_scan_ops_export_llt_test/etmem_scan_ops_export_llt.c b/etmem/test/etmem_scan_ops_export_llt_test/etmem_scan_ops_export_llt.c
index e8e6098..2625cde 100644
--- a/etmem/test/etmem_scan_ops_export_llt_test/etmem_scan_ops_export_llt.c
+++ b/etmem/test/etmem_scan_ops_export_llt_test/etmem_scan_ops_export_llt.c
@@ -191,7 +191,7 @@ static void test_etmem_exp_scan_005(void)
CU_ASSERT_EQUAL(etmemd_scan_init(), 0);
const char *pid = "1";
- char *vmflags_array[10] = {"rd"};
+ char *vmflags_array[10] = {"wr"};
int vmflag_num = 1;
int is_anon_only = false;
struct vmas *vmas = NULL;
diff --git a/etmem/test/etmem_scan_ops_llt_test/etmem_scan_ops_llt.c b/etmem/test/etmem_scan_ops_llt_test/etmem_scan_ops_llt.c
index cb1ccbc..d717b44 100644
--- a/etmem/test/etmem_scan_ops_llt_test/etmem_scan_ops_llt.c
+++ b/etmem/test/etmem_scan_ops_llt_test/etmem_scan_ops_llt.c
@@ -233,7 +233,7 @@ static void test_get_page_refs_valid()
CU_ASSERT_EQUAL(etmemd_scan_init(), 0);
const char *pid = "1";
- char *vmflags_array[10] = {"rd"};
+ char *vmflags_array[10] = {"wr"};
int vmflag_num = 1;
int is_anon_only = false;
struct vmas *vmas = NULL;
diff --git a/etmem/test/etmem_slide_ops_llt_test/etmem_slide_ops_llt.c b/etmem/test/etmem_slide_ops_llt_test/etmem_slide_ops_llt.c
index 4521a60..a476f29 100644
--- a/etmem/test/etmem_slide_ops_llt_test/etmem_slide_ops_llt.c
+++ b/etmem/test/etmem_slide_ops_llt_test/etmem_slide_ops_llt.c
@@ -479,6 +479,20 @@ static void test_task_common_invalid_config(void)
config = construct_slide_task_config(&slide_task);
CU_ASSERT_NOT_EQUAL(etmemd_project_add_task(config), OPT_SUCCESS);
destroy_slide_task_config(config);
+
+ /* task value invalid */
+ init_slide_task(&slide_task);
+ slide_task.task_param.value = "";
+ config = construct_slide_task_config(&slide_task);
+ CU_ASSERT_NOT_EQUAL(etmemd_project_add_task(config), OPT_SUCCESS);
+ destroy_slide_task_config(config);
+
+ /* task value invalid */
+ init_slide_task(&slide_task);
+ slide_task.task_param.type = "name*^";
+ config = construct_slide_task_config(&slide_task);
+ CU_ASSERT_NOT_EQUAL(etmemd_project_add_task(config), OPT_SUCCESS);
+ destroy_slide_task_config(config);
}
static void test_task_slide_invalid_config(void)
diff --git a/etmem/test/etmem_socket_ops_llt_test/etmem_socket_ops_llt.c b/etmem/test/etmem_socket_ops_llt_test/etmem_socket_ops_llt.c
index 387ffd1..8f0f0f8 100644
--- a/etmem/test/etmem_socket_ops_llt_test/etmem_socket_ops_llt.c
+++ b/etmem/test/etmem_socket_ops_llt_test/etmem_socket_ops_llt.c
@@ -155,7 +155,7 @@ static void etmem_pro_add_error(void)
CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_ADD, "test", "file_name", ""), -1);
file_name = get_length_str(RPC_SEND_FILE_MAX);
CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_ADD, "test", file_name, ""), -1);
- CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_ADD, "test", "file_name", "sock_name"), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_ADD, "test", file_name, "sock_name"), -1);
free(file_name);
}
@@ -183,7 +183,7 @@ static void etmem_pro_del_error(void)
CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_DEL, "test", "file_name", ""), -1);
file_name = get_length_str(RPC_SEND_FILE_MAX);
CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_DEL, "test", file_name, ""), -1);
- CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_DEL, "test", "file_name", "sock_name"), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_DEL, "test", file_name, "sock_name"), -1);
free(file_name);
}
@@ -211,7 +211,7 @@ static void etmem_pro_start_error(void)
CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_START, "test", "file_name", ""), -1);
file_name = get_length_str(RPC_SEND_FILE_MAX);
CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_START, "test", file_name, ""), -1);
- CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_START, "test", "file_name", "sock_name"), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_START, "test", file_name, "sock_name"), -1);
free(file_name);
}
@@ -239,7 +239,7 @@ static void etmem_pro_stop_error(void)
CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_STOP, "test", "file_name", ""), -1);
file_name = get_length_str(RPC_SEND_FILE_MAX);
CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_STOP, "test", file_name, ""), -1);
- CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_STOP, "test", "file_name", "sock_name"), -1);
+ CU_ASSERT_EQUAL(etmem_socket_client(ETMEM_CMD_STOP, "test", file_name, "sock_name"), -1);
free(file_name);
}
--
2.23.0

Binary file not shown.

BIN
1.1.tar.gz Normal file

Binary file not shown.

View File

@ -1,98 +1,13 @@
%global debug_package %{nil}
Name: etmem
Version: 1.0
Release: 12
Version: 1.1
Release: 1
Summary: etmem
License: MulanPSL-2.0
URL: https://gitee.com/openeuler/etmem
Source0: https://gitee.com/openeuler/etmem/repository/archive/%{version}.tar.gz
Patch0: 0001-fix-64K-pagesize-scan-problem.patch
Patch1: 0002-change-aarch64-march-to-armv8-a.patch
Patch2: 0003-update-README.md.patch
Patch3: 0004-add-cslide-for-etmem.patch
Patch4: 0005-fix-code-check-problems.patch
Patch5: 0006-remove-unused-share-vmas-merge.patch
Patch6: 0007-fix-error-when-open-idle_pages-failed.patch
Patch7: 0008-fix-memleak.patch
Patch8: 0009-fix-some-bugs-that-occur-when-execute-obj-add-or-del.patch
Patch9: 0010-clean-code.patch
Patch10: 0011-wait-for-next-period-when-error-occurs-in-this-perio.patch
Patch11: 0012-add-recursive-in-etmemd_get_task_pids.patch
Patch12: 0013-check-permission-according-cmd-to-be-executed.patch
Patch13: 0014-stat-pages-info-early-only-replace-cold-mem-in-hot-nodes.patch
Patch14: 0015-limit-mig_quota-hot_reserve-to-0-INT_MAX.patch
Patch15: 0016-add-some-dfx-info.patch
Patch16: 0017-do-not-stop-the-process-when-failed-to-delete-any-obj.patch
Patch17: 0018-fix-code-check-warnning.patch
Patch18: 0019-accept-review-advise.patch
Patch19: 0020-revert-socket-permission-check.patch
Patch20: 0021-add-thirdpart-engine.patch
Patch21: 0022-export-symbols-for-user-defined-thirdparty-engine.patch
Patch22: 0023-accept-review-advise.patch
Patch23: 0024-correct-etmemd-name.patch
Patch24: 0025-add-support-for-systemctl-mode-to-start-etmem.patch
Patch25: 0026-add-scan-library.patch
Patch26: 0027-add-ign_host-to-ignore-host-access-when-scan-vm.patch
Patch27: 0028-openlog-with-same-ident.patch
Patch28: 0029-accept-advise.patch
Patch29: 0030-notify-rpc-success-with-finish-tag.patch
Patch30: 0031-remove-node_watermark.patch
Patch31: 0032-print-all-log-to-stdout.patch
Patch32: 0033-accept-review-advise.patch
Patch33: 0034-fix-open-swap_pages-failure.patch
Patch34: 0035-give-the-correct-example-of-config-file.patch
Patch35: 0036-check-if-start_task-is-NULL-before-call-it.patch
Patch36: 0037-correct-max_threads-when-max_threads-is-0.patch
Patch37: 0038-fix-etmem-help-return-error.patch
Patch38: 0039-check-if-eng_mgt_func-is-NULL-before-use-it.patch
Patch39: 0040-make-code-clean-for-etmem.patch
Patch40: 0041-return-error-if-migrate-failed-and-clean-code.patch
Patch41: 0042-etmemd-fix-memleak-and-clean-code.patch
Patch42: 0043-update-README.md.patch
Patch43: 0044-etmem-cleancode.patch
Patch44: 0045-add-dram_percent-to-etmem.patch
Patch45: 0046-Fix-memory-leak-in-slide-engine.patch
Patch46: 0047-move-all-the-files-to-sub-directory-of-etmem.patch
Patch47: 0048-Commit-new-features-memRouter-and-userswap-to-etmem.patch
Patch48: 0049-Add-engine-memdcd-to-etmemd.patch
Patch49: 0050-Add-CMakeLists.txt-for-three-features-of-etmem.patch
Patch50: 0051-update-memdcd-engine-for-userswap.patch
Patch51: 0052-etmem-correct-example-config-file.patch
Patch52: 0053-etmem-split-example_conf.yaml.patch
Patch53: 0054-add-License-in-memRouter.patch
Patch54: 0055-add-code-of-testcase-for-etmem-common-function.patch
Patch55: 0056-add-code-of-testcase-for-etmem-project-function.patch
Patch56: 0057-add-test-for-export-scan.patch
Patch57: 0058-add-code-of-testcase-for-etmem-common-function.patch
Patch58: 0059-add-code-of-testcase-for-etmem-log-ops.patch
Patch59: 0060-add-make-install-support-to-CMakeList.patch
Patch60: 0061-add-region-scan.patch
Patch61: 0062-fix-etmem-build-problem.patch
Patch62: 0063-etmem-add-code-of-testcase.patch
Patch63: 0064-etmem-add-code-of-testcase.patch
Patch64: 0065-etmem-add-code-of-testcase.patch
Patch65: 0066-etmem-add-sysmem_threshold-and-swap_threshold-parame.patch
Patch66: 0067-etmem-add-swapcache-reclaim-to-etmem.patch
Patch67: 0068-etmem-add-swap-flag-to-support-specified-page-swap-o.patch
Patch68: 0069-etmem-fix-the-swapcache-wmark-configuration-parse-er.patch
Patch69: 0070-etmem-update-README.md.patch
Patch70: 0071-etmem-add-code-of-testcase.patch
Patch71: 0072-etmem-add-code-of-testcase.patch
Patch72: 0073-etmem-add-testcode-script.patch
Patch73: 0074-etmem-add-code-of-testcase.patch
Patch74: 0075-etmem-testcode-adaptation.patch
Patch75: 0076-cslide-limit-hot_threshold-range-to-avoid-overflow-a.patch
Patch76: 0077-etmem-fix-the-problem-of-libso-no-permission-verific.patch
Patch77: 0078-etmem-add-config-file-permission-check.patch
Patch78: 0079-etmem-fix-problem-of-abnormal-task-value.patch
Patch79: 0080-etmem-remove-useless-dt-test-code.patch
Patch80: 0081-etmem-Fix-help-command.patch
Patch81: 0082-etmem-add-etmem-project-License-and-notice-file.patch
Patch82: 0083-etmem-fix-memory-leak.patch
Patch83: 0084-etmem-add-dt-test-code-for-permission-check.patch
#Dependency
BuildRequires: cmake gcc gcc-c++ glib2-devel
BuildRequires: libboundscheck numactl-devel libcap-devel json-c-devel
@ -145,6 +60,9 @@ install -m 0644 userswap/include/uswap_api.h $RPM_BUILD_ROOT%{_includedir}
%postun -p /sbin/ldconfig
%changelog
* Sun Jan 29 2023 liubo <liubo254@huawei.com> 1.1-1
- upgrade etmem version to 1.1
* Thu Dec 1 2022 liubo <liubo254@huawei.com> 1.0-12
- Modify License to MulanPSL-2.0 in the spec