112 lines
4.0 KiB
Diff
112 lines
4.0 KiB
Diff
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
|
|
|