!35 同步代码到22.03-LTS-Next分支
From: @louhongxiang Reviewed-by: @liuzhiqiang26 Signed-off-by: @liuzhiqiang26
This commit is contained in:
commit
b2b95ba65a
82
0003-update-README.md.patch
Normal file
82
0003-update-README.md.patch
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
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
|
||||||
|
|
||||||
6484
0004-add-cslide-for-etmem.patch
Normal file
6484
0004-add-cslide-for-etmem.patch
Normal file
File diff suppressed because it is too large
Load Diff
256
0005-fix-code-check-problems.patch
Normal file
256
0005-fix-code-check-problems.patch
Normal file
@ -0,0 +1,256 @@
|
|||||||
|
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
|
||||||
|
|
||||||
240
0006-remove-unused-share-vmas-merge.patch
Normal file
240
0006-remove-unused-share-vmas-merge.patch
Normal file
@ -0,0 +1,240 @@
|
|||||||
|
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
|
||||||
|
|
||||||
52
0007-fix-error-when-open-idle_pages-failed.patch
Normal file
52
0007-fix-error-when-open-idle_pages-failed.patch
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
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
|
||||||
|
|
||||||
134
0008-fix-memleak.patch
Normal file
134
0008-fix-memleak.patch
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
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
|
||||||
|
|
||||||
@ -0,0 +1,56 @@
|
|||||||
|
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
|
||||||
|
|
||||||
334
0010-clean-code.patch
Normal file
334
0010-clean-code.patch
Normal file
@ -0,0 +1,334 @@
|
|||||||
|
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
|
||||||
|
|
||||||
111
0011-wait-for-next-period-when-error-occurs-in-this-perio.patch
Normal file
111
0011-wait-for-next-period-when-error-occurs-in-this-perio.patch
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
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
|
||||||
|
|
||||||
110
0012-add-recursive-in-etmemd_get_task_pids.patch
Normal file
110
0012-add-recursive-in-etmemd_get_task_pids.patch
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
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
|
||||||
|
|
||||||
130
0013-check-permission-according-cmd-to-be-executed.patch
Normal file
130
0013-check-permission-according-cmd-to-be-executed.patch
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
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
|
||||||
|
|
||||||
@ -0,0 +1,300 @@
|
|||||||
|
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(¶ms->factory);
|
||||||
|
pthread_mutex_destroy(¶ms->stat_mtx);
|
||||||
|
destroy_node_map(¶ms->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(¶ms->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(¶ms->factory);
|
||||||
|
+
|
||||||
|
destroy_stat_mtx:
|
||||||
|
pthread_mutex_destroy(¶ms->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
|
||||||
|
|
||||||
41
0015-limit-mig_quota-hot_reserve-to-0-INT_MAX.patch
Normal file
41
0015-limit-mig_quota-hot_reserve-to-0-INT_MAX.patch
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
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
|
||||||
|
|
||||||
122
0016-add-some-dfx-info.patch
Normal file
122
0016-add-some-dfx-info.patch
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
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
|
||||||
|
|
||||||
@ -0,0 +1,73 @@
|
|||||||
|
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
|
||||||
|
|
||||||
41
0018-fix-code-check-warnning.patch
Normal file
41
0018-fix-code-check-warnning.patch
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
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
|
||||||
|
|
||||||
78
0019-accept-review-advise.patch
Normal file
78
0019-accept-review-advise.patch
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
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
|
||||||
|
|
||||||
133
0020-revert-socket-permission-check.patch
Normal file
133
0020-revert-socket-permission-check.patch
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
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
|
||||||
|
|
||||||
549
0021-add-thirdpart-engine.patch
Normal file
549
0021-add-thirdpart-engine.patch
Normal file
@ -0,0 +1,549 @@
|
|||||||
|
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(¶ms, 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), ¶ms) != 0) {
|
||||||
|
+ etmemd_log(ETMEMD_LOG_ERR, "parse thirdparty_params fail\n");
|
||||||
|
+ goto clear_params;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (set_engine(eng, ¶ms) != 0) {
|
||||||
|
+ etmemd_log(ETMEMD_LOG_ERR, "set engine fail\n");
|
||||||
|
+ goto clear_params;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ret = 0;
|
||||||
|
+
|
||||||
|
+clear_params:
|
||||||
|
+ clear_thirdparty_params(¶ms);
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void clear_engine_type_thirdparty(struct engine *eng)
|
||||||
|
+{
|
||||||
|
+ clear_engine(eng);
|
||||||
|
+}
|
||||||
|
--
|
||||||
|
2.27.0
|
||||||
|
|
||||||
321
0022-export-symbols-for-user-defined-thirdparty-engine.patch
Normal file
321
0022-export-symbols-for-user-defined-thirdparty-engine.patch
Normal file
@ -0,0 +1,321 @@
|
|||||||
|
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
|
||||||
|
|
||||||
95
0023-accept-review-advise.patch
Normal file
95
0023-accept-review-advise.patch
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
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
|
||||||
|
|
||||||
194
0024-correct-etmemd-name.patch
Normal file
194
0024-correct-etmemd-name.patch
Normal file
@ -0,0 +1,194 @@
|
|||||||
|
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
|
||||||
|
|
||||||
243
0025-add-support-for-systemctl-mode-to-start-etmem.patch
Normal file
243
0025-add-support-for-systemctl-mode-to-start-etmem.patch
Normal file
@ -0,0 +1,243 @@
|
|||||||
|
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
|
||||||
|
|
||||||
524
0026-add-scan-library.patch
Normal file
524
0026-add-scan-library.patch
Normal file
@ -0,0 +1,524 @@
|
|||||||
|
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
|
||||||
|
|
||||||
72
0027-add-ign_host-to-ignore-host-access-when-scan-vm.patch
Normal file
72
0027-add-ign_host-to-ignore-host-access-when-scan-vm.patch
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
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
|
||||||
|
|
||||||
41
0028-openlog-with-same-ident.patch
Normal file
41
0028-openlog-with-same-ident.patch
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
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
|
||||||
|
|
||||||
139
0029-accept-advise.patch
Normal file
139
0029-accept-advise.patch
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
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
|
||||||
|
|
||||||
157
0030-notify-rpc-success-with-finish-tag.patch
Normal file
157
0030-notify-rpc-success-with-finish-tag.patch
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
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
|
||||||
|
|
||||||
131
0031-remove-node_watermark.patch
Normal file
131
0031-remove-node_watermark.patch
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
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
|
||||||
|
|
||||||
80
0032-print-all-log-to-stdout.patch
Normal file
80
0032-print-all-log-to-stdout.patch
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
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
|
||||||
|
|
||||||
49
0033-accept-review-advise.patch
Normal file
49
0033-accept-review-advise.patch
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
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
|
||||||
|
|
||||||
48
0034-fix-open-swap_pages-failure.patch
Normal file
48
0034-fix-open-swap_pages-failure.patch
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
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
|
||||||
|
|
||||||
85
0035-give-the-correct-example-of-config-file.patch
Normal file
85
0035-give-the-correct-example-of-config-file.patch
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
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
|
||||||
|
|
||||||
26
0036-check-if-start_task-is-NULL-before-call-it.patch
Normal file
26
0036-check-if-start_task-is-NULL-before-call-it.patch
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
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
|
||||||
|
|
||||||
26
0037-correct-max_threads-when-max_threads-is-0.patch
Normal file
26
0037-correct-max_threads-when-max_threads-is-0.patch
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
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
|
||||||
|
|
||||||
25
0038-fix-etmem-help-return-error.patch
Normal file
25
0038-fix-etmem-help-return-error.patch
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
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
|
||||||
|
|
||||||
30
0039-check-if-eng_mgt_func-is-NULL-before-use-it.patch
Normal file
30
0039-check-if-eng_mgt_func-is-NULL-before-use-it.patch
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
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
|
||||||
|
|
||||||
302
0040-make-code-clean-for-etmem.patch
Normal file
302
0040-make-code-clean-for-etmem.patch
Normal file
@ -0,0 +1,302 @@
|
|||||||
|
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
|
||||||
|
|
||||||
64
0041-return-error-if-migrate-failed-and-clean-code.patch
Normal file
64
0041-return-error-if-migrate-failed-and-clean-code.patch
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
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
|
||||||
|
|
||||||
59
0042-etmemd-fix-memleak-and-clean-code.patch
Normal file
59
0042-etmemd-fix-memleak-and-clean-code.patch
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
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
|
||||||
|
|
||||||
575
0043-update-README.md.patch
Normal file
575
0043-update-README.md.patch
Normal file
@ -0,0 +1,575 @@
|
|||||||
|
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 | 0:debug级别 1:info级别 2:warning级别 3:error级别 只有大于等于配置的级别才会打印到/var/log/message文件中 |
|
||||||
|
-| -s或--socket | etmemd监听的名称,用于与客户端交互 | 是 | 是 | 107个字符之内的字符串 | 指定服务端监听的名称 |
|
||||||
|
-| -h或--help | 帮助信息 | 否 | 否 | NA | 执行时带有此参数会打印后退出 |
|
||||||
|
-
|
||||||
|
+| -l或\-\-log-level | etmemd日志级别 | 否 | 是 | 0~3 | 0:debug级别 1:info级别 2:warning级别 3:error级别 只有大于等于配置的级别才会打印到/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个字以内的字符串 | 用来标识project,engine和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 //单位为MB,AEP到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 | 指定对象的配置文件 | add,del子命令必须包含 | 是 | 需要指定路径名称 |
|
||||||
|
+| -s或\-\-socket | 与etmemd服务端通信的socket名称,需要与etmemd启动时指定的保持一致 | add,del子命令必须包含 | 是 | 必须配置,在有多个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名称 | start,stop,show子命令必须包含 | 是 | project名称,与配置文件一一对应 |
|
||||||
|
+| -s或\-\-socket | 与etmemd服务端通信的socket名称,需要与etmemd启动时指定的保持一致 | start,stop,show子命令必须包含 | 是 | 必须配置,在有多个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 | 0:debug级别;1:info级别;2:warning级别;3:error级别;只有大于等于配置的级别才会打印到/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
|
||||||
|
|
||||||
55
0044-etmem-cleancode.patch
Normal file
55
0044-etmem-cleancode.patch
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
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
|
||||||
|
|
||||||
520
0045-add-dram_percent-to-etmem.patch
Normal file
520
0045-add-dram_percent-to-etmem.patch
Normal file
@ -0,0 +1,520 @@
|
|||||||
|
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
|
||||||
|
|
||||||
52
0046-Fix-memory-leak-in-slide-engine.patch
Normal file
52
0046-Fix-memory-leak-in-slide-engine.patch
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
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
|
||||||
|
|
||||||
335
0047-move-all-the-files-to-sub-directory-of-etmem.patch
Normal file
335
0047-move-all-the-files-to-sub-directory-of-etmem.patch
Normal file
@ -0,0 +1,335 @@
|
|||||||
|
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
|
||||||
|
|
||||||
3286
0048-Commit-new-features-memRouter-and-userswap-to-etmem.patch
Normal file
3286
0048-Commit-new-features-memRouter-and-userswap-to-etmem.patch
Normal file
File diff suppressed because it is too large
Load Diff
481
0049-Add-engine-memdcd-to-etmemd.patch
Normal file
481
0049-Add-engine-memdcd-to-etmemd.patch
Normal file
@ -0,0 +1,481 @@
|
|||||||
|
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
|
||||||
|
|
||||||
39
0050-Add-CMakeLists.txt-for-three-features-of-etmem.patch
Normal file
39
0050-Add-CMakeLists.txt-for-three-features-of-etmem.patch
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
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
|
||||||
|
|
||||||
99
0051-update-memdcd-engine-for-userswap.patch
Normal file
99
0051-update-memdcd-engine-for-userswap.patch
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
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
|
||||||
|
|
||||||
BIN
1.0.tar.gz
Normal file
BIN
1.0.tar.gz
Normal file
Binary file not shown.
@ -16,7 +16,7 @@ etmem内存分级扩展技术,通过DRAM+内存压缩/高性能存储新介质
|
|||||||
|
|
||||||
a) 下载代码包手动编译
|
a) 下载代码包手动编译
|
||||||
|
|
||||||
$ tar -xf etmem-1.0.tar.gz
|
$ tar -xf 1.0.tar.gz
|
||||||
|
|
||||||
$ cd etmem-1.0
|
$ cd etmem-1.0
|
||||||
|
|
||||||
|
|||||||
BIN
etmem-1.0.tar.gz
BIN
etmem-1.0.tar.gz
Binary file not shown.
94
etmem.spec
94
etmem.spec
@ -2,17 +2,69 @@
|
|||||||
|
|
||||||
Name: etmem
|
Name: etmem
|
||||||
Version: 1.0
|
Version: 1.0
|
||||||
Release: 6
|
Release: 10
|
||||||
Summary: etmem
|
Summary: etmem
|
||||||
License: Mulan PSL v2
|
License: Mulan PSL v2
|
||||||
Source0: etmem-%{version}.tar.gz
|
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
|
Patch0: 0001-fix-64K-pagesize-scan-problem.patch
|
||||||
Patch1: 0002-change-aarch64-march-to-armv8-a.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
|
||||||
|
|
||||||
#Dependency
|
#Dependency
|
||||||
BuildRequires: cmake gcc gcc-c++
|
BuildRequires: cmake gcc gcc-c++ glib2-devel
|
||||||
BuildRequires: libboundscheck
|
BuildRequires: libboundscheck numactl-devel libcap-devel json-c-devel
|
||||||
Requires: libboundscheck
|
Requires: libboundscheck json-c libcap numactl-libs
|
||||||
|
Requires: glib2
|
||||||
|
|
||||||
%description
|
%description
|
||||||
etmem module
|
etmem module
|
||||||
@ -29,23 +81,45 @@ make
|
|||||||
|
|
||||||
%install
|
%install
|
||||||
mkdir -p $RPM_BUILD_ROOT%{_bindir}
|
mkdir -p $RPM_BUILD_ROOT%{_bindir}
|
||||||
|
mkdir -p $RPM_BUILD_ROOT%{_libdir}
|
||||||
|
mkdir -p $RPM_BUILD_ROOT%{_includedir}
|
||||||
install -d $RPM_BUILD_ROOT%{_sysconfdir}/etmem/
|
install -d $RPM_BUILD_ROOT%{_sysconfdir}/etmem/
|
||||||
|
|
||||||
install -m 0500 build/bin/etmem $RPM_BUILD_ROOT%{_bindir}
|
install -m 0700 etmem/build/bin/etmem $RPM_BUILD_ROOT%{_bindir}
|
||||||
install -m 0500 build/bin/etmemd $RPM_BUILD_ROOT%{_bindir}
|
install -m 0700 etmem/build/bin/etmemd $RPM_BUILD_ROOT%{_bindir}
|
||||||
install -m 0600 conf/example_conf.yaml $RPM_BUILD_ROOT%{_sysconfdir}/etmem/
|
install -m 0600 etmem/conf/example_conf.yaml $RPM_BUILD_ROOT%{_sysconfdir}/etmem/
|
||||||
|
|
||||||
|
install -m 0750 build/memRouter/memdcd $RPM_BUILD_ROOT%{_bindir}
|
||||||
|
install -m 0750 build/userswap/libuswap.a $RPM_BUILD_ROOT%{_libdir}
|
||||||
|
install -m 0644 userswap/include/uswap_api.h $RPM_BUILD_ROOT%{_includedir}
|
||||||
%files
|
%files
|
||||||
%defattr(-,root,root,0750)
|
%defattr(-,root,root,0750)
|
||||||
%{_bindir}/etmem
|
%attr(0500, -, -) %{_bindir}/etmem
|
||||||
%{_bindir}/etmemd
|
%attr(0500, -, -) %{_bindir}/etmemd
|
||||||
%dir %{_sysconfdir}/etmem
|
%dir %{_sysconfdir}/etmem
|
||||||
%{_sysconfdir}/etmem/example_conf.yaml
|
%{_sysconfdir}/etmem/example_conf.yaml
|
||||||
|
%attr(0550, -, -) %{_bindir}/memdcd
|
||||||
|
%attr(0550, -, -) %{_libdir}/libuswap.a
|
||||||
|
%{_includedir}/uswap_api.h
|
||||||
|
|
||||||
%post -p /sbin/ldconfig
|
%post -p /sbin/ldconfig
|
||||||
%postun -p /sbin/ldconfig
|
%postun -p /sbin/ldconfig
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri Dec 15 2021 YangXin <245051644@qq.com> 1.0-10
|
||||||
|
- Update memdcd engine for userswap page filter.
|
||||||
|
|
||||||
|
* Fri Oct 29 2021 liubo <liubo254@huawei.com> 1.0-9
|
||||||
|
- Add missing URL and source to etmem.spec
|
||||||
|
|
||||||
|
* Thu Oct 20 2021 shikemeng <shikemeng@huawei.com> 1.0-8
|
||||||
|
- Add missing Requires
|
||||||
|
- Remove write permssion in %file after strip
|
||||||
|
- Change Requires numactl to numactl-libs
|
||||||
|
|
||||||
|
* Thu Sep 30 2021 yangxin <245051644@qq.com> 1.0-7
|
||||||
|
- Update etmem and add new features memRouter and userswap.=
|
||||||
|
|
||||||
* Mon Aug 1 2021 louhongxiang <louhongxiang@huawei.com> 1.0-6
|
* Mon Aug 1 2021 louhongxiang <louhongxiang@huawei.com> 1.0-6
|
||||||
- cancel write permission of root.
|
- cancel write permission of root.
|
||||||
|
|
||||||
|
|||||||
4
etmem.yaml
Normal file
4
etmem.yaml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
version_control: gitee
|
||||||
|
src_repo: openEuler/etmem
|
||||||
|
tag_prefix: ""
|
||||||
|
seperator: .
|
||||||
Loading…
x
Reference in New Issue
Block a user