19 Star 0 Fork 38

openEuler-RISC-V/criu

forked from src-openEuler/criu 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
0032-task_exit_notify-add-task-exit-notify-mask-method-fo.patch 5.47 KB
一键复制 编辑 原始数据 按行查看 历史
river 提交于 2022-04-13 15:05 . criu: backport kinds of features/bugfix
From 58a8c9eb07c2cff6232c20f9a59edc634bb1e5e0 Mon Sep 17 00:00:00 2001
From: Jingxian He <hejingxian@huawei.com>
Date: Wed, 19 May 2021 21:59:24 +0800
Subject: [PATCH 32/72] task_exit_notify: add task exit notify mask method for
criu
Add task exit notify mask method for criu during kernel module upgrade.
Signed-off-by: Jingxian He <hejingxian@huawei.com>
Signed-off-by: fu.lin <fulin10@huawei.com>
---
criu/Makefile.crtools | 1 +
criu/config.c | 1 +
criu/cr-restore.c | 10 ++++++++++
criu/crtools.c | 1 +
criu/exit-notify.c | 34 ++++++++++++++++++++++++++++++++++
criu/include/cr_options.h | 1 +
criu/include/exit-notify.h | 10 ++++++++++
criu/seize.c | 10 +++++++++-
8 files changed, 67 insertions(+), 1 deletion(-)
create mode 100644 criu/exit-notify.c
create mode 100644 criu/include/exit-notify.h
diff --git a/criu/Makefile.crtools b/criu/Makefile.crtools
index 2e82912..65cc215 100644
--- a/criu/Makefile.crtools
+++ b/criu/Makefile.crtools
@@ -93,6 +93,7 @@ obj-y += timens.o
obj-y += pin-mem.o
obj-y += devname.o
obj-y += files-chr.o
+obj-y += exit-notify.o
obj-$(CONFIG_HAS_LIBBPF) += bpfmap.o
obj-$(CONFIG_COMPAT) += pie-util-vdso-elf32.o
CFLAGS_pie-util-vdso-elf32.o += -DCONFIG_VDSO_32
diff --git a/criu/config.c b/criu/config.c
index cf99fb1..bd0f84d 100644
--- a/criu/config.c
+++ b/criu/config.c
@@ -703,6 +703,7 @@ int parse_options(int argc, char **argv, bool *usage_error, bool *has_exec_cmd,
BOOL_OPT("with-notifier", &opts.with_notifier_kup),
BOOL_OPT("dump-char-dev", &opts.dump_char_dev),
BOOL_OPT("with-fd-cred", &opts.with_fd_cred),
+ BOOL_OPT("mask-exit-notify", &opts.mask_exit_notify),
{},
};
diff --git a/criu/cr-restore.c b/criu/cr-restore.c
index ac677a1..09f135b 100644
--- a/criu/cr-restore.c
+++ b/criu/cr-restore.c
@@ -82,6 +82,7 @@
#include "apparmor.h"
#include "pin-mem.h"
#include "notifier.h"
+#include "exit-notify.h"
#include "parasite-syscall.h"
#include "files-reg.h"
@@ -1542,6 +1543,15 @@ static inline int fork_with_pid(struct pstree_item *item)
pr_debug("PID: real %d virt %d\n", item->pid->real, vpid(item));
}
+ if (opts.mask_exit_notify) {
+ int pid = ret;
+
+ pr_info("Start unmask exit notifier for pid %d\n", pid);
+ ret = mask_task_exit_notify(pid, false);
+ if (ret)
+ pr_err("Can't unmask exit notifier for pid %d\n", pid);
+ }
+
err_unlock:
if (!(ca.clone_flags & CLONE_NEWPID))
unlock_last_pid();
diff --git a/criu/crtools.c b/criu/crtools.c
index ed7bd99..1a41be4 100644
--- a/criu/crtools.c
+++ b/criu/crtools.c
@@ -454,6 +454,7 @@ usage:
" --dump-char-dev Dump char dev files as normal file with repair cmd\n"
\
" --with-fd-cred Allow to make the restored process has the same cred\n"
+ " --mask-exit-notify Mask task exit notify during dump and restore\n"
"\n"
"Check options:\n"
" Without options, \"criu check\" checks availability of absolutely required\n"
diff --git a/criu/exit-notify.c b/criu/exit-notify.c
new file mode 100644
index 0000000..5c86724
--- /dev/null
+++ b/criu/exit-notify.c
@@ -0,0 +1,34 @@
+#include <fcntl.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include "exit-notify.h"
+#include "log.h"
+
+int mask_task_exit_notify(int pid, bool mask)
+{
+ int fd, retval;
+ char buf[PID_BUF_SIZE] = {0};
+
+ if (pid <= 0)
+ return -1;
+
+ snprintf(buf, PID_BUF_SIZE - 1, "%d", pid);
+ if (mask)
+ fd = open(MASK_EXIT_NOTIFY_DIR, O_WRONLY, 0);
+ else
+ fd = open(UNMASK_EXIT_NOTIFY_DIR, O_WRONLY, 0);
+
+ if (fd < 0) {
+ pr_err("open mask exit notify file fail\n");
+ return fd;
+ }
+
+ retval = write(fd, buf, PID_BUF_SIZE);
+ if (retval < 0)
+ pr_err("Write mask exit pid: %s fail\n", buf);
+ close(fd);
+
+ return retval < 0 ? -1 : 0;
+}
diff --git a/criu/include/cr_options.h b/criu/include/cr_options.h
index 1d6ddcf..26ae5b6 100644
--- a/criu/include/cr_options.h
+++ b/criu/include/cr_options.h
@@ -195,6 +195,7 @@ struct cr_options {
int with_notifier_kup;
int dump_char_dev;
int with_fd_cred;
+ int mask_exit_notify;
};
extern struct cr_options opts;
diff --git a/criu/include/exit-notify.h b/criu/include/exit-notify.h
new file mode 100644
index 0000000..34f2c8d
--- /dev/null
+++ b/criu/include/exit-notify.h
@@ -0,0 +1,10 @@
+#ifndef __CRIU_EXIT_NOTIFY_H__
+#define __CRIU_EXIT_NOTIFY_H__
+
+#define PID_BUF_SIZE 32
+#define MASK_EXIT_NOTIFY_DIR "/sys/kernel/mask_exit_notify"
+#define UNMASK_EXIT_NOTIFY_DIR "/sys/kernel/unmask_exit_notify"
+
+int mask_task_exit_notify(int pid, bool mask);
+
+#endif /* __CRIU_EXIT_NOTIFY_H__ */
diff --git a/criu/seize.c b/criu/seize.c
index 8a35c3c..1e127ff 100644
--- a/criu/seize.c
+++ b/criu/seize.c
@@ -24,6 +24,8 @@
#include "xmalloc.h"
#include "util.h"
#include "pin-mem.h"
+#include "mem.h"
+#include "exit-notify.h"
#define NR_ATTEMPTS 5
@@ -636,7 +638,7 @@ free:
static void unseize_task_and_threads(const struct pstree_item *item, int st)
{
- int i;
+ int i, ret;
if (item->pid->state == TASK_DEAD)
return;
@@ -646,6 +648,12 @@ static void unseize_task_and_threads(const struct pstree_item *item, int st)
dump_task_special_pages(item->threads[i].real);
}
+ if (opts.mask_exit_notify && (st == TASK_DEAD)) {
+ ret = mask_task_exit_notify(item->threads[0].real, true);
+ if (ret)
+ pr_err("mask exit notify for %d fail.\n", item->threads[0].real);
+ }
+
/*
* The st is the state we want to switch tasks into,
* the item->state is the state task was in when we seized one.
--
2.34.1
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/openeuler-risc-v/criu.git
git@gitee.com:openeuler-risc-v/criu.git
openeuler-risc-v
criu
criu
master

搜索帮助

0d507c66 1850385 C8b1a773 1850385