etmem/0011-wait-for-next-period-when-error-occurs-in-this-perio.patch
YangXin ce6533c4bd Update etmem.
Signed-off-by: YangXin <245051644@qq.com>
2021-09-30 22:57:41 +08:00

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