1 Star 0 Fork 35

cf-zhao/criu

forked from src-openEuler/criu 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
0046-sk-fix-share-sockets-repair-problem.patch 3.88 KB
一键复制 编辑 原始数据 按行查看 历史
river 提交于 2022-04-13 15:05 . criu: backport kinds of features/bugfix
From 8b1856d5c72c6870c04a87158718d2df62591a6c Mon Sep 17 00:00:00 2001
From: Jingxian He <hejingxian@huawei.com>
Date: Wed, 11 Aug 2021 15:01:27 +0800
Subject: [PATCH 46/72] sk: fix share sockets repair problem
Repair off the share sockets after reusing them
to recover the share socket state.
Signed-off-by: Jingxian He <hejingxian@huawei.com>
Signed-off-by: fu.lin <fulin10@huawei.com>
---
criu/files.c | 33 ++++++++++++++++++++++++++++++++-
criu/sk-inet.c | 7 +++++--
criu/sk-netlink.c | 5 +++--
3 files changed, 40 insertions(+), 5 deletions(-)
diff --git a/criu/files.c b/criu/files.c
index e79052e..24ed219 100644
--- a/criu/files.c
+++ b/criu/files.c
@@ -51,6 +51,7 @@
#include "bpfmap.h"
#include "files-chr.h"
#include "orphan-inode.h"
+#include "sk-inet.h"
#include "protobuf.h"
#include "util.h"
@@ -1215,7 +1216,7 @@ int setup_and_serve_out(struct fdinfo_list_entry *fle, int new_fd)
if (reopen_fd_as(fle->fe->fd, new_fd))
return -1;
- pr_info("*******flags: %d",fle->fe->flags);
+ pr_info("*******flags: %d\n",fle->fe->flags);
if (fcntl(fle->fe->fd, F_SETFD, fle->fe->flags) == -1) {
pr_perror("Unable to set file descriptor flags");
return -1;
@@ -1229,6 +1230,30 @@ int setup_and_serve_out(struct fdinfo_list_entry *fle, int new_fd)
return 0;
}
+#define MAX_SHARE_SOCKETS_NUM 25000
+int repair_share_sockets[MAX_SHARE_SOCKETS_NUM];
+int repair_share_num;
+
+int add_repair_share_socket(int fd)
+{
+ if (repair_share_num >= MAX_SHARE_SOCKETS_NUM)
+ return -1;
+ repair_share_sockets[repair_share_num] = fd;
+ repair_share_num++;
+ return 0;
+}
+
+void repair_off_share_sockets(void)
+{
+ int i;
+
+ for (i = 0; i < repair_share_num; i++) {
+ tcp_repair_off(repair_share_sockets[i]);
+ pr_info("repair off socket:%d\n", repair_share_sockets[i]);
+ }
+ repair_share_num = 0;
+}
+
static int open_fd(struct fdinfo_list_entry *fle)
{
struct file_desc *d = fle->desc;
@@ -1248,6 +1273,7 @@ static int open_fd(struct fdinfo_list_entry *fle)
if (d->ops->type == FD_TYPES__INETSK) {
if (check_need_repair(d)) {
+ pr_info("start repair for:%d\n", d->id);
ret = repair_share_socket(d->id);
if (!ret) {
new_fd = get_share_socket();
@@ -1255,6 +1281,10 @@ static int open_fd(struct fdinfo_list_entry *fle)
if (new_fd <= 0 || setup_and_serve_out(fle, new_fd) < 0)
return -1;
fle->stage = FLE_RESTORED;
+ if (add_repair_share_socket(fle->fe->fd)) {
+ pr_perror("add repair share socket fail\n");
+ return -1;
+ }
return 0;
}
}
@@ -1379,6 +1409,7 @@ static int open_fdinfos(struct pstree_item *me)
wait_fds_event();
} while (again || progress);
+ repair_off_share_sockets();
BUG_ON(!list_empty(list));
/*
* Fake fles may be used for restore other
diff --git a/criu/sk-inet.c b/criu/sk-inet.c
index c7de793..c0251db 100644
--- a/criu/sk-inet.c
+++ b/criu/sk-inet.c
@@ -635,8 +635,11 @@ static int do_dump_one_inet_fd(int lfd, u32 id, const struct fd_parms *p, int fa
BUG_ON(sk->sd.already_dumped);
if (check_share_dst_port(sk->dst_port) || check_share_src_port(sk->src_port)) {
- pr_info("Start add share prot:%d src %d\n", sk->dst_port, sk->src_port);
- add_share_socket(id, lfd, dst_pid, sk->src_port);
+ pr_info("Start add share prot:%d-%d dst_pid %d id %d\n",
+ sk->dst_port, sk->src_port, dst_pid, id);
+ ret = add_share_socket(id, lfd, dst_pid, sk->src_port);
+ if (ret)
+ pr_warn("add share socket ret %d\n", ret);
}
ie.id = id;
diff --git a/criu/sk-netlink.c b/criu/sk-netlink.c
index d4b3b7b..2832060 100644
--- a/criu/sk-netlink.c
+++ b/criu/sk-netlink.c
@@ -115,9 +115,10 @@ static bool can_dump_netlink_sk(int lfd)
ret = fd_has_data(lfd);
if (ret == 1)
- pr_err("The socket has data to read\n");
+ pr_warn("The socket has data to read\n");
- return ret == 0;
+ /* ignore netlink socket data */
+ return true;
}
static int dump_one_netlink_fd(int lfd, u32 id, const struct fd_parms *p)
--
2.34.1
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/cf-zhao/criu.git
git@gitee.com:cf-zhao/criu.git
cf-zhao
criu
criu
master

搜索帮助