Filter out vmas without userswap flags in the memdcd engine. Signed-off-by: YangXin <245051644@qq.com>
100 lines
3.7 KiB
Diff
100 lines
3.7 KiB
Diff
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
|
|
|