Enable initial rseq support
Signed-off-by: Radostin Stoyanov <rstoyanov@fedoraproject.org>
This commit is contained in:
parent
9f1d78115d
commit
46abdd731a
33
0004-criu-8-add-external-net-option.patch
Normal file
33
0004-criu-8-add-external-net-option.patch
Normal file
@ -0,0 +1,33 @@
|
||||
From 93d977ccacdc6dc01c0ef8c6a27a5c8896ceaaf9 Mon Sep 17 00:00:00 2001
|
||||
From: Radostin Stoyanov <radostin@redhat.com>
|
||||
Date: Mon, 20 Sep 2021 13:50:08 +0100
|
||||
Subject: [PATCH 004/120] criu(8): add --external net option
|
||||
|
||||
Support for external net namespaces has been introduced with
|
||||
commit c2b21fbf (criu: add support for external net namespaces).
|
||||
|
||||
Signed-off-by: Radostin Stoyanov <radostin@redhat.com>
|
||||
---
|
||||
Documentation/criu.txt | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/Documentation/criu.txt b/Documentation/criu.txt
|
||||
index 690f61e14..3c4c1eaf8 100644
|
||||
--- a/Documentation/criu.txt
|
||||
+++ b/Documentation/criu.txt
|
||||
@@ -242,6 +242,12 @@ In other words, do not use it unless really needed.
|
||||
Tell *criu* that one end of a pair of UNIX sockets (created by
|
||||
*socketpair*(2)) with the given _id_ is OK to be disconnected.
|
||||
|
||||
+*--external* **net[**__inode__**]:**__name__::
|
||||
+ Mark a network namespace as external and do not include it in the
|
||||
+ checkpoint. The label 'name' can be used with *--inherit-fd* during
|
||||
+ restore to specify a file descriptor to a preconfigured network
|
||||
+ namespace.
|
||||
+
|
||||
*--external* **pid[**__inode__**]:**__name__::
|
||||
Mark a PID namespace as external. This can be later used to restore
|
||||
a process into an existing PID namespace. The label 'name' can be
|
||||
--
|
||||
2.34.1
|
||||
|
||||
269
0005-criu-Introduce-new-device-file-plugin-hooks.patch
Normal file
269
0005-criu-Introduce-new-device-file-plugin-hooks.patch
Normal file
@ -0,0 +1,269 @@
|
||||
From 32055ece2d1eeb7e5ea7e8345c728e117ae4b737 Mon Sep 17 00:00:00 2001
|
||||
From: Rajneesh Bhardwaj <rajneesh.bhardwaj@amd.com>
|
||||
Date: Thu, 15 Apr 2021 12:04:45 -0400
|
||||
Subject: [PATCH 005/120] criu: Introduce new device file plugin hooks
|
||||
|
||||
Currently CRIU cannot handle Checkpoint Restore operations when a device
|
||||
file is involved in a process, however, CRIU allows flexible extensions
|
||||
via special plugins but still, for certain complex devices such as a GPU,
|
||||
the existing hooks are not sufficient. This introduces few new hooks
|
||||
that will be used to support Checkpoint Restore operation with AMD GPU
|
||||
devices and potentially to other similar devices too.
|
||||
|
||||
- HANDLE_DEVICE_VMA
|
||||
- UPDATE_VMA_MAP
|
||||
- RESUME_DEVICES_LATE
|
||||
|
||||
*HANDLE_DEVICE_VMA:
|
||||
Hook to detect a suitable plugin to handle device file VMA with
|
||||
PF | IO mappings.
|
||||
|
||||
*UPDATE_VMA_MAP:
|
||||
Hook to handle VMAs during a device file restore.
|
||||
|
||||
When restoring VMAs for the device files, criu runs sys_mmap in
|
||||
the pie restore context but the offsets and file path within a
|
||||
device file may change during restore operation so it needs to be
|
||||
adjusted properly.
|
||||
|
||||
*RESUME_DEVICES_LATE:
|
||||
Hook to do some special handling in late restore phase.
|
||||
|
||||
During criu restore phase when a device is getting restored with
|
||||
the help of a plugin, some device specific operations might need
|
||||
to be delayed until criu finalizes the VMA placements in address
|
||||
space of the target process. But by the time criu finalizes this,
|
||||
its too late since pie phase is over and control is back to criu
|
||||
master process. This hook allows an external trigger to each
|
||||
resuming task to check whether it has a device specific operation
|
||||
pending such as issuing an ioctl call? Since this is called from
|
||||
criu master process context, supply the pid of the target process
|
||||
and give a chance to each plugin registered to run device
|
||||
specific operation if the target pid is valid.
|
||||
|
||||
A future patch will add consumers for these plugin hooks to support AMD
|
||||
GPUs.
|
||||
|
||||
Signed-off-by: Rajneesh Bhardwaj <rajneesh.bhardwaj@amd.com>
|
||||
---
|
||||
criu/cr-restore.c | 23 +++++++++++++++++++
|
||||
criu/files-reg.c | 17 ++++++++++++++
|
||||
criu/include/criu-plugin.h | 16 +++++++++++++
|
||||
criu/plugin.c | 3 +++
|
||||
criu/proc_parse.c | 47 +++++++++++++++++++++++++++++++++-----
|
||||
5 files changed, 100 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/criu/cr-restore.c b/criu/cr-restore.c
|
||||
index 9d2d957f8..ed62cc5a2 100644
|
||||
--- a/criu/cr-restore.c
|
||||
+++ b/criu/cr-restore.c
|
||||
@@ -2388,6 +2388,29 @@ skip_ns_bouncing:
|
||||
pr_err("Unable to flush breakpoints\n");
|
||||
|
||||
finalize_restore();
|
||||
+ /*
|
||||
+ * Some external devices such as GPUs might need a very late
|
||||
+ * trigger to kick-off some events, memory notifiers and for
|
||||
+ * restarting the previously restored queues during criu restore
|
||||
+ * stage. This is needed since criu pie code may shuffle VMAs
|
||||
+ * around so things such as registering MMU notifiers (for GPU
|
||||
+ * mapped memory) could be done sanely once the pie code hands
|
||||
+ * over the control to master process.
|
||||
+ */
|
||||
+ for_each_pstree_item(item) {
|
||||
+ pr_info("Run late stage hook from criu master for external devices\n");
|
||||
+ ret = run_plugins(RESUME_DEVICES_LATE, item->pid->real);
|
||||
+ /*
|
||||
+ * This may not really be an error. Only certain plugin hooks
|
||||
+ * (if available) will return success such as amdgpu_plugin that
|
||||
+ * validates the pid of the resuming tasks in the kernel mode.
|
||||
+ * Most of the times, it'll be -ENOTSUP and in few cases, it
|
||||
+ * might actually be a true error code but that would be also
|
||||
+ * captured in the plugin so no need to print the error here.
|
||||
+ */
|
||||
+ if (ret < 0)
|
||||
+ pr_debug("restore late stage hook for external plugin failed\n");
|
||||
+ }
|
||||
|
||||
ret = run_scripts(ACT_PRE_RESUME);
|
||||
if (ret)
|
||||
diff --git a/criu/files-reg.c b/criu/files-reg.c
|
||||
index ee54d1d7d..2b0347575 100644
|
||||
--- a/criu/files-reg.c
|
||||
+++ b/criu/files-reg.c
|
||||
@@ -2267,6 +2267,23 @@ static int open_filemap(int pid, struct vma_area *vma)
|
||||
BUG_ON((vma->vmfd == NULL) || !vma->e->has_fdflags);
|
||||
flags = vma->e->fdflags;
|
||||
|
||||
+ /* update the new device file page offsets and file paths set during restore */
|
||||
+ if (vma->e->status & VMA_UNSUPP) {
|
||||
+ uint64_t new_pgoff;
|
||||
+ char new_path[PATH_MAX];
|
||||
+ int ret;
|
||||
+
|
||||
+ struct reg_file_info *rfi = container_of(vma->vmfd, struct reg_file_info, d);
|
||||
+ ret = run_plugins(UPDATE_VMA_MAP, rfi->rfe->name, new_path, vma->e->start, vma->e->pgoff, &new_pgoff);
|
||||
+ if (ret == 1) {
|
||||
+ pr_info("New mmap %#016" PRIx64 "->%#016" PRIx64 " path %s\n", vma->e->pgoff, new_pgoff,
|
||||
+ new_path);
|
||||
+ vma->e->pgoff = new_pgoff;
|
||||
+ rfi->path = xstrdup(new_path);
|
||||
+ pr_debug("Updated rfi->path %s\n", rfi->path);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
if (ctx.flags != flags || ctx.desc != vma->vmfd) {
|
||||
if (vma->e->status & VMA_AREA_MEMFD)
|
||||
ret = memfd_open(vma->vmfd, &flags);
|
||||
diff --git a/criu/include/criu-plugin.h b/criu/include/criu-plugin.h
|
||||
index 897666ecd..0bc7a4255 100644
|
||||
--- a/criu/include/criu-plugin.h
|
||||
+++ b/criu/include/criu-plugin.h
|
||||
@@ -22,6 +22,8 @@
|
||||
|
||||
#include <limits.h>
|
||||
#include <stdbool.h>
|
||||
+#include <stdint.h>
|
||||
+#include <sys/stat.h>
|
||||
|
||||
#define CRIU_PLUGIN_GEN_VERSION(a, b, c) (((a) << 16) + ((b) << 8) + (c))
|
||||
#define CRIU_PLUGIN_VERSION_MAJOR 0
|
||||
@@ -48,6 +50,12 @@ enum {
|
||||
|
||||
CR_PLUGIN_HOOK__DUMP_EXT_LINK = 6,
|
||||
|
||||
+ CR_PLUGIN_HOOK__HANDLE_DEVICE_VMA = 7,
|
||||
+
|
||||
+ CR_PLUGIN_HOOK__UPDATE_VMA_MAP = 8,
|
||||
+
|
||||
+ CR_PLUGIN_HOOK__RESUME_DEVICES_LATE = 9,
|
||||
+
|
||||
CR_PLUGIN_HOOK__MAX
|
||||
};
|
||||
|
||||
@@ -60,6 +68,10 @@ DECLARE_PLUGIN_HOOK_ARGS(CR_PLUGIN_HOOK__RESTORE_EXT_FILE, int id);
|
||||
DECLARE_PLUGIN_HOOK_ARGS(CR_PLUGIN_HOOK__DUMP_EXT_MOUNT, char *mountpoint, int id);
|
||||
DECLARE_PLUGIN_HOOK_ARGS(CR_PLUGIN_HOOK__RESTORE_EXT_MOUNT, int id, char *mountpoint, char *old_root, int *is_file);
|
||||
DECLARE_PLUGIN_HOOK_ARGS(CR_PLUGIN_HOOK__DUMP_EXT_LINK, int index, int type, char *kind);
|
||||
+DECLARE_PLUGIN_HOOK_ARGS(CR_PLUGIN_HOOK__HANDLE_DEVICE_VMA, int fd, const struct stat *stat);
|
||||
+DECLARE_PLUGIN_HOOK_ARGS(CR_PLUGIN_HOOK__UPDATE_VMA_MAP, const char *old_path, char *new_path, const uint64_t addr,
|
||||
+ const uint64_t old_pgoff, uint64_t *new_pgoff);
|
||||
+DECLARE_PLUGIN_HOOK_ARGS(CR_PLUGIN_HOOK__RESUME_DEVICES_LATE, int pid);
|
||||
|
||||
enum {
|
||||
CR_PLUGIN_STAGE__DUMP,
|
||||
@@ -130,5 +142,9 @@ typedef int(cr_plugin_restore_file_t)(int id);
|
||||
typedef int(cr_plugin_dump_ext_mount_t)(char *mountpoint, int id);
|
||||
typedef int(cr_plugin_restore_ext_mount_t)(int id, char *mountpoint, char *old_root, int *is_file);
|
||||
typedef int(cr_plugin_dump_ext_link_t)(int index, int type, char *kind);
|
||||
+typedef int(cr_plugin_handle_device_vma_t)(int fd, const struct stat *stat);
|
||||
+typedef int(cr_plugin_update_vma_map_t)(const char *old_path, char *new_path, const uint64_t addr,
|
||||
+ const uint64_t old_pgoff, uint64_t *new_pgoff);
|
||||
+typedef int(cr_plugin_resume_devices_late_t)(int pid);
|
||||
|
||||
#endif /* __CRIU_PLUGIN_H__ */
|
||||
diff --git a/criu/plugin.c b/criu/plugin.c
|
||||
index 3fe03c7cd..f3fea2856 100644
|
||||
--- a/criu/plugin.c
|
||||
+++ b/criu/plugin.c
|
||||
@@ -54,6 +54,9 @@ static cr_plugin_desc_t *cr_gen_plugin_desc(void *h, char *path)
|
||||
__assign_hook(DUMP_EXT_MOUNT, "cr_plugin_dump_ext_mount");
|
||||
__assign_hook(RESTORE_EXT_MOUNT, "cr_plugin_restore_ext_mount");
|
||||
__assign_hook(DUMP_EXT_LINK, "cr_plugin_dump_ext_link");
|
||||
+ __assign_hook(HANDLE_DEVICE_VMA, "cr_plugin_handle_device_vma");
|
||||
+ __assign_hook(UPDATE_VMA_MAP, "cr_plugin_update_vma_map");
|
||||
+ __assign_hook(RESUME_DEVICES_LATE, "cr_plugin_resume_devices_late");
|
||||
|
||||
#undef __assign_hook
|
||||
|
||||
diff --git a/criu/proc_parse.c b/criu/proc_parse.c
|
||||
index f3491e781..8a9ce3a37 100644
|
||||
--- a/criu/proc_parse.c
|
||||
+++ b/criu/proc_parse.c
|
||||
@@ -45,6 +45,7 @@
|
||||
#include "protobuf.h"
|
||||
#include "images/fdinfo.pb-c.h"
|
||||
#include "images/mnt.pb-c.h"
|
||||
+#include "plugin.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
@@ -103,6 +104,19 @@ bool is_vma_range_fmt(char *line)
|
||||
return __is_vma_range_fmt(line);
|
||||
}
|
||||
|
||||
+bool handle_vma_plugin(int *fd, struct stat *stat)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = run_plugins(HANDLE_DEVICE_VMA, *fd, stat);
|
||||
+ if (ret < 0) {
|
||||
+ pr_perror("handle_device_vma plugin failed");
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
static void __parse_vmflags(char *buf, u32 *flags, u64 *madv, int *io_pf)
|
||||
{
|
||||
char *tok;
|
||||
@@ -188,6 +202,7 @@ struct vma_file_info {
|
||||
int dev_min;
|
||||
unsigned long ino;
|
||||
struct vma_area *vma;
|
||||
+ bool has_device_plugin;
|
||||
};
|
||||
|
||||
static inline int vfi_equal(struct vma_file_info *a, struct vma_file_info *b)
|
||||
@@ -577,11 +592,17 @@ static int handle_vma(pid_t pid, struct vma_area *vma_area, const char *file_pat
|
||||
} else if (*vm_file_fd >= 0) {
|
||||
struct stat *st_buf = vma_area->vmst;
|
||||
|
||||
- if (S_ISREG(st_buf->st_mode))
|
||||
+ if (S_ISREG(st_buf->st_mode)) {
|
||||
/* regular file mapping -- supported */;
|
||||
- else if (S_ISCHR(st_buf->st_mode) && (st_buf->st_rdev == DEVZERO))
|
||||
+ pr_debug("Found regular file mapping, OK\n");
|
||||
+ } else if (S_ISCHR(st_buf->st_mode) && (st_buf->st_rdev == DEVZERO)) {
|
||||
/* devzero mapping -- also makes sense */;
|
||||
- else {
|
||||
+ pr_debug("Found devzero mapping, OK\n");
|
||||
+ } else if (handle_vma_plugin(vm_file_fd, st_buf)) {
|
||||
+ pr_info("Found device file mapping, plugin is available\n");
|
||||
+ vfi->has_device_plugin = true;
|
||||
+ } else {
|
||||
+ /* non-regular mapping with no supporting plugin */
|
||||
pr_err("Can't handle non-regular mapping on %d's map %" PRIx64 "\n", pid, vma_area->e->start);
|
||||
goto err;
|
||||
}
|
||||
@@ -646,9 +667,23 @@ static int vma_list_add(struct vma_area *vma_area, struct vm_area_list *vma_area
|
||||
struct vma_file_info *vfi, struct vma_file_info *prev_vfi)
|
||||
{
|
||||
if (vma_area->e->status & VMA_UNSUPP) {
|
||||
- pr_err("Unsupported mapping found %016" PRIx64 "-%016" PRIx64 "\n", vma_area->e->start,
|
||||
- vma_area->e->end);
|
||||
- return -1;
|
||||
+ if (vfi->has_device_plugin) {
|
||||
+ /* Unsupported VMAs that provide special plugins for
|
||||
+ * backup can be treated as regular VMAs and criu
|
||||
+ * should only save their metadata in the dump files.
|
||||
+ * There can be several special backup plugins hooks
|
||||
+ * that might run at different stages during checkpoint
|
||||
+ * and restore.
|
||||
+ */
|
||||
+ pr_debug("Device file mapping %016" PRIx64 "-%016" PRIx64 " "
|
||||
+ "must be supported via device plugins\n",
|
||||
+ vma_area->e->start, vma_area->e->end);
|
||||
+
|
||||
+ } else {
|
||||
+ pr_err("Unsupported mapping found %016" PRIx64 "-%016" PRIx64 "\n", vma_area->e->start,
|
||||
+ vma_area->e->end);
|
||||
+ return -1;
|
||||
+ }
|
||||
}
|
||||
|
||||
/* Add a guard page only if here is enough space for it */
|
||||
--
|
||||
2.34.1
|
||||
|
||||
160
0006-criu-plugin-Implement-dummy-amdgpu-plugin-hooks.patch
Normal file
160
0006-criu-plugin-Implement-dummy-amdgpu-plugin-hooks.patch
Normal file
@ -0,0 +1,160 @@
|
||||
From 3470e3d012a2706463cd77afce0a33f3581c2721 Mon Sep 17 00:00:00 2001
|
||||
From: Rajneesh Bhardwaj <rajneesh.bhardwaj@amd.com>
|
||||
Date: Thu, 15 Jul 2021 01:34:08 -0400
|
||||
Subject: [PATCH 006/120] criu/plugin: Implement dummy amdgpu plugin hooks
|
||||
|
||||
This is just a placeholder dummy plugin and will be replaced by a proper
|
||||
plugin that implements support for AMD GPU devices. This just
|
||||
facilitates the initial pull request and CI build test trigger for early
|
||||
code review of CRIU specific changes. Future PRs will bring in more
|
||||
support for amdgpu_plugin to enable CRIU with AMD ROCm.
|
||||
|
||||
Signed-off-by: Rajneesh Bhardwaj <rajneesh.bhardwaj@amd.com>
|
||||
---
|
||||
Makefile | 12 ++++++++++--
|
||||
Makefile.install | 8 +++++++-
|
||||
plugins/amdgpu/Makefile | 13 +++++++++++++
|
||||
plugins/amdgpu/dummy_plugin.c | 36 +++++++++++++++++++++++++++++++++++
|
||||
4 files changed, 66 insertions(+), 3 deletions(-)
|
||||
create mode 100644 plugins/amdgpu/Makefile
|
||||
create mode 100644 plugins/amdgpu/dummy_plugin.c
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
index a1e3977f8..e361e8a8f 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -294,15 +294,19 @@ clean mrproper:
|
||||
$(Q) $(MAKE) $(build)=crit $@
|
||||
.PHONY: clean mrproper
|
||||
|
||||
+clean-dummy_amdgpu_plugin:
|
||||
+ $(Q) $(MAKE) -C plugins/amdgpu clean
|
||||
+.PHONY: clean dummy_amdgpu_plugin
|
||||
+
|
||||
clean-top:
|
||||
$(Q) $(MAKE) -C Documentation clean
|
||||
$(Q) $(MAKE) $(build)=test/compel clean
|
||||
$(Q) $(RM) .gitid
|
||||
.PHONY: clean-top
|
||||
|
||||
-clean: clean-top
|
||||
+clean: clean-top clean-dummy_amdgpu_plugin
|
||||
|
||||
-mrproper-top: clean-top
|
||||
+mrproper-top: clean-top clean-dummy_amdgpu_plugin
|
||||
$(Q) $(RM) $(CONFIG_HEADER)
|
||||
$(Q) $(RM) $(VERSION_HEADER)
|
||||
$(Q) $(RM) $(COMPEL_VERSION_HEADER)
|
||||
@@ -330,6 +334,10 @@ test: zdtm
|
||||
$(Q) $(MAKE) -C test
|
||||
.PHONY: test
|
||||
|
||||
+dummy_amdgpu_plugin:
|
||||
+ $(Q) $(MAKE) -C plugins/amdgpu all
|
||||
+.PHONY: dummy_amdgpu_plugin
|
||||
+
|
||||
#
|
||||
# Generating tar requires tag matched CRIU_VERSION.
|
||||
# If not found then simply use GIT's describe with
|
||||
diff --git a/Makefile.install b/Makefile.install
|
||||
index 3987bcc6f..52e8c06da 100644
|
||||
--- a/Makefile.install
|
||||
+++ b/Makefile.install
|
||||
@@ -7,6 +7,7 @@ MANDIR ?= $(PREFIX)/share/man
|
||||
INCLUDEDIR ?= $(PREFIX)/include
|
||||
LIBEXECDIR ?= $(PREFIX)/libexec
|
||||
RUNDIR ?= /run
|
||||
+PLUGINDIR ?= /var/lib/criu
|
||||
|
||||
#
|
||||
# For recent Debian/Ubuntu with multiarch support.
|
||||
@@ -26,7 +27,7 @@ endif
|
||||
LIBDIR ?= $(PREFIX)/lib
|
||||
|
||||
export PREFIX BINDIR SBINDIR MANDIR RUNDIR
|
||||
-export LIBDIR INCLUDEDIR LIBEXECDIR
|
||||
+export LIBDIR INCLUDEDIR LIBEXECDIR PLUGINDIR
|
||||
|
||||
install-man:
|
||||
$(Q) $(MAKE) -C Documentation install
|
||||
@@ -40,6 +41,10 @@ install-criu: criu
|
||||
$(Q) $(MAKE) $(build)=criu install
|
||||
.PHONY: install-criu
|
||||
|
||||
+install-dummy_amdgpu_plugin: dummy_amdgpu_plugin
|
||||
+ $(Q) $(MAKE) -C plugins/amdgpu install
|
||||
+.PHONY: install-dummy_amdgpu_plugin
|
||||
+
|
||||
install-compel: $(compel-install-targets)
|
||||
$(Q) $(MAKE) $(build)=compel install
|
||||
$(Q) $(MAKE) $(build)=compel/plugins install
|
||||
@@ -54,4 +59,5 @@ uninstall:
|
||||
$(Q) $(MAKE) $(build)=criu $@
|
||||
$(Q) $(MAKE) $(build)=compel $@
|
||||
$(Q) $(MAKE) $(build)=compel/plugins $@
|
||||
+ $(Q) $(MAKE) -C plugins/amdgpu $@
|
||||
.PHONY: uninstall
|
||||
diff --git a/plugins/amdgpu/Makefile b/plugins/amdgpu/Makefile
|
||||
new file mode 100644
|
||||
index 000000000..45a9ec611
|
||||
--- /dev/null
|
||||
+++ b/plugins/amdgpu/Makefile
|
||||
@@ -0,0 +1,13 @@
|
||||
+all: dummy_plugin.so
|
||||
+
|
||||
+dummy_plugin.so: dummy_plugin.c
|
||||
+ gcc -g -Werror -D _GNU_SOURCE -Wall -shared -nostartfiles dummy_plugin.c -o dummy_plugin.so -iquote ../../../criu/include -iquote ../../criu/include -fPIC
|
||||
+
|
||||
+clean:
|
||||
+ $(Q) $(RM) dummy_plugin.so
|
||||
+install:
|
||||
+ $(Q) mkdir -p $(PLUGINDIR)
|
||||
+ $(Q) install -m 644 dummy_plugin.so $(PLUGINDIR)
|
||||
+
|
||||
+uninstall:
|
||||
+ $(Q) $(RM) $(PLUGINDIR)/dummy_plugin.so
|
||||
diff --git a/plugins/amdgpu/dummy_plugin.c b/plugins/amdgpu/dummy_plugin.c
|
||||
new file mode 100644
|
||||
index 000000000..872276095
|
||||
--- /dev/null
|
||||
+++ b/plugins/amdgpu/dummy_plugin.c
|
||||
@@ -0,0 +1,36 @@
|
||||
+#include <sys/stat.h>
|
||||
+
|
||||
+#include "criu-log.h"
|
||||
+#include "criu-plugin.h"
|
||||
+
|
||||
+int dummy_plugin_handle_device_vma(int fd, const struct stat *stat)
|
||||
+{
|
||||
+ pr_info("dummy_plugin: Inside %s for fd = %d\n", __func__, fd);
|
||||
+ /* let criu report failure for the unsupported mapping */
|
||||
+ return -ENOTSUP;
|
||||
+}
|
||||
+CR_PLUGIN_REGISTER_HOOK(CR_PLUGIN_HOOK__HANDLE_DEVICE_VMA, dummy_plugin_handle_device_vma)
|
||||
+
|
||||
+int dummy_plugin_resume_devices_late(int target_pid)
|
||||
+{
|
||||
+ pr_info("dummy_plugin: Inside %s for target pid = %d\n", __func__, target_pid);
|
||||
+ return -ENOTSUP;
|
||||
+}
|
||||
+CR_PLUGIN_REGISTER_HOOK(CR_PLUGIN_HOOK__RESUME_DEVICES_LATE, dummy_plugin_resume_devices_late)
|
||||
+
|
||||
+/*
|
||||
+ * return 0 if no match found
|
||||
+ * return -1 for error or -ENOTSUP.
|
||||
+ * return 1 if vmap map must be adjusted.
|
||||
+ */
|
||||
+int dummy_plugin_update_vmamap(const char *old_path, char *new_path, const uint64_t addr, const uint64_t old_offset,
|
||||
+ uint64_t *new_offset)
|
||||
+{
|
||||
+ uint64_t temp = 100;
|
||||
+
|
||||
+ *new_offset = temp;
|
||||
+ pr_info("dummy_plugin: old_pgoff= 0x%lu new_pgoff = 0x%lx old_path = %s new_path = %s addr = 0x%lu\n",
|
||||
+ old_offset, *new_offset, old_path, new_path, addr);
|
||||
+ return -ENOTSUP;
|
||||
+}
|
||||
+CR_PLUGIN_REGISTER_HOOK(CR_PLUGIN_HOOK__UPDATE_VMA_MAP, dummy_plugin_update_vmamap)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
41
0007-criu-files-Don-t-cache-fd-ids-for-device-files.patch
Normal file
41
0007-criu-files-Don-t-cache-fd-ids-for-device-files.patch
Normal file
@ -0,0 +1,41 @@
|
||||
From 951f8bc4db77ed71a7929c8a0a6c754a5dbb8919 Mon Sep 17 00:00:00 2001
|
||||
From: Rajneesh Bhardwaj <rajneesh.bhardwaj@amd.com>
|
||||
Date: Tue, 27 Apr 2021 19:08:57 -0400
|
||||
Subject: [PATCH 007/120] criu/files: Don't cache fd ids for device files
|
||||
|
||||
Restore operation fails when we perform CR operation of multiple
|
||||
independent proceses that have device files because criu caches
|
||||
the ids for the device files with same mnt_ids, inode pair. This
|
||||
change ensures that even in case of a cached id found for a device, a
|
||||
unique subid is generated and returned which is used for dumping.
|
||||
|
||||
Suggested-by: Andrei Vagin <avagin@gmail.com>
|
||||
Signed-off-by: Rajneesh Bhardwaj <rajneesh.bhardwaj@amd.com>
|
||||
---
|
||||
criu/file-ids.c | 10 ++++++++--
|
||||
1 file changed, 8 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/criu/file-ids.c b/criu/file-ids.c
|
||||
index 1b9d68888..772bd92cf 100644
|
||||
--- a/criu/file-ids.c
|
||||
+++ b/criu/file-ids.c
|
||||
@@ -77,8 +77,14 @@ int fd_id_generate_special(struct fd_parms *p, u32 *id)
|
||||
|
||||
fi = fd_id_cache_lookup(p);
|
||||
if (fi) {
|
||||
- *id = fi->id;
|
||||
- return 0;
|
||||
+ if (p->stat.st_mode & (S_IFCHR | S_IFBLK)) {
|
||||
+ /* Don't cache the id for mapped devices */
|
||||
+ *id = fd_tree.subid++;
|
||||
+ return 1;
|
||||
+ } else {
|
||||
+ *id = fi->id;
|
||||
+ return 0;
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,40 @@
|
||||
From de3a7112b8e44993e077ffe03e4e4aa38bd20325 Mon Sep 17 00:00:00 2001
|
||||
From: Bui Quang Minh <minhquangbui99@gmail.com>
|
||||
Date: Thu, 12 Aug 2021 11:05:09 +0000
|
||||
Subject: [PATCH 008/120] tcp: Skip restoring TCP state when dumping with
|
||||
--tcp-close
|
||||
|
||||
Since commit e42f5e0 ("tcp: allow to specify --tcp-close on dump"),
|
||||
--tcp-close option can be used when checkpointing. This option skips
|
||||
checkpointing established socket's state (including once established
|
||||
but now closed socket). However, when restoring, we still try to
|
||||
restore closed socket's state. As a result, a non-existent protobuf
|
||||
image is opened.
|
||||
|
||||
This commit skips TCP_CLOSE socket when restoring established TCP
|
||||
connection and removes the redundant check for TCP_LISTEN socket as
|
||||
TCP_LISTEN socket cannot reach this function.
|
||||
|
||||
Suggested-by: Andrei Vagin <avagin@gmail.com>
|
||||
Suggested-by: Radostin Stoyanov <radostin@redhat.com>
|
||||
Signed-off-by: Bui Quang Minh <minhquangbui99@gmail.com>
|
||||
---
|
||||
criu/sk-tcp.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/criu/sk-tcp.c b/criu/sk-tcp.c
|
||||
index 0afecd2d6..96d5d13bf 100644
|
||||
--- a/criu/sk-tcp.c
|
||||
+++ b/criu/sk-tcp.c
|
||||
@@ -451,7 +451,7 @@ int restore_one_tcp(int fd, struct inet_sk_info *ii)
|
||||
|
||||
pr_info("Restoring TCP connection\n");
|
||||
|
||||
- if (opts.tcp_close && ii->ie->state != TCP_LISTEN && ii->ie->state != TCP_CLOSE) {
|
||||
+ if (opts.tcp_close) {
|
||||
if (shutdown(fd, SHUT_RDWR) && errno != ENOTCONN) {
|
||||
pr_perror("Unable to shutdown the socket id %x ino %x", ii->ie->id, ii->ie->ino);
|
||||
}
|
||||
--
|
||||
2.34.1
|
||||
|
||||
110
0009-zdtm-Dumping-restoring-with-tcp-close-on-TCP_CLOSE-s.patch
Normal file
110
0009-zdtm-Dumping-restoring-with-tcp-close-on-TCP_CLOSE-s.patch
Normal file
@ -0,0 +1,110 @@
|
||||
From 40fc4f667fb614fef765489843aa038b61c31d2e Mon Sep 17 00:00:00 2001
|
||||
From: Bui Quang Minh <minhquangbui99@gmail.com>
|
||||
Date: Mon, 20 Sep 2021 20:57:03 +0700
|
||||
Subject: [PATCH 009/120] zdtm: Dumping/restoring with --tcp-close on TCP_CLOSE
|
||||
socket
|
||||
|
||||
Signed-off-by: Bui Quang Minh <minhquangbui99@gmail.com>
|
||||
---
|
||||
test/zdtm/static/Makefile | 1 +
|
||||
test/zdtm/static/socket-tcp-close2.c | 67 +++++++++++++++++++++++++
|
||||
test/zdtm/static/socket-tcp-close2.desc | 1 +
|
||||
3 files changed, 69 insertions(+)
|
||||
create mode 100644 test/zdtm/static/socket-tcp-close2.c
|
||||
create mode 100644 test/zdtm/static/socket-tcp-close2.desc
|
||||
|
||||
diff --git a/test/zdtm/static/Makefile b/test/zdtm/static/Makefile
|
||||
index c9e6589f0..b6aa621c7 100644
|
||||
--- a/test/zdtm/static/Makefile
|
||||
+++ b/test/zdtm/static/Makefile
|
||||
@@ -107,6 +107,7 @@ TST_NOFILE := \
|
||||
socket-tcp4v6-closed \
|
||||
socket-tcp-close0 \
|
||||
socket-tcp-close1 \
|
||||
+ socket-tcp-close2 \
|
||||
socket-dump-tcp-close \
|
||||
socket-tcp-unconn \
|
||||
socket-tcp6-unconn \
|
||||
diff --git a/test/zdtm/static/socket-tcp-close2.c b/test/zdtm/static/socket-tcp-close2.c
|
||||
new file mode 100644
|
||||
index 000000000..697c99f39
|
||||
--- /dev/null
|
||||
+++ b/test/zdtm/static/socket-tcp-close2.c
|
||||
@@ -0,0 +1,67 @@
|
||||
+#include <sys/types.h>
|
||||
+#include <sys/socket.h>
|
||||
+#include <netinet/tcp.h>
|
||||
+#include <netinet/in.h>
|
||||
+#include <linux/types.h>
|
||||
+#include <signal.h>
|
||||
+
|
||||
+#include "zdtmtst.h"
|
||||
+
|
||||
+const char *test_doc = "Check both dump and restore with tcp_close on TCP_CLOSE sockets";
|
||||
+const char *test_author = "Bui Quang Minh <minhquangbui99@gmail.com>";
|
||||
+
|
||||
+static int port = 8880;
|
||||
+
|
||||
+int main(int argc, char **argv)
|
||||
+{
|
||||
+ int fd_s, fd, client;
|
||||
+ char c;
|
||||
+
|
||||
+ test_init(argc, argv);
|
||||
+ signal(SIGPIPE, SIG_IGN);
|
||||
+
|
||||
+ fd_s = tcp_init_server(AF_INET, &port);
|
||||
+ if (fd_s < 0) {
|
||||
+ pr_err("Server initializations failed\n");
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
+ client = tcp_init_client(AF_INET, "localhost", port);
|
||||
+ if (client < 0) {
|
||||
+ pr_err("Client initializations failed\n");
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
+ fd = tcp_accept_server(fd_s);
|
||||
+ if (fd < 0) {
|
||||
+ pr_err("Can't accept client\n");
|
||||
+ return 1;
|
||||
+ }
|
||||
+ close(fd_s);
|
||||
+
|
||||
+ shutdown(client, SHUT_WR);
|
||||
+ shutdown(fd, SHUT_WR);
|
||||
+
|
||||
+ test_daemon();
|
||||
+ test_waitsig();
|
||||
+
|
||||
+ if (read(fd, &c, 1) != 0) {
|
||||
+ fail("read server");
|
||||
+ return 1;
|
||||
+ }
|
||||
+ if (read(client, &c, 1) != 0) {
|
||||
+ fail("read client");
|
||||
+ return 1;
|
||||
+ }
|
||||
+ if (write(client, &c, 1) != -1) {
|
||||
+ fail("write client");
|
||||
+ return 1;
|
||||
+ }
|
||||
+ if (write(fd, &c, 1) != -1) {
|
||||
+ fail("write server");
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
+ pass();
|
||||
+ return 0;
|
||||
+}
|
||||
diff --git a/test/zdtm/static/socket-tcp-close2.desc b/test/zdtm/static/socket-tcp-close2.desc
|
||||
new file mode 100644
|
||||
index 000000000..c53a1f315
|
||||
--- /dev/null
|
||||
+++ b/test/zdtm/static/socket-tcp-close2.desc
|
||||
@@ -0,0 +1 @@
|
||||
+{'opts': '--tcp-close', 'flags': 'reqrst '}
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,33 @@
|
||||
From 4eb1a3da7d65ae798db324153d693adef13ef6ed Mon Sep 17 00:00:00 2001
|
||||
From: Bui Quang Minh <minhquangbui99@gmail.com>
|
||||
Date: Mon, 4 Oct 2021 20:38:34 +0700
|
||||
Subject: [PATCH 010/120] criu(8): Add more detailed description about
|
||||
--tcp-close dump option
|
||||
|
||||
The expected behavior of --tcp-close option when dumpping is to close
|
||||
all established tcp connections including connection that is once
|
||||
established but now closed. This adds an explicit description about
|
||||
that behavior.
|
||||
|
||||
Signed-off-by: Bui Quang Minh <minhquangbui99@gmail.com>
|
||||
---
|
||||
Documentation/criu.txt | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/Documentation/criu.txt b/Documentation/criu.txt
|
||||
index 3c4c1eaf8..4c6885fc9 100644
|
||||
--- a/Documentation/criu.txt
|
||||
+++ b/Documentation/criu.txt
|
||||
@@ -334,7 +334,8 @@ mount -t cgroup -o devices,freezer none devices,freezer
|
||||
Checkpoint established TCP connections.
|
||||
|
||||
*--tcp-close*::
|
||||
- Don't dump the state of, or block, established tcp connections.
|
||||
+ Don't dump the state of, or block, established tcp connections
|
||||
+ (including the connection is once established but now closed).
|
||||
This is useful when tcp connections are not going to be restored.
|
||||
|
||||
*--skip-in-flight*::
|
||||
--
|
||||
2.34.1
|
||||
|
||||
311
0011-Add-support-for-python3-in-criu-coredump.patch
Normal file
311
0011-Add-support-for-python3-in-criu-coredump.patch
Normal file
@ -0,0 +1,311 @@
|
||||
From 96acfa9af099f17a14d985ac5e9ee9769d9ebe2c Mon Sep 17 00:00:00 2001
|
||||
From: Andrey Vyazovtsev <viazovtsev.av@phystech.edu>
|
||||
Date: Thu, 26 Aug 2021 22:22:33 +0300
|
||||
Subject: [PATCH 011/120] Add support for python3 in criu-coredump
|
||||
|
||||
Resolve the following python3 portability issues:
|
||||
|
||||
1) Python 3 needs explicit relative import path.
|
||||
|
||||
2) Coredumps are binary data, not unicode strings. Use byte strings
|
||||
(b"" instead of "") and open files in binary format.
|
||||
|
||||
3) Some functions (for example: filter) return a list in python 2,
|
||||
but an iterator in python 3. Port code to a common subset of python 2
|
||||
and python 3 using itertool.
|
||||
|
||||
4) Division operator / changed meaning in Python 3. Use explicit
|
||||
integer division (//) where appropriate.
|
||||
|
||||
Signed-off-by: Andrey Vyazovtsev <viazovtsev.av@phystech.edu>
|
||||
---
|
||||
coredump/criu-coredump | 4 +-
|
||||
coredump/criu_coredump/__init__.py | 4 +-
|
||||
coredump/criu_coredump/coredump.py | 68 ++++++++++++++++++------------
|
||||
coredump/criu_coredump/elf.py | 2 +-
|
||||
4 files changed, 45 insertions(+), 33 deletions(-)
|
||||
|
||||
diff --git a/coredump/criu-coredump b/coredump/criu-coredump
|
||||
index 25c188c6b..d3113d372 100755
|
||||
--- a/coredump/criu-coredump
|
||||
+++ b/coredump/criu-coredump
|
||||
@@ -1,4 +1,4 @@
|
||||
-#!/usr/bin/env python2
|
||||
+#!/usr/bin/env python
|
||||
import argparse
|
||||
import os
|
||||
|
||||
@@ -10,7 +10,7 @@ def coredump(opts):
|
||||
for pid in cores:
|
||||
if opts['pid'] and pid != opts['pid']:
|
||||
continue
|
||||
- with open(os.path.realpath(opts['out'])+"/core."+str(pid), 'w+') as f:
|
||||
+ with open(os.path.realpath(opts['out'])+"/core."+str(pid), 'wb+') as f:
|
||||
cores[pid].write(f)
|
||||
|
||||
|
||||
diff --git a/coredump/criu_coredump/__init__.py b/coredump/criu_coredump/__init__.py
|
||||
index 213af42ec..7f947518e 100644
|
||||
--- a/coredump/criu_coredump/__init__.py
|
||||
+++ b/coredump/criu_coredump/__init__.py
|
||||
@@ -1,2 +1,2 @@
|
||||
-from coredump import *
|
||||
-import elf
|
||||
+from .coredump import *
|
||||
+from . import elf
|
||||
diff --git a/coredump/criu_coredump/coredump.py b/coredump/criu_coredump/coredump.py
|
||||
index b37ef2291..d67c335c1 100644
|
||||
--- a/coredump/criu_coredump/coredump.py
|
||||
+++ b/coredump/criu_coredump/coredump.py
|
||||
@@ -29,9 +29,14 @@
|
||||
# 4) VMAs contents;
|
||||
#
|
||||
import io
|
||||
-import elf
|
||||
+import sys
|
||||
+from . import elf
|
||||
import ctypes
|
||||
from pycriu import images
|
||||
+try:
|
||||
+ from itertools import ifilter as filter
|
||||
+except ImportError:
|
||||
+ pass
|
||||
|
||||
# Some memory-related constants
|
||||
PAGESIZE = 4096
|
||||
@@ -88,7 +93,7 @@ class coredump:
|
||||
for note in self.notes:
|
||||
buf.write(note.nhdr)
|
||||
buf.write(note.owner)
|
||||
- buf.write("\0" * (8 - len(note.owner)))
|
||||
+ buf.write(b"\0" * (8 - len(note.owner)))
|
||||
buf.write(note.data)
|
||||
|
||||
offset = ctypes.sizeof(elf.Elf64_Ehdr())
|
||||
@@ -136,7 +141,7 @@ class coredump_generator:
|
||||
path += "-" + str(pid)
|
||||
path += ".img"
|
||||
|
||||
- with open(path) as f:
|
||||
+ with open(path, 'rb') as f:
|
||||
img = images.load(f)
|
||||
|
||||
if single:
|
||||
@@ -177,7 +182,7 @@ class coredump_generator:
|
||||
for p in self.coredumps:
|
||||
if pid and p != pid:
|
||||
continue
|
||||
- with open(coredumps_dir + "/" + "core." + str(p), 'w+') as f:
|
||||
+ with open(coredumps_dir + "/" + "core." + str(p), 'wb+') as f:
|
||||
self.coredumps[p].write(f)
|
||||
|
||||
def _gen_coredump(self, pid):
|
||||
@@ -295,7 +300,7 @@ class coredump_generator:
|
||||
prpsinfo.pr_state = 3
|
||||
# Don't even ask me why it is so, just borrowed from linux
|
||||
# source and made pr_state match.
|
||||
- prpsinfo.pr_sname = '.' if prpsinfo.pr_state > 5 else "RSDTZW" [
|
||||
+ prpsinfo.pr_sname = b'.' if prpsinfo.pr_state > 5 else b"RSDTZW" [
|
||||
prpsinfo.pr_state]
|
||||
prpsinfo.pr_zomb = 1 if prpsinfo.pr_state == 4 else 0
|
||||
prpsinfo.pr_nice = core["thread_core"][
|
||||
@@ -307,8 +312,12 @@ class coredump_generator:
|
||||
prpsinfo.pr_ppid = pstree["ppid"]
|
||||
prpsinfo.pr_pgrp = pstree["pgid"]
|
||||
prpsinfo.pr_sid = pstree["sid"]
|
||||
- prpsinfo.pr_fname = core["tc"]["comm"]
|
||||
prpsinfo.pr_psargs = self._gen_cmdline(pid)
|
||||
+ if (sys.version_info > (3, 0)):
|
||||
+ prpsinfo.pr_fname = core["tc"]["comm"].encode()
|
||||
+ else:
|
||||
+ prpsinfo.pr_fname = core["tc"]["comm"]
|
||||
+
|
||||
|
||||
nhdr = elf.Elf64_Nhdr()
|
||||
nhdr.n_namesz = 5
|
||||
@@ -317,7 +326,7 @@ class coredump_generator:
|
||||
|
||||
note = elf_note()
|
||||
note.data = prpsinfo
|
||||
- note.owner = "CORE"
|
||||
+ note.owner = b"CORE"
|
||||
note.nhdr = nhdr
|
||||
|
||||
return note
|
||||
@@ -375,7 +384,7 @@ class coredump_generator:
|
||||
|
||||
note = elf_note()
|
||||
note.data = prstatus
|
||||
- note.owner = "CORE"
|
||||
+ note.owner = b"CORE"
|
||||
note.nhdr = nhdr
|
||||
|
||||
return note
|
||||
@@ -411,7 +420,7 @@ class coredump_generator:
|
||||
|
||||
note = elf_note()
|
||||
note.data = fpregset
|
||||
- note.owner = "CORE"
|
||||
+ note.owner = b"CORE"
|
||||
note.nhdr = nhdr
|
||||
|
||||
return note
|
||||
@@ -452,7 +461,7 @@ class coredump_generator:
|
||||
|
||||
note = elf_note()
|
||||
note.data = data
|
||||
- note.owner = "LINUX"
|
||||
+ note.owner = b"LINUX"
|
||||
note.nhdr = nhdr
|
||||
|
||||
return note
|
||||
@@ -472,7 +481,7 @@ class coredump_generator:
|
||||
|
||||
note = elf_note()
|
||||
note.data = siginfo
|
||||
- note.owner = "CORE"
|
||||
+ note.owner = b"CORE"
|
||||
note.nhdr = nhdr
|
||||
|
||||
return note
|
||||
@@ -482,7 +491,7 @@ class coredump_generator:
|
||||
Generate NT_AUXV note for thread tid of process pid.
|
||||
"""
|
||||
mm = self.mms[pid]
|
||||
- num_auxv = len(mm["mm_saved_auxv"]) / 2
|
||||
+ num_auxv = len(mm["mm_saved_auxv"]) // 2
|
||||
|
||||
class elf_auxv(ctypes.Structure):
|
||||
_fields_ = [("auxv", elf.Elf64_auxv_t * num_auxv)]
|
||||
@@ -499,7 +508,7 @@ class coredump_generator:
|
||||
|
||||
note = elf_note()
|
||||
note.data = auxv
|
||||
- note.owner = "CORE"
|
||||
+ note.owner = b"CORE"
|
||||
note.nhdr = nhdr
|
||||
|
||||
return note
|
||||
@@ -523,10 +532,10 @@ class coredump_generator:
|
||||
continue
|
||||
|
||||
shmid = vma["shmid"]
|
||||
- off = vma["pgoff"] / PAGESIZE
|
||||
+ off = vma["pgoff"] // PAGESIZE
|
||||
|
||||
files = self.reg_files
|
||||
- fname = filter(lambda x: x["id"] == shmid, files)[0]["name"]
|
||||
+ fname = next(filter(lambda x: x["id"] == shmid, files))["name"]
|
||||
|
||||
info = mmaped_file_info()
|
||||
info.start = vma["start"]
|
||||
@@ -569,7 +578,10 @@ class coredump_generator:
|
||||
setattr(data, "start" + str(i), info.start)
|
||||
setattr(data, "end" + str(i), info.end)
|
||||
setattr(data, "file_ofs" + str(i), info.file_ofs)
|
||||
- setattr(data, "name" + str(i), info.name)
|
||||
+ if (sys.version_info > (3, 0)):
|
||||
+ setattr(data, "name" + str(i), info.name.encode())
|
||||
+ else:
|
||||
+ setattr(data, "name" + str(i), info.name)
|
||||
|
||||
nhdr = elf.Elf64_Nhdr()
|
||||
|
||||
@@ -579,7 +591,7 @@ class coredump_generator:
|
||||
|
||||
note = elf_note()
|
||||
note.nhdr = nhdr
|
||||
- note.owner = "CORE"
|
||||
+ note.owner = b"CORE"
|
||||
note.data = data
|
||||
|
||||
return note
|
||||
@@ -644,7 +656,7 @@ class coredump_generator:
|
||||
ppid = self.pstree[pid]["ppid"]
|
||||
return self._get_page(ppid, page_no)
|
||||
else:
|
||||
- with open(self._imgs_dir + "/pages-%s.img" % pages_id) as f:
|
||||
+ with open(self._imgs_dir + "/pages-%s.img" % pages_id, 'rb') as f:
|
||||
f.seek(off * PAGESIZE)
|
||||
return f.read(PAGESIZE)
|
||||
|
||||
@@ -657,16 +669,16 @@ class coredump_generator:
|
||||
f = None
|
||||
|
||||
if size == 0:
|
||||
- return ""
|
||||
+ return b""
|
||||
|
||||
if vma["status"] & status["VMA_AREA_VVAR"]:
|
||||
#FIXME this is what gdb does, as vvar vma
|
||||
# is not readable from userspace?
|
||||
- return "\0" * size
|
||||
+ return b"\0" * size
|
||||
elif vma["status"] & status["VMA_AREA_VSYSCALL"]:
|
||||
#FIXME need to dump it with criu or read from
|
||||
# current process.
|
||||
- return "\0" * size
|
||||
+ return b"\0" * size
|
||||
|
||||
if vma["status"] & status["VMA_FILE_SHARED"] or \
|
||||
vma["status"] & status["VMA_FILE_PRIVATE"]:
|
||||
@@ -675,9 +687,9 @@ class coredump_generator:
|
||||
off = vma["pgoff"]
|
||||
|
||||
files = self.reg_files
|
||||
- fname = filter(lambda x: x["id"] == shmid, files)[0]["name"]
|
||||
+ fname = next(filter(lambda x: x["id"] == shmid, files))["name"]
|
||||
|
||||
- f = open(fname)
|
||||
+ f = open(fname, 'rb')
|
||||
f.seek(off)
|
||||
|
||||
start = vma["start"]
|
||||
@@ -699,10 +711,10 @@ class coredump_generator:
|
||||
# a file, and changed ones -- from pages.img.
|
||||
# Finally, if no page is found neither in pages.img nor
|
||||
# in file, hole in inserted -- a page filled with zeroes.
|
||||
- start_page = start / PAGESIZE
|
||||
- end_page = end / PAGESIZE
|
||||
+ start_page = start // PAGESIZE
|
||||
+ end_page = end // PAGESIZE
|
||||
|
||||
- buf = ""
|
||||
+ buf = b""
|
||||
for page_no in range(start_page, end_page + 1):
|
||||
page = None
|
||||
|
||||
@@ -720,7 +732,7 @@ class coredump_generator:
|
||||
|
||||
if page is None:
|
||||
# Hole
|
||||
- page = PAGESIZE * "\0"
|
||||
+ page = PAGESIZE * b"\0"
|
||||
|
||||
# If it is a start or end page, we need to read
|
||||
# only part of it.
|
||||
@@ -762,7 +774,7 @@ class coredump_generator:
|
||||
chunk = self._gen_mem_chunk(pid, vma, size)
|
||||
|
||||
# Replace all '\0's with spaces.
|
||||
- return chunk.replace('\0', ' ')
|
||||
+ return chunk.replace(b'\0', b' ')
|
||||
|
||||
def _get_vma_dump_size(self, vma):
|
||||
"""
|
||||
diff --git a/coredump/criu_coredump/elf.py b/coredump/criu_coredump/elf.py
|
||||
index e65919e6b..a670ae866 100644
|
||||
--- a/coredump/criu_coredump/elf.py
|
||||
+++ b/coredump/criu_coredump/elf.py
|
||||
@@ -368,7 +368,7 @@ elf_fpregset_t = user_fpregs_struct
|
||||
# siginfo_t related constants.
|
||||
|
||||
_SI_MAX_SIZE = 128
|
||||
-_SI_PAD_SIZE = (_SI_MAX_SIZE / ctypes.sizeof(ctypes.c_int)) - 4
|
||||
+_SI_PAD_SIZE = (_SI_MAX_SIZE // ctypes.sizeof(ctypes.c_int)) - 4
|
||||
|
||||
|
||||
# /* kill(). */
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,71 @@
|
||||
From db79777cf017751ec54d2534966b237927f23a15 Mon Sep 17 00:00:00 2001
|
||||
From: AndreyVV-100 <viazovtsev.av@phystech.edu>
|
||||
Date: Fri, 23 Jul 2021 12:48:03 +0300
|
||||
Subject: [PATCH 012/120] Add new files for running criu-coredump via python 2
|
||||
or 3
|
||||
|
||||
Previous commit added support for python3 in criu-coredump. For convenience,
|
||||
add two files (coredump-python2 and coredump-python3) that start
|
||||
criu-coredump with respective python version. Edit env.sh accordingly.
|
||||
|
||||
Signed-off-by: Andrey Vyazovtsev <viazovtsev.av@phystech.edu>
|
||||
---
|
||||
coredump/coredump-python2 | 6 ++++++
|
||||
coredump/coredump-python3 | 6 ++++++
|
||||
coredump/{criu-coredump => coredump.py} | 1 -
|
||||
test/others/env.sh | 2 +-
|
||||
4 files changed, 13 insertions(+), 2 deletions(-)
|
||||
create mode 100755 coredump/coredump-python2
|
||||
create mode 100755 coredump/coredump-python3
|
||||
rename coredump/{criu-coredump => coredump.py} (97%)
|
||||
|
||||
diff --git a/coredump/coredump-python2 b/coredump/coredump-python2
|
||||
new file mode 100755
|
||||
index 000000000..3a15c90a3
|
||||
--- /dev/null
|
||||
+++ b/coredump/coredump-python2
|
||||
@@ -0,0 +1,6 @@
|
||||
+#!/usr/bin/env python2
|
||||
+
|
||||
+import coredump
|
||||
+
|
||||
+if __name__ == '__main__':
|
||||
+ coredump.main()
|
||||
diff --git a/coredump/coredump-python3 b/coredump/coredump-python3
|
||||
new file mode 100755
|
||||
index 000000000..82ec6b855
|
||||
--- /dev/null
|
||||
+++ b/coredump/coredump-python3
|
||||
@@ -0,0 +1,6 @@
|
||||
+#!/usr/bin/env python3
|
||||
+
|
||||
+import coredump
|
||||
+
|
||||
+if __name__ == '__main__':
|
||||
+ coredump.main()
|
||||
diff --git a/coredump/criu-coredump b/coredump/coredump.py
|
||||
similarity index 97%
|
||||
rename from coredump/criu-coredump
|
||||
rename to coredump/coredump.py
|
||||
index d3113d372..56ba54083 100755
|
||||
--- a/coredump/criu-coredump
|
||||
+++ b/coredump/coredump.py
|
||||
@@ -1,4 +1,3 @@
|
||||
-#!/usr/bin/env python
|
||||
import argparse
|
||||
import os
|
||||
|
||||
diff --git a/test/others/env.sh b/test/others/env.sh
|
||||
index b514e87d9..e2f63eee3 100755
|
||||
--- a/test/others/env.sh
|
||||
+++ b/test/others/env.sh
|
||||
@@ -13,5 +13,5 @@ fi
|
||||
#export PYTHON
|
||||
CRIT=$(readlink -f `dirname ${BASH_SOURCE[0]}`/../../crit/crit-"${PYTHON}")
|
||||
crit=$CRIT
|
||||
-CRIU_COREDUMP=$(readlink -f `dirname ${BASH_SOURCE[0]}`/../../criu-coredump/criu-coredump)
|
||||
+CRIU_COREDUMP=$(readlink -f `dirname ${BASH_SOURCE[0]}`/../../criu-coredump/coredump-"${PYTHON}")
|
||||
criu_coredump=$CRIU_COREDUMP
|
||||
--
|
||||
2.34.1
|
||||
|
||||
32
0013-coredump-remove-unused-import.patch
Normal file
32
0013-coredump-remove-unused-import.patch
Normal file
@ -0,0 +1,32 @@
|
||||
From e3f910ff3e9e3326e1df5e6d8e97dbbd8dc4af94 Mon Sep 17 00:00:00 2001
|
||||
From: Radostin Stoyanov <radostin@redhat.com>
|
||||
Date: Sun, 5 Sep 2021 21:31:12 +0100
|
||||
Subject: [PATCH 013/120] coredump: remove unused import
|
||||
|
||||
Signed-off-by: Radostin Stoyanov <radostin@redhat.com>
|
||||
---
|
||||
coredump/criu_coredump/__init__.py | 3 +--
|
||||
scripts/flake8.cfg | 2 ++
|
||||
2 files changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/coredump/criu_coredump/__init__.py b/coredump/criu_coredump/__init__.py
|
||||
index 7f947518e..c1a437cf4 100644
|
||||
--- a/coredump/criu_coredump/__init__.py
|
||||
+++ b/coredump/criu_coredump/__init__.py
|
||||
@@ -1,2 +1 @@
|
||||
-from .coredump import *
|
||||
-from . import elf
|
||||
+from .coredump import coredump_generator
|
||||
diff --git a/scripts/flake8.cfg b/scripts/flake8.cfg
|
||||
index b6a587729..bd4f95bb2 100644
|
||||
--- a/scripts/flake8.cfg
|
||||
+++ b/scripts/flake8.cfg
|
||||
@@ -2,3 +2,5 @@
|
||||
# E501 line too long
|
||||
# W504 line break after binary operator
|
||||
ignore = E501,W504
|
||||
+# F401: imported but unused
|
||||
+per-file-ignores = __init__.py:F401
|
||||
--
|
||||
2.34.1
|
||||
|
||||
31
0014-coredump-sort-imports.patch
Normal file
31
0014-coredump-sort-imports.patch
Normal file
@ -0,0 +1,31 @@
|
||||
From 8b69c69dbec5e6b2a84083e609c3de4e15661c90 Mon Sep 17 00:00:00 2001
|
||||
From: Radostin Stoyanov <radostin@redhat.com>
|
||||
Date: Sun, 5 Sep 2021 21:32:17 +0100
|
||||
Subject: [PATCH 014/120] coredump: sort imports
|
||||
|
||||
Signed-off-by: Radostin Stoyanov <radostin@redhat.com>
|
||||
---
|
||||
coredump/criu_coredump/coredump.py | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/coredump/criu_coredump/coredump.py b/coredump/criu_coredump/coredump.py
|
||||
index d67c335c1..9b4aad5ff 100644
|
||||
--- a/coredump/criu_coredump/coredump.py
|
||||
+++ b/coredump/criu_coredump/coredump.py
|
||||
@@ -30,9 +30,12 @@
|
||||
#
|
||||
import io
|
||||
import sys
|
||||
-from . import elf
|
||||
import ctypes
|
||||
+
|
||||
from pycriu import images
|
||||
+from . import elf
|
||||
+
|
||||
+
|
||||
try:
|
||||
from itertools import ifilter as filter
|
||||
except ImportError:
|
||||
--
|
||||
2.34.1
|
||||
|
||||
107
0015-coredump-convert-indentation-to-spaces.patch
Normal file
107
0015-coredump-convert-indentation-to-spaces.patch
Normal file
@ -0,0 +1,107 @@
|
||||
From f0f0d7fd59774e1a1a695a49e429239ba4a5a469 Mon Sep 17 00:00:00 2001
|
||||
From: Radostin Stoyanov <radostin@redhat.com>
|
||||
Date: Sun, 5 Sep 2021 21:34:00 +0100
|
||||
Subject: [PATCH 015/120] coredump: convert indentation to spaces
|
||||
|
||||
Signed-off-by: Radostin Stoyanov <radostin@redhat.com>
|
||||
---
|
||||
coredump/coredump-python2 | 2 +-
|
||||
coredump/coredump-python3 | 2 +-
|
||||
coredump/coredump.py | 58 ++++++++++++++++++++-------------------
|
||||
3 files changed, 32 insertions(+), 30 deletions(-)
|
||||
|
||||
diff --git a/coredump/coredump-python2 b/coredump/coredump-python2
|
||||
index 3a15c90a3..564c05ce9 100755
|
||||
--- a/coredump/coredump-python2
|
||||
+++ b/coredump/coredump-python2
|
||||
@@ -3,4 +3,4 @@
|
||||
import coredump
|
||||
|
||||
if __name__ == '__main__':
|
||||
- coredump.main()
|
||||
+ coredump.main()
|
||||
diff --git a/coredump/coredump-python3 b/coredump/coredump-python3
|
||||
index 82ec6b855..3032dbadf 100755
|
||||
--- a/coredump/coredump-python3
|
||||
+++ b/coredump/coredump-python3
|
||||
@@ -3,4 +3,4 @@
|
||||
import coredump
|
||||
|
||||
if __name__ == '__main__':
|
||||
- coredump.main()
|
||||
+ coredump.main()
|
||||
diff --git a/coredump/coredump.py b/coredump/coredump.py
|
||||
index 56ba54083..e63abf951 100755
|
||||
--- a/coredump/coredump.py
|
||||
+++ b/coredump/coredump.py
|
||||
@@ -3,37 +3,39 @@ import os
|
||||
|
||||
import criu_coredump
|
||||
|
||||
+
|
||||
def coredump(opts):
|
||||
- generator = criu_coredump.coredump_generator()
|
||||
- cores = generator(os.path.realpath(opts['in']))
|
||||
- for pid in cores:
|
||||
- if opts['pid'] and pid != opts['pid']:
|
||||
- continue
|
||||
- with open(os.path.realpath(opts['out'])+"/core."+str(pid), 'wb+') as f:
|
||||
- cores[pid].write(f)
|
||||
+ generator = criu_coredump.coredump_generator()
|
||||
+ cores = generator(os.path.realpath(opts['in']))
|
||||
+ for pid in cores:
|
||||
+ if opts['pid'] and pid != opts['pid']:
|
||||
+ continue
|
||||
+ with open(os.path.realpath(opts['out'])+"/core."+str(pid), 'wb+') as f:
|
||||
+ cores[pid].write(f)
|
||||
|
||||
|
||||
def main():
|
||||
- desc = 'CRIU core dump'
|
||||
- parser = argparse.ArgumentParser(description=desc,
|
||||
- formatter_class=argparse.RawTextHelpFormatter)
|
||||
-
|
||||
- parser.add_argument('-i',
|
||||
- '--in',
|
||||
- default = '.',
|
||||
- help = 'directory where to get images from')
|
||||
- parser.add_argument('-p',
|
||||
- '--pid',
|
||||
- type = int,
|
||||
- help = 'generate coredump for specific pid(all pids py default)')
|
||||
- parser.add_argument('-o',
|
||||
- '--out',
|
||||
- default = '.',
|
||||
- help = 'directory to write coredumps to')
|
||||
-
|
||||
- opts = vars(parser.parse_args())
|
||||
-
|
||||
- coredump(opts)
|
||||
+ desc = 'CRIU core dump'
|
||||
+ parser = argparse.ArgumentParser(description=desc,
|
||||
+ formatter_class=argparse.RawTextHelpFormatter)
|
||||
+
|
||||
+ parser.add_argument('-i',
|
||||
+ '--in',
|
||||
+ default='.',
|
||||
+ help='directory where to get images from')
|
||||
+ parser.add_argument('-p',
|
||||
+ '--pid',
|
||||
+ type=int,
|
||||
+ help='generate coredump for specific pid(all pids py default)')
|
||||
+ parser.add_argument('-o',
|
||||
+ '--out',
|
||||
+ default='.',
|
||||
+ help='directory to write coredumps to')
|
||||
+
|
||||
+ opts = vars(parser.parse_args())
|
||||
+
|
||||
+ coredump(opts)
|
||||
+
|
||||
|
||||
if __name__ == '__main__':
|
||||
- main()
|
||||
+ main()
|
||||
--
|
||||
2.34.1
|
||||
|
||||
117
0016-python-replace-equality-with-identity-test.patch
Normal file
117
0016-python-replace-equality-with-identity-test.patch
Normal file
@ -0,0 +1,117 @@
|
||||
From e108510070507deb370ef0c857eadc5a9e855a1c Mon Sep 17 00:00:00 2001
|
||||
From: Radostin Stoyanov <radostin@redhat.com>
|
||||
Date: Sun, 5 Sep 2021 21:36:10 +0100
|
||||
Subject: [PATCH 016/120] python: replace equality with identity test
|
||||
|
||||
PEP8 recommends for comparisons to singletons like None to always be
|
||||
done with 'is' or 'is not', never the equality operators.
|
||||
|
||||
https://python.org/dev/peps/pep-0008/#programming-recommendations
|
||||
|
||||
Signed-off-by: Radostin Stoyanov <radostin@redhat.com>
|
||||
---
|
||||
coredump/criu_coredump/coredump.py | 6 +++---
|
||||
test/exhaustive/pipe.py | 12 ++++++------
|
||||
test/exhaustive/unix.py | 2 +-
|
||||
3 files changed, 10 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/coredump/criu_coredump/coredump.py b/coredump/criu_coredump/coredump.py
|
||||
index 9b4aad5ff..a9a8bb27c 100644
|
||||
--- a/coredump/criu_coredump/coredump.py
|
||||
+++ b/coredump/criu_coredump/coredump.py
|
||||
@@ -725,10 +725,10 @@ class coredump_generator:
|
||||
# and choose appropriate.
|
||||
page_mem = self._get_page(pid, page_no)
|
||||
|
||||
- if f != None:
|
||||
+ if f is not None:
|
||||
page = f.read(PAGESIZE)
|
||||
|
||||
- if page_mem != None:
|
||||
+ if page_mem is not None:
|
||||
# Page from pages.img has higher priority
|
||||
# than one from maped file on disk.
|
||||
page = page_mem
|
||||
@@ -755,7 +755,7 @@ class coredump_generator:
|
||||
buf += page[n_skip:n_skip + n_read]
|
||||
|
||||
# Don't forget to close file.
|
||||
- if f != None:
|
||||
+ if f is not None:
|
||||
f.close()
|
||||
|
||||
return buf
|
||||
diff --git a/test/exhaustive/pipe.py b/test/exhaustive/pipe.py
|
||||
index fdadc480c..7f1c53d34 100755
|
||||
--- a/test/exhaustive/pipe.py
|
||||
+++ b/test/exhaustive/pipe.py
|
||||
@@ -75,7 +75,7 @@ def get_pipe_rw(pid, fd):
|
||||
|
||||
def check_pipe_y(pid, fd, rw, inos):
|
||||
ino = get_pipe_ino(pid, fd)
|
||||
- if ino == None:
|
||||
+ if ino is None:
|
||||
return 'missing '
|
||||
if not inos.has_key(fd):
|
||||
inos[fd] = ino
|
||||
@@ -89,7 +89,7 @@ def check_pipe_y(pid, fd, rw, inos):
|
||||
|
||||
def check_pipe_n(pid, fd):
|
||||
ino = get_pipe_ino(pid, fd)
|
||||
- if ino == None:
|
||||
+ if ino is None:
|
||||
return None
|
||||
else:
|
||||
return 'present '
|
||||
@@ -102,7 +102,7 @@ def check_pipe_end(kids, fd, comb, rw, inos):
|
||||
res = check_pipe_y(t_pid, fd, rw, inos)
|
||||
else:
|
||||
res = check_pipe_n(t_pid, fd)
|
||||
- if res != None:
|
||||
+ if res is not None:
|
||||
return res + 'kid(%d)' % t_nr
|
||||
t_nr += 1
|
||||
return None
|
||||
@@ -111,7 +111,7 @@ def check_pipe_end(kids, fd, comb, rw, inos):
|
||||
def check_pipe(kids, fds, comb, inos):
|
||||
for e in (0, 1): # 0 == R, 1 == W, see get_pipe_rw()
|
||||
res = check_pipe_end(kids, fds[e], comb[e], e, inos)
|
||||
- if res != None:
|
||||
+ if res is not None:
|
||||
return res + 'end(%d)' % e
|
||||
return None
|
||||
|
||||
@@ -124,7 +124,7 @@ def check_pipes(kids, pipes, comb):
|
||||
p_inos = {}
|
||||
for p_fds in pipes:
|
||||
res = check_pipe(kids, p_fds, comb[p_nr], p_inos)
|
||||
- if res != None:
|
||||
+ if res is not None:
|
||||
return res + 'pipe(%d)' % p_nr
|
||||
p_nr += 1
|
||||
|
||||
@@ -182,7 +182,7 @@ def make_comb(comb, opts, status_pipe):
|
||||
if v == '0':
|
||||
print('\tCheck pipes')
|
||||
res = check_pipes(kids, pipes, comb)
|
||||
- if res == None:
|
||||
+ if res is None:
|
||||
ex_code = 0
|
||||
else:
|
||||
print('\tFAIL %s' % res)
|
||||
diff --git a/test/exhaustive/unix.py b/test/exhaustive/unix.py
|
||||
index 98dbbb7b0..114bf957b 100755
|
||||
--- a/test/exhaustive/unix.py
|
||||
+++ b/test/exhaustive/unix.py
|
||||
@@ -304,7 +304,7 @@ class sock:
|
||||
for psk in st.sockets:
|
||||
if psk == self:
|
||||
continue
|
||||
- if psk.peer != None and psk.peer != self.sk_id:
|
||||
+ if psk.peer is not None and psk.peer != self.sk_id:
|
||||
# Peer by someone else, can do nothing
|
||||
continue
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
26
0017-coredump-drop-unused-variable.patch
Normal file
26
0017-coredump-drop-unused-variable.patch
Normal file
@ -0,0 +1,26 @@
|
||||
From 2f4e9c36f9686a101d6283b9c60e638175d6c817 Mon Sep 17 00:00:00 2001
|
||||
From: Radostin Stoyanov <radostin@redhat.com>
|
||||
Date: Sun, 5 Sep 2021 21:38:06 +0100
|
||||
Subject: [PATCH 017/120] coredump: drop unused variable
|
||||
|
||||
Signed-off-by: Radostin Stoyanov <radostin@redhat.com>
|
||||
---
|
||||
coredump/criu_coredump/coredump.py | 2 --
|
||||
1 file changed, 2 deletions(-)
|
||||
|
||||
diff --git a/coredump/criu_coredump/coredump.py b/coredump/criu_coredump/coredump.py
|
||||
index a9a8bb27c..42c2fed19 100644
|
||||
--- a/coredump/criu_coredump/coredump.py
|
||||
+++ b/coredump/criu_coredump/coredump.py
|
||||
@@ -834,8 +834,6 @@ class coredump_generator:
|
||||
|
||||
vmas = []
|
||||
for vma in mm["vmas"]:
|
||||
- size = self._get_vma_dump_size(vma)
|
||||
-
|
||||
v = vma_class()
|
||||
v.filesz = self._get_vma_dump_size(vma)
|
||||
v.data = self._gen_mem_chunk(pid, vma, v.filesz)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
20
0018-coredump-drop-exec-permission.patch
Normal file
20
0018-coredump-drop-exec-permission.patch
Normal file
@ -0,0 +1,20 @@
|
||||
From 7833c71147357c37203328da9668f384fa08bf47 Mon Sep 17 00:00:00 2001
|
||||
From: Radostin Stoyanov <radostin@redhat.com>
|
||||
Date: Sun, 5 Sep 2021 21:42:46 +0100
|
||||
Subject: [PATCH 018/120] coredump: drop exec permission
|
||||
|
||||
The shebang line in this file was removed in a previous commit and the
|
||||
file should be non-executable.
|
||||
|
||||
Signed-off-by: Radostin Stoyanov <radostin@redhat.com>
|
||||
---
|
||||
coredump/coredump.py | 0
|
||||
1 file changed, 0 insertions(+), 0 deletions(-)
|
||||
mode change 100755 => 100644 coredump/coredump.py
|
||||
|
||||
diff --git a/coredump/coredump.py b/coredump/coredump.py
|
||||
old mode 100755
|
||||
new mode 100644
|
||||
--
|
||||
2.34.1
|
||||
|
||||
1289
0019-coredump-lint-fix-for-block-comments.patch
Normal file
1289
0019-coredump-lint-fix-for-block-comments.patch
Normal file
File diff suppressed because it is too large
Load Diff
29
0020-coredump-fix-missing-whitespace-around-operator.patch
Normal file
29
0020-coredump-fix-missing-whitespace-around-operator.patch
Normal file
@ -0,0 +1,29 @@
|
||||
From 4abfd7ea70d7c1d8f1ee4b87dcff0e121823b523 Mon Sep 17 00:00:00 2001
|
||||
From: Radostin Stoyanov <radostin@redhat.com>
|
||||
Date: Sun, 5 Sep 2021 22:37:26 +0100
|
||||
Subject: [PATCH 020/120] coredump: fix missing whitespace around operator
|
||||
|
||||
Missing whitespace around arithmetic operator
|
||||
https://www.flake8rules.com/rules/E226.html
|
||||
|
||||
Signed-off-by: Radostin Stoyanov <radostin@redhat.com>
|
||||
---
|
||||
coredump/coredump.py | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/coredump/coredump.py b/coredump/coredump.py
|
||||
index e63abf951..5e63d2138 100644
|
||||
--- a/coredump/coredump.py
|
||||
+++ b/coredump/coredump.py
|
||||
@@ -10,7 +10,7 @@ def coredump(opts):
|
||||
for pid in cores:
|
||||
if opts['pid'] and pid != opts['pid']:
|
||||
continue
|
||||
- with open(os.path.realpath(opts['out'])+"/core."+str(pid), 'wb+') as f:
|
||||
+ with open(os.path.realpath(opts['out']) + "/core." + str(pid), 'wb+') as f:
|
||||
cores[pid].write(f)
|
||||
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
27
0021-coredump-fix-too-many-blank-lines.patch
Normal file
27
0021-coredump-fix-too-many-blank-lines.patch
Normal file
@ -0,0 +1,27 @@
|
||||
From c53231fe5e81412d27ada8bdd4a0dd78f19c3b21 Mon Sep 17 00:00:00 2001
|
||||
From: Radostin Stoyanov <radostin@redhat.com>
|
||||
Date: Sun, 5 Sep 2021 22:39:50 +0100
|
||||
Subject: [PATCH 021/120] coredump: fix too many blank lines
|
||||
|
||||
https://www.flake8rules.com/rules/E303.html
|
||||
|
||||
Signed-off-by: Radostin Stoyanov <radostin@redhat.com>
|
||||
---
|
||||
coredump/criu_coredump/coredump.py | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/coredump/criu_coredump/coredump.py b/coredump/criu_coredump/coredump.py
|
||||
index 274889800..a232132fd 100644
|
||||
--- a/coredump/criu_coredump/coredump.py
|
||||
+++ b/coredump/criu_coredump/coredump.py
|
||||
@@ -321,7 +321,6 @@ class coredump_generator:
|
||||
else:
|
||||
prpsinfo.pr_fname = core["tc"]["comm"]
|
||||
|
||||
-
|
||||
nhdr = elf.Elf64_Nhdr()
|
||||
nhdr.n_namesz = 5
|
||||
nhdr.n_descsz = ctypes.sizeof(elf.elf_prpsinfo())
|
||||
--
|
||||
2.34.1
|
||||
|
||||
29
0022-coredump-fix-comparison-to-true.patch
Normal file
29
0022-coredump-fix-comparison-to-true.patch
Normal file
@ -0,0 +1,29 @@
|
||||
From 718d0039623a7371130cdb568b39ee9f968d31c4 Mon Sep 17 00:00:00 2001
|
||||
From: Radostin Stoyanov <radostin@redhat.com>
|
||||
Date: Sun, 5 Sep 2021 22:42:19 +0100
|
||||
Subject: [PATCH 022/120] coredump: fix comparison to true
|
||||
|
||||
Comparison to true should be 'if cond is true:' or 'if cond:'
|
||||
https://www.flake8rules.com/rules/E712.html
|
||||
|
||||
Signed-off-by: Radostin Stoyanov <radostin@redhat.com>
|
||||
---
|
||||
coredump/criu_coredump/coredump.py | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/coredump/criu_coredump/coredump.py b/coredump/criu_coredump/coredump.py
|
||||
index a232132fd..41d102db7 100644
|
||||
--- a/coredump/criu_coredump/coredump.py
|
||||
+++ b/coredump/criu_coredump/coredump.py
|
||||
@@ -653,7 +653,7 @@ class coredump_generator:
|
||||
if not found:
|
||||
continue
|
||||
|
||||
- if "in_parent" in m and m["in_parent"] == True:
|
||||
+ if "in_parent" in m and m["in_parent"]:
|
||||
ppid = self.pstree[pid]["ppid"]
|
||||
return self._get_page(ppid, page_no)
|
||||
else:
|
||||
--
|
||||
2.34.1
|
||||
|
||||
52
0023-coredump-lint-fix-visually-indented-line.patch
Normal file
52
0023-coredump-lint-fix-visually-indented-line.patch
Normal file
@ -0,0 +1,52 @@
|
||||
From bf85f98b0cbdab968d539dbc7c363b596eb0e95e Mon Sep 17 00:00:00 2001
|
||||
From: Radostin Stoyanov <radostin@redhat.com>
|
||||
Date: Sun, 5 Sep 2021 22:47:59 +0100
|
||||
Subject: [PATCH 023/120] coredump: lint fix visually indented line
|
||||
|
||||
Continuation line over-indented for visual indent
|
||||
https://www.flake8rules.com/rules/E127.html
|
||||
|
||||
Visually indented line with same indent as next logical line
|
||||
https://www.flake8rules.com/rules/E129.html
|
||||
|
||||
Signed-off-by: Radostin Stoyanov <radostin@redhat.com>
|
||||
---
|
||||
coredump/criu_coredump/coredump.py | 18 +++++++++---------
|
||||
1 file changed, 9 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/coredump/criu_coredump/coredump.py b/coredump/criu_coredump/coredump.py
|
||||
index 41d102db7..881c40b0a 100644
|
||||
--- a/coredump/criu_coredump/coredump.py
|
||||
+++ b/coredump/criu_coredump/coredump.py
|
||||
@@ -781,19 +781,19 @@ class coredump_generator:
|
||||
"""
|
||||
Calculate amount of vma to put into core dump.
|
||||
"""
|
||||
- if vma["status"] & status["VMA_AREA_VVAR"] or \
|
||||
- vma["status"] & status["VMA_AREA_VSYSCALL"] or \
|
||||
- vma["status"] & status["VMA_AREA_VDSO"]:
|
||||
+ if (vma["status"] & status["VMA_AREA_VVAR"] or
|
||||
+ vma["status"] & status["VMA_AREA_VSYSCALL"] or
|
||||
+ vma["status"] & status["VMA_AREA_VDSO"]):
|
||||
size = vma["end"] - vma["start"]
|
||||
elif vma["prot"] == 0:
|
||||
size = 0
|
||||
- elif vma["prot"] & prot["PROT_READ"] and \
|
||||
- vma["prot"] & prot["PROT_EXEC"]:
|
||||
+ elif (vma["prot"] & prot["PROT_READ"] and
|
||||
+ vma["prot"] & prot["PROT_EXEC"]):
|
||||
size = PAGESIZE
|
||||
- elif vma["status"] & status["VMA_ANON_SHARED"] or \
|
||||
- vma["status"] & status["VMA_FILE_SHARED"] or \
|
||||
- vma["status"] & status["VMA_ANON_PRIVATE"] or \
|
||||
- vma["status"] & status["VMA_FILE_PRIVATE"]:
|
||||
+ elif (vma["status"] & status["VMA_ANON_SHARED"] or
|
||||
+ vma["status"] & status["VMA_FILE_SHARED"] or
|
||||
+ vma["status"] & status["VMA_ANON_PRIVATE"] or
|
||||
+ vma["status"] & status["VMA_FILE_PRIVATE"]):
|
||||
size = vma["end"] - vma["start"]
|
||||
else:
|
||||
size = 0
|
||||
--
|
||||
2.34.1
|
||||
|
||||
51
0024-test-coredump-fix-shellcheck-errors.patch
Normal file
51
0024-test-coredump-fix-shellcheck-errors.patch
Normal file
@ -0,0 +1,51 @@
|
||||
From e56c944db74f9c3b033274271f7a82fef6fed815 Mon Sep 17 00:00:00 2001
|
||||
From: Radostin Stoyanov <radostin@redhat.com>
|
||||
Date: Mon, 6 Sep 2021 00:20:58 +0100
|
||||
Subject: [PATCH 024/120] test/coredump: fix shellcheck errors
|
||||
|
||||
ShellCheck reports the following problems:
|
||||
|
||||
SC2086: Double quote to prevent globbing and word splitting.
|
||||
SC2035: Use ./*glob* or -- *glob* so names with dashes won't become options.
|
||||
SC1091: Not following: ../env.sh was not specified as input (see shellcheck -x).
|
||||
|
||||
Signed-off-by: Radostin Stoyanov <radostin@redhat.com>
|
||||
---
|
||||
test/others/criu-coredump/test.sh | 10 +++++++---
|
||||
1 file changed, 7 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/test/others/criu-coredump/test.sh b/test/others/criu-coredump/test.sh
|
||||
index 62d9f7edc..dd774e298 100755
|
||||
--- a/test/others/criu-coredump/test.sh
|
||||
+++ b/test/others/criu-coredump/test.sh
|
||||
@@ -1,4 +1,8 @@
|
||||
-source ../env.sh
|
||||
+#!/bin/bash
|
||||
+
|
||||
+set -x
|
||||
+# shellcheck disable=SC1091
|
||||
+source ../env.sh || exit 1
|
||||
|
||||
function gen_imgs {
|
||||
PID=$(../loop)
|
||||
@@ -9,7 +13,7 @@ function gen_imgs {
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- images_list=$(ls -1 *.img)
|
||||
+ images_list=$(ls -1 ./*.img)
|
||||
if [ -z "$images_list" ]; then
|
||||
echo "Failed to generate images"
|
||||
exit 1
|
||||
@@ -32,7 +36,7 @@ function run_test {
|
||||
for x in $cores
|
||||
do
|
||||
echo "=== try readelf $x"
|
||||
- readelf -a $x || exit $?
|
||||
+ readelf -a "$x" || exit $?
|
||||
echo "=== done"
|
||||
done
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
31
0025-make-enable-lint-for-coredump.patch
Normal file
31
0025-make-enable-lint-for-coredump.patch
Normal file
@ -0,0 +1,31 @@
|
||||
From ff7eea013205a1055b6f0e2300db46f6768c6d28 Mon Sep 17 00:00:00 2001
|
||||
From: Radostin Stoyanov <radostin@redhat.com>
|
||||
Date: Sun, 5 Sep 2021 22:55:24 +0100
|
||||
Subject: [PATCH 025/120] make: enable lint for coredump
|
||||
|
||||
Signed-off-by: Radostin Stoyanov <radostin@redhat.com>
|
||||
---
|
||||
Makefile | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
index e361e8a8f..73b647d6d 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -427,11 +427,13 @@ lint:
|
||||
flake8 --config=scripts/flake8.cfg test/others/rpc/config_file.py
|
||||
flake8 --config=scripts/flake8.cfg lib/py/images/pb2dict.py
|
||||
flake8 --config=scripts/flake8.cfg scripts/criu-ns
|
||||
+ flake8 --config=scripts/flake8.cfg coredump/
|
||||
shellcheck --version
|
||||
shellcheck scripts/*.sh
|
||||
shellcheck scripts/ci/*.sh scripts/ci/apt-install
|
||||
shellcheck test/others/crit/*.sh
|
||||
shellcheck test/others/libcriu/*.sh
|
||||
+ shellcheck test/others/crit/*.sh test/others/criu-coredump/*.sh
|
||||
shellcheck test/others/config-file/*.sh
|
||||
# Do not append \n to pr_perror or fail
|
||||
! git --no-pager grep -E '^\s*\<(pr_perror|fail)\>.*\\n"'
|
||||
--
|
||||
2.34.1
|
||||
|
||||
39
0026-ci-enable-coredump-tests.patch
Normal file
39
0026-ci-enable-coredump-tests.patch
Normal file
@ -0,0 +1,39 @@
|
||||
From 4a67277e8f67e988aa14106cb69a14d8e3e65815 Mon Sep 17 00:00:00 2001
|
||||
From: Radostin Stoyanov <radostin@redhat.com>
|
||||
Date: Sun, 5 Sep 2021 23:06:56 +0100
|
||||
Subject: [PATCH 026/120] ci: enable coredump tests
|
||||
|
||||
Signed-off-by: Radostin Stoyanov <radostin@redhat.com>
|
||||
---
|
||||
scripts/ci/run-ci-tests.sh | 3 +++
|
||||
test/others/env.sh | 2 +-
|
||||
2 files changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/scripts/ci/run-ci-tests.sh b/scripts/ci/run-ci-tests.sh
|
||||
index 7c66e6802..51aa7db9e 100755
|
||||
--- a/scripts/ci/run-ci-tests.sh
|
||||
+++ b/scripts/ci/run-ci-tests.sh
|
||||
@@ -259,6 +259,9 @@ ip net add test
|
||||
# more crit testing
|
||||
make -C test/others/crit run
|
||||
|
||||
+# coredump testing
|
||||
+make -C test/others/criu-coredump run
|
||||
+
|
||||
# libcriu testing
|
||||
make -C test/others/libcriu run
|
||||
|
||||
diff --git a/test/others/env.sh b/test/others/env.sh
|
||||
index e2f63eee3..45066f760 100755
|
||||
--- a/test/others/env.sh
|
||||
+++ b/test/others/env.sh
|
||||
@@ -13,5 +13,5 @@ fi
|
||||
#export PYTHON
|
||||
CRIT=$(readlink -f `dirname ${BASH_SOURCE[0]}`/../../crit/crit-"${PYTHON}")
|
||||
crit=$CRIT
|
||||
-CRIU_COREDUMP=$(readlink -f `dirname ${BASH_SOURCE[0]}`/../../criu-coredump/coredump-"${PYTHON}")
|
||||
+CRIU_COREDUMP=$(readlink -f `dirname ${BASH_SOURCE[0]}`/../../coredump/coredump-"${PYTHON}")
|
||||
criu_coredump=$CRIU_COREDUMP
|
||||
--
|
||||
2.34.1
|
||||
|
||||
39
0027-pie-restorer-remove-excess-hash-printf-specifier.patch
Normal file
39
0027-pie-restorer-remove-excess-hash-printf-specifier.patch
Normal file
@ -0,0 +1,39 @@
|
||||
From 8ee0ce3b87d8be2a294881e47e076e8095ea834b Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Thu, 21 Oct 2021 11:47:01 +0300
|
||||
Subject: [PATCH 027/120] pie/restorer: remove excess hash printf specifier
|
||||
|
||||
We use here "%#x" printf specifier in pie code, but sbuf_printf core pie
|
||||
printing function knows nothing about '#' specifier. More over simple
|
||||
"%x" in pie does same as "%#x" in stdio printf, see print_hex* functions
|
||||
add "0x" before hex numbers.
|
||||
|
||||
We've got this error on vzt-cpt runs in Virtuozzo:
|
||||
|
||||
(04.750271) pie: 158: Adjust id
|
||||
Error: Unknown printf format %#
|
||||
|
||||
So to fix it we can just remove '#'.
|
||||
|
||||
Fixes: ecd432fe2 ("timerfd: Implement c/r procedure")
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
criu/pie/restorer.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/criu/pie/restorer.c b/criu/pie/restorer.c
|
||||
index 4304691bb..0051452e4 100644
|
||||
--- a/criu/pie/restorer.c
|
||||
+++ b/criu/pie/restorer.c
|
||||
@@ -1013,7 +1013,7 @@ static int timerfd_arm(struct task_restore_args *args)
|
||||
|
||||
t->val.it_value.tv_sec += (time_t)ts.tv_sec;
|
||||
|
||||
- pr_debug("Adjust id %#x it_value(%llu, %llu) -> it_value(%llu, %llu)\n", t->id,
|
||||
+ pr_debug("Adjust id %x it_value(%llu, %llu) -> it_value(%llu, %llu)\n", t->id,
|
||||
(unsigned long long)ts.tv_sec, (unsigned long long)ts.tv_nsec,
|
||||
(unsigned long long)t->val.it_value.tv_sec,
|
||||
(unsigned long long)t->val.it_value.tv_nsec);
|
||||
--
|
||||
2.34.1
|
||||
|
||||
34
0028-tty-fix-the-null-pointer-of-get_tty_driver.patch
Normal file
34
0028-tty-fix-the-null-pointer-of-get_tty_driver.patch
Normal file
@ -0,0 +1,34 @@
|
||||
From 79c194313f14a5a902764ec653a611616125c256 Mon Sep 17 00:00:00 2001
|
||||
From: "fu.lin" <fulin10@huawei.com>
|
||||
Date: Fri, 17 Sep 2021 17:16:48 +0800
|
||||
Subject: [PATCH 028/120] tty: fix the null pointer of get_tty_driver
|
||||
|
||||
v2: split error checking from index variable initialization
|
||||
v3: use PRIx64 for printing dev_t
|
||||
|
||||
Signed-off-by: fu.lin <fulin10@huawei.com>
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
criu/tty.c | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/criu/tty.c b/criu/tty.c
|
||||
index 1598ad956..1462193c5 100644
|
||||
--- a/criu/tty.c
|
||||
+++ b/criu/tty.c
|
||||
@@ -1977,6 +1977,12 @@ static int dump_one_tty(int lfd, u32 id, const struct fd_parms *p)
|
||||
pr_info("Dumping tty %d with id %#x\n", lfd, id);
|
||||
|
||||
driver = get_tty_driver(p->stat.st_rdev, p->stat.st_dev);
|
||||
+ if (driver == NULL) {
|
||||
+ pr_err("Unable to find a tty driver (rdev %#" PRIx64 " dev %#" PRIx64 ")\n", p->stat.st_rdev,
|
||||
+ p->stat.st_dev);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
if (driver->fd_get_index)
|
||||
index = driver->fd_get_index(lfd, p);
|
||||
else
|
||||
--
|
||||
2.34.1
|
||||
|
||||
126
0029-util-use-nftw-in-rmrf-helper.patch
Normal file
126
0029-util-use-nftw-in-rmrf-helper.patch
Normal file
@ -0,0 +1,126 @@
|
||||
From 6dadc8bf0c996385531af6729361751b47b8926b Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Fri, 22 Oct 2021 17:56:37 +0300
|
||||
Subject: [PATCH 029/120] util: use nftw in rmrf helper
|
||||
|
||||
This simplifies the code by removing excess recursion and reusing
|
||||
standard function to walk over file-tree instead of opencoding it.
|
||||
|
||||
This addresses problem mentioned in my review comment:
|
||||
https://github.com/checkpoint-restore/criu/pull/1495#discussion_r677554523
|
||||
|
||||
Fixes: 0db135ac4 ("util: add rm -rf function")
|
||||
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
criu/apparmor.c | 2 +-
|
||||
criu/include/util.h | 4 ++--
|
||||
criu/util.c | 46 ++++++++++++++-------------------------------
|
||||
3 files changed, 17 insertions(+), 35 deletions(-)
|
||||
|
||||
diff --git a/criu/apparmor.c b/criu/apparmor.c
|
||||
index 328fc606b..f9ad79619 100644
|
||||
--- a/criu/apparmor.c
|
||||
+++ b/criu/apparmor.c
|
||||
@@ -630,7 +630,7 @@ int suspend_aa(void)
|
||||
}
|
||||
|
||||
ret = do_suspend(true);
|
||||
- if (rm_rf(policydir) < 0)
|
||||
+ if (rmrf(policydir) < 0)
|
||||
pr_err("failed removing policy dir %s\n", policydir);
|
||||
|
||||
return ret;
|
||||
diff --git a/criu/include/util.h b/criu/include/util.h
|
||||
index a2dac2233..19d378fc5 100644
|
||||
--- a/criu/include/util.h
|
||||
+++ b/criu/include/util.h
|
||||
@@ -284,8 +284,8 @@ int setup_tcp_server(char *type, char *addr, unsigned short *port);
|
||||
int run_tcp_server(bool daemon_mode, int *ask, int cfd, int sk);
|
||||
int setup_tcp_client(char *hostname);
|
||||
|
||||
-/* *dir should be writable and at least PATH_MAX long */
|
||||
-int rm_rf(char *dir);
|
||||
+/* path should be writable and no more than PATH_MAX long */
|
||||
+int rmrf(char *path);
|
||||
|
||||
#define LAST_PID_PATH "sys/kernel/ns_last_pid"
|
||||
#define PID_MAX_PATH "sys/kernel/pid_max"
|
||||
diff --git a/criu/util.c b/criu/util.c
|
||||
index 06124c220..414879971 100644
|
||||
--- a/criu/util.c
|
||||
+++ b/criu/util.c
|
||||
@@ -1,4 +1,4 @@
|
||||
-#define _XOPEN_SOURCE
|
||||
+#define _XOPEN_SOURCE 500
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
@@ -26,6 +26,7 @@
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <sched.h>
|
||||
+#include <ftw.h>
|
||||
|
||||
#include "linux/mount.h"
|
||||
|
||||
@@ -1613,44 +1614,25 @@ ssize_t write_all(int fd, const void *buf, size_t size)
|
||||
return n;
|
||||
}
|
||||
|
||||
-int rm_rf(char *target)
|
||||
+static int remove_one(const char *fpath, const struct stat *sb, int tflag, struct FTW *ftwbuf)
|
||||
{
|
||||
- int offset = strlen(target);
|
||||
- DIR *dir = NULL;
|
||||
- struct dirent *de;
|
||||
- int ret = -1;
|
||||
+ int ret;
|
||||
|
||||
- dir = opendir(target);
|
||||
- if (!dir) {
|
||||
- pr_perror("unable to open %s", target);
|
||||
+ ret = remove(fpath);
|
||||
+ if (ret) {
|
||||
+ pr_perror("rmrf: unable to remove %s", fpath);
|
||||
return -1;
|
||||
}
|
||||
|
||||
- while ((de = readdir(dir))) {
|
||||
- int n;
|
||||
-
|
||||
- if (dir_dots(de))
|
||||
- continue;
|
||||
-
|
||||
- n = snprintf(target + offset, PATH_MAX - offset, "/%s", de->d_name);
|
||||
- if (n < 0 || n >= PATH_MAX) {
|
||||
- pr_err("snprintf failed\n");
|
||||
- goto out;
|
||||
- }
|
||||
-
|
||||
- if (de->d_type == DT_DIR && rm_rf(target))
|
||||
- goto out;
|
||||
+ return 0;
|
||||
+}
|
||||
|
||||
- if (remove(target) < 0) {
|
||||
- pr_perror("unable to remove %s", target);
|
||||
- goto out;
|
||||
- }
|
||||
- }
|
||||
+#define NFTW_FD_MAX 64
|
||||
|
||||
- ret = 0;
|
||||
-out:
|
||||
- target[offset] = 0;
|
||||
- return ret;
|
||||
+int rmrf(char *path)
|
||||
+{
|
||||
+ pr_debug("rmrf: removing %s\n", path);
|
||||
+ return nftw(path, remove_one, NFTW_FD_MAX, FTW_DEPTH | FTW_PHYS);
|
||||
}
|
||||
|
||||
__attribute__((returns_twice)) static pid_t raw_legacy_clone(unsigned long flags, int *pidfd)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
37
0030-criu-ns-make-pidns-init-first-do-setsid.patch
Normal file
37
0030-criu-ns-make-pidns-init-first-do-setsid.patch
Normal file
@ -0,0 +1,37 @@
|
||||
From d6d76e07bb7f4532bb49c1fce99f3fef7fcd87c6 Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Mon, 18 Oct 2021 18:43:14 +0300
|
||||
Subject: [PATCH 030/120] criu-ns: make pidns init first do setsid
|
||||
|
||||
We see that on criu-ns dump/restore/dump of the process which initially
|
||||
was not a session leader (with --shell-job option) we see sid == 0 for
|
||||
it and fail with something like:
|
||||
|
||||
Error (criu/cr-dump.c:1333): A session leader of 41585(41585) is outside of its pid namespace
|
||||
|
||||
Note: We should not dump processes with sid 0 (even with --shell-job) as
|
||||
on restore we can can put such processes from multiple sessions into
|
||||
one, which is wrong.
|
||||
|
||||
Fixes: #232
|
||||
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
scripts/criu-ns | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/scripts/criu-ns b/scripts/criu-ns
|
||||
index d76db3606..72c0753e5 100755
|
||||
--- a/scripts/criu-ns
|
||||
+++ b/scripts/criu-ns
|
||||
@@ -102,6 +102,7 @@ def wrap_restore():
|
||||
|
||||
criu_pid = os.fork()
|
||||
if criu_pid == 0:
|
||||
+ os.setsid()
|
||||
_mount_new_proc()
|
||||
run_criu(restore_args)
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
113
0031-net-optimize-restore_rule-to-not-open-the-CR_FD_RULE.patch
Normal file
113
0031-net-optimize-restore_rule-to-not-open-the-CR_FD_RULE.patch
Normal file
@ -0,0 +1,113 @@
|
||||
From 62090e89b553a022bf564e76840dc67ea786ec65 Mon Sep 17 00:00:00 2001
|
||||
From: Nicolas Viennot <Nicolas.Viennot@twosigma.com>
|
||||
Date: Thu, 28 Oct 2021 21:05:57 +0000
|
||||
Subject: [PATCH 031/120] net: optimize restore_rule() to not open the
|
||||
CR_FD_RULE image file twice
|
||||
|
||||
Previously, `open_image(CR_FD_RULE, O_RSTR, pid)` was called twice.
|
||||
Opening an image file twice is not allowed when streaming the image.
|
||||
This commit optimizes the code to only open the image file once.
|
||||
|
||||
Also improved the error path in restore_ip_dump().
|
||||
|
||||
Signed-off-by: Nicolas Viennot <Nicolas.Viennot@twosigma.com>
|
||||
---
|
||||
criu/net.c | 51 ++++++++++++++++++---------------------------------
|
||||
1 file changed, 18 insertions(+), 33 deletions(-)
|
||||
|
||||
diff --git a/criu/net.c b/criu/net.c
|
||||
index 7b45f0633..02115c4de 100644
|
||||
--- a/criu/net.c
|
||||
+++ b/criu/net.c
|
||||
@@ -2250,12 +2250,12 @@ static int restore_ip_dump(int type, int pid, char *cmd)
|
||||
sockfd = img_raw_fd(img);
|
||||
if (sockfd < 0) {
|
||||
pr_err("Getting raw FD failed\n");
|
||||
- return -1;
|
||||
+ goto out_image;
|
||||
}
|
||||
tmp_file = tmpfile();
|
||||
if (!tmp_file) {
|
||||
pr_perror("Failed to open tmpfile");
|
||||
- return -1;
|
||||
+ goto out_image;
|
||||
}
|
||||
|
||||
while ((n = read(sockfd, buf, 1024)) > 0) {
|
||||
@@ -2264,25 +2264,34 @@ static int restore_ip_dump(int type, int pid, char *cmd)
|
||||
pr_perror("Failed to write to tmpfile "
|
||||
"[written: %d; total: %d]",
|
||||
written, n);
|
||||
- goto close;
|
||||
+ goto out_tmp_file;
|
||||
}
|
||||
}
|
||||
|
||||
if (fseek(tmp_file, 0, SEEK_SET)) {
|
||||
pr_perror("Failed to set file position to beginning of tmpfile");
|
||||
- goto close;
|
||||
+ goto out_tmp_file;
|
||||
}
|
||||
|
||||
- if (img) {
|
||||
- ret = run_ip_tool(cmd, "restore", NULL, NULL, fileno(tmp_file), -1, 0);
|
||||
- close_image(img);
|
||||
+ if (type == CR_FD_RULE) {
|
||||
+ /*
|
||||
+ * Delete 3 default rules to prevent duplicates. See kernel's
|
||||
+ * function fib_default_rules_init() for the details.
|
||||
+ */
|
||||
+ run_ip_tool("rule", "flush", NULL, NULL, -1, -1, 0);
|
||||
+ run_ip_tool("rule", "delete", "table", "local", -1, -1, 0);
|
||||
}
|
||||
|
||||
-close:
|
||||
+ ret = run_ip_tool(cmd, "restore", NULL, NULL, fileno(tmp_file), -1, 0);
|
||||
+
|
||||
+out_tmp_file:
|
||||
if (fclose(tmp_file)) {
|
||||
pr_perror("Failed to close tmpfile");
|
||||
}
|
||||
|
||||
+out_image:
|
||||
+ close_image(img);
|
||||
+
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -2304,31 +2313,7 @@ static inline int restore_route(int pid)
|
||||
|
||||
static inline int restore_rule(int pid)
|
||||
{
|
||||
- struct cr_img *img;
|
||||
- int ret = 0;
|
||||
-
|
||||
- img = open_image(CR_FD_RULE, O_RSTR, pid);
|
||||
- if (!img) {
|
||||
- ret = -1;
|
||||
- goto out;
|
||||
- }
|
||||
-
|
||||
- if (empty_image(img))
|
||||
- goto close;
|
||||
-
|
||||
- /*
|
||||
- * Delete 3 default rules to prevent duplicates. See kernel's
|
||||
- * function fib_default_rules_init() for the details.
|
||||
- */
|
||||
- run_ip_tool("rule", "flush", NULL, NULL, -1, -1, 0);
|
||||
- run_ip_tool("rule", "delete", "table", "local", -1, -1, 0);
|
||||
-
|
||||
- if (restore_ip_dump(CR_FD_RULE, pid, "rule"))
|
||||
- ret = -1;
|
||||
-close:
|
||||
- close_image(img);
|
||||
-out:
|
||||
- return ret;
|
||||
+ return restore_ip_dump(CR_FD_RULE, pid, "rule");
|
||||
}
|
||||
|
||||
/*
|
||||
--
|
||||
2.34.1
|
||||
|
||||
45
0032-ci-replace-deprecated-codecov-bash-uploader.patch
Normal file
45
0032-ci-replace-deprecated-codecov-bash-uploader.patch
Normal file
@ -0,0 +1,45 @@
|
||||
From e11c742e018aeaf60f0e3abef33c557b4799fb9a Mon Sep 17 00:00:00 2001
|
||||
From: Adrian Reber <areber@redhat.com>
|
||||
Date: Wed, 27 Oct 2021 07:27:22 +0000
|
||||
Subject: [PATCH 032/120] ci: replace deprecated codecov bash uploader
|
||||
|
||||
Replace deprecated codecov bash uploader with new version:
|
||||
|
||||
https://about.codecov.io/blog/introducing-codecovs-new-uploader/
|
||||
|
||||
Signed-off-by: Adrian Reber <areber@redhat.com>
|
||||
---
|
||||
.github/workflows/gcov-test.yml | 2 ++
|
||||
Makefile | 4 +++-
|
||||
2 files changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/.github/workflows/gcov-test.yml b/.github/workflows/gcov-test.yml
|
||||
index f1b38e77e..f782c5b9d 100644
|
||||
--- a/.github/workflows/gcov-test.yml
|
||||
+++ b/.github/workflows/gcov-test.yml
|
||||
@@ -10,5 +10,7 @@ jobs:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Run Coverage Tests
|
||||
run: sudo -E make -C scripts/ci local GCOV=1
|
||||
+ - name: Run gcov
|
||||
+ run: sudo -E find . -name '*gcda' -type f -print0 | sudo -E xargs --null --max-args 128 --max-procs 4 gcov
|
||||
- name: Run Coverage Analysis
|
||||
run: sudo -E make codecov
|
||||
diff --git a/Makefile b/Makefile
|
||||
index 73b647d6d..d35012615 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -449,7 +449,9 @@ lint:
|
||||
|
||||
codecov: SHELL := $(shell which bash)
|
||||
codecov:
|
||||
- bash <(curl -s https://codecov.io/bash)
|
||||
+ curl -Os https://uploader.codecov.io/latest/linux/codecov
|
||||
+ chmod +x codecov
|
||||
+ ./codecov
|
||||
.PHONY: codecov
|
||||
|
||||
fetch-clang-format: .FORCE
|
||||
--
|
||||
2.34.1
|
||||
|
||||
36
0033-ci-fix-userfaultfd-test-failures.patch
Normal file
36
0033-ci-fix-userfaultfd-test-failures.patch
Normal file
@ -0,0 +1,36 @@
|
||||
From a86a66fc2cbb77cdf0df69f3589c325018261d67 Mon Sep 17 00:00:00 2001
|
||||
From: Adrian Reber <areber@redhat.com>
|
||||
Date: Thu, 4 Nov 2021 09:10:38 +0000
|
||||
Subject: [PATCH 033/120] ci: fix userfaultfd test failures
|
||||
|
||||
Newer kernels (5.11) require echo 1 > /proc/sys/vm/unprivileged_userfaultfd
|
||||
|
||||
Without the 'echo 1' the kernel prints a message like this:
|
||||
|
||||
uffd: Set unprivileged_userfaultfd sysctl knob to 1 if kernel faults must be handled without obtaining CAP_SYS_PTRACE capability
|
||||
|
||||
Signed-off-by: Adrian Reber <areber@redhat.com>
|
||||
---
|
||||
scripts/ci/run-ci-tests.sh | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/scripts/ci/run-ci-tests.sh b/scripts/ci/run-ci-tests.sh
|
||||
index 51aa7db9e..096f907fb 100755
|
||||
--- a/scripts/ci/run-ci-tests.sh
|
||||
+++ b/scripts/ci/run-ci-tests.sh
|
||||
@@ -197,6 +197,12 @@ fi
|
||||
# shellcheck disable=SC2086
|
||||
./test/zdtm.py run -a -p 2 --keep-going $ZDTM_OPTS
|
||||
|
||||
+# Newer kernels are blocking access to userfaultfd:
|
||||
+# uffd: Set unprivileged_userfaultfd sysctl knob to 1 if kernel faults must be handled without obtaining CAP_SYS_PTRACE capability
|
||||
+if [ -e /proc/sys/vm/unprivileged_userfaultfd ]; then
|
||||
+ echo 1 > /proc/sys/vm/unprivileged_userfaultfd
|
||||
+fi
|
||||
+
|
||||
LAZY_EXCLUDE="-x maps04 -x cmdlinenv00 -x maps007"
|
||||
|
||||
LAZY_TESTS='.*(maps0|uffd-events|lazy-thp|futex|fork).*'
|
||||
--
|
||||
2.34.1
|
||||
|
||||
29
0034-ci-use-Fedora-34-for-lint-CI-runs.patch
Normal file
29
0034-ci-use-Fedora-34-for-lint-CI-runs.patch
Normal file
@ -0,0 +1,29 @@
|
||||
From 07a2f0265d3d6eebec6b3a7538179f6b50da270b Mon Sep 17 00:00:00 2001
|
||||
From: Adrian Reber <areber@redhat.com>
|
||||
Date: Thu, 4 Nov 2021 09:18:31 +0000
|
||||
Subject: [PATCH 034/120] ci: use Fedora 34 for lint CI runs
|
||||
|
||||
Fedora 35 comes with clang 13 which provides different results for
|
||||
clang-format than clang 12 in Fedora 34.
|
||||
|
||||
Signed-off-by: Adrian Reber <areber@redhat.com>
|
||||
---
|
||||
.github/workflows/lint.yml | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
|
||||
index 50b241e9f..49eb6aaac 100644
|
||||
--- a/.github/workflows/lint.yml
|
||||
+++ b/.github/workflows/lint.yml
|
||||
@@ -6,7 +6,7 @@ jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
- image: registry.fedoraproject.org/fedora:latest
|
||||
+ image: registry.fedoraproject.org/fedora:34
|
||||
steps:
|
||||
- name: Install tools
|
||||
run: sudo dnf -y install git make python3-flake8 ShellCheck clang-tools-extra which findutils
|
||||
--
|
||||
2.34.1
|
||||
|
||||
145
0035-tests-improve-the-image-streamer-process-control.patch
Normal file
145
0035-tests-improve-the-image-streamer-process-control.patch
Normal file
@ -0,0 +1,145 @@
|
||||
From b405b1b0142bea0eeec1437a867b1c0ef7a3afe1 Mon Sep 17 00:00:00 2001
|
||||
From: Nicolas Viennot <Nicolas.Viennot@twosigma.com>
|
||||
Date: Fri, 29 Oct 2021 02:49:31 +0000
|
||||
Subject: [PATCH 035/120] tests: improve the image streamer process control
|
||||
|
||||
When exceptions are raised during testing, the image streamer process
|
||||
should be terminated as opposed to being left hanging.
|
||||
This could lead to the whole test suite to be left hanging as it waits
|
||||
for all child processes to exit.
|
||||
|
||||
Signed-off-by: Nicolas Viennot <Nicolas.Viennot@twosigma.com>
|
||||
---
|
||||
test/zdtm.py | 44 ++++++++++++++++++++++++++++++++++----------
|
||||
1 file changed, 34 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/test/zdtm.py b/test/zdtm.py
|
||||
index 0a52e1b96..fc7b8a183 100755
|
||||
--- a/test/zdtm.py
|
||||
+++ b/test/zdtm.py
|
||||
@@ -1039,6 +1039,7 @@ class criu:
|
||||
self.__lazy_pages_p = None
|
||||
self.__page_server_p = None
|
||||
self.__dump_process = None
|
||||
+ self.__img_streamer_process = None
|
||||
self.__tls = self.__tls_options() if opts['tls'] else []
|
||||
self.__criu_bin = opts['criu_bin']
|
||||
self.__crit_bin = opts['crit_bin']
|
||||
@@ -1065,6 +1066,11 @@ class criu:
|
||||
self.__dump_process = None
|
||||
if ret:
|
||||
raise test_fail_exc("criu dump exited with %s" % ret)
|
||||
+ if self.__img_streamer_process:
|
||||
+ ret = self.wait_for_criu_image_streamer()
|
||||
+ if ret:
|
||||
+ raise test_fail_exc("criu-image-streamer exited with %s" % ret)
|
||||
+
|
||||
return
|
||||
|
||||
def logs(self):
|
||||
@@ -1219,8 +1225,10 @@ class criu:
|
||||
stent['pages_written'])
|
||||
|
||||
if self.__stream:
|
||||
- p = self.spawn_criu_image_streamer("extract")
|
||||
- p.wait()
|
||||
+ self.spawn_criu_image_streamer("extract")
|
||||
+ ret = self.wait_for_criu_image_streamer()
|
||||
+ if ret:
|
||||
+ raise test_fail_exc("criu-image-streamer (extract) exited with %s" % ret)
|
||||
|
||||
real_written = 0
|
||||
for f in os.listdir(self.__ddir()):
|
||||
@@ -1262,6 +1270,8 @@ class criu:
|
||||
"--progress-fd {progress_fd}",
|
||||
action]
|
||||
|
||||
+ log = open(os.path.join(self.__ddir(), "img-streamer.log"), "w")
|
||||
+
|
||||
# * As we are using a shell pipe command, we want to use pipefail.
|
||||
# Otherwise, failures stay unnoticed. For this, we use bash as sh
|
||||
# doesn't support that feature.
|
||||
@@ -1270,7 +1280,9 @@ class criu:
|
||||
progress_fd=progress_w,
|
||||
images_dir=self.__ddir(),
|
||||
img_file=os.path.join(self.__ddir(), STREAMED_IMG_FILE_NAME)
|
||||
- )], close_fds=False)
|
||||
+ )], stderr=log, close_fds=False)
|
||||
+
|
||||
+ log.close()
|
||||
|
||||
os.close(progress_w)
|
||||
progress = os.fdopen(progress_r, "r")
|
||||
@@ -1287,7 +1299,15 @@ class criu:
|
||||
raise test_fail_exc(
|
||||
"criu-image-streamer is not starting (exit_code=%d)" % p.wait())
|
||||
|
||||
- return p
|
||||
+ progress.close()
|
||||
+
|
||||
+ self.__img_streamer_process = p
|
||||
+
|
||||
+ def wait_for_criu_image_streamer(self):
|
||||
+ ret = self.__img_streamer_process.wait()
|
||||
+ grep_errors(os.path.join(self.__ddir(), "img-streamer.log"))
|
||||
+ self.__img_streamer_process = None
|
||||
+ return ret
|
||||
|
||||
def dump(self, action, opts=[]):
|
||||
self.__iter += 1
|
||||
@@ -1319,7 +1339,7 @@ class criu:
|
||||
a_opts += self.__test.getdopts()
|
||||
|
||||
if self.__stream:
|
||||
- streamer_p = self.spawn_criu_image_streamer("capture")
|
||||
+ self.spawn_criu_image_streamer("capture")
|
||||
a_opts += ["--stream"]
|
||||
|
||||
if self.__dedup:
|
||||
@@ -1347,9 +1367,9 @@ class criu:
|
||||
opts=a_opts + opts,
|
||||
nowait=nowait)
|
||||
if self.__stream:
|
||||
- ret = streamer_p.wait()
|
||||
+ ret = self.wait_for_criu_image_streamer()
|
||||
if ret:
|
||||
- raise test_fail_exc("criu-image-streamer exited with %d" % ret)
|
||||
+ raise test_fail_exc("criu-image-streamer (capture) exited with %d" % ret)
|
||||
|
||||
if self.__mdedup and self.__iter > 1:
|
||||
self.__criu_act("dedup", opts=[])
|
||||
@@ -1382,7 +1402,7 @@ class criu:
|
||||
r_opts += ['--action-script', os.getcwd() + '/empty-netns-prep.sh']
|
||||
|
||||
if self.__stream:
|
||||
- streamer_p = self.spawn_criu_image_streamer("serve")
|
||||
+ self.spawn_criu_image_streamer("serve")
|
||||
r_opts += ["--stream"]
|
||||
|
||||
if self.__dedup:
|
||||
@@ -1419,9 +1439,9 @@ class criu:
|
||||
|
||||
self.__criu_act("restore", opts=r_opts + ["--restore-detached"])
|
||||
if self.__stream:
|
||||
- ret = streamer_p.wait()
|
||||
+ ret = self.wait_for_criu_image_streamer()
|
||||
if ret:
|
||||
- raise test_fail_exc("criu-image-streamer exited with %d" % ret)
|
||||
+ raise test_fail_exc("criu-image-streamer (serve) exited with %d" % ret)
|
||||
|
||||
self.show_stats("restore")
|
||||
|
||||
@@ -1466,6 +1486,10 @@ class criu:
|
||||
print("criu dump exited with %s" % self.__dump_process.wait())
|
||||
grep_errors(os.path.join(self.__ddir(), "dump.log"))
|
||||
self.__dump_process = None
|
||||
+ if self.__img_streamer_process:
|
||||
+ self.__img_streamer_process.terminate()
|
||||
+ ret = self.wait_for_criu_image_streamer()
|
||||
+ print("criu-image-streamer exited with %s" % ret)
|
||||
|
||||
|
||||
def try_run_hook(test, args):
|
||||
--
|
||||
2.34.1
|
||||
|
||||
32
0036-sockets-don-t-call-sk_setbufs-asyncronously.patch
Normal file
32
0036-sockets-don-t-call-sk_setbufs-asyncronously.patch
Normal file
@ -0,0 +1,32 @@
|
||||
From d1e0bcf8130183cdcbd7e80dcbe18a5e7674f259 Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Thu, 29 Jul 2021 14:21:37 +0300
|
||||
Subject: [PATCH 036/120] sockets: don't call sk_setbufs asyncronously
|
||||
|
||||
We want to also c/r socket buf locks (SO_BUF_LOCKS) which are also
|
||||
implicitly set by setsockopt(SO_{SND,RCV}BUF*), so we need to order
|
||||
these two properly. That's why we need to wait for sk_setbufs to finish.
|
||||
And there is no much point in seting buffer sizes asyncronously anyway.
|
||||
|
||||
Reviewed-by: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
criu/sockets.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/criu/sockets.c b/criu/sockets.c
|
||||
index 9426b5b94..65aa82950 100644
|
||||
--- a/criu/sockets.c
|
||||
+++ b/criu/sockets.c
|
||||
@@ -517,7 +517,7 @@ int restore_socket_opts(int sk, SkOptsEntry *soe)
|
||||
pr_info("%d restore sndbuf %d rcv buf %d\n", sk, soe->so_sndbuf, soe->so_rcvbuf);
|
||||
|
||||
/* setsockopt() multiplies the input values by 2 */
|
||||
- ret |= userns_call(sk_setbufs, UNS_ASYNC, bufs, sizeof(bufs), sk);
|
||||
+ ret |= userns_call(sk_setbufs, 0, bufs, sizeof(bufs), sk);
|
||||
|
||||
if (soe->has_so_priority) {
|
||||
pr_debug("\trestore priority %d for socket\n", soe->so_priority);
|
||||
--
|
||||
2.34.1
|
||||
|
||||
132
0037-kerndat-check-for-set-getsockopt-SO_BUF_LOCK-availab.patch
Normal file
132
0037-kerndat-check-for-set-getsockopt-SO_BUF_LOCK-availab.patch
Normal file
@ -0,0 +1,132 @@
|
||||
From 5e13d03743d7d99f292858669d13d0350938106e Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Thu, 29 Jul 2021 14:57:17 +0300
|
||||
Subject: [PATCH 037/120] kerndat: check for set/getsockopt SO_BUF_LOCK
|
||||
availability
|
||||
|
||||
This is a new kernel feature to let criu restore sockets with kernel
|
||||
auto-adjusted buffer sizes.
|
||||
|
||||
Reviewed-by: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
criu/cr-check.c | 10 ++++++++++
|
||||
criu/include/kerndat.h | 1 +
|
||||
criu/include/sockets.h | 4 ++++
|
||||
criu/kerndat.c | 33 +++++++++++++++++++++++++++++++++
|
||||
4 files changed, 48 insertions(+)
|
||||
|
||||
diff --git a/criu/cr-check.c b/criu/cr-check.c
|
||||
index 3575fb3b3..3e268c439 100644
|
||||
--- a/criu/cr-check.c
|
||||
+++ b/criu/cr-check.c
|
||||
@@ -1372,6 +1372,14 @@ static int check_network_lock_nftables(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int check_sockopt_buf_lock(void)
|
||||
+{
|
||||
+ if (!kdat.has_sockopt_buf_lock)
|
||||
+ return -1;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int (*chk_feature)(void);
|
||||
|
||||
/*
|
||||
@@ -1490,6 +1498,7 @@ int cr_check(void)
|
||||
ret |= check_ns_pid();
|
||||
ret |= check_apparmor_stacking();
|
||||
ret |= check_network_lock_nftables();
|
||||
+ ret |= check_sockopt_buf_lock();
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1602,6 +1611,7 @@ static struct feature_list feature_list[] = {
|
||||
{ "ns_pid", check_ns_pid },
|
||||
{ "apparmor_stacking", check_apparmor_stacking },
|
||||
{ "network_lock_nftables", check_network_lock_nftables },
|
||||
+ { "sockopt_buf_lock", check_sockopt_buf_lock },
|
||||
{ NULL, NULL },
|
||||
};
|
||||
|
||||
diff --git a/criu/include/kerndat.h b/criu/include/kerndat.h
|
||||
index 80bad7f11..2ded7d1da 100644
|
||||
--- a/criu/include/kerndat.h
|
||||
+++ b/criu/include/kerndat.h
|
||||
@@ -74,6 +74,7 @@ struct kerndat_s {
|
||||
bool has_pidfd_getfd;
|
||||
bool has_nspid;
|
||||
bool has_nftables_concat;
|
||||
+ bool has_sockopt_buf_lock;
|
||||
};
|
||||
|
||||
extern struct kerndat_s kdat;
|
||||
diff --git a/criu/include/sockets.h b/criu/include/sockets.h
|
||||
index 3e8f3d601..399d38664 100644
|
||||
--- a/criu/include/sockets.h
|
||||
+++ b/criu/include/sockets.h
|
||||
@@ -123,4 +123,8 @@ extern const char *socket_proto_name(unsigned int proto, char *nm, size_t size);
|
||||
#define ___socket_family_name(family) __socket_info_helper(socket_family_name, family)
|
||||
#define ___socket_proto_name(proto) __socket_info_helper(socket_proto_name, proto)
|
||||
|
||||
+#ifndef SO_BUF_LOCK
|
||||
+#define SO_BUF_LOCK 72
|
||||
+#endif
|
||||
+
|
||||
#endif /* __CR_SOCKETS_H__ */
|
||||
diff --git a/criu/kerndat.c b/criu/kerndat.c
|
||||
index 0e88ba43e..9f6a6ec42 100644
|
||||
--- a/criu/kerndat.c
|
||||
+++ b/criu/kerndat.c
|
||||
@@ -816,6 +816,35 @@ static int kerndat_x86_has_ptrace_fpu_xsave_bug(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+int kerndat_sockopt_buf_lock(void)
|
||||
+{
|
||||
+ int exit_code = -1;
|
||||
+ socklen_t len;
|
||||
+ u32 buf_lock;
|
||||
+ int sock;
|
||||
+
|
||||
+ sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
|
||||
+ if (sock < 0) {
|
||||
+ pr_perror("Unable to create a socket");
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ len = sizeof(buf_lock);
|
||||
+ if (getsockopt(sock, SOL_SOCKET, SO_BUF_LOCK, &buf_lock, &len)) {
|
||||
+ if (errno != ENOPROTOOPT) {
|
||||
+ pr_perror("Unable to get SO_BUF_LOCK with getsockopt");
|
||||
+ goto err;
|
||||
+ }
|
||||
+ kdat.has_sockopt_buf_lock = false;
|
||||
+ } else
|
||||
+ kdat.has_sockopt_buf_lock = true;
|
||||
+
|
||||
+ exit_code = 0;
|
||||
+err:
|
||||
+ close(sock);
|
||||
+ return exit_code;
|
||||
+}
|
||||
+
|
||||
#define KERNDAT_CACHE_FILE KDAT_RUNDIR "/criu.kdat"
|
||||
#define KERNDAT_CACHE_FILE_TMP KDAT_RUNDIR "/.criu.kdat"
|
||||
|
||||
@@ -1359,6 +1388,10 @@ int kerndat_init(void)
|
||||
pr_err("kerndat_has_nftables_concat failed when initializing kerndat.\n");
|
||||
ret = -1;
|
||||
}
|
||||
+ if (!ret && kerndat_sockopt_buf_lock()) {
|
||||
+ pr_err("kerndat_sockopt_buf_lock failed when initializing kerndat.\n");
|
||||
+ ret = -1;
|
||||
+ }
|
||||
|
||||
kerndat_lsm();
|
||||
kerndat_mmap_min_addr();
|
||||
--
|
||||
2.34.1
|
||||
|
||||
69
0038-sockets-c-r-bufer-size-locks.patch
Normal file
69
0038-sockets-c-r-bufer-size-locks.patch
Normal file
@ -0,0 +1,69 @@
|
||||
From 9d02a38d6771a0eb449d5885eddcf74535f8ba8a Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Thu, 29 Jul 2021 11:27:13 +0300
|
||||
Subject: [PATCH 038/120] sockets: c/r bufer size locks
|
||||
|
||||
When one sets socket buffer sizes with setsockopt(SO_{SND,RCV}BUF*),
|
||||
kernel sets coresponding SOCK_SNDBUF_LOCK or SOCK_RCVBUF_LOCK flags on
|
||||
struct sock. It means that such a socket with explicitly changed buffer
|
||||
size can not be auto-adjusted by kernel (e.g. if there is free memory
|
||||
kernel can auto-increase default socket buffers to improve perfomance).
|
||||
(see tcp_fixup_rcvbuf() and tcp_sndbuf_expand())
|
||||
|
||||
CRIU is always changing buf sizes on restore, that means that all
|
||||
sockets receive lock flags on struct sock and become non-auto-adjusted
|
||||
after migration. In some cases it can decrease perfomance of network
|
||||
connections quite a lot.
|
||||
|
||||
So let's c/r socket buf locks (SO_BUF_LOCKS), so that sockets for which
|
||||
auto-adjustment is available does not lose it.
|
||||
|
||||
Reviewed-by: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
criu/sockets.c | 8 ++++++++
|
||||
images/sk-opts.proto | 2 ++
|
||||
2 files changed, 10 insertions(+)
|
||||
|
||||
diff --git a/criu/sockets.c b/criu/sockets.c
|
||||
index 65aa82950..db772707b 100644
|
||||
--- a/criu/sockets.c
|
||||
+++ b/criu/sockets.c
|
||||
@@ -519,6 +519,10 @@ int restore_socket_opts(int sk, SkOptsEntry *soe)
|
||||
/* setsockopt() multiplies the input values by 2 */
|
||||
ret |= userns_call(sk_setbufs, 0, bufs, sizeof(bufs), sk);
|
||||
|
||||
+ if (soe->has_so_buf_lock) {
|
||||
+ pr_debug("\trestore buf_lock %d for socket\n", soe->so_buf_lock);
|
||||
+ ret |= restore_opt(sk, SOL_SOCKET, SO_BUF_LOCK, &soe->so_buf_lock);
|
||||
+ }
|
||||
if (soe->has_so_priority) {
|
||||
pr_debug("\trestore priority %d for socket\n", soe->so_priority);
|
||||
ret |= restore_opt(sk, SOL_SOCKET, SO_PRIORITY, &soe->so_priority);
|
||||
@@ -619,6 +623,10 @@ int dump_socket_opts(int sk, SkOptsEntry *soe)
|
||||
|
||||
ret |= dump_opt(sk, SOL_SOCKET, SO_SNDBUF, &soe->so_sndbuf);
|
||||
ret |= dump_opt(sk, SOL_SOCKET, SO_RCVBUF, &soe->so_rcvbuf);
|
||||
+ if (kdat.has_sockopt_buf_lock) {
|
||||
+ soe->has_so_buf_lock = true;
|
||||
+ ret |= dump_opt(sk, SOL_SOCKET, SO_BUF_LOCK, &soe->so_buf_lock);
|
||||
+ }
|
||||
soe->has_so_priority = true;
|
||||
ret |= dump_opt(sk, SOL_SOCKET, SO_PRIORITY, &soe->so_priority);
|
||||
soe->has_so_rcvlowat = true;
|
||||
diff --git a/images/sk-opts.proto b/images/sk-opts.proto
|
||||
index 2377f6b62..1d24d47cc 100644
|
||||
--- a/images/sk-opts.proto
|
||||
+++ b/images/sk-opts.proto
|
||||
@@ -31,6 +31,8 @@ message sk_opts_entry {
|
||||
optional uint32 tcp_keepintvl = 22;
|
||||
optional uint32 so_oobinline = 23;
|
||||
optional uint32 so_linger = 24;
|
||||
+
|
||||
+ optional uint32 so_buf_lock = 25;
|
||||
}
|
||||
|
||||
enum sk_shutdown {
|
||||
--
|
||||
2.34.1
|
||||
|
||||
118
0039-zdtm-add-test-for-socket-buffer-size-locks.patch
Normal file
118
0039-zdtm-add-test-for-socket-buffer-size-locks.patch
Normal file
@ -0,0 +1,118 @@
|
||||
From 579b8b02603d29adf664aab99f9df6cda33acfea Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Thu, 29 Jul 2021 16:16:12 +0300
|
||||
Subject: [PATCH 039/120] zdtm: add test for socket buffer size locks
|
||||
|
||||
Just set all possible values 0-3 and chack if it persists.
|
||||
|
||||
Reviewed-by: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
test/zdtm/static/Makefile | 1 +
|
||||
test/zdtm/static/sock_opts02.c | 73 +++++++++++++++++++++++++++++++
|
||||
test/zdtm/static/sock_opts02.desc | 1 +
|
||||
3 files changed, 75 insertions(+)
|
||||
create mode 100644 test/zdtm/static/sock_opts02.c
|
||||
create mode 100644 test/zdtm/static/sock_opts02.desc
|
||||
|
||||
diff --git a/test/zdtm/static/Makefile b/test/zdtm/static/Makefile
|
||||
index b6aa621c7..3e1e0a498 100644
|
||||
--- a/test/zdtm/static/Makefile
|
||||
+++ b/test/zdtm/static/Makefile
|
||||
@@ -117,6 +117,7 @@ TST_NOFILE := \
|
||||
socket-linger \
|
||||
sock_opts00 \
|
||||
sock_opts01 \
|
||||
+ sock_opts02 \
|
||||
sk-unix-unconn \
|
||||
ipc_namespace \
|
||||
selfexe00 \
|
||||
diff --git a/test/zdtm/static/sock_opts02.c b/test/zdtm/static/sock_opts02.c
|
||||
new file mode 100644
|
||||
index 000000000..21a81a28f
|
||||
--- /dev/null
|
||||
+++ b/test/zdtm/static/sock_opts02.c
|
||||
@@ -0,0 +1,73 @@
|
||||
+#include <stdio.h>
|
||||
+#include <unistd.h>
|
||||
+#include <sys/types.h>
|
||||
+#include <sys/socket.h>
|
||||
+#include <netinet/in.h>
|
||||
+
|
||||
+#include "zdtmtst.h"
|
||||
+
|
||||
+const char *test_doc = "Check that SO_BUF_LOCK option dumped";
|
||||
+const char *test_author = "Pavel Tikhomirov <ptikhomirov@virtuozzo.com>";
|
||||
+
|
||||
+#ifndef SO_BUF_LOCK
|
||||
+#define SO_BUF_LOCK 72
|
||||
+#endif
|
||||
+
|
||||
+#define NSOCK 4
|
||||
+
|
||||
+int main(int argc, char **argv)
|
||||
+{
|
||||
+ int sock[NSOCK];
|
||||
+ uint32_t val[NSOCK];
|
||||
+ int ret, i;
|
||||
+ int exit_code = 1;
|
||||
+
|
||||
+ test_init(argc, argv);
|
||||
+
|
||||
+ for (i = 0; i < NSOCK; i++) {
|
||||
+ sock[i] = -1;
|
||||
+ val[i] = i;
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < NSOCK; i++) {
|
||||
+ sock[i] = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
|
||||
+ if (sock[i] < 0) {
|
||||
+ pr_perror("can't create socket %d", i);
|
||||
+ goto err;
|
||||
+ }
|
||||
+
|
||||
+ ret = setsockopt(sock[i], SOL_SOCKET, SO_BUF_LOCK, &val[i], sizeof(val[i]));
|
||||
+ if (ret < 0) {
|
||||
+ pr_perror("can't set SO_BUF_LOCK (%u) on socket %d", val[i], i);
|
||||
+ goto err;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ test_daemon();
|
||||
+ test_waitsig();
|
||||
+
|
||||
+ for (i = 0; i < NSOCK; i++) {
|
||||
+ uint32_t tmp;
|
||||
+ socklen_t len;
|
||||
+
|
||||
+ len = sizeof(tmp);
|
||||
+ ret = getsockopt(sock[i], SOL_SOCKET, SO_BUF_LOCK, &tmp, &len);
|
||||
+ if (ret < 0) {
|
||||
+ pr_perror("can't get SO_BUF_LOCK from socket %d", i);
|
||||
+ goto err;
|
||||
+ }
|
||||
+
|
||||
+ if (tmp != val[i]) {
|
||||
+ fail("SO_BUF_LOCK missmatch %u != %u", tmp, val[i]);
|
||||
+ goto err;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ pass();
|
||||
+ exit_code = 0;
|
||||
+err:
|
||||
+ for (i = 0; i < NSOCK; i++)
|
||||
+ close(sock[i]);
|
||||
+
|
||||
+ return exit_code;
|
||||
+}
|
||||
diff --git a/test/zdtm/static/sock_opts02.desc b/test/zdtm/static/sock_opts02.desc
|
||||
new file mode 100644
|
||||
index 000000000..37d3a6354
|
||||
--- /dev/null
|
||||
+++ b/test/zdtm/static/sock_opts02.desc
|
||||
@@ -0,0 +1 @@
|
||||
+{'flags': 'suid', 'feature': 'sockopt_buf_lock'}
|
||||
--
|
||||
2.34.1
|
||||
|
||||
115
0040-zdtm-make-sock_opts02-also-check-lock-change-by-SO_-.patch
Normal file
115
0040-zdtm-make-sock_opts02-also-check-lock-change-by-SO_-.patch
Normal file
@ -0,0 +1,115 @@
|
||||
From b4cc85671010c1d99659e3ed90b3f03c415e5f8a Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Tue, 3 Aug 2021 13:05:32 +0300
|
||||
Subject: [PATCH 040/120] zdtm: make sock_opts02 also check lock change by
|
||||
SO_*BUF*
|
||||
|
||||
Reviewed-by: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
test/zdtm/static/sock_opts02.c | 63 +++++++++++++++++++++++++++++-----
|
||||
1 file changed, 54 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/test/zdtm/static/sock_opts02.c b/test/zdtm/static/sock_opts02.c
|
||||
index 21a81a28f..7ea98744a 100644
|
||||
--- a/test/zdtm/static/sock_opts02.c
|
||||
+++ b/test/zdtm/static/sock_opts02.c
|
||||
@@ -13,32 +13,77 @@ const char *test_author = "Pavel Tikhomirov <ptikhomirov@virtuozzo.com>";
|
||||
#define SO_BUF_LOCK 72
|
||||
#endif
|
||||
|
||||
-#define NSOCK 4
|
||||
+#ifndef SOCK_SNDBUF_LOCK
|
||||
+#define SOCK_SNDBUF_LOCK 1
|
||||
+#endif
|
||||
+#ifndef SOCK_RCVBUF_LOCK
|
||||
+#define SOCK_RCVBUF_LOCK 2
|
||||
+#endif
|
||||
+
|
||||
+#define BUFSIZE 16384
|
||||
+
|
||||
+struct sk_opt {
|
||||
+ int type;
|
||||
+ uint32_t val;
|
||||
+ uint32_t lock;
|
||||
+} sk_opts[] = { { SO_BUF_LOCK, 0, 0 },
|
||||
+ { SO_BUF_LOCK, SOCK_SNDBUF_LOCK, SOCK_SNDBUF_LOCK },
|
||||
+ { SO_BUF_LOCK, SOCK_RCVBUF_LOCK, SOCK_RCVBUF_LOCK },
|
||||
+ { SO_BUF_LOCK, SOCK_SNDBUF_LOCK | SOCK_RCVBUF_LOCK, SOCK_SNDBUF_LOCK | SOCK_RCVBUF_LOCK },
|
||||
+ { SO_SNDBUF, BUFSIZE, SOCK_SNDBUF_LOCK },
|
||||
+ { SO_RCVBUF, BUFSIZE, SOCK_RCVBUF_LOCK } };
|
||||
+
|
||||
+#define NSOCK ARRAY_SIZE(sk_opts)
|
||||
+
|
||||
+char *type_to_str(int type)
|
||||
+{
|
||||
+ switch (type) {
|
||||
+ case SO_BUF_LOCK:
|
||||
+ return "SO_BUF_LOCK";
|
||||
+ case SO_SNDBUFFORCE:
|
||||
+ return "SO_SNDBUFFORCE";
|
||||
+ case SO_RCVBUFFORCE:
|
||||
+ return "SO_RCVBUFFORCE";
|
||||
+ }
|
||||
+ return NULL;
|
||||
+}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int sock[NSOCK];
|
||||
- uint32_t val[NSOCK];
|
||||
int ret, i;
|
||||
int exit_code = 1;
|
||||
|
||||
test_init(argc, argv);
|
||||
|
||||
- for (i = 0; i < NSOCK; i++) {
|
||||
+ for (i = 0; i < NSOCK; i++)
|
||||
sock[i] = -1;
|
||||
- val[i] = i;
|
||||
- }
|
||||
|
||||
for (i = 0; i < NSOCK; i++) {
|
||||
+ uint32_t tmp;
|
||||
+ socklen_t len;
|
||||
+
|
||||
sock[i] = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
|
||||
if (sock[i] < 0) {
|
||||
pr_perror("can't create socket %d", i);
|
||||
goto err;
|
||||
}
|
||||
|
||||
- ret = setsockopt(sock[i], SOL_SOCKET, SO_BUF_LOCK, &val[i], sizeof(val[i]));
|
||||
+ ret = setsockopt(sock[i], SOL_SOCKET, sk_opts[i].type, &sk_opts[i].val, sizeof(sk_opts[i].val));
|
||||
+ if (ret < 0) {
|
||||
+ pr_perror("can't set %s (%u) on socket %d", type_to_str(sk_opts[i].type), sk_opts[i].val, i);
|
||||
+ goto err;
|
||||
+ }
|
||||
+
|
||||
+ len = sizeof(tmp);
|
||||
+ ret = getsockopt(sock[i], SOL_SOCKET, SO_BUF_LOCK, &tmp, &len);
|
||||
if (ret < 0) {
|
||||
- pr_perror("can't set SO_BUF_LOCK (%u) on socket %d", val[i], i);
|
||||
+ pr_perror("can't get SO_BUF_LOCK from socket %d", i);
|
||||
+ goto err;
|
||||
+ }
|
||||
+
|
||||
+ if (tmp != sk_opts[i].lock) {
|
||||
+ fail("SO_BUF_LOCK missmatch %u != %u", tmp, sk_opts[i].lock);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
@@ -57,8 +102,8 @@ int main(int argc, char **argv)
|
||||
goto err;
|
||||
}
|
||||
|
||||
- if (tmp != val[i]) {
|
||||
- fail("SO_BUF_LOCK missmatch %u != %u", tmp, val[i]);
|
||||
+ if (tmp != sk_opts[i].lock) {
|
||||
+ fail("SO_BUF_LOCK missmatch %u != %u", tmp, sk_opts[i].lock);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
--
|
||||
2.34.1
|
||||
|
||||
173
0041-clang-format-enable-AlignTrailingComments.patch
Normal file
173
0041-clang-format-enable-AlignTrailingComments.patch
Normal file
@ -0,0 +1,173 @@
|
||||
From 78723d0b5747134ef4b6fe2663fbcfc2b4737e89 Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Thu, 28 Oct 2021 17:15:52 +0300
|
||||
Subject: [PATCH 041/120] clang-format: enable AlignTrailingComments
|
||||
|
||||
Code becomes much more human-readable after enabling it.
|
||||
|
||||
Example 1:
|
||||
|
||||
Before:
|
||||
```
|
||||
struct file_desc {
|
||||
u32 id; /* File id, unique */
|
||||
struct hlist_node hash; /* Descriptor hashing and lookup */
|
||||
struct list_head fd_info_head; /* Chain of fdinfo_list_entry-s with same ID and type but different pids */
|
||||
struct file_desc_ops *ops; /* Associated operations */
|
||||
struct list_head fake_master_list; /* To chain in the list of file_desc, which don't
|
||||
have a fle in a task, that having permissions */
|
||||
};
|
||||
```
|
||||
After:
|
||||
```
|
||||
struct file_desc {
|
||||
u32 id; /* File id, unique */
|
||||
struct hlist_node hash; /* Descriptor hashing and lookup */
|
||||
struct list_head fd_info_head; /* Chain of fdinfo_list_entry-s with same ID and type but different pids */
|
||||
struct file_desc_ops *ops; /* Associated operations */
|
||||
struct list_head fake_master_list; /* To chain in the list of file_desc, which don't
|
||||
* have a fle in a task, that having permissions */
|
||||
};
|
||||
```
|
||||
|
||||
Example 2:
|
||||
|
||||
Before:
|
||||
```
|
||||
enum fsconfig_command {
|
||||
FSCONFIG_SET_FLAG = 0, /* Set parameter, supplying no value */
|
||||
FSCONFIG_SET_STRING = 1, /* Set parameter, supplying a string value */
|
||||
FSCONFIG_SET_BINARY = 2, /* Set parameter, supplying a binary blob value */
|
||||
FSCONFIG_SET_PATH = 3, /* Set parameter, supplying an object by path */
|
||||
FSCONFIG_SET_PATH_EMPTY = 4, /* Set parameter, supplying an object by (empty) path */
|
||||
FSCONFIG_SET_FD = 5, /* Set parameter, supplying an object by fd */
|
||||
FSCONFIG_CMD_CREATE = 6, /* Invoke superblock creation */
|
||||
FSCONFIG_CMD_RECONFIGURE = 7, /* Invoke superblock reconfiguration */
|
||||
};
|
||||
```
|
||||
After:
|
||||
```
|
||||
enum fsconfig_command {
|
||||
FSCONFIG_SET_FLAG = 0, /* Set parameter, supplying no value */
|
||||
FSCONFIG_SET_STRING = 1, /* Set parameter, supplying a string value */
|
||||
FSCONFIG_SET_BINARY = 2, /* Set parameter, supplying a binary blob value */
|
||||
FSCONFIG_SET_PATH = 3, /* Set parameter, supplying an object by path */
|
||||
FSCONFIG_SET_PATH_EMPTY = 4, /* Set parameter, supplying an object by (empty) path */
|
||||
FSCONFIG_SET_FD = 5, /* Set parameter, supplying an object by fd */
|
||||
FSCONFIG_CMD_CREATE = 6, /* Invoke superblock creation */
|
||||
FSCONFIG_CMD_RECONFIGURE = 7, /* Invoke superblock reconfiguration */
|
||||
};
|
||||
```
|
||||
|
||||
Example 3:
|
||||
|
||||
Before:
|
||||
```
|
||||
ret = libnet_build_tcp(ntohs(sk->dst_addr->v4.sin_port), /* source port */
|
||||
ntohs(sk->src_addr->v4.sin_port), /* destination port */
|
||||
data->inq_seq, /* sequence number */
|
||||
data->outq_seq - data->outq_len, /* acknowledgement num */
|
||||
flags, /* control flags */
|
||||
data->rcv_wnd, /* window size */
|
||||
0, /* checksum */
|
||||
10, /* urgent pointer */
|
||||
LIBNET_TCP_H + 20, /* TCP packet size */
|
||||
NULL, /* payload */
|
||||
0, /* payload size */
|
||||
l, /* libnet handle */
|
||||
0); /* libnet id */
|
||||
```
|
||||
After:
|
||||
```
|
||||
ret = libnet_build_tcp(ntohs(sk->dst_addr->v4.sin_port), /* source port */
|
||||
ntohs(sk->src_addr->v4.sin_port), /* destination port */
|
||||
data->inq_seq, /* sequence number */
|
||||
data->outq_seq - data->outq_len, /* acknowledgement num */
|
||||
flags, /* control flags */
|
||||
data->rcv_wnd, /* window size */
|
||||
0, /* checksum */
|
||||
10, /* urgent pointer */
|
||||
LIBNET_TCP_H + 20, /* TCP packet size */
|
||||
NULL, /* payload */
|
||||
0, /* payload size */
|
||||
l, /* libnet handle */
|
||||
0); /* libnet id */
|
||||
```
|
||||
|
||||
Example 4:
|
||||
|
||||
Before:
|
||||
```
|
||||
static struct testcase __testcases[] = {
|
||||
{ 2, 1, 2, 1, 2, 1 }, /* session00 */
|
||||
{ 4, 2, 4, 2, 4, 1 }, /* |\_session00 */
|
||||
{ 15, 4, 4, 4, 15, 1 }, /* | |\_session00 */
|
||||
{ 16, 4, 4, 4, 15, 1 }, /* | \_session00 */
|
||||
{ 17, 4, 4, 4, 17, 0 }, /* | |\_session00 */
|
||||
{ 18, 4, 4, 4, 17, 1 }, /* | \_session00 */
|
||||
{ 5, 2, 2, 2, 2, 1 }, /* |\_session00 */
|
||||
{ 8, 2, 8, 2, 8, 1 }, /* |\_session00 */
|
||||
{ 9, 8, 2, 2, 2, 1 }, /* | \_session00 */
|
||||
{ 10, 2, 10, 2, 10, 1 }, /* |\_session00 */
|
||||
{ 11, 10, 11, 2, 11, 1 }, /* | \_session00 */
|
||||
{ 12, 11, 2, 2, 2, 1 }, /* | \_session00 */
|
||||
{ 13, 2, 2, 2, 2, 0 }, /* \_session00 */
|
||||
{ 3, 13, 2, 2, 2, 1 }, /* session00 */
|
||||
{ 6, 2, 6, 2, 6, 0 }, /* \_session00 */
|
||||
{ 14, 6, 6, 6, 6, 1 }, /* session00 */
|
||||
};
|
||||
```
|
||||
After:
|
||||
```
|
||||
static struct testcase __testcases[] = {
|
||||
{ 2, 1, 2, 1, 2, 1 }, /* session00 */
|
||||
{ 4, 2, 4, 2, 4, 1 }, /* |\_session00 */
|
||||
{ 15, 4, 4, 4, 15, 1 }, /* | |\_session00 */
|
||||
{ 16, 4, 4, 4, 15, 1 }, /* | \_session00 */
|
||||
{ 17, 4, 4, 4, 17, 0 }, /* | |\_session00 */
|
||||
{ 18, 4, 4, 4, 17, 1 }, /* | \_session00 */
|
||||
{ 5, 2, 2, 2, 2, 1 }, /* |\_session00 */
|
||||
{ 8, 2, 8, 2, 8, 1 }, /* |\_session00 */
|
||||
{ 9, 8, 2, 2, 2, 1 }, /* | \_session00 */
|
||||
{ 10, 2, 10, 2, 10, 1 }, /* |\_session00 */
|
||||
{ 11, 10, 11, 2, 11, 1 }, /* | \_session00 */
|
||||
{ 12, 11, 2, 2, 2, 1 }, /* | \_session00 */
|
||||
{ 13, 2, 2, 2, 2, 0 }, /* \_session00 */
|
||||
{ 3, 13, 2, 2, 2, 1 }, /* session00 */
|
||||
{ 6, 2, 6, 2, 6, 0 }, /* \_session00 */
|
||||
{ 14, 6, 6, 6, 6, 1 }, /* session00 */
|
||||
};
|
||||
```
|
||||
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
.clang-format | 2 +-
|
||||
scripts/fetch-clang-format.sh | 1 +
|
||||
2 files changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/.clang-format b/.clang-format
|
||||
index dd4ade370..96ba5909f 100644
|
||||
--- a/.clang-format
|
||||
+++ b/.clang-format
|
||||
@@ -15,7 +15,7 @@ AlignConsecutiveAssignments: false
|
||||
AlignConsecutiveDeclarations: false
|
||||
AlignEscapedNewlines: Left # Unknown to clang-format-4.0
|
||||
AlignOperands: true
|
||||
-AlignTrailingComments: false
|
||||
+AlignTrailingComments: true
|
||||
AlignConsecutiveMacros: true
|
||||
AllowAllParametersOfDeclarationOnNextLine: false
|
||||
AllowShortBlocksOnASingleLine: false
|
||||
diff --git a/scripts/fetch-clang-format.sh b/scripts/fetch-clang-format.sh
|
||||
index c9006c518..0e9545f2d 100755
|
||||
--- a/scripts/fetch-clang-format.sh
|
||||
+++ b/scripts/fetch-clang-format.sh
|
||||
@@ -12,4 +12,5 @@ curl -s "${URL}" | sed -e "
|
||||
s,Intended for clang-format >= 4,Intended for clang-format >= 11,g;
|
||||
s,ForEachMacros:,ForEachMacros:\n - 'for_each_pstree_item',g;
|
||||
s,\(AlignTrailingComments:.*\)$,\1\nAlignConsecutiveMacros: true,g;
|
||||
+ s,AlignTrailingComments: false,AlignTrailingComments: true,g;
|
||||
" > .clang-format
|
||||
--
|
||||
2.34.1
|
||||
|
||||
169
0042-clang-format-do-several-manual-comment-fixups.patch
Normal file
169
0042-clang-format-do-several-manual-comment-fixups.patch
Normal file
@ -0,0 +1,169 @@
|
||||
From 8e8870f6772d61089b98863fcc93e7968ea7a74c Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Thu, 28 Oct 2021 17:17:44 +0300
|
||||
Subject: [PATCH 042/120] clang-format: do several manual comment fixups
|
||||
|
||||
Automatic AlignTrailingComments fails to make those comments look right,
|
||||
so let's do it manually, so that they both satisfy AlignTrailingComments
|
||||
and also are human-readable.
|
||||
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
criu/include/files.h | 10 +++++-----
|
||||
criu/include/page-pipe.h | 6 ++----
|
||||
criu/include/pagemap.h | 19 ++++++++----------
|
||||
criu/include/pipes.h | 4 ++--
|
||||
criu/shmem.c | 3 ++-
|
||||
test/zdtm/static/ipc_namespace.c | 33 ++++++++++++++++----------------
|
||||
6 files changed, 36 insertions(+), 39 deletions(-)
|
||||
|
||||
diff --git a/criu/include/files.h b/criu/include/files.h
|
||||
index 96face71b..26ce1f42a 100644
|
||||
--- a/criu/include/files.h
|
||||
+++ b/criu/include/files.h
|
||||
@@ -121,12 +121,12 @@ unsigned int find_unused_fd(struct pstree_item *, int hint_fd);
|
||||
struct fdinfo_list_entry *find_used_fd(struct pstree_item *, int fd);
|
||||
|
||||
struct file_desc {
|
||||
- u32 id; /* File id, unique */
|
||||
- struct hlist_node hash; /* Descriptor hashing and lookup */
|
||||
- struct list_head fd_info_head; /* Chain of fdinfo_list_entry-s with same ID and type but different pids */
|
||||
- struct file_desc_ops *ops; /* Associated operations */
|
||||
+ u32 id; /* File id, unique */
|
||||
+ struct hlist_node hash; /* Descriptor hashing and lookup */
|
||||
+ struct list_head fd_info_head; /* Chain of fdinfo_list_entry-s with same ID and type but different pids */
|
||||
+ struct file_desc_ops *ops; /* Associated operations */
|
||||
struct list_head fake_master_list; /* To chain in the list of file_desc, which don't
|
||||
- have a fle in a task, that having permissions */
|
||||
+ * have a fle in a task, that having permissions */
|
||||
};
|
||||
|
||||
struct fdtype_ops {
|
||||
diff --git a/criu/include/page-pipe.h b/criu/include/page-pipe.h
|
||||
index a5f97678e..0917869d9 100644
|
||||
--- a/criu/include/page-pipe.h
|
||||
+++ b/criu/include/page-pipe.h
|
||||
@@ -130,10 +130,8 @@ struct page_pipe {
|
||||
unsigned int flags; /* PP_FOO flags below */
|
||||
};
|
||||
|
||||
-#define PP_CHUNK_MODE \
|
||||
- 0x1 /* Restrict the maximum buffer size of pipes
|
||||
- and dump memory for a few iterations */
|
||||
-#define PP_OWN_IOVS 0x4 /* create_page_pipe allocated IOVs memory */
|
||||
+#define PP_CHUNK_MODE 0x1 /* Restrict the maximum buffer size of pipes and dump memory for a few iterations */
|
||||
+#define PP_OWN_IOVS 0x4 /* create_page_pipe allocated IOVs memory */
|
||||
|
||||
struct page_pipe *create_page_pipe(unsigned int nr_segs, struct iovec *iovs, unsigned flags);
|
||||
extern void destroy_page_pipe(struct page_pipe *p);
|
||||
diff --git a/criu/include/pagemap.h b/criu/include/pagemap.h
|
||||
index c39c25d0c..8c7180559 100644
|
||||
--- a/criu/include/pagemap.h
|
||||
+++ b/criu/include/pagemap.h
|
||||
@@ -63,17 +63,14 @@ struct page_read {
|
||||
struct cr_img *pi;
|
||||
u32 pages_img_id;
|
||||
|
||||
- PagemapEntry *pe; /* current pagemap we are on */
|
||||
- struct page_read *parent; /* parent pagemap (if ->in_parent
|
||||
- pagemap is met in image, then
|
||||
- go to this guy for page, see
|
||||
- read_pagemap_page */
|
||||
- unsigned long cvaddr; /* vaddr we are on */
|
||||
- off_t pi_off; /* current offset in pages file */
|
||||
-
|
||||
- struct iovec bunch; /* record consequent neighbour
|
||||
- iovecs to punch together */
|
||||
- unsigned id; /* for logging */
|
||||
+ PagemapEntry *pe; /* current pagemap we are on */
|
||||
+ struct page_read *parent; /* parent pagemap (if ->in_parent pagemap is met in image,
|
||||
+ * then go to this guy for page, see read_pagemap_page */
|
||||
+ unsigned long cvaddr; /* vaddr we are on */
|
||||
+ off_t pi_off; /* current offset in pages file */
|
||||
+
|
||||
+ struct iovec bunch; /* record consequent neighbour iovecs to punch together */
|
||||
+ unsigned id; /* for logging */
|
||||
unsigned long img_id; /* pagemap image file ID */
|
||||
|
||||
PagemapEntry **pmes;
|
||||
diff --git a/criu/include/pipes.h b/criu/include/pipes.h
|
||||
index 6e6310e14..f442d7f65 100644
|
||||
--- a/criu/include/pipes.h
|
||||
+++ b/criu/include/pipes.h
|
||||
@@ -49,8 +49,8 @@ extern int restore_pipe_data(int img_type, int pfd, u32 id, struct pipe_data_rst
|
||||
struct pipe_info {
|
||||
PipeEntry *pe;
|
||||
struct list_head pipe_list; /* All pipe_info with the same pipe_id
|
||||
- * This is pure circular list without head */
|
||||
- struct list_head list; /* global list of pipes */
|
||||
+ * This is pure circular list without head */
|
||||
+ struct list_head list; /* global list of pipes */
|
||||
struct file_desc d;
|
||||
unsigned int create : 1, reopen : 1;
|
||||
};
|
||||
diff --git a/criu/shmem.c b/criu/shmem.c
|
||||
index 1b83327ef..bb48e436b 100644
|
||||
--- a/criu/shmem.c
|
||||
+++ b/criu/shmem.c
|
||||
@@ -85,7 +85,8 @@ struct shmem_info {
|
||||
int self_count; /* the number of regions, which belongs to "pid" */
|
||||
};
|
||||
|
||||
- struct { /* For sysvipc restore */
|
||||
+ /* For sysvipc restore */
|
||||
+ struct {
|
||||
struct list_head att; /* list of shmem_sysv_att-s */
|
||||
int want_write;
|
||||
};
|
||||
diff --git a/test/zdtm/static/ipc_namespace.c b/test/zdtm/static/ipc_namespace.c
|
||||
index 98241d816..4273951ae 100644
|
||||
--- a/test/zdtm/static/ipc_namespace.c
|
||||
+++ b/test/zdtm/static/ipc_namespace.c
|
||||
@@ -19,27 +19,28 @@ extern int shmctl(int __shmid, int __cmd, struct shmid_ds *__buf);
|
||||
|
||||
struct ipc_ids {
|
||||
int in_use; /* TODO: Check for 0 */
|
||||
- // unsigned short seq;
|
||||
- // unsigned short seq_max;
|
||||
- // struct rw_semaphore rw_mutex;
|
||||
- // struct idr ipcs_idr; /* TODO */
|
||||
+
|
||||
+ // unsigned short seq;
|
||||
+ // unsigned short seq_max;
|
||||
+ // struct rw_semaphore rw_mutex;
|
||||
+ // struct idr ipcs_idr; /* TODO */
|
||||
};
|
||||
|
||||
struct ipc_ns {
|
||||
struct ipc_ids ids[3];
|
||||
|
||||
- int sem_ctls[4]; // +
|
||||
- int used_sems; // +
|
||||
-
|
||||
- int msg_ctlmax; // +
|
||||
- int msg_ctlmnb; // +
|
||||
- int msg_ctlmni; // +
|
||||
- int msg_bytes; // +
|
||||
- int msg_hdrs; // +
|
||||
- int auto_msgmni; // +
|
||||
- int msg_next_id; // +
|
||||
- int sem_next_id; // +
|
||||
- int shm_next_id; // +
|
||||
+ int sem_ctls[4];
|
||||
+ int used_sems;
|
||||
+
|
||||
+ int msg_ctlmax;
|
||||
+ int msg_ctlmnb;
|
||||
+ int msg_ctlmni;
|
||||
+ int msg_bytes;
|
||||
+ int msg_hdrs;
|
||||
+ int auto_msgmni;
|
||||
+ int msg_next_id;
|
||||
+ int sem_next_id;
|
||||
+ int shm_next_id;
|
||||
|
||||
size_t shm_ctlmax;
|
||||
size_t shm_ctlall;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
1889
0043-clang-format-do-automatic-comment-fixups.patch
Normal file
1889
0043-clang-format-do-automatic-comment-fixups.patch
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,35 @@
|
||||
From 688149930abd96fd9e1db4ee3b67c727bab4f3d8 Mon Sep 17 00:00:00 2001
|
||||
From: Liu Hua <weldonliu@tencent.com>
|
||||
Date: Mon, 1 Nov 2021 20:50:58 +0800
|
||||
Subject: [PATCH 044/120] cr-dump: fail dumping when zombie process with sid 0
|
||||
|
||||
A zombie process with 0 sid has a session leader in
|
||||
outer pidns and has ignored SIGHUP. Criu has no idea
|
||||
to restore this type of process, so fail the dumpping.
|
||||
|
||||
Signed-off-by: Liu Hua <weldonliu@tencent.com>
|
||||
---
|
||||
criu/cr-dump.c | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
diff --git a/criu/cr-dump.c b/criu/cr-dump.c
|
||||
index ecc99f116..c972e343a 100644
|
||||
--- a/criu/cr-dump.c
|
||||
+++ b/criu/cr-dump.c
|
||||
@@ -1129,6 +1129,13 @@ static int dump_zombies(void)
|
||||
item->pgid = pps_buf.pgid;
|
||||
|
||||
BUG_ON(!list_empty(&item->children));
|
||||
+
|
||||
+ if (!item->sid) {
|
||||
+ pr_err("A session leader of zombie process %d(%d) is outside of its pid namespace\n",
|
||||
+ item->pid->real, vpid(item));
|
||||
+ goto err;
|
||||
+ }
|
||||
+
|
||||
if (dump_one_zombie(item, &pps_buf) < 0)
|
||||
goto err;
|
||||
}
|
||||
--
|
||||
2.34.1
|
||||
|
||||
176
0045-clang-format-make-x86_ins_capability_mask-human-read.patch
Normal file
176
0045-clang-format-make-x86_ins_capability_mask-human-read.patch
Normal file
@ -0,0 +1,176 @@
|
||||
From fef55d6b7cafddc13ecc29920b9726406f820ee6 Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Fri, 29 Oct 2021 10:35:28 +0300
|
||||
Subject: [PATCH 045/120] clang-format: make x86_ins_capability_mask
|
||||
human-readable
|
||||
|
||||
There is no option in clang not to merge as much binary operands as it
|
||||
fits in column limit, but here we need each bit on new line to make it
|
||||
readable, so let's disable clang-format for x86_ins_capability_masks.
|
||||
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
criu/arch/x86/cpu.c | 139 ++++++++++++++++++++++++++++----------------
|
||||
1 file changed, 89 insertions(+), 50 deletions(-)
|
||||
|
||||
diff --git a/criu/arch/x86/cpu.c b/criu/arch/x86/cpu.c
|
||||
index d02f4abd5..b3a7ca636 100644
|
||||
--- a/criu/arch/x86/cpu.c
|
||||
+++ b/criu/arch/x86/cpu.c
|
||||
@@ -107,64 +107,103 @@ int cpu_dump_cpuinfo(void)
|
||||
|
||||
#define __ins_bit(__l, __v) (1u << ((__v)-32u * (__l)))
|
||||
|
||||
+// clang-format off
|
||||
static uint32_t x86_ins_capability_mask[NCAPINTS] = {
|
||||
- [CPUID_1_EDX] = __ins_bit(CPUID_1_EDX, X86_FEATURE_FPU) | __ins_bit(CPUID_1_EDX, X86_FEATURE_TSC) |
|
||||
- __ins_bit(CPUID_1_EDX, X86_FEATURE_CX8) | __ins_bit(CPUID_1_EDX, X86_FEATURE_SEP) |
|
||||
- __ins_bit(CPUID_1_EDX, X86_FEATURE_CMOV) | __ins_bit(CPUID_1_EDX, X86_FEATURE_CLFLUSH) |
|
||||
- __ins_bit(CPUID_1_EDX, X86_FEATURE_MMX) | __ins_bit(CPUID_1_EDX, X86_FEATURE_FXSR) |
|
||||
- __ins_bit(CPUID_1_EDX, X86_FEATURE_XMM) | __ins_bit(CPUID_1_EDX, X86_FEATURE_XMM2),
|
||||
-
|
||||
- [CPUID_8000_0001_EDX] = __ins_bit(CPUID_8000_0001_EDX, X86_FEATURE_SYSCALL) |
|
||||
- __ins_bit(CPUID_8000_0001_EDX, X86_FEATURE_MMXEXT) |
|
||||
- __ins_bit(CPUID_8000_0001_EDX, X86_FEATURE_RDTSCP) |
|
||||
- __ins_bit(CPUID_8000_0001_EDX, X86_FEATURE_3DNOWEXT) |
|
||||
- __ins_bit(CPUID_8000_0001_EDX, X86_FEATURE_3DNOW),
|
||||
-
|
||||
- [CPUID_LNX_1] = __ins_bit(CPUID_LNX_1, X86_FEATURE_REP_GOOD) | __ins_bit(CPUID_LNX_1, X86_FEATURE_NOPL),
|
||||
-
|
||||
- [CPUID_1_ECX] = __ins_bit(CPUID_1_ECX, X86_FEATURE_XMM3) | __ins_bit(CPUID_1_ECX, X86_FEATURE_PCLMULQDQ) |
|
||||
- __ins_bit(CPUID_1_ECX, X86_FEATURE_MWAIT) | __ins_bit(CPUID_1_ECX, X86_FEATURE_SSSE3) |
|
||||
- __ins_bit(CPUID_1_ECX, X86_FEATURE_CX16) | __ins_bit(CPUID_1_ECX, X86_FEATURE_XMM4_1) |
|
||||
- __ins_bit(CPUID_1_ECX, X86_FEATURE_XMM4_2) | __ins_bit(CPUID_1_ECX, X86_FEATURE_MOVBE) |
|
||||
- __ins_bit(CPUID_1_ECX, X86_FEATURE_POPCNT) | __ins_bit(CPUID_1_ECX, X86_FEATURE_AES) |
|
||||
- __ins_bit(CPUID_1_ECX, X86_FEATURE_XSAVE) | __ins_bit(CPUID_1_ECX, X86_FEATURE_OSXSAVE) |
|
||||
- __ins_bit(CPUID_1_ECX, X86_FEATURE_AVX) | __ins_bit(CPUID_1_ECX, X86_FEATURE_F16C) |
|
||||
- __ins_bit(CPUID_1_ECX, X86_FEATURE_RDRAND),
|
||||
+ [CPUID_1_EDX] =
|
||||
+ __ins_bit(CPUID_1_EDX, X86_FEATURE_FPU) |
|
||||
+ __ins_bit(CPUID_1_EDX, X86_FEATURE_TSC) |
|
||||
+ __ins_bit(CPUID_1_EDX, X86_FEATURE_CX8) |
|
||||
+ __ins_bit(CPUID_1_EDX, X86_FEATURE_SEP) |
|
||||
+ __ins_bit(CPUID_1_EDX, X86_FEATURE_CMOV) |
|
||||
+ __ins_bit(CPUID_1_EDX, X86_FEATURE_CLFLUSH) |
|
||||
+ __ins_bit(CPUID_1_EDX, X86_FEATURE_MMX) |
|
||||
+ __ins_bit(CPUID_1_EDX, X86_FEATURE_FXSR) |
|
||||
+ __ins_bit(CPUID_1_EDX, X86_FEATURE_XMM) |
|
||||
+ __ins_bit(CPUID_1_EDX, X86_FEATURE_XMM2),
|
||||
+
|
||||
+ [CPUID_8000_0001_EDX] =
|
||||
+ __ins_bit(CPUID_8000_0001_EDX, X86_FEATURE_SYSCALL) |
|
||||
+ __ins_bit(CPUID_8000_0001_EDX, X86_FEATURE_MMXEXT) |
|
||||
+ __ins_bit(CPUID_8000_0001_EDX, X86_FEATURE_RDTSCP) |
|
||||
+ __ins_bit(CPUID_8000_0001_EDX, X86_FEATURE_3DNOWEXT) |
|
||||
+ __ins_bit(CPUID_8000_0001_EDX, X86_FEATURE_3DNOW),
|
||||
+
|
||||
+ [CPUID_LNX_1] =
|
||||
+ __ins_bit(CPUID_LNX_1, X86_FEATURE_REP_GOOD) |
|
||||
+ __ins_bit(CPUID_LNX_1, X86_FEATURE_NOPL),
|
||||
+
|
||||
+ [CPUID_1_ECX] =
|
||||
+ __ins_bit(CPUID_1_ECX, X86_FEATURE_XMM3) |
|
||||
+ __ins_bit(CPUID_1_ECX, X86_FEATURE_PCLMULQDQ) |
|
||||
+ __ins_bit(CPUID_1_ECX, X86_FEATURE_MWAIT) |
|
||||
+ __ins_bit(CPUID_1_ECX, X86_FEATURE_SSSE3) |
|
||||
+ __ins_bit(CPUID_1_ECX, X86_FEATURE_CX16) |
|
||||
+ __ins_bit(CPUID_1_ECX, X86_FEATURE_XMM4_1) |
|
||||
+ __ins_bit(CPUID_1_ECX, X86_FEATURE_XMM4_2) |
|
||||
+ __ins_bit(CPUID_1_ECX, X86_FEATURE_MOVBE) |
|
||||
+ __ins_bit(CPUID_1_ECX, X86_FEATURE_POPCNT) |
|
||||
+ __ins_bit(CPUID_1_ECX, X86_FEATURE_AES) |
|
||||
+ __ins_bit(CPUID_1_ECX, X86_FEATURE_XSAVE) |
|
||||
+ __ins_bit(CPUID_1_ECX, X86_FEATURE_OSXSAVE) |
|
||||
+ __ins_bit(CPUID_1_ECX, X86_FEATURE_AVX) |
|
||||
+ __ins_bit(CPUID_1_ECX, X86_FEATURE_F16C) |
|
||||
+ __ins_bit(CPUID_1_ECX, X86_FEATURE_RDRAND),
|
||||
|
||||
[CPUID_8000_0001_ECX] =
|
||||
- __ins_bit(CPUID_8000_0001_ECX, X86_FEATURE_ABM) | __ins_bit(CPUID_8000_0001_ECX, X86_FEATURE_SSE4A) |
|
||||
- __ins_bit(CPUID_8000_0001_ECX, X86_FEATURE_MISALIGNSSE) |
|
||||
- __ins_bit(CPUID_8000_0001_ECX, X86_FEATURE_3DNOWPREFETCH) |
|
||||
- __ins_bit(CPUID_8000_0001_ECX, X86_FEATURE_XOP) | __ins_bit(CPUID_8000_0001_ECX, X86_FEATURE_FMA4) |
|
||||
- __ins_bit(CPUID_8000_0001_ECX, X86_FEATURE_TBM),
|
||||
+ __ins_bit(CPUID_8000_0001_ECX, X86_FEATURE_ABM) |
|
||||
+ __ins_bit(CPUID_8000_0001_ECX, X86_FEATURE_SSE4A) |
|
||||
+ __ins_bit(CPUID_8000_0001_ECX, X86_FEATURE_MISALIGNSSE) |
|
||||
+ __ins_bit(CPUID_8000_0001_ECX, X86_FEATURE_3DNOWPREFETCH) |
|
||||
+ __ins_bit(CPUID_8000_0001_ECX, X86_FEATURE_XOP) |
|
||||
+ __ins_bit(CPUID_8000_0001_ECX, X86_FEATURE_FMA4) |
|
||||
+ __ins_bit(CPUID_8000_0001_ECX, X86_FEATURE_TBM),
|
||||
|
||||
[CPUID_7_0_EBX] =
|
||||
- __ins_bit(CPUID_7_0_EBX, X86_FEATURE_FSGSBASE) | __ins_bit(CPUID_7_0_EBX, X86_FEATURE_BMI1) |
|
||||
- __ins_bit(CPUID_7_0_EBX, X86_FEATURE_HLE) | __ins_bit(CPUID_7_0_EBX, X86_FEATURE_AVX2) |
|
||||
- __ins_bit(CPUID_7_0_EBX, X86_FEATURE_BMI2) | __ins_bit(CPUID_7_0_EBX, X86_FEATURE_ERMS) |
|
||||
- __ins_bit(CPUID_7_0_EBX, X86_FEATURE_RTM) | __ins_bit(CPUID_7_0_EBX, X86_FEATURE_MPX) |
|
||||
- __ins_bit(CPUID_7_0_EBX, X86_FEATURE_AVX512F) | __ins_bit(CPUID_7_0_EBX, X86_FEATURE_AVX512DQ) |
|
||||
- __ins_bit(CPUID_7_0_EBX, X86_FEATURE_RDSEED) | __ins_bit(CPUID_7_0_EBX, X86_FEATURE_ADX) |
|
||||
- __ins_bit(CPUID_7_0_EBX, X86_FEATURE_CLFLUSHOPT) | __ins_bit(CPUID_7_0_EBX, X86_FEATURE_AVX512PF) |
|
||||
- __ins_bit(CPUID_7_0_EBX, X86_FEATURE_AVX512ER) | __ins_bit(CPUID_7_0_EBX, X86_FEATURE_AVX512CD) |
|
||||
- __ins_bit(CPUID_7_0_EBX, X86_FEATURE_SHA_NI) | __ins_bit(CPUID_7_0_EBX, X86_FEATURE_AVX512BW) |
|
||||
- __ins_bit(CPUID_7_0_EBX, X86_FEATURE_AVX512VL),
|
||||
-
|
||||
- [CPUID_D_1_EAX] = __ins_bit(CPUID_D_1_EAX, X86_FEATURE_XSAVEOPT) |
|
||||
- __ins_bit(CPUID_D_1_EAX, X86_FEATURE_XSAVEC) | __ins_bit(CPUID_D_1_EAX, X86_FEATURE_XGETBV1),
|
||||
+ __ins_bit(CPUID_7_0_EBX, X86_FEATURE_FSGSBASE) |
|
||||
+ __ins_bit(CPUID_7_0_EBX, X86_FEATURE_BMI1) |
|
||||
+ __ins_bit(CPUID_7_0_EBX, X86_FEATURE_HLE) |
|
||||
+ __ins_bit(CPUID_7_0_EBX, X86_FEATURE_AVX2) |
|
||||
+ __ins_bit(CPUID_7_0_EBX, X86_FEATURE_BMI2) |
|
||||
+ __ins_bit(CPUID_7_0_EBX, X86_FEATURE_ERMS) |
|
||||
+ __ins_bit(CPUID_7_0_EBX, X86_FEATURE_RTM) |
|
||||
+ __ins_bit(CPUID_7_0_EBX, X86_FEATURE_MPX) |
|
||||
+ __ins_bit(CPUID_7_0_EBX, X86_FEATURE_AVX512F) |
|
||||
+ __ins_bit(CPUID_7_0_EBX, X86_FEATURE_AVX512DQ) |
|
||||
+ __ins_bit(CPUID_7_0_EBX, X86_FEATURE_RDSEED) |
|
||||
+ __ins_bit(CPUID_7_0_EBX, X86_FEATURE_ADX) |
|
||||
+ __ins_bit(CPUID_7_0_EBX, X86_FEATURE_CLFLUSHOPT) |
|
||||
+ __ins_bit(CPUID_7_0_EBX, X86_FEATURE_AVX512PF) |
|
||||
+ __ins_bit(CPUID_7_0_EBX, X86_FEATURE_AVX512ER) |
|
||||
+ __ins_bit(CPUID_7_0_EBX, X86_FEATURE_AVX512CD) |
|
||||
+ __ins_bit(CPUID_7_0_EBX, X86_FEATURE_SHA_NI) |
|
||||
+ __ins_bit(CPUID_7_0_EBX, X86_FEATURE_AVX512BW) |
|
||||
+ __ins_bit(CPUID_7_0_EBX, X86_FEATURE_AVX512VL),
|
||||
+
|
||||
+ [CPUID_D_1_EAX] =
|
||||
+ __ins_bit(CPUID_D_1_EAX, X86_FEATURE_XSAVEOPT) |
|
||||
+ __ins_bit(CPUID_D_1_EAX, X86_FEATURE_XSAVEC) |
|
||||
+ __ins_bit(CPUID_D_1_EAX, X86_FEATURE_XGETBV1),
|
||||
|
||||
[CPUID_7_0_ECX] =
|
||||
- __ins_bit(CPUID_7_0_ECX, X86_FEATURE_AVX512VBMI) | __ins_bit(CPUID_7_0_ECX, X86_FEATURE_AVX512_VBMI2) |
|
||||
- __ins_bit(CPUID_7_0_ECX, X86_FEATURE_GFNI) | __ins_bit(CPUID_7_0_ECX, X86_FEATURE_VAES) |
|
||||
- __ins_bit(CPUID_7_0_ECX, X86_FEATURE_VPCLMULQDQ) | __ins_bit(CPUID_7_0_ECX, X86_FEATURE_AVX512_VNNI) |
|
||||
- __ins_bit(CPUID_7_0_ECX, X86_FEATURE_AVX512_BITALG) | __ins_bit(CPUID_7_0_ECX, X86_FEATURE_TME) |
|
||||
- __ins_bit(CPUID_7_0_ECX, X86_FEATURE_AVX512_VPOPCNTDQ) | __ins_bit(CPUID_7_0_ECX, X86_FEATURE_RDPID),
|
||||
-
|
||||
- [CPUID_8000_0008_EBX] = __ins_bit(CPUID_8000_0008_EBX, X86_FEATURE_CLZERO),
|
||||
-
|
||||
- [CPUID_7_0_EDX] = __ins_bit(CPUID_7_0_EDX, X86_FEATURE_AVX512_4VNNIW) |
|
||||
- __ins_bit(CPUID_7_0_EDX, X86_FEATURE_AVX512_4FMAPS),
|
||||
+ __ins_bit(CPUID_7_0_ECX, X86_FEATURE_AVX512VBMI) |
|
||||
+ __ins_bit(CPUID_7_0_ECX, X86_FEATURE_AVX512_VBMI2) |
|
||||
+ __ins_bit(CPUID_7_0_ECX, X86_FEATURE_GFNI) |
|
||||
+ __ins_bit(CPUID_7_0_ECX, X86_FEATURE_VAES) |
|
||||
+ __ins_bit(CPUID_7_0_ECX, X86_FEATURE_VPCLMULQDQ) |
|
||||
+ __ins_bit(CPUID_7_0_ECX, X86_FEATURE_AVX512_VNNI) |
|
||||
+ __ins_bit(CPUID_7_0_ECX, X86_FEATURE_AVX512_BITALG) |
|
||||
+ __ins_bit(CPUID_7_0_ECX, X86_FEATURE_TME) |
|
||||
+ __ins_bit(CPUID_7_0_ECX, X86_FEATURE_AVX512_VPOPCNTDQ) |
|
||||
+ __ins_bit(CPUID_7_0_ECX, X86_FEATURE_RDPID),
|
||||
+
|
||||
+ [CPUID_8000_0008_EBX] =
|
||||
+ __ins_bit(CPUID_8000_0008_EBX, X86_FEATURE_CLZERO),
|
||||
+
|
||||
+ [CPUID_7_0_EDX] =
|
||||
+ __ins_bit(CPUID_7_0_EDX, X86_FEATURE_AVX512_4VNNIW) |
|
||||
+ __ins_bit(CPUID_7_0_EDX, X86_FEATURE_AVX512_4FMAPS),
|
||||
};
|
||||
+// clang-format on
|
||||
|
||||
#undef __ins_bit
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
44
0046-ci-disable-socket-raw-test-on-centos8.patch
Normal file
44
0046-ci-disable-socket-raw-test-on-centos8.patch
Normal file
@ -0,0 +1,44 @@
|
||||
From 268bd349a2eea76ab18763bc56c12d5a69a2a51d Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Fri, 19 Nov 2021 10:08:37 +0300
|
||||
Subject: [PATCH 046/120] ci: disable socket-raw test on centos8
|
||||
|
||||
We see error in centos8 ci on restore of socket-raw test:
|
||||
|
||||
inet: \tRestore: family AF_INET type SOCK_RAW proto 66
|
||||
port 66 state TCP_CLOSE src_addr 0.0.0.0
|
||||
Error (criu/sk-inet.c:834): inet: Can't create inet socket:
|
||||
Protocol not supported
|
||||
|
||||
Centos 8 kernel replaces IPPROTO_MPTCP(262) with "in-kernel" value
|
||||
IPPROTO_MPTCP_KERN(66) on inet_create(), but later shows this inkernel
|
||||
value to criu when listing sockets info. Same code in inet_create()
|
||||
returns EPROTONOSUPPORT on the attempr to create socket with
|
||||
IPPROTO_MPTCP_KERN. So this ci error is completely rh8 kernel related.
|
||||
Kernel should not show "in-kernel" value to userspace. But anyway this
|
||||
is already changed in Centos 9 kernel, so we can just skip socket-raw
|
||||
test on Centos 8.
|
||||
|
||||
v2: use cirrus.yml
|
||||
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
.cirrus.yml | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/.cirrus.yml b/.cirrus.yml
|
||||
index 671178d8b..235b9821e 100644
|
||||
--- a/.cirrus.yml
|
||||
+++ b/.cirrus.yml
|
||||
@@ -47,7 +47,7 @@ task:
|
||||
pip3 install junit_xml
|
||||
|
||||
build_script: |
|
||||
- make -C scripts/ci local SKIP_CI_PREP=1 CC=gcc CD_TO_TOP=1
|
||||
+ make -C scripts/ci local SKIP_CI_PREP=1 CC=gcc CD_TO_TOP=1 ZDTM_OPTS="-x zdtm/static/socket-raw"
|
||||
|
||||
task:
|
||||
name: CentOS 7 based test
|
||||
--
|
||||
2.34.1
|
||||
|
||||
60
0047-zdtm.py-make-tests-with-link_remap-exclusive.patch
Normal file
60
0047-zdtm.py-make-tests-with-link_remap-exclusive.patch
Normal file
@ -0,0 +1,60 @@
|
||||
From 014e4f3002a5b5f01f619252cd0b1b1f4632aa9b Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Wed, 3 Nov 2021 18:34:11 +0300
|
||||
Subject: [PATCH 047/120] zdtm.py: make tests with --link_remap exclusive
|
||||
|
||||
We see that tests mntns_ghost01 and unlink_fstat03 can run
|
||||
simultaneousely and thus the former sees leftover link_remap.* files in
|
||||
the test directory created by the latter, and the latter is still
|
||||
running so it's ok to have link_remap.* at this point.
|
||||
|
||||
Let's implicitly make all --link-remap tests exclusive (not running in
|
||||
parallel).
|
||||
|
||||
Fixes: #1633
|
||||
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
test/zdtm.py | 19 +++++++++++++++++--
|
||||
1 file changed, 17 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/test/zdtm.py b/test/zdtm.py
|
||||
index fc7b8a183..b62136e96 100755
|
||||
--- a/test/zdtm.py
|
||||
+++ b/test/zdtm.py
|
||||
@@ -1997,7 +1997,22 @@ class Launcher:
|
||||
raise Exception("The kernel is tainted: %r (%r)" %
|
||||
(taint, self.__taint))
|
||||
|
||||
- if test_flag(desc, 'excl'):
|
||||
+ '''
|
||||
+ The option --link-remap allows criu to hardlink open files back to the
|
||||
+ file-system on dump (should be removed on restore) and we have a sanity
|
||||
+ check in check_visible_state that they were actually removed at least
|
||||
+ from the root test directory after restore.
|
||||
+
|
||||
+ As zdtm runs all tests from the same cwd (e.g.: test/zdtm/static) in
|
||||
+ parallel, hardlinks from one test can mess up with sanity checks of
|
||||
+ another test or even one test can by mistake use hardlinks created by
|
||||
+ another test which is even worse.
|
||||
+
|
||||
+ So let's make all tests using --link-remap option non parallel.
|
||||
+ '''
|
||||
+ link_remap_excl = '--link-remap' in desc.get('opts', '').split() + desc.get('dopts', '').split() + desc.get('ropts', '').split()
|
||||
+
|
||||
+ if test_flag(desc, 'excl') or link_remap_excl:
|
||||
self.wait_all()
|
||||
|
||||
self.__nr += 1
|
||||
@@ -2030,7 +2045,7 @@ class Launcher:
|
||||
"start": time.time()
|
||||
}
|
||||
|
||||
- if test_flag(desc, 'excl'):
|
||||
+ if test_flag(desc, 'excl') or link_remap_excl:
|
||||
self.wait()
|
||||
|
||||
def __wait_one(self, flags):
|
||||
--
|
||||
2.34.1
|
||||
|
||||
108
0048-tests-improve-the-deterministic-behavior-of-the-test.patch
Normal file
108
0048-tests-improve-the-deterministic-behavior-of-the-test.patch
Normal file
@ -0,0 +1,108 @@
|
||||
From fd48f1ae384a4be34f45cbd10c7fd5525fffe2e7 Mon Sep 17 00:00:00 2001
|
||||
From: Nicolas Viennot <Nicolas.Viennot@twosigma.com>
|
||||
Date: Fri, 29 Oct 2021 03:01:14 +0000
|
||||
Subject: [PATCH 048/120] tests: improve the deterministic behavior of the test
|
||||
suite
|
||||
|
||||
Various I/O objects are unclosed when the object falls out of scope.
|
||||
This can lead to non-deterministic behavior.
|
||||
|
||||
Also fixed a few missing list(). It doesn't play way with python3.
|
||||
e.g., `random.shuffle(filter(...))` doesn't work.
|
||||
|
||||
Signed-off-by: Nicolas Viennot <Nicolas.Viennot@twosigma.com>
|
||||
---
|
||||
test/zdtm.py | 25 +++++++++++++++----------
|
||||
1 file changed, 15 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/test/zdtm.py b/test/zdtm.py
|
||||
index b62136e96..b98770079 100755
|
||||
--- a/test/zdtm.py
|
||||
+++ b/test/zdtm.py
|
||||
@@ -202,6 +202,8 @@ class ns_flavor:
|
||||
|
||||
def __copy_libs(self, binary):
|
||||
ldd = subprocess.Popen(["ldd", binary], stdout=subprocess.PIPE)
|
||||
+ stdout, _ = ldd.communicate()
|
||||
+
|
||||
xl = re.compile(
|
||||
r'^(linux-gate.so|linux-vdso(64)?.so|not a dynamic|.*\s*ldd\s)')
|
||||
|
||||
@@ -216,11 +218,9 @@ class ns_flavor:
|
||||
map(
|
||||
lambda x: str(x).strip(),
|
||||
filter(lambda x: str(x).startswith('\t'),
|
||||
- ldd.stdout.read().decode(
|
||||
+ stdout.decode(
|
||||
'ascii').splitlines())))))
|
||||
|
||||
- ldd.wait()
|
||||
-
|
||||
for lib in libs:
|
||||
if not os.access(lib, os.F_OK):
|
||||
raise test_fail_exc("Can't find lib %s required by %s" %
|
||||
@@ -331,8 +331,7 @@ def decode_flav(i):
|
||||
|
||||
def tail(path):
|
||||
p = subprocess.Popen(['tail', '-n1', path], stdout=subprocess.PIPE)
|
||||
- out = p.stdout.readline()
|
||||
- p.wait()
|
||||
+ out, _ = p.communicate()
|
||||
return out.decode()
|
||||
|
||||
|
||||
@@ -801,7 +800,7 @@ class groups_test(zdtm_test):
|
||||
if flavor.ns:
|
||||
self.__real_name = name
|
||||
with open(name) as fd:
|
||||
- self.__subs = map(lambda x: x.strip(), fd.readlines())
|
||||
+ self.__subs = list(map(lambda x: x.strip(), fd.readlines()))
|
||||
print("Subs:\n%s" % '\n'.join(self.__subs))
|
||||
else:
|
||||
self.__real_name = ''
|
||||
@@ -819,8 +818,8 @@ class groups_test(zdtm_test):
|
||||
subprocess.check_call(s_args + [tname + '.cleanout'])
|
||||
s = subprocess.Popen(s_args + ['--dry-run', tname + '.pid'],
|
||||
stdout=subprocess.PIPE)
|
||||
- cmd = s.stdout.readlines().pop().strip()
|
||||
- s.wait()
|
||||
+ out, _ = s.communicate()
|
||||
+ cmd = out.decode().splitlines()[-1].strip()
|
||||
|
||||
return 'cd /' + tdir + ' && ' + cmd
|
||||
|
||||
@@ -2045,6 +2044,9 @@ class Launcher:
|
||||
"start": time.time()
|
||||
}
|
||||
|
||||
+ if log:
|
||||
+ log.close()
|
||||
+
|
||||
if test_flag(desc, 'excl') or link_remap_excl:
|
||||
self.wait()
|
||||
|
||||
@@ -2068,6 +2070,9 @@ class Launcher:
|
||||
self.__runtest += 1
|
||||
if pid != 0:
|
||||
sub = self.__subs.pop(pid)
|
||||
+ # The following wait() is not useful for our domain logic.
|
||||
+ # It's useful for taming warnings in subprocess.Popen.__del__()
|
||||
+ sub['sub'].wait()
|
||||
tc = None
|
||||
if self.__junit_test_cases is not None:
|
||||
tc = TestCase(sub['name'],
|
||||
@@ -2168,9 +2173,9 @@ def all_tests(opts):
|
||||
continue
|
||||
files.append(fp)
|
||||
excl = list(map(lambda x: os.path.join(desc['dir'], x), desc['exclude']))
|
||||
- tlist = filter(
|
||||
+ tlist = list(filter(
|
||||
lambda x: not x.endswith('.checkskip') and not x.endswith('.hook') and
|
||||
- x not in excl, map(lambda x: x.strip(), files))
|
||||
+ x not in excl, map(lambda x: x.strip(), files)))
|
||||
return tlist
|
||||
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,99 @@
|
||||
From d4ae0b77f9ff0380e9766d1a4e0301b1d1521da3 Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Tue, 23 Nov 2021 15:06:03 +0300
|
||||
Subject: [PATCH 049/120] clang-format/zdtm: fix clang complains about strange
|
||||
elseifs
|
||||
|
||||
Clang-format v13 on my Fedora 35 complains about these hunks, more over
|
||||
reading the formating we had before is a pain:
|
||||
|
||||
} else /* comment */
|
||||
if (smth) {
|
||||
fail("")
|
||||
return -1;
|
||||
}
|
||||
|
||||
Let's make explicit {} braces for else, this way it looks much better.
|
||||
|
||||
Fixes: 93dd984ca ("Run 'make indent' on all C files")
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
test/zdtm/static/mprotect00.c | 16 ++++++++++------
|
||||
test/zdtm/static/shm-mp.c | 16 ++++++++++------
|
||||
2 files changed, 20 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/test/zdtm/static/mprotect00.c b/test/zdtm/static/mprotect00.c
|
||||
index 006b64772..717b7ddcf 100644
|
||||
--- a/test/zdtm/static/mprotect00.c
|
||||
+++ b/test/zdtm/static/mprotect00.c
|
||||
@@ -44,10 +44,12 @@ static int check_prot(char *ptr, int prot)
|
||||
fail("PROT_READ bypassed");
|
||||
return -1;
|
||||
}
|
||||
- } else /* we come here on return from SIGSEGV handler */
|
||||
+ } else {
|
||||
+ /* we come here on return from SIGSEGV handler */
|
||||
if (prot & PROT_READ) {
|
||||
- fail("PROT_READ rejected");
|
||||
- return -1;
|
||||
+ fail("PROT_READ rejected");
|
||||
+ return -1;
|
||||
+ }
|
||||
}
|
||||
|
||||
if (!sigsetjmp(segv_ret, 1)) {
|
||||
@@ -56,10 +58,12 @@ static int check_prot(char *ptr, int prot)
|
||||
fail("PROT_WRITE bypassed");
|
||||
return -1;
|
||||
}
|
||||
- } else /* we come here on return from SIGSEGV handler */
|
||||
+ } else {
|
||||
+ /* we come here on return from SIGSEGV handler */
|
||||
if (prot & PROT_WRITE) {
|
||||
- fail("PROT_WRITE rejected");
|
||||
- return -1;
|
||||
+ fail("PROT_WRITE rejected");
|
||||
+ return -1;
|
||||
+ }
|
||||
}
|
||||
|
||||
if (signal(SIGSEGV, SIG_DFL) == SIG_ERR) {
|
||||
diff --git a/test/zdtm/static/shm-mp.c b/test/zdtm/static/shm-mp.c
|
||||
index 1929dac19..c95f3d84c 100644
|
||||
--- a/test/zdtm/static/shm-mp.c
|
||||
+++ b/test/zdtm/static/shm-mp.c
|
||||
@@ -33,10 +33,12 @@ static int check_prot(char *ptr, char val, int prot)
|
||||
fail("PROT_READ bypassed");
|
||||
return -1;
|
||||
}
|
||||
- } else /* we come here on return from SIGSEGV handler */
|
||||
+ } else {
|
||||
+ /* we come here on return from SIGSEGV handler */
|
||||
if (prot & PROT_READ) {
|
||||
- fail("PROT_READ rejected");
|
||||
- return -1;
|
||||
+ fail("PROT_READ rejected");
|
||||
+ return -1;
|
||||
+ }
|
||||
}
|
||||
|
||||
if (!sigsetjmp(segv_ret, 1)) {
|
||||
@@ -45,10 +47,12 @@ static int check_prot(char *ptr, char val, int prot)
|
||||
fail("PROT_WRITE bypassed");
|
||||
return -1;
|
||||
}
|
||||
- } else /* we come here on return from SIGSEGV handler */
|
||||
+ } else {
|
||||
+ /* we come here on return from SIGSEGV handler */
|
||||
if (prot & PROT_WRITE) {
|
||||
- fail("PROT_WRITE rejected");
|
||||
- return -1;
|
||||
+ fail("PROT_WRITE rejected");
|
||||
+ return -1;
|
||||
+ }
|
||||
}
|
||||
|
||||
if (signal(SIGSEGV, SIG_DFL) == SIG_ERR) {
|
||||
--
|
||||
2.34.1
|
||||
|
||||
72
0050-seize-restore-cgroup-freezer-to-right-state.patch
Normal file
72
0050-seize-restore-cgroup-freezer-to-right-state.patch
Normal file
@ -0,0 +1,72 @@
|
||||
From 5643067ce662e5ca1730f36e209f17eaf6818f90 Mon Sep 17 00:00:00 2001
|
||||
From: Liu Hua <weldonliu@tencent.com>
|
||||
Date: Fri, 5 Nov 2021 17:08:51 +0800
|
||||
Subject: [PATCH 050/120] seize: restore cgroup freezer to right state
|
||||
|
||||
The new freezer_state is a complete equivalent of old freezer_thawed
|
||||
except for the initial value. If old freezer_thawed was not initialized
|
||||
it was 0 and in freezer_restore_state were threated as if we need to
|
||||
freeze cgroup "back", thus before this patch if criu dump failed before
|
||||
freezing dumpee, criu always freeze dumpee in cr_dump_finish which is
|
||||
wrong. Switching to freezer_state initialized with FREEZER_ERROR fixes
|
||||
the problem.
|
||||
|
||||
v2: improve description, rename to origin_freezer_state
|
||||
|
||||
Signed-off-by: Liu Hua <weldonliu@tencent.com>
|
||||
---
|
||||
criu/seize.c | 13 +++++++------
|
||||
1 file changed, 7 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/criu/seize.c b/criu/seize.c
|
||||
index 95bf9ef0c..58564ca74 100644
|
||||
--- a/criu/seize.c
|
||||
+++ b/criu/seize.c
|
||||
@@ -131,11 +131,11 @@ static enum freezer_state get_freezer_state(int fd)
|
||||
return get_freezer_v1_state(fd);
|
||||
}
|
||||
|
||||
-static bool freezer_thawed;
|
||||
+static enum freezer_state origin_freezer_state = FREEZER_ERROR;
|
||||
|
||||
const char *get_real_freezer_state(void)
|
||||
{
|
||||
- return freezer_thawed ? thawed : frozen;
|
||||
+ return origin_freezer_state == THAWED ? thawed : frozen;
|
||||
}
|
||||
|
||||
static int freezer_write_state(int fd, enum freezer_state new_state)
|
||||
@@ -192,7 +192,7 @@ static int freezer_restore_state(void)
|
||||
int fd;
|
||||
int ret;
|
||||
|
||||
- if (!opts.freeze_cgroup || freezer_thawed)
|
||||
+ if (!opts.freeze_cgroup || origin_freezer_state != FROZEN)
|
||||
return 0;
|
||||
|
||||
fd = freezer_open();
|
||||
@@ -481,9 +481,10 @@ static int freeze_processes(void)
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
- if (state == THAWED) {
|
||||
- freezer_thawed = true;
|
||||
|
||||
+ origin_freezer_state = state == FREEZING ? FROZEN : state;
|
||||
+
|
||||
+ if (state == THAWED) {
|
||||
if (freezer_write_state(fd, FROZEN)) {
|
||||
close(fd);
|
||||
return -1;
|
||||
@@ -534,7 +535,7 @@ static int freeze_processes(void)
|
||||
}
|
||||
|
||||
err:
|
||||
- if (exit_code == 0 || freezer_thawed)
|
||||
+ if (exit_code == 0 || origin_freezer_state == THAWED)
|
||||
exit_code = freezer_write_state(fd, THAWED);
|
||||
|
||||
if (close(fd)) {
|
||||
--
|
||||
2.34.1
|
||||
|
||||
30
0051-ci-Use-latest-Fedora-for-lint-ci-runs-again.patch
Normal file
30
0051-ci-Use-latest-Fedora-for-lint-ci-runs-again.patch
Normal file
@ -0,0 +1,30 @@
|
||||
From def608a7fefd89ccac455da7a966ad7cd766398c Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Wed, 24 Nov 2021 11:37:58 +0300
|
||||
Subject: [PATCH 051/120] ci: Use latest Fedora for lint ci runs again
|
||||
|
||||
Now when we fixed clang-format complains in zdtm, let's switch to lates
|
||||
clang-format available. This is effectively a revert of commit 07a2f0265
|
||||
("ci: use Fedora 34 for lint CI runs").
|
||||
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
.github/workflows/lint.yml | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
|
||||
index 49eb6aaac..50b241e9f 100644
|
||||
--- a/.github/workflows/lint.yml
|
||||
+++ b/.github/workflows/lint.yml
|
||||
@@ -6,7 +6,7 @@ jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
- image: registry.fedoraproject.org/fedora:34
|
||||
+ image: registry.fedoraproject.org/fedora:latest
|
||||
steps:
|
||||
- name: Install tools
|
||||
run: sudo dnf -y install git make python3-flake8 ShellCheck clang-tools-extra which findutils
|
||||
--
|
||||
2.34.1
|
||||
|
||||
72
0052-crtools-ignore-SIGPIPE-in-swrk-mode.patch
Normal file
72
0052-crtools-ignore-SIGPIPE-in-swrk-mode.patch
Normal file
@ -0,0 +1,72 @@
|
||||
From 983464ffad11a0f8c5656492f3c342139acd2527 Mon Sep 17 00:00:00 2001
|
||||
From: Liu Hua <weldonliu@tencent.com>
|
||||
Date: Thu, 4 Nov 2021 10:04:22 +0800
|
||||
Subject: [PATCH 052/120] crtools: ignore SIGPIPE in swrk mode
|
||||
|
||||
Criu ignores SIGPIPE in most cases except swrk mode. And in the
|
||||
following situtation criu get killed by SIGPIPE and have no chance
|
||||
to do cleanup: Connection to page server is lost when we do disk-less
|
||||
migration, criu send PS_IOV_FLUSH via a broken connction in
|
||||
disconnect_from_page_server.
|
||||
|
||||
This patch let criu ignore SIGPIPE in all paths .
|
||||
|
||||
Signed-off-by: Liu Hua <weldonliu@tencent.com>
|
||||
---
|
||||
criu/crtools.c | 33 ++++++++++++++++++---------------
|
||||
1 file changed, 18 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/criu/crtools.c b/criu/crtools.c
|
||||
index 6a75cd1ea..81c0aa963 100644
|
||||
--- a/criu/crtools.c
|
||||
+++ b/criu/crtools.c
|
||||
@@ -106,6 +106,24 @@ int main(int argc, char *argv[], char *envp[])
|
||||
|
||||
log_set_loglevel(opts.log_level);
|
||||
|
||||
+ /*
|
||||
+ * There kernel might send us lethal signals in the following cases:
|
||||
+ * 1) Writing a pipe which reader has disappeared.
|
||||
+ * 2) Writing to a socket of type SOCK_STREAM which is no longer connected.
|
||||
+ * We deal with write()/Send() failures on our own, and prefer not to get killed.
|
||||
+ * So we ignore SIGPIPEs.
|
||||
+ *
|
||||
+ * Pipes are used in various places:
|
||||
+ * 1) Receiving application page data
|
||||
+ * 2) Transmitting data to the image streamer
|
||||
+ * 3) Emitting logs (potentially to a pipe).
|
||||
+ * Sockets are mainly used in transmitting memory data.
|
||||
+ */
|
||||
+ if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
|
||||
+ pr_perror("Failed to set a SIGPIPE signal ignore.");
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
if (optind < argc && !strcmp(argv[optind], "swrk")) {
|
||||
if (argc != optind + 2) {
|
||||
fprintf(stderr, "Usage: criu swrk <fd>\n");
|
||||
@@ -175,21 +193,6 @@ int main(int argc, char *argv[], char *envp[])
|
||||
}
|
||||
}
|
||||
|
||||
- /*
|
||||
- * The kernel might send us lethal signals when writing to a pipe
|
||||
- * which reader has disappeared. We deal with write() failures on our
|
||||
- * own, and prefer not to get killed. So we ignore SIGPIPEs.
|
||||
- *
|
||||
- * Pipes are used in various places:
|
||||
- * 1) Receiving application page data
|
||||
- * 2) Transmitting data to the image streamer
|
||||
- * 3) Emitting logs (potentially to a pipe).
|
||||
- */
|
||||
- if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
|
||||
- pr_perror("Failed to set a SIGPIPE signal ignore.");
|
||||
- return 1;
|
||||
- }
|
||||
-
|
||||
/*
|
||||
* When a process group becomes an orphan,
|
||||
* its processes are sent a SIGHUP signal
|
||||
--
|
||||
2.34.1
|
||||
|
||||
29
0053-ci-switch-to-centos-stream-8.patch
Normal file
29
0053-ci-switch-to-centos-stream-8.patch
Normal file
@ -0,0 +1,29 @@
|
||||
From 21873e0efd64f023a0d7b472ceca1f394f83e58e Mon Sep 17 00:00:00 2001
|
||||
From: Adrian Reber <areber@redhat.com>
|
||||
Date: Wed, 24 Nov 2021 16:13:01 +0000
|
||||
Subject: [PATCH 053/120] ci: switch to centos-stream-8
|
||||
|
||||
CentOS 8 goes EOL at the end of 2021. This switches our CentOS 8 based
|
||||
tests to CentOS Stream 8 which should be supported until 2024.
|
||||
|
||||
Signed-off-by: Adrian Reber <areber@redhat.com>
|
||||
---
|
||||
.cirrus.yml | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/.cirrus.yml b/.cirrus.yml
|
||||
index 235b9821e..ef0de54e9 100644
|
||||
--- a/.cirrus.yml
|
||||
+++ b/.cirrus.yml
|
||||
@@ -27,7 +27,7 @@ task:
|
||||
|
||||
compute_engine_instance:
|
||||
image_project: centos-cloud
|
||||
- image: family/centos-8
|
||||
+ image: family/centos-stream-8
|
||||
platform: linux
|
||||
cpu: 4
|
||||
memory: 8G
|
||||
--
|
||||
2.34.1
|
||||
|
||||
68
0054-check-cleanup-child-processes.patch
Normal file
68
0054-check-cleanup-child-processes.patch
Normal file
@ -0,0 +1,68 @@
|
||||
From 6754b16c2e95766493ac27e4122a3b63867133f5 Mon Sep 17 00:00:00 2001
|
||||
From: Nicolas Viennot <Nicolas.Viennot@twosigma.com>
|
||||
Date: Fri, 19 Nov 2021 20:58:13 +0000
|
||||
Subject: [PATCH 054/120] check: cleanup child processes
|
||||
|
||||
Always wait() for forked child processes. It avoid zombie processes in
|
||||
containers that don't have an init process reaping orphans.
|
||||
|
||||
Signed-off-by: Nicolas Viennot <Nicolas.Viennot@twosigma.com>
|
||||
---
|
||||
criu/cr-check.c | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/criu/cr-check.c b/criu/cr-check.c
|
||||
index e46c93815..0320b445a 100644
|
||||
--- a/criu/cr-check.c
|
||||
+++ b/criu/cr-check.c
|
||||
@@ -575,6 +575,7 @@ static pid_t fork_and_ptrace_attach(int (*child_setup)(void))
|
||||
if (read(sk, &c, 1) != 1) {
|
||||
close(sk);
|
||||
kill(pid, SIGKILL);
|
||||
+ waitpid(pid, NULL, 0);
|
||||
pr_perror("read");
|
||||
return -1;
|
||||
}
|
||||
@@ -584,6 +585,7 @@ static pid_t fork_and_ptrace_attach(int (*child_setup)(void))
|
||||
if (ptrace(PTRACE_ATTACH, pid, NULL, NULL) == -1) {
|
||||
pr_perror("Unable to ptrace the child");
|
||||
kill(pid, SIGKILL);
|
||||
+ waitpid(pid, NULL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -618,6 +620,7 @@ static int check_ptrace_peeksiginfo(void)
|
||||
}
|
||||
|
||||
kill(pid, SIGKILL);
|
||||
+ waitpid(pid, NULL, 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -768,6 +771,7 @@ static int check_special_mapping_mremap(void)
|
||||
/* Probably, we're interrupted with a signal - cleanup */
|
||||
pr_err("Failed to wait for a child %d\n", errno);
|
||||
kill(child, SIGKILL);
|
||||
+ waitpid(child, NULL, 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -806,6 +810,7 @@ static int check_ptrace_suspend_seccomp(void)
|
||||
}
|
||||
|
||||
kill(pid, SIGKILL);
|
||||
+ waitpid(pid, NULL, 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -846,6 +851,7 @@ static int check_ptrace_dump_seccomp_filters(void)
|
||||
}
|
||||
|
||||
kill(pid, SIGKILL);
|
||||
+ waitpid(pid, NULL, 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
156
0055-files-reg-fix-error-handling-in-open_path.patch
Normal file
156
0055-files-reg-fix-error-handling-in-open_path.patch
Normal file
@ -0,0 +1,156 @@
|
||||
From ae3bf06242d6a8bb2a9946cba4ace96e202ee3f4 Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Thu, 13 Feb 2020 10:43:14 +0300
|
||||
Subject: [PATCH 055/120] files-reg: fix error handling in open_path
|
||||
|
||||
1) On error paths need to close fd and unlock mutex.
|
||||
2) Make rfi_remap return special return code to identify EEXIST from
|
||||
linkat_hard, all other errors should be reported up.
|
||||
3) Report unlinkat error as criu should not corrupt fs.
|
||||
|
||||
Cherry-picked from Virtuozzo criu:
|
||||
https://src.openvz.org/projects/OVZ/repos/criu/commits/fe1d0be14
|
||||
|
||||
Changes: use close_safe(), fix order in "Fake %s -> %s link" error
|
||||
message.
|
||||
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
criu/files-reg.c | 47 +++++++++++++++++++++++++++++++----------------
|
||||
1 file changed, 31 insertions(+), 16 deletions(-)
|
||||
|
||||
diff --git a/criu/files-reg.c b/criu/files-reg.c
|
||||
index 679477c1c..4560f253e 100644
|
||||
--- a/criu/files-reg.c
|
||||
+++ b/criu/files-reg.c
|
||||
@@ -1867,6 +1867,9 @@ out:
|
||||
* This routine properly resolves d's path handling ghost/link-remaps.
|
||||
* The open_cb is a routine that does actual open, it differs for
|
||||
* files, directories, fifos, etc.
|
||||
+ *
|
||||
+ * Return 0 on success, -1 on error and 1 to indicate soft error, which can be
|
||||
+ * retried.
|
||||
*/
|
||||
|
||||
static int rfi_remap(struct reg_file_info *rfi, int *level)
|
||||
@@ -1932,6 +1935,8 @@ out_root:
|
||||
int errno_saved = errno;
|
||||
rm_parent_dirs(mntns_root, path, *level);
|
||||
errno = errno_saved;
|
||||
+ if (errno == EEXIST)
|
||||
+ return 1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -2008,11 +2013,12 @@ static bool validate_file(const int fd, const struct stat *fd_status, const stru
|
||||
|
||||
int open_path(struct file_desc *d, int (*open_cb)(int mntns_root, struct reg_file_info *, void *), void *arg)
|
||||
{
|
||||
- int tmp, mntns_root, level = 0;
|
||||
+ int tmp = -1, mntns_root, level = 0;
|
||||
struct reg_file_info *rfi;
|
||||
char *orig_path = NULL;
|
||||
char path[PATH_MAX];
|
||||
int inh_fd = -1;
|
||||
+ int ret;
|
||||
|
||||
if (inherited_fd(d, &tmp))
|
||||
return tmp;
|
||||
@@ -2049,14 +2055,9 @@ int open_path(struct file_desc *d, int (*open_cb)(int mntns_root, struct reg_fil
|
||||
*/
|
||||
orig_path = rfi->path;
|
||||
rfi->path = rfi->remap->rpath;
|
||||
- } else if (rfi_remap(rfi, &level) < 0) {
|
||||
+ } else if ((ret = rfi_remap(rfi, &level)) == 1) {
|
||||
static char tmp_path[PATH_MAX];
|
||||
|
||||
- if (errno != EEXIST) {
|
||||
- pr_perror("Can't link %s -> %s", rfi->remap->rpath, rfi->path);
|
||||
- return -1;
|
||||
- }
|
||||
-
|
||||
/*
|
||||
* The file whose name we're trying to create
|
||||
* exists. Need to pick some other one, we're
|
||||
@@ -2070,12 +2071,15 @@ int open_path(struct file_desc *d, int (*open_cb)(int mntns_root, struct reg_fil
|
||||
orig_path = rfi->path;
|
||||
rfi->path = tmp_path;
|
||||
snprintf(tmp_path, sizeof(tmp_path), "%s.cr_link", orig_path);
|
||||
- pr_debug("Fake %s -> %s link\n", rfi->path, rfi->remap->rpath);
|
||||
+ pr_debug("Fake %s -> %s link\n", rfi->remap->rpath, rfi->path);
|
||||
|
||||
- if (rfi_remap(rfi, &level) < 0) {
|
||||
+ if (rfi_remap(rfi, &level)) {
|
||||
pr_perror("Can't create even fake link!");
|
||||
- return -1;
|
||||
+ goto err;
|
||||
}
|
||||
+ } else if (ret < 0) {
|
||||
+ pr_perror("Can't link %s -> %s", rfi->remap->rpath, rfi->path);
|
||||
+ goto err;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2085,7 +2089,7 @@ ext:
|
||||
if (tmp < 0) {
|
||||
pr_perror("Can't open file %s", rfi->path);
|
||||
close_safe(&inh_fd);
|
||||
- return -1;
|
||||
+ goto err;
|
||||
}
|
||||
close_safe(&inh_fd);
|
||||
|
||||
@@ -2094,15 +2098,15 @@ ext:
|
||||
|
||||
if (fstat(tmp, &st) < 0) {
|
||||
pr_perror("Can't fstat opened file");
|
||||
- return -1;
|
||||
+ goto err;
|
||||
}
|
||||
|
||||
if (!validate_file(tmp, &st, rfi))
|
||||
- return -1;
|
||||
+ goto err;
|
||||
|
||||
if (rfi->rfe->has_mode && (st.st_mode != rfi->rfe->mode)) {
|
||||
pr_err("File %s has bad mode 0%o (expect 0%o)\n", rfi->path, (int)st.st_mode, rfi->rfe->mode);
|
||||
- return -1;
|
||||
+ goto err;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2115,7 +2119,11 @@ ext:
|
||||
|
||||
if (rfi->remap) {
|
||||
if (!rfi->remap->is_dir) {
|
||||
- unlinkat(mntns_root, rfi->path, 0);
|
||||
+ pr_debug("Unlink: %d:%s\n", rfi->rfe->mnt_id, rfi->path);
|
||||
+ if (unlinkat(mntns_root, rfi->path, 0)) {
|
||||
+ pr_perror("Failed to unlink the remap file");
|
||||
+ goto err;
|
||||
+ }
|
||||
rm_parent_dirs(mntns_root, rfi->path, level);
|
||||
}
|
||||
|
||||
@@ -2124,10 +2132,17 @@ ext:
|
||||
if (orig_path)
|
||||
rfi->path = orig_path;
|
||||
|
||||
- if (restore_fown(tmp, rfi->rfe->fown))
|
||||
+ if (restore_fown(tmp, rfi->rfe->fown)) {
|
||||
+ close(tmp);
|
||||
return -1;
|
||||
+ }
|
||||
|
||||
return tmp;
|
||||
+err:
|
||||
+ if (rfi->remap)
|
||||
+ mutex_unlock(remap_open_lock);
|
||||
+ close_safe(&tmp);
|
||||
+ return -1;
|
||||
}
|
||||
|
||||
int do_open_reg_noseek_flags(int ns_root_fd, struct reg_file_info *rfi, void *arg)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
116
0056-files-reg-fix-error-handling-of-rm_parent_dirs.patch
Normal file
116
0056-files-reg-fix-error-handling-of-rm_parent_dirs.patch
Normal file
@ -0,0 +1,116 @@
|
||||
From 2894e242562f3c639b6cb63f502d7445076d3db1 Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Thu, 13 Feb 2020 13:03:12 +0300
|
||||
Subject: [PATCH 056/120] files-reg: fix error handling of rm_parent_dirs
|
||||
|
||||
If unlinkat fails it means that fs is in "corrupted" state - spoiled
|
||||
with non-unlinked auxiliary directories.
|
||||
|
||||
While on it add fixme note as this function can be racy and BUG_ON if
|
||||
path contains double slashes.
|
||||
|
||||
Cherry-picked from Virtuozzo criu:
|
||||
https://src.openvz.org/projects/OVZ/repos/criu/commits/b7b4e69fd
|
||||
|
||||
Changes: simplify while loop condition, remove confusing FIXME, remove
|
||||
excess !count check in favour of while loop condition check
|
||||
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
criu/files-reg.c | 45 ++++++++++++++++++++++++++++++---------------
|
||||
1 file changed, 30 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/criu/files-reg.c b/criu/files-reg.c
|
||||
index 4560f253e..0e126a32e 100644
|
||||
--- a/criu/files-reg.c
|
||||
+++ b/criu/files-reg.c
|
||||
@@ -1792,30 +1792,42 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static void rm_parent_dirs(int mntns_root, char *path, int count)
|
||||
+static int rm_parent_dirs(int mntns_root, char *path, int count)
|
||||
{
|
||||
char *p, *prev = NULL;
|
||||
+ int ret = -1;
|
||||
|
||||
- if (!count)
|
||||
- return;
|
||||
-
|
||||
- while (count > 0) {
|
||||
- count -= 1;
|
||||
+ while (count-- > 0) {
|
||||
p = strrchr(path, '/');
|
||||
- if (p)
|
||||
+ if (p) {
|
||||
+ /* We don't handle "//" in path */
|
||||
+ BUG_ON(prev && (prev - p == 1));
|
||||
*p = '\0';
|
||||
+ } else {
|
||||
+ /* Inconsistent path and count */
|
||||
+ pr_perror("Can't strrchr \"/\" in \"%s\"/\"%s\"]"
|
||||
+ " left count=%d\n",
|
||||
+ path, prev ? prev + 1 : "", count + 1);
|
||||
+ goto err;
|
||||
+ }
|
||||
+
|
||||
if (prev)
|
||||
*prev = '/';
|
||||
+ prev = p;
|
||||
|
||||
- if (unlinkat(mntns_root, path, AT_REMOVEDIR))
|
||||
+ if (unlinkat(mntns_root, path, AT_REMOVEDIR)) {
|
||||
pr_perror("Can't remove %s AT %d", path, mntns_root);
|
||||
- else
|
||||
- pr_debug("Unlinked parent dir: %s AT %d\n", path, mntns_root);
|
||||
- prev = p;
|
||||
+ goto err;
|
||||
+ }
|
||||
+ pr_debug("Unlinked parent dir: %s AT %d\n", path, mntns_root);
|
||||
}
|
||||
|
||||
+ ret = 0;
|
||||
+err:
|
||||
if (prev)
|
||||
*prev = '/';
|
||||
+
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
/* Construct parent dir name and mkdir parent/grandparents if they're not exist */
|
||||
@@ -1847,6 +1859,7 @@ static int make_parent_dirs_if_need(int mntns_root, char *path)
|
||||
err = mkdirat(mntns_root, path, 0777);
|
||||
if (err && errno != EEXIST) {
|
||||
pr_perror("Can't create dir: %s AT %d", path, mntns_root);
|
||||
+ /* Failing anyway -> no retcode check */
|
||||
rm_parent_dirs(mntns_root, path, count);
|
||||
count = -1;
|
||||
goto out;
|
||||
@@ -1933,10 +1946,11 @@ out_root:
|
||||
|
||||
if (linkat_hard(mntns_root, rpath, mntns_root, path, rfi->remap->uid, rfi->remap->gid, 0) < 0) {
|
||||
int errno_saved = errno;
|
||||
- rm_parent_dirs(mntns_root, path, *level);
|
||||
- errno = errno_saved;
|
||||
- if (errno == EEXIST)
|
||||
+
|
||||
+ if (!rm_parent_dirs(mntns_root, path, *level) && errno_saved == EEXIST) {
|
||||
+ errno = errno_saved;
|
||||
return 1;
|
||||
+ }
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -2124,7 +2138,8 @@ ext:
|
||||
pr_perror("Failed to unlink the remap file");
|
||||
goto err;
|
||||
}
|
||||
- rm_parent_dirs(mntns_root, rfi->path, level);
|
||||
+ if (rm_parent_dirs(mntns_root, rfi->path, level))
|
||||
+ goto err;
|
||||
}
|
||||
|
||||
mutex_unlock(remap_open_lock);
|
||||
--
|
||||
2.34.1
|
||||
|
||||
180
0057-ghost-mount-allocate-remounted_rw-in-shmem-to-get-in.patch
Normal file
180
0057-ghost-mount-allocate-remounted_rw-in-shmem-to-get-in.patch
Normal file
@ -0,0 +1,180 @@
|
||||
From 0a2d380e6b9110ec809101757c243ce316f4d1bb Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Thu, 13 Feb 2020 18:28:15 +0300
|
||||
Subject: [PATCH 057/120] ghost/mount: allocate remounted_rw in shmem to get
|
||||
info from other processes
|
||||
|
||||
Previousely remounted_rw was not shared between all processes on
|
||||
restore, thus cleanup didn't got this info from rfi_remap and these
|
||||
mounts were wrongly left writable after restore.
|
||||
|
||||
Cherry-picked from Virtuozzo criu:
|
||||
https://src.openvz.org/projects/OVZ/repos/criu/commits/3a1a592e7
|
||||
|
||||
Fixes: fd0a3cd9efb9 ("mount: remount ro mounts writable before
|
||||
ghost-file restore")
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
criu/include/mount.h | 4 ++--
|
||||
criu/mount.c | 32 ++++++++++++++++++++++----------
|
||||
criu/proc_parse.c | 2 +-
|
||||
3 files changed, 25 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/criu/include/mount.h b/criu/include/mount.h
|
||||
index 833a75ca0..7705279e4 100644
|
||||
--- a/criu/include/mount.h
|
||||
+++ b/criu/include/mount.h
|
||||
@@ -84,7 +84,7 @@ struct mount_info {
|
||||
struct list_head postpone;
|
||||
|
||||
int is_overmounted;
|
||||
- int remounted_rw;
|
||||
+ int *remounted_rw;
|
||||
|
||||
void *private; /* associated filesystem data */
|
||||
};
|
||||
@@ -100,7 +100,7 @@ static inline int collect_binfmt_misc(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
-extern struct mount_info *mnt_entry_alloc(void);
|
||||
+extern struct mount_info *mnt_entry_alloc(bool rst);
|
||||
extern void mnt_entry_free(struct mount_info *mi);
|
||||
|
||||
extern int __mntns_get_root_fd(pid_t pid);
|
||||
diff --git a/criu/mount.c b/criu/mount.c
|
||||
index 93725e526..d75ca5598 100644
|
||||
--- a/criu/mount.c
|
||||
+++ b/criu/mount.c
|
||||
@@ -27,6 +27,7 @@
|
||||
#include "external.h"
|
||||
#include "clone-noasan.h"
|
||||
#include "fdstore.h"
|
||||
+#include "rst-malloc.h"
|
||||
|
||||
#include "images/mnt.pb-c.h"
|
||||
|
||||
@@ -1415,7 +1416,8 @@ err:
|
||||
return -1;
|
||||
}
|
||||
|
||||
-static __maybe_unused int add_cr_time_mount(struct mount_info *root, char *fsname, const char *path, unsigned int s_dev)
|
||||
+static __maybe_unused int add_cr_time_mount(struct mount_info *root, char *fsname, const char *path, unsigned int s_dev,
|
||||
+ bool rst)
|
||||
{
|
||||
struct mount_info *mi, *t, *parent;
|
||||
bool add_slash = false;
|
||||
@@ -1434,7 +1436,7 @@ static __maybe_unused int add_cr_time_mount(struct mount_info *root, char *fsnam
|
||||
}
|
||||
}
|
||||
|
||||
- mi = mnt_entry_alloc();
|
||||
+ mi = mnt_entry_alloc(rst);
|
||||
if (!mi)
|
||||
return -1;
|
||||
|
||||
@@ -2723,7 +2725,7 @@ err_root:
|
||||
return exit_code;
|
||||
}
|
||||
|
||||
-struct mount_info *mnt_entry_alloc()
|
||||
+struct mount_info *mnt_entry_alloc(bool rst)
|
||||
{
|
||||
struct mount_info *new;
|
||||
|
||||
@@ -2734,6 +2736,13 @@ struct mount_info *mnt_entry_alloc()
|
||||
|
||||
new = xzalloc(sizeof(struct mount_info));
|
||||
if (new) {
|
||||
+ if (rst) {
|
||||
+ new->remounted_rw = shmalloc(sizeof(int));
|
||||
+ if (!new->remounted_rw) {
|
||||
+ xfree(new);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+ }
|
||||
new->fd = -1;
|
||||
new->is_overmounted = -1;
|
||||
INIT_LIST_HEAD(&new->children);
|
||||
@@ -2956,7 +2965,7 @@ static int collect_mnt_from_image(struct mount_info **head, struct mount_info **
|
||||
if (ret <= 0)
|
||||
break;
|
||||
|
||||
- pm = mnt_entry_alloc();
|
||||
+ pm = mnt_entry_alloc(true);
|
||||
if (!pm)
|
||||
goto err;
|
||||
|
||||
@@ -3234,7 +3243,7 @@ static int populate_mnt_ns(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
- root_yard_mp = mnt_entry_alloc();
|
||||
+ root_yard_mp = mnt_entry_alloc(true);
|
||||
if (!root_yard_mp)
|
||||
return -1;
|
||||
|
||||
@@ -3247,7 +3256,7 @@ static int populate_mnt_ns(void)
|
||||
#ifdef CONFIG_BINFMT_MISC_VIRTUALIZED
|
||||
if (!opts.has_binfmt_misc && !list_empty(&binfmt_misc_list)) {
|
||||
/* Add to mount tree. Generic code will mount it later */
|
||||
- ret = add_cr_time_mount(root_yard_mp, "binfmt_misc", BINFMT_MISC_HOME, 0);
|
||||
+ ret = add_cr_time_mount(root_yard_mp, "binfmt_misc", BINFMT_MISC_HOME, 0, true);
|
||||
if (ret)
|
||||
return -1;
|
||||
}
|
||||
@@ -3697,7 +3706,7 @@ int collect_mnt_namespaces(bool for_dump)
|
||||
ret = -1;
|
||||
goto err;
|
||||
} else if (ret > 0 && add_cr_time_mount(ns->mnt.mntinfo_tree, "binfmt_misc", BINFMT_MISC_HOME,
|
||||
- s_dev) < 0) {
|
||||
+ s_dev, false) < 0) {
|
||||
ret = -1;
|
||||
goto err;
|
||||
}
|
||||
@@ -3838,7 +3847,10 @@ int try_remount_writable(struct mount_info *mi, bool ns)
|
||||
if (!ns)
|
||||
remounted = REMOUNTED_RW_SERVICE;
|
||||
|
||||
- if (mi->flags & MS_RDONLY && !(mi->remounted_rw & remounted)) {
|
||||
+ /* All mounts in mntinfo list should have it on restore */
|
||||
+ BUG_ON(mi->remounted_rw == NULL);
|
||||
+
|
||||
+ if (mi->flags & MS_RDONLY && !(*mi->remounted_rw & remounted)) {
|
||||
if (mnt_is_overmounted(mi)) {
|
||||
pr_err("The mount %d is overmounted so paths are invisible\n", mi->mnt_id);
|
||||
return -1;
|
||||
@@ -3861,7 +3873,7 @@ int try_remount_writable(struct mount_info *mi, bool ns)
|
||||
if (call_helper_process(ns_remount_writable, mi))
|
||||
return -1;
|
||||
}
|
||||
- mi->remounted_rw |= remounted;
|
||||
+ *mi->remounted_rw |= remounted;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -3876,7 +3888,7 @@ static int __remount_readonly_mounts(struct ns_id *ns)
|
||||
if (ns && mi->nsid != ns)
|
||||
continue;
|
||||
|
||||
- if (!(mi->remounted_rw && REMOUNTED_RW))
|
||||
+ if (!(*mi->remounted_rw && REMOUNTED_RW))
|
||||
continue;
|
||||
|
||||
/*
|
||||
diff --git a/criu/proc_parse.c b/criu/proc_parse.c
|
||||
index 8a9ce3a37..094f9b84e 100644
|
||||
--- a/criu/proc_parse.c
|
||||
+++ b/criu/proc_parse.c
|
||||
@@ -1541,7 +1541,7 @@ struct mount_info *parse_mountinfo(pid_t pid, struct ns_id *nsid, bool for_dump)
|
||||
int ret = -1;
|
||||
char *fsname = NULL;
|
||||
|
||||
- new = mnt_entry_alloc();
|
||||
+ new = mnt_entry_alloc(false);
|
||||
if (!new)
|
||||
goto end;
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,46 @@
|
||||
From 3aca580025b38aa043f6ef82f24ecab2d2d258e9 Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Thu, 13 Feb 2020 18:26:52 +0300
|
||||
Subject: [PATCH 058/120] files-reg: temporary remount writable the mount we do
|
||||
unlink on
|
||||
|
||||
Previousely I din't mention this case because we had bad error handling
|
||||
in ghost cleanup path.
|
||||
|
||||
Without these patch but with proper error handling for unlink we have an
|
||||
error in mntns_ghost01 test:
|
||||
|
||||
Error (criu/files-reg.c:2269): Failed to unlink the remap file:
|
||||
Read-only file system
|
||||
|
||||
Cherry-picked from Virtuozzo criu:
|
||||
https://src.openvz.org/projects/OVZ/repos/criu/commits/151c859e1
|
||||
|
||||
Changes: check lookup_mnt_id return for NULL
|
||||
|
||||
Fixes: fd0a3cd9efb9 ("mount: remount ro mounts writable before
|
||||
ghost-file restore")
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
criu/files-reg.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/criu/files-reg.c b/criu/files-reg.c
|
||||
index 0e126a32e..57403d2c6 100644
|
||||
--- a/criu/files-reg.c
|
||||
+++ b/criu/files-reg.c
|
||||
@@ -2133,6 +2133,11 @@ ext:
|
||||
|
||||
if (rfi->remap) {
|
||||
if (!rfi->remap->is_dir) {
|
||||
+ struct mount_info *mi = lookup_mnt_id(rfi->rfe->mnt_id);
|
||||
+
|
||||
+ if (mi && try_remount_writable(mi, true))
|
||||
+ goto err;
|
||||
+
|
||||
pr_debug("Unlink: %d:%s\n", rfi->rfe->mnt_id, rfi->path);
|
||||
if (unlinkat(mntns_root, rfi->path, 0)) {
|
||||
pr_perror("Failed to unlink the remap file");
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,47 @@
|
||||
From d137057e215de10ee772852126075ce9575e908e Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Tue, 30 Nov 2021 19:03:29 +0300
|
||||
Subject: [PATCH 059/120] zdtm: add ro-mount check after c/r to mntns_ghost01
|
||||
|
||||
This is a test for "ghost/mount: allocate remounted_rw in shmem to get
|
||||
info from other processes" patch, without the patch test fails with:
|
||||
|
||||
############# Test zdtm/static/mntns_ghost01 FAIL at result check ##############
|
||||
Test output: ================================
|
||||
16:15:19.607: 5: ERR: mntns_ghost01.c:95: open for write on rofs -> 7 (errno = 11 (Resource temporarily unavailable))
|
||||
16:15:19.607: 4: FAIL: mntns_ghost01.c:121: Test died (errno = 11 (Resource temporarily unavailable))
|
||||
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
test/zdtm/static/mntns_ghost01.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/test/zdtm/static/mntns_ghost01.c b/test/zdtm/static/mntns_ghost01.c
|
||||
index 20397d543..2cc2270dd 100644
|
||||
--- a/test/zdtm/static/mntns_ghost01.c
|
||||
+++ b/test/zdtm/static/mntns_ghost01.c
|
||||
@@ -6,6 +6,7 @@
|
||||
#include <sched.h>
|
||||
#include <sys/wait.h>
|
||||
#include <limits.h>
|
||||
+#include <errno.h>
|
||||
|
||||
#include "zdtmtst.h"
|
||||
|
||||
@@ -89,6 +90,13 @@ int main(int argc, char **argv)
|
||||
return 1;
|
||||
}
|
||||
|
||||
+ fd = open(ghost_path, O_CREAT | O_WRONLY, 0600);
|
||||
+ if (fd >= 0 || errno != EROFS) {
|
||||
+ pr_perror("open for write on rofs -> %d", fd);
|
||||
+ close(fd);
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
115
0060-clang-format-disable-wrong-struct-pointer-declaratio.patch
Normal file
115
0060-clang-format-disable-wrong-struct-pointer-declaratio.patch
Normal file
@ -0,0 +1,115 @@
|
||||
From bb9c27c217a9b995c101cbb2023c4084ce76a07b Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Thu, 25 Nov 2021 16:51:55 +0300
|
||||
Subject: [PATCH 060/120] clang-format: disable wrong struct pointer
|
||||
declaration format
|
||||
|
||||
When we declare struct and at the same time declare variable pointer of
|
||||
this struct type, it looks like clang-format threats "*" as a
|
||||
multiplication operator instead of indirection (pointer declaration)
|
||||
operator and puts spaces on both sides, which looks wrong.
|
||||
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
criu/fdstore.c | 4 +++-
|
||||
test/zdtm/lib/test.c | 4 +++-
|
||||
test/zdtm/static/child_subreaper_and_reparent.c | 4 +++-
|
||||
test/zdtm/static/child_subreaper_existing_child.c | 4 +++-
|
||||
test/zdtm/static/file_fown.c | 4 +++-
|
||||
5 files changed, 15 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/criu/fdstore.c b/criu/fdstore.c
|
||||
index 77935484f..65264a511 100644
|
||||
--- a/criu/fdstore.c
|
||||
+++ b/criu/fdstore.c
|
||||
@@ -13,10 +13,12 @@
|
||||
#include "rst-malloc.h"
|
||||
#include "log.h"
|
||||
|
||||
+/* clang-format off */
|
||||
static struct fdstore_desc {
|
||||
int next_id;
|
||||
mutex_t lock; /* to protect a peek offset */
|
||||
-} * desc;
|
||||
+} *desc;
|
||||
+/* clang-format on */
|
||||
|
||||
int fdstore_init(void)
|
||||
{
|
||||
diff --git a/test/zdtm/lib/test.c b/test/zdtm/lib/test.c
|
||||
index 81da81eba..57eb42046 100644
|
||||
--- a/test/zdtm/lib/test.c
|
||||
+++ b/test/zdtm/lib/test.c
|
||||
@@ -20,9 +20,11 @@
|
||||
#include "ns.h"
|
||||
|
||||
futex_t sig_received;
|
||||
+/* clang-format off */
|
||||
static struct {
|
||||
futex_t stage;
|
||||
-} * test_shared_state;
|
||||
+} *test_shared_state;
|
||||
+/* clang-format on */
|
||||
|
||||
enum {
|
||||
TEST_INIT_STAGE = 0,
|
||||
diff --git a/test/zdtm/static/child_subreaper_and_reparent.c b/test/zdtm/static/child_subreaper_and_reparent.c
|
||||
index ba03517ba..c71778ae9 100644
|
||||
--- a/test/zdtm/static/child_subreaper_and_reparent.c
|
||||
+++ b/test/zdtm/static/child_subreaper_and_reparent.c
|
||||
@@ -19,11 +19,13 @@ enum {
|
||||
TEST_EXIT,
|
||||
};
|
||||
|
||||
+/* clang-format off */
|
||||
struct shared {
|
||||
futex_t fstate;
|
||||
int parent_before_cr;
|
||||
int parent_after_cr;
|
||||
-} * sh;
|
||||
+} *sh;
|
||||
+/* clang-format on */
|
||||
|
||||
int orphan(void)
|
||||
{
|
||||
diff --git a/test/zdtm/static/child_subreaper_existing_child.c b/test/zdtm/static/child_subreaper_existing_child.c
|
||||
index 4805aa41d..92d22bc4a 100644
|
||||
--- a/test/zdtm/static/child_subreaper_existing_child.c
|
||||
+++ b/test/zdtm/static/child_subreaper_existing_child.c
|
||||
@@ -18,10 +18,12 @@ enum {
|
||||
TEST_EXIT,
|
||||
};
|
||||
|
||||
+/* clang-format off */
|
||||
struct shared {
|
||||
futex_t fstate;
|
||||
int ppid_after_reparent;
|
||||
-} * sh;
|
||||
+} *sh;
|
||||
+/* clang-format on */
|
||||
|
||||
int orphan(void)
|
||||
{
|
||||
diff --git a/test/zdtm/static/file_fown.c b/test/zdtm/static/file_fown.c
|
||||
index eb42a826e..2c5ba82c2 100644
|
||||
--- a/test/zdtm/static/file_fown.c
|
||||
+++ b/test/zdtm/static/file_fown.c
|
||||
@@ -22,12 +22,14 @@
|
||||
const char *test_doc = "Check for signal delivery on file owners";
|
||||
const char *test_author = "Cyrill Gorcunov <gorcunov@openvz.org>";
|
||||
|
||||
+/* clang-format off */
|
||||
struct params {
|
||||
int sigio;
|
||||
int pipe_flags[2];
|
||||
int pipe_pid[2];
|
||||
int pipe_sig[2];
|
||||
-} * shared;
|
||||
+} *shared;
|
||||
+/* clang-format on */
|
||||
|
||||
static void signal_handler_io(int status)
|
||||
{
|
||||
--
|
||||
2.34.1
|
||||
|
||||
181
0061-ci-Run-cross-compile-on-debian-stable.patch
Normal file
181
0061-ci-Run-cross-compile-on-debian-stable.patch
Normal file
@ -0,0 +1,181 @@
|
||||
From 9134e859293a3980b25cff043273be1d41ab7d53 Mon Sep 17 00:00:00 2001
|
||||
From: Radostin Stoyanov <radostin@redhat.com>
|
||||
Date: Sat, 4 Dec 2021 16:18:26 +0000
|
||||
Subject: [PATCH 061/120] ci: Run cross compile on debian stable
|
||||
|
||||
The current debian stable release is Bullseye, not Buster. However, we
|
||||
can use the 'stable' release instead. This would allow the CI to
|
||||
automatically pick up updates in the future.
|
||||
|
||||
Signed-off-by: Radostin Stoyanov <radostin@redhat.com>
|
||||
---
|
||||
.github/workflows/cross-compile-daily.yml | 2 +-
|
||||
.github/workflows/cross-compile.yml | 2 +-
|
||||
scripts/build/Dockerfile.aarch64-cross.tmpl | 1 -
|
||||
...aarch64-cross.hdr => Dockerfile.aarch64-stable-cross.hdr} | 0
|
||||
scripts/build/Dockerfile.aarch64-stable-cross.tmpl | 1 +
|
||||
scripts/build/Dockerfile.armv7-cross.tmpl | 1 -
|
||||
...ile.armv7-cross.hdr => Dockerfile.armv7-stable-cross.hdr} | 0
|
||||
scripts/build/Dockerfile.armv7-stable-cross.tmpl | 1 +
|
||||
scripts/build/Dockerfile.mips64el-cross.tmpl | 1 -
|
||||
...ps64el-cross.hdr => Dockerfile.mips64el-stable-cross.hdr} | 0
|
||||
scripts/build/Dockerfile.mips64el-stable-cross.tmpl | 1 +
|
||||
scripts/build/Dockerfile.ppc64-cross.tmpl | 1 -
|
||||
...ile.ppc64-cross.hdr => Dockerfile.ppc64-stable-cross.hdr} | 0
|
||||
scripts/build/Dockerfile.ppc64-stable-cross.tmpl | 1 +
|
||||
.../{Dockerfile.cross.tmpl => Dockerfile.stable-cross.tmpl} | 5 ++---
|
||||
scripts/build/Makefile | 2 +-
|
||||
16 files changed, 9 insertions(+), 10 deletions(-)
|
||||
delete mode 120000 scripts/build/Dockerfile.aarch64-cross.tmpl
|
||||
rename scripts/build/{Dockerfile.aarch64-cross.hdr => Dockerfile.aarch64-stable-cross.hdr} (100%)
|
||||
create mode 120000 scripts/build/Dockerfile.aarch64-stable-cross.tmpl
|
||||
delete mode 120000 scripts/build/Dockerfile.armv7-cross.tmpl
|
||||
rename scripts/build/{Dockerfile.armv7-cross.hdr => Dockerfile.armv7-stable-cross.hdr} (100%)
|
||||
create mode 120000 scripts/build/Dockerfile.armv7-stable-cross.tmpl
|
||||
delete mode 120000 scripts/build/Dockerfile.mips64el-cross.tmpl
|
||||
rename scripts/build/{Dockerfile.mips64el-cross.hdr => Dockerfile.mips64el-stable-cross.hdr} (100%)
|
||||
create mode 120000 scripts/build/Dockerfile.mips64el-stable-cross.tmpl
|
||||
delete mode 120000 scripts/build/Dockerfile.ppc64-cross.tmpl
|
||||
rename scripts/build/{Dockerfile.ppc64-cross.hdr => Dockerfile.ppc64-stable-cross.hdr} (100%)
|
||||
create mode 120000 scripts/build/Dockerfile.ppc64-stable-cross.tmpl
|
||||
rename scripts/build/{Dockerfile.cross.tmpl => Dockerfile.stable-cross.tmpl} (88%)
|
||||
|
||||
diff --git a/.github/workflows/cross-compile-daily.yml b/.github/workflows/cross-compile-daily.yml
|
||||
index 701213276..927ddced2 100644
|
||||
--- a/.github/workflows/cross-compile-daily.yml
|
||||
+++ b/.github/workflows/cross-compile-daily.yml
|
||||
@@ -10,7 +10,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
- target: [armv7-cross, aarch64-cross, ppc64-cross, mips64el-cross]
|
||||
+ target: [armv7-stable-cross, aarch64-stable-cross, ppc64-stable-cross, mips64el-stable-cross]
|
||||
branches: [criu-dev, master]
|
||||
|
||||
steps:
|
||||
diff --git a/.github/workflows/cross-compile.yml b/.github/workflows/cross-compile.yml
|
||||
index 90862e7ab..c6745d43e 100644
|
||||
--- a/.github/workflows/cross-compile.yml
|
||||
+++ b/.github/workflows/cross-compile.yml
|
||||
@@ -8,7 +8,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
- target: [armv7-cross, aarch64-cross, ppc64-cross, mips64el-cross]
|
||||
+ target: [armv7-stable-cross, aarch64-stable-cross, ppc64-stable-cross, mips64el-stable-cross]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
diff --git a/scripts/build/Dockerfile.aarch64-cross.tmpl b/scripts/build/Dockerfile.aarch64-cross.tmpl
|
||||
deleted file mode 120000
|
||||
index 50eff9213..000000000
|
||||
--- a/scripts/build/Dockerfile.aarch64-cross.tmpl
|
||||
+++ /dev/null
|
||||
@@ -1 +0,0 @@
|
||||
-Dockerfile.cross.tmpl
|
||||
\ No newline at end of file
|
||||
diff --git a/scripts/build/Dockerfile.aarch64-cross.hdr b/scripts/build/Dockerfile.aarch64-stable-cross.hdr
|
||||
similarity index 100%
|
||||
rename from scripts/build/Dockerfile.aarch64-cross.hdr
|
||||
rename to scripts/build/Dockerfile.aarch64-stable-cross.hdr
|
||||
diff --git a/scripts/build/Dockerfile.aarch64-stable-cross.tmpl b/scripts/build/Dockerfile.aarch64-stable-cross.tmpl
|
||||
new file mode 120000
|
||||
index 000000000..81ef22980
|
||||
--- /dev/null
|
||||
+++ b/scripts/build/Dockerfile.aarch64-stable-cross.tmpl
|
||||
@@ -0,0 +1 @@
|
||||
+Dockerfile.stable-cross.tmpl
|
||||
\ No newline at end of file
|
||||
diff --git a/scripts/build/Dockerfile.armv7-cross.tmpl b/scripts/build/Dockerfile.armv7-cross.tmpl
|
||||
deleted file mode 120000
|
||||
index 50eff9213..000000000
|
||||
--- a/scripts/build/Dockerfile.armv7-cross.tmpl
|
||||
+++ /dev/null
|
||||
@@ -1 +0,0 @@
|
||||
-Dockerfile.cross.tmpl
|
||||
\ No newline at end of file
|
||||
diff --git a/scripts/build/Dockerfile.armv7-cross.hdr b/scripts/build/Dockerfile.armv7-stable-cross.hdr
|
||||
similarity index 100%
|
||||
rename from scripts/build/Dockerfile.armv7-cross.hdr
|
||||
rename to scripts/build/Dockerfile.armv7-stable-cross.hdr
|
||||
diff --git a/scripts/build/Dockerfile.armv7-stable-cross.tmpl b/scripts/build/Dockerfile.armv7-stable-cross.tmpl
|
||||
new file mode 120000
|
||||
index 000000000..81ef22980
|
||||
--- /dev/null
|
||||
+++ b/scripts/build/Dockerfile.armv7-stable-cross.tmpl
|
||||
@@ -0,0 +1 @@
|
||||
+Dockerfile.stable-cross.tmpl
|
||||
\ No newline at end of file
|
||||
diff --git a/scripts/build/Dockerfile.mips64el-cross.tmpl b/scripts/build/Dockerfile.mips64el-cross.tmpl
|
||||
deleted file mode 120000
|
||||
index 50eff9213..000000000
|
||||
--- a/scripts/build/Dockerfile.mips64el-cross.tmpl
|
||||
+++ /dev/null
|
||||
@@ -1 +0,0 @@
|
||||
-Dockerfile.cross.tmpl
|
||||
\ No newline at end of file
|
||||
diff --git a/scripts/build/Dockerfile.mips64el-cross.hdr b/scripts/build/Dockerfile.mips64el-stable-cross.hdr
|
||||
similarity index 100%
|
||||
rename from scripts/build/Dockerfile.mips64el-cross.hdr
|
||||
rename to scripts/build/Dockerfile.mips64el-stable-cross.hdr
|
||||
diff --git a/scripts/build/Dockerfile.mips64el-stable-cross.tmpl b/scripts/build/Dockerfile.mips64el-stable-cross.tmpl
|
||||
new file mode 120000
|
||||
index 000000000..81ef22980
|
||||
--- /dev/null
|
||||
+++ b/scripts/build/Dockerfile.mips64el-stable-cross.tmpl
|
||||
@@ -0,0 +1 @@
|
||||
+Dockerfile.stable-cross.tmpl
|
||||
\ No newline at end of file
|
||||
diff --git a/scripts/build/Dockerfile.ppc64-cross.tmpl b/scripts/build/Dockerfile.ppc64-cross.tmpl
|
||||
deleted file mode 120000
|
||||
index 50eff9213..000000000
|
||||
--- a/scripts/build/Dockerfile.ppc64-cross.tmpl
|
||||
+++ /dev/null
|
||||
@@ -1 +0,0 @@
|
||||
-Dockerfile.cross.tmpl
|
||||
\ No newline at end of file
|
||||
diff --git a/scripts/build/Dockerfile.ppc64-cross.hdr b/scripts/build/Dockerfile.ppc64-stable-cross.hdr
|
||||
similarity index 100%
|
||||
rename from scripts/build/Dockerfile.ppc64-cross.hdr
|
||||
rename to scripts/build/Dockerfile.ppc64-stable-cross.hdr
|
||||
diff --git a/scripts/build/Dockerfile.ppc64-stable-cross.tmpl b/scripts/build/Dockerfile.ppc64-stable-cross.tmpl
|
||||
new file mode 120000
|
||||
index 000000000..81ef22980
|
||||
--- /dev/null
|
||||
+++ b/scripts/build/Dockerfile.ppc64-stable-cross.tmpl
|
||||
@@ -0,0 +1 @@
|
||||
+Dockerfile.stable-cross.tmpl
|
||||
\ No newline at end of file
|
||||
diff --git a/scripts/build/Dockerfile.cross.tmpl b/scripts/build/Dockerfile.stable-cross.tmpl
|
||||
similarity index 88%
|
||||
rename from scripts/build/Dockerfile.cross.tmpl
|
||||
rename to scripts/build/Dockerfile.stable-cross.tmpl
|
||||
index 8b95fbb1c..6a68cd1ca 100644
|
||||
--- a/scripts/build/Dockerfile.cross.tmpl
|
||||
+++ b/scripts/build/Dockerfile.stable-cross.tmpl
|
||||
@@ -1,9 +1,8 @@
|
||||
COPY scripts/ci/apt-install /bin/apt-install
|
||||
|
||||
# Add the cross compiler sources
|
||||
-RUN echo "deb http://deb.debian.org/debian/ buster main" >> /etc/apt/sources.list && \
|
||||
- dpkg --add-architecture ${DEBIAN_ARCH} && \
|
||||
- apt-install emdebian-archive-keyring
|
||||
+RUN echo "deb http://deb.debian.org/debian/ stable main" >> /etc/apt/sources.list && \
|
||||
+ dpkg --add-architecture ${DEBIAN_ARCH}
|
||||
|
||||
RUN apt-install \
|
||||
crossbuild-essential-${DEBIAN_ARCH} \
|
||||
diff --git a/scripts/build/Makefile b/scripts/build/Makefile
|
||||
index 62e3a9920..a436c2839 100644
|
||||
--- a/scripts/build/Makefile
|
||||
+++ b/scripts/build/Makefile
|
||||
@@ -1,5 +1,5 @@
|
||||
ARCHES := x86_64 fedora-asan fedora-rawhide centos7 armv7hf centos8
|
||||
-NON_CLANG := armv7-cross aarch64-cross ppc64-cross mips64el-cross
|
||||
+NON_CLANG := armv7-stable-cross aarch64-stable-cross ppc64-stable-cross mips64el-stable-cross
|
||||
CREATE_DOCKERFILES := $(ARCHES) $(NON_CLANG)
|
||||
TARGETS := $(ARCHES) alpine archlinux
|
||||
TARGETS_CLANG := $(addsuffix $(TARGETS),-clang)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
197
0062-ci-Run-cross-compile-with-debian-testing.patch
Normal file
197
0062-ci-Run-cross-compile-with-debian-testing.patch
Normal file
@ -0,0 +1,197 @@
|
||||
From e16ea6a3c23fb8a5f0ed8c19052ee9b4140108cf Mon Sep 17 00:00:00 2001
|
||||
From: Radostin Stoyanov <radostin@redhat.com>
|
||||
Date: Sat, 4 Dec 2021 16:31:34 +0000
|
||||
Subject: [PATCH 062/120] ci: Run cross compile with debian testing
|
||||
|
||||
Debian testing has newer compiler version and running
|
||||
cross compilation tests would allow us to catch any compilation
|
||||
errors early.
|
||||
|
||||
Signed-off-by: Radostin Stoyanov <radostin@redhat.com>
|
||||
---
|
||||
.github/workflows/cross-compile.yml | 11 ++++-
|
||||
.../Dockerfile.aarch64-testing-cross.hdr | 5 +++
|
||||
.../Dockerfile.aarch64-testing-cross.tmpl | 1 +
|
||||
.../build/Dockerfile.armv7-testing-cross.hdr | 6 +++
|
||||
.../build/Dockerfile.armv7-testing-cross.tmpl | 1 +
|
||||
.../Dockerfile.mips64el-testing-cross.hdr | 6 +++
|
||||
.../Dockerfile.mips64el-testing-cross.tmpl | 1 +
|
||||
.../build/Dockerfile.ppc64-testing-cross.hdr | 5 +++
|
||||
.../build/Dockerfile.ppc64-testing-cross.tmpl | 1 +
|
||||
scripts/build/Dockerfile.testing-cross.tmpl | 42 +++++++++++++++++++
|
||||
scripts/build/Makefile | 4 +-
|
||||
11 files changed, 81 insertions(+), 2 deletions(-)
|
||||
create mode 100644 scripts/build/Dockerfile.aarch64-testing-cross.hdr
|
||||
create mode 120000 scripts/build/Dockerfile.aarch64-testing-cross.tmpl
|
||||
create mode 100644 scripts/build/Dockerfile.armv7-testing-cross.hdr
|
||||
create mode 120000 scripts/build/Dockerfile.armv7-testing-cross.tmpl
|
||||
create mode 100644 scripts/build/Dockerfile.mips64el-testing-cross.hdr
|
||||
create mode 120000 scripts/build/Dockerfile.mips64el-testing-cross.tmpl
|
||||
create mode 100644 scripts/build/Dockerfile.ppc64-testing-cross.hdr
|
||||
create mode 120000 scripts/build/Dockerfile.ppc64-testing-cross.tmpl
|
||||
create mode 100644 scripts/build/Dockerfile.testing-cross.tmpl
|
||||
|
||||
diff --git a/.github/workflows/cross-compile.yml b/.github/workflows/cross-compile.yml
|
||||
index c6745d43e..eec6eb577 100644
|
||||
--- a/.github/workflows/cross-compile.yml
|
||||
+++ b/.github/workflows/cross-compile.yml
|
||||
@@ -8,7 +8,16 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
- target: [armv7-stable-cross, aarch64-stable-cross, ppc64-stable-cross, mips64el-stable-cross]
|
||||
+ target: [
|
||||
+ armv7-stable-cross,
|
||||
+ armv7-testing-cross,
|
||||
+ aarch64-stable-cross,
|
||||
+ aarch64-testing-cross,
|
||||
+ ppc64-stable-cross,
|
||||
+ ppc64-testing-cross,
|
||||
+ mips64el-stable-cross,
|
||||
+ mips64el-testing-cross
|
||||
+ ]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
diff --git a/scripts/build/Dockerfile.aarch64-testing-cross.hdr b/scripts/build/Dockerfile.aarch64-testing-cross.hdr
|
||||
new file mode 100644
|
||||
index 000000000..c61d2af27
|
||||
--- /dev/null
|
||||
+++ b/scripts/build/Dockerfile.aarch64-testing-cross.hdr
|
||||
@@ -0,0 +1,5 @@
|
||||
+FROM docker.io/dockcross/base:latest
|
||||
+
|
||||
+ENV ARCH=aarch64
|
||||
+ENV DEBIAN_ARCH=arm64
|
||||
+ENV CROSS_TRIPLET=aarch64-linux-gnu
|
||||
diff --git a/scripts/build/Dockerfile.aarch64-testing-cross.tmpl b/scripts/build/Dockerfile.aarch64-testing-cross.tmpl
|
||||
new file mode 120000
|
||||
index 000000000..c1dd38b21
|
||||
--- /dev/null
|
||||
+++ b/scripts/build/Dockerfile.aarch64-testing-cross.tmpl
|
||||
@@ -0,0 +1 @@
|
||||
+Dockerfile.testing-cross.tmpl
|
||||
\ No newline at end of file
|
||||
diff --git a/scripts/build/Dockerfile.armv7-testing-cross.hdr b/scripts/build/Dockerfile.armv7-testing-cross.hdr
|
||||
new file mode 100644
|
||||
index 000000000..f96dc51f7
|
||||
--- /dev/null
|
||||
+++ b/scripts/build/Dockerfile.armv7-testing-cross.hdr
|
||||
@@ -0,0 +1,6 @@
|
||||
+FROM docker.io/dockcross/base:latest
|
||||
+
|
||||
+ENV ARCH=arm
|
||||
+ENV SUBARCH=armv7
|
||||
+ENV DEBIAN_ARCH=armhf
|
||||
+ENV CROSS_TRIPLET=arm-linux-gnueabihf
|
||||
diff --git a/scripts/build/Dockerfile.armv7-testing-cross.tmpl b/scripts/build/Dockerfile.armv7-testing-cross.tmpl
|
||||
new file mode 120000
|
||||
index 000000000..c1dd38b21
|
||||
--- /dev/null
|
||||
+++ b/scripts/build/Dockerfile.armv7-testing-cross.tmpl
|
||||
@@ -0,0 +1 @@
|
||||
+Dockerfile.testing-cross.tmpl
|
||||
\ No newline at end of file
|
||||
diff --git a/scripts/build/Dockerfile.mips64el-testing-cross.hdr b/scripts/build/Dockerfile.mips64el-testing-cross.hdr
|
||||
new file mode 100644
|
||||
index 000000000..e78c94aa5
|
||||
--- /dev/null
|
||||
+++ b/scripts/build/Dockerfile.mips64el-testing-cross.hdr
|
||||
@@ -0,0 +1,6 @@
|
||||
+FROM dockcross/base:latest
|
||||
+
|
||||
+ENV ARCH=mips
|
||||
+ENV SUBARCH=mips
|
||||
+ENV DEBIAN_ARCH=mips64el
|
||||
+ENV CROSS_TRIPLET=mips64el-linux-gnuabi64
|
||||
diff --git a/scripts/build/Dockerfile.mips64el-testing-cross.tmpl b/scripts/build/Dockerfile.mips64el-testing-cross.tmpl
|
||||
new file mode 120000
|
||||
index 000000000..c1dd38b21
|
||||
--- /dev/null
|
||||
+++ b/scripts/build/Dockerfile.mips64el-testing-cross.tmpl
|
||||
@@ -0,0 +1 @@
|
||||
+Dockerfile.testing-cross.tmpl
|
||||
\ No newline at end of file
|
||||
diff --git a/scripts/build/Dockerfile.ppc64-testing-cross.hdr b/scripts/build/Dockerfile.ppc64-testing-cross.hdr
|
||||
new file mode 100644
|
||||
index 000000000..38547ac55
|
||||
--- /dev/null
|
||||
+++ b/scripts/build/Dockerfile.ppc64-testing-cross.hdr
|
||||
@@ -0,0 +1,5 @@
|
||||
+FROM dockcross/base:latest
|
||||
+
|
||||
+ENV ARCH=ppc64
|
||||
+ENV DEBIAN_ARCH=ppc64el
|
||||
+ENV CROSS_TRIPLET=powerpc64le-linux-gnu
|
||||
diff --git a/scripts/build/Dockerfile.ppc64-testing-cross.tmpl b/scripts/build/Dockerfile.ppc64-testing-cross.tmpl
|
||||
new file mode 120000
|
||||
index 000000000..c1dd38b21
|
||||
--- /dev/null
|
||||
+++ b/scripts/build/Dockerfile.ppc64-testing-cross.tmpl
|
||||
@@ -0,0 +1 @@
|
||||
+Dockerfile.testing-cross.tmpl
|
||||
\ No newline at end of file
|
||||
diff --git a/scripts/build/Dockerfile.testing-cross.tmpl b/scripts/build/Dockerfile.testing-cross.tmpl
|
||||
new file mode 100644
|
||||
index 000000000..1d5565310
|
||||
--- /dev/null
|
||||
+++ b/scripts/build/Dockerfile.testing-cross.tmpl
|
||||
@@ -0,0 +1,42 @@
|
||||
+COPY scripts/ci/apt-install /bin/apt-install
|
||||
+
|
||||
+# Add the cross compiler sources
|
||||
+RUN echo "deb http://deb.debian.org/debian/ testing main" >> /etc/apt/sources.list && \
|
||||
+ dpkg --add-architecture ${DEBIAN_ARCH}
|
||||
+
|
||||
+RUN apt-install \
|
||||
+ crossbuild-essential-${DEBIAN_ARCH} \
|
||||
+ libc6-dev-${DEBIAN_ARCH}-cross \
|
||||
+ libc6-${DEBIAN_ARCH}-cross \
|
||||
+ libbz2-dev:${DEBIAN_ARCH} \
|
||||
+ libexpat1-dev:${DEBIAN_ARCH} \
|
||||
+ ncurses-dev:${DEBIAN_ARCH} \
|
||||
+ libssl-dev:${DEBIAN_ARCH} \
|
||||
+ protobuf-c-compiler \
|
||||
+ protobuf-compiler \
|
||||
+ python3-protobuf \
|
||||
+ libnl-3-dev:${DEBIAN_ARCH} \
|
||||
+ libprotobuf-dev:${DEBIAN_ARCH} \
|
||||
+ libnet-dev:${DEBIAN_ARCH} \
|
||||
+ libprotobuf-c-dev:${DEBIAN_ARCH} \
|
||||
+ libcap-dev:${DEBIAN_ARCH} \
|
||||
+ libaio-dev:${DEBIAN_ARCH} \
|
||||
+ libnl-route-3-dev:${DEBIAN_ARCH}
|
||||
+
|
||||
+ENV CROSS_COMPILE=${CROSS_TRIPLET}- \
|
||||
+ CROSS_ROOT=/usr/${CROSS_TRIPLET} \
|
||||
+ AS=/usr/bin/${CROSS_TRIPLET}-as \
|
||||
+ AR=/usr/bin/${CROSS_TRIPLET}-ar \
|
||||
+ CC=/usr/bin/${CROSS_TRIPLET}-gcc \
|
||||
+ CPP=/usr/bin/${CROSS_TRIPLET}-cpp \
|
||||
+ CXX=/usr/bin/${CROSS_TRIPLET}-g++ \
|
||||
+ LD=/usr/bin/${CROSS_TRIPLET}-ld \
|
||||
+ FC=/usr/bin/${CROSS_TRIPLET}-gfortran
|
||||
+
|
||||
+ENV PATH="${PATH}:${CROSS_ROOT}/bin" \
|
||||
+ PKG_CONFIG_PATH=/usr/lib/${CROSS_TRIPLET}/pkgconfig
|
||||
+
|
||||
+COPY . /criu
|
||||
+WORKDIR /criu
|
||||
+
|
||||
+RUN make mrproper && date && make -j $(nproc) zdtm && date
|
||||
diff --git a/scripts/build/Makefile b/scripts/build/Makefile
|
||||
index a436c2839..b24fc80ea 100644
|
||||
--- a/scripts/build/Makefile
|
||||
+++ b/scripts/build/Makefile
|
||||
@@ -1,5 +1,7 @@
|
||||
ARCHES := x86_64 fedora-asan fedora-rawhide centos7 armv7hf centos8
|
||||
-NON_CLANG := armv7-stable-cross aarch64-stable-cross ppc64-stable-cross mips64el-stable-cross
|
||||
+STABLE_CROSS_ARCHES := armv7-stable-cross aarch64-stable-cross ppc64-stable-cross mips64el-stable-cross
|
||||
+TESTING_CROSS_ARCHES := armv7-testing-cross aarch64-testing-cross ppc64-testing-cross mips64el-testing-cross
|
||||
+NON_CLANG := $(TESTING_CROSS_ARCHES) $(STABLE_CROSS_ARCHES)
|
||||
CREATE_DOCKERFILES := $(ARCHES) $(NON_CLANG)
|
||||
TARGETS := $(ARCHES) alpine archlinux
|
||||
TARGETS_CLANG := $(addsuffix $(TARGETS),-clang)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
48
0063-make-Explicitly-enable-FPU-on-ARMv7-builds.patch
Normal file
48
0063-make-Explicitly-enable-FPU-on-ARMv7-builds.patch
Normal file
@ -0,0 +1,48 @@
|
||||
From 8887dfb9174a42b699b1fde2dbf9033f66c8363b Mon Sep 17 00:00:00 2001
|
||||
From: Salvatore Bonaccorso <carnil@debian.org>
|
||||
Date: Sat, 4 Dec 2021 16:59:51 +0000
|
||||
Subject: [PATCH 063/120] make: Explicitly enable FPU on ARMv7 builds
|
||||
|
||||
Starting with gcc-11, Debian's armhf compiler no longer builds with
|
||||
a default -mfpu= option. Instead it enables the FPU via an extension
|
||||
to the -march flag (--with-arch=armv7-a+fp). criu's Makefile explicitly
|
||||
passes its own -march=armv7-a setting, which overrides the +fp default,
|
||||
so we end up with no FPU:
|
||||
|
||||
cc1: error: '-mfloat-abi=hard': selected architecture lacks an FPU
|
||||
|
||||
Signed-off-by: Radostin Stoyanov <radostin@redhat.com>
|
||||
---
|
||||
Makefile | 2 +-
|
||||
test/zdtm/Makefile.inc | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
index d35012615..c0d008371 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -39,7 +39,7 @@ ifeq ($(ARCH),arm)
|
||||
endif
|
||||
|
||||
ifeq ($(ARMV),7)
|
||||
- USERCFLAGS += -march=armv7-a
|
||||
+ USERCFLAGS += -march=armv7-a+fp
|
||||
endif
|
||||
|
||||
ifeq ($(ARMV),8)
|
||||
diff --git a/test/zdtm/Makefile.inc b/test/zdtm/Makefile.inc
|
||||
index 69154fdc9..d34523315 100644
|
||||
--- a/test/zdtm/Makefile.inc
|
||||
+++ b/test/zdtm/Makefile.inc
|
||||
@@ -25,7 +25,7 @@ ifeq ($(ARCH),arm)
|
||||
ifeq ($(ARMV),6)
|
||||
USERCFLAGS += -march=armv6
|
||||
else ifeq ($(ARMV),7)
|
||||
- USERCFLAGS += -march=armv7-a
|
||||
+ USERCFLAGS += -march=armv7-a+fp
|
||||
else ifeq ($(ARMV),8)
|
||||
# To build aarch32 on armv8 Travis-CI (see criu Makefile)
|
||||
USERCFLAGS += -march=armv7-a
|
||||
--
|
||||
2.34.1
|
||||
|
||||
59
0064-ci-disable-broken-tests-until-fixed.patch
Normal file
59
0064-ci-disable-broken-tests-until-fixed.patch
Normal file
@ -0,0 +1,59 @@
|
||||
From e7efdffa340d0169b4fb18d9ebba214f546ade5d Mon Sep 17 00:00:00 2001
|
||||
From: Adrian Reber <areber@redhat.com>
|
||||
Date: Fri, 3 Dec 2021 16:48:36 +0000
|
||||
Subject: [PATCH 064/120] ci: disable broken tests until fixed
|
||||
|
||||
Broken tests are being tracked at
|
||||
|
||||
* https://github.com/checkpoint-restore/criu/issues/1669
|
||||
* https://github.com/checkpoint-restore/criu/issues/1635
|
||||
|
||||
This also enables previously disabled BPF related tests:
|
||||
|
||||
* https://github.com/checkpoint-restore/criu/issues/1354
|
||||
|
||||
Signed-off-by: Adrian Reber <areber@redhat.com>
|
||||
---
|
||||
scripts/ci/vagrant.sh | 6 +++---
|
||||
test/jenkins/criu-fault.sh | 8 ++++++++
|
||||
2 files changed, 11 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/scripts/ci/vagrant.sh b/scripts/ci/vagrant.sh
|
||||
index 839b100c8..25343f96c 100755
|
||||
--- a/scripts/ci/vagrant.sh
|
||||
+++ b/scripts/ci/vagrant.sh
|
||||
@@ -50,9 +50,9 @@ fedora-no-vdso() {
|
||||
vagrant reload
|
||||
ssh default cat /proc/cmdline
|
||||
ssh default 'cd /vagrant; tar xf criu.tar; cd criu; make -j 4'
|
||||
- # BPF tests are failing see: https://github.com/checkpoint-restore/criu/issues/1354
|
||||
- # Needs to be fixed, skip for now
|
||||
- ssh default 'cd /vagrant/criu/test; sudo ./zdtm.py run -a --keep-going -x zdtm/static/bpf_hash -x zdtm/static/bpf_array'
|
||||
+ # Disabling tests which are broken on 5.15
|
||||
+ # https://github.com/checkpoint-restore/criu/issues/1669
|
||||
+ ssh default 'cd /vagrant/criu/test; sudo ./zdtm.py run -a --keep-going -x zdtm/static/socket_close_data -x zdtm/static/socket_close_data01 -x zdtm/static/fifo_upon_unix_socket01 -x zdtm/static/sk-unix-mntns -x zdtm/static/fifo_upon_unix_socket00 -x zdtm/static/socket-ext -x zdtm/static/sk-unix01 -x zdtm/static/socket_dgram_data -x zdtm/static/sockets_dgram -x zdtm/static/sk-unix-dgram-ghost'
|
||||
# This test (pidfd_store_sk) requires pidfd_getfd syscall which is guaranteed in Fedora 33.
|
||||
# It is also skipped from -a because it runs in RPC mode only
|
||||
ssh default 'cd /vagrant/criu/test; sudo ./zdtm.py run -t zdtm/transition/pidfd_store_sk --rpc --pre 2'
|
||||
diff --git a/test/jenkins/criu-fault.sh b/test/jenkins/criu-fault.sh
|
||||
index a8c3a5cf7..bff40aed5 100755
|
||||
--- a/test/jenkins/criu-fault.sh
|
||||
+++ b/test/jenkins/criu-fault.sh
|
||||
@@ -28,6 +28,14 @@ fi
|
||||
./test/zdtm.py run -t zdtm/static/maps04 --fault 131 --keep-going --report report --pre 2:1 || fail
|
||||
./test/zdtm.py run -t zdtm/transition/maps008 --fault 131 --keep-going --report report --pre 2:1 || fail
|
||||
./test/zdtm.py run -t zdtm/static/maps01 --fault 132 -f h || fail
|
||||
+
|
||||
+# Error injection with --fault 134 fails on newer CPUs used in Circle CI on EC2
|
||||
+# Skip the --fault 134 tests
|
||||
+# https://github.com/checkpoint-restore/criu/issues/1635
|
||||
+if [ -n "$CIRCLECI" ]; then
|
||||
+ exit 0
|
||||
+fi
|
||||
+
|
||||
# 134 is corrupting extended registers set, should run in a sub-thread (fpu03)
|
||||
# without restore (that will check if parasite corrupts extended registers)
|
||||
./test/zdtm.py run -t zdtm/static/fpu03 --fault 134 -f h --norst || fail
|
||||
--
|
||||
2.34.1
|
||||
|
||||
101
0065-test-do-not-use-keep-going-for-single-zdtm-tests.patch
Normal file
101
0065-test-do-not-use-keep-going-for-single-zdtm-tests.patch
Normal file
@ -0,0 +1,101 @@
|
||||
From 3b81160c57cde29450d27edb383deb6e19188dbf Mon Sep 17 00:00:00 2001
|
||||
From: Adrian Reber <areber@redhat.com>
|
||||
Date: Sun, 5 Dec 2021 16:45:20 +0000
|
||||
Subject: [PATCH 065/120] test: do not use --keep-going for single zdtm tests
|
||||
|
||||
Looking at CI logs there are often messages like:
|
||||
|
||||
"[WARNING] Option --keep-going is more useful when running multiple tests"
|
||||
|
||||
This commit removes '--keep-going' from single zdtm test runs.
|
||||
|
||||
Signed-off-by: Adrian Reber <areber@redhat.com>
|
||||
---
|
||||
test/jenkins/criu-dedup.sh | 10 +++++-----
|
||||
test/jenkins/criu-fault.sh | 18 +++++++++---------
|
||||
test/jenkins/criu-fcg.sh | 12 ++++++------
|
||||
3 files changed, 20 insertions(+), 20 deletions(-)
|
||||
|
||||
diff --git a/test/jenkins/criu-dedup.sh b/test/jenkins/criu-dedup.sh
|
||||
index 0041496d8..edb1b653d 100755
|
||||
--- a/test/jenkins/criu-dedup.sh
|
||||
+++ b/test/jenkins/criu-dedup.sh
|
||||
@@ -9,8 +9,8 @@ prep
|
||||
# Additionally run these tests as they touch a lot of
|
||||
# memory and it makes sense to additionally check it
|
||||
# with delays between iterations
|
||||
-./test/zdtm.py run -t zdtm/transition/maps007 --keep-going --report report -f h --pre 8:.1 --dedup || fail
|
||||
-./test/zdtm.py run -t zdtm/static/mem-touch --keep-going --report report -f h --pre 8:.1 --dedup || fail
|
||||
-./test/zdtm.py run -t zdtm/transition/maps008 --keep-going --report report -f h --pre 8:.1 --dedup || fail
|
||||
-./test/zdtm.py run -t zdtm/transition/maps007 --keep-going --report report -f h --pre 8:.1 --noauto-dedup || fail
|
||||
-./test/zdtm.py run -t zdtm/static/mem-touch --keep-going --report report -f h --pre 8:.1 --noauto-dedup || fail
|
||||
+./test/zdtm.py run -t zdtm/transition/maps007 --report report -f h --pre 8:.1 --dedup || fail
|
||||
+./test/zdtm.py run -t zdtm/static/mem-touch --report report -f h --pre 8:.1 --dedup || fail
|
||||
+./test/zdtm.py run -t zdtm/transition/maps008 --report report -f h --pre 8:.1 --dedup || fail
|
||||
+./test/zdtm.py run -t zdtm/transition/maps007 --report report -f h --pre 8:.1 --noauto-dedup || fail
|
||||
+./test/zdtm.py run -t zdtm/static/mem-touch --report report -f h --pre 8:.1 --noauto-dedup || fail
|
||||
diff --git a/test/jenkins/criu-fault.sh b/test/jenkins/criu-fault.sh
|
||||
index bff40aed5..0c5c180e9 100755
|
||||
--- a/test/jenkins/criu-fault.sh
|
||||
+++ b/test/jenkins/criu-fault.sh
|
||||
@@ -4,10 +4,10 @@
|
||||
set -e
|
||||
source `dirname $0`/criu-lib.sh
|
||||
prep
|
||||
-./test/zdtm.py run -t zdtm/static/env00 --fault 1 --keep-going --report report -f h || fail
|
||||
-./test/zdtm.py run -t zdtm/static/unlink_fstat00 --fault 2 --keep-going --report report -f h || fail
|
||||
-./test/zdtm.py run -t zdtm/static/maps00 --fault 3 --keep-going --report report -f h || fail
|
||||
-./test/zdtm.py run -t zdtm/static/inotify_irmap --fault 128 --keep-going --pre 2 -f uns || fail
|
||||
+./test/zdtm.py run -t zdtm/static/env00 --fault 1 --report report -f h || fail
|
||||
+./test/zdtm.py run -t zdtm/static/unlink_fstat00 --fault 2 --report report -f h || fail
|
||||
+./test/zdtm.py run -t zdtm/static/maps00 --fault 3 --report report -f h || fail
|
||||
+./test/zdtm.py run -t zdtm/static/inotify_irmap --fault 128 --pre 2 -f uns || fail
|
||||
./test/zdtm.py run -t zdtm/static/env00 --fault 129 -f uns || fail
|
||||
./test/zdtm.py run -t zdtm/transition/fork --fault 130 -f h || fail
|
||||
./test/zdtm.py run -t zdtm/static/vdso01 --fault 127 || fail
|
||||
@@ -17,16 +17,16 @@ if [ "${COMPAT_TEST}" != "y" ] ; then
|
||||
./test/zdtm.py run -t zdtm/static/vdso01 --fault 133 -f h || fail
|
||||
fi
|
||||
|
||||
-./test/zdtm.py run -t zdtm/static/mntns_ghost --fault 2 --keep-going --report report || fail
|
||||
-./test/zdtm.py run -t zdtm/static/mntns_ghost --fault 4 --keep-going --report report || fail
|
||||
+./test/zdtm.py run -t zdtm/static/mntns_ghost --fault 2 --report report || fail
|
||||
+./test/zdtm.py run -t zdtm/static/mntns_ghost --fault 4 --report report || fail
|
||||
|
||||
./test/zdtm.py run -t zdtm/static/mntns_ghost --fault 6 --report report || fail
|
||||
./test/zdtm.py run -t zdtm/static/mntns_link_remap --fault 6 --report report || fail
|
||||
./test/zdtm.py run -t zdtm/static/unlink_fstat03 --fault 6 --report report || fail
|
||||
|
||||
-./test/zdtm.py run -t zdtm/static/env00 --fault 5 --keep-going --report report || fail
|
||||
-./test/zdtm.py run -t zdtm/static/maps04 --fault 131 --keep-going --report report --pre 2:1 || fail
|
||||
-./test/zdtm.py run -t zdtm/transition/maps008 --fault 131 --keep-going --report report --pre 2:1 || fail
|
||||
+./test/zdtm.py run -t zdtm/static/env00 --fault 5 --report report || fail
|
||||
+./test/zdtm.py run -t zdtm/static/maps04 --fault 131 --report report --pre 2:1 || fail
|
||||
+./test/zdtm.py run -t zdtm/transition/maps008 --fault 131 --report report --pre 2:1 || fail
|
||||
./test/zdtm.py run -t zdtm/static/maps01 --fault 132 -f h || fail
|
||||
|
||||
# Error injection with --fault 134 fails on newer CPUs used in Circle CI on EC2
|
||||
diff --git a/test/jenkins/criu-fcg.sh b/test/jenkins/criu-fcg.sh
|
||||
index ca5054f5e..81395b7ba 100755
|
||||
--- a/test/jenkins/criu-fcg.sh
|
||||
+++ b/test/jenkins/criu-fcg.sh
|
||||
@@ -6,10 +6,10 @@ source `dirname $0`/criu-lib.sh
|
||||
prep
|
||||
mount_tmpfs_to_dump
|
||||
|
||||
-./test/zdtm.py run -t zdtm/transition/thread-bomb -f h --keep-going --report report --freezecg zdtm:f || fail
|
||||
-./test/zdtm.py run -t zdtm/transition/thread-bomb -f h --keep-going --report report --freezecg zdtm:f --pre 3 || fail
|
||||
-./test/zdtm.py run -t zdtm/transition/thread-bomb -f h --keep-going --report report --freezecg zdtm:f --norst || fail
|
||||
+./test/zdtm.py run -t zdtm/transition/thread-bomb -f h --report report --freezecg zdtm:f || fail
|
||||
+./test/zdtm.py run -t zdtm/transition/thread-bomb -f h --report report --freezecg zdtm:f --pre 3 || fail
|
||||
+./test/zdtm.py run -t zdtm/transition/thread-bomb -f h --report report --freezecg zdtm:f --norst || fail
|
||||
|
||||
-./test/zdtm.py run -t zdtm/transition/thread-bomb -f h --keep-going --report report --freezecg zdtm:t || fail
|
||||
-./test/zdtm.py run -t zdtm/transition/thread-bomb -f h --keep-going --report report --freezecg zdtm:t --pre 3 || fail
|
||||
-./test/zdtm.py run -t zdtm/transition/thread-bomb -f h --keep-going --report report --freezecg zdtm:t --norst || fail
|
||||
+./test/zdtm.py run -t zdtm/transition/thread-bomb -f h --report report --freezecg zdtm:t || fail
|
||||
+./test/zdtm.py run -t zdtm/transition/thread-bomb -f h --report report --freezecg zdtm:t --pre 3 || fail
|
||||
+./test/zdtm.py run -t zdtm/transition/thread-bomb -f h --report report --freezecg zdtm:t --norst || fail
|
||||
--
|
||||
2.34.1
|
||||
|
||||
137
0066-files-reg-try-dump_ghost_remap-if-link-remap-failed-.patch
Normal file
137
0066-files-reg-try-dump_ghost_remap-if-link-remap-failed-.patch
Normal file
@ -0,0 +1,137 @@
|
||||
From 94d3c9694f16342e52afe1f3de7077bac9eaf198 Mon Sep 17 00:00:00 2001
|
||||
From: ianlang <ianlang@tencent.com>
|
||||
Date: Fri, 3 Dec 2021 15:15:30 +0800
|
||||
Subject: [PATCH 066/120] files-reg: try dump_ghost_remap if link-remap failed
|
||||
with error ENOENT
|
||||
|
||||
An issue with dumping deleted reg files in overlayfs:
|
||||
|
||||
After deleting a file originated from lower layer in merged dir,
|
||||
fstat() on the /proc/$pid/map_files symlink returns st_nlink=1, while
|
||||
linkat() fails with errno ENOENT.
|
||||
|
||||
Signed-off-by: langyenan <ianlang@tencent.com>
|
||||
---
|
||||
criu/files-reg.c | 42 +++++++++++++++++++++++++++++++++++------
|
||||
criu/include/fs-magic.h | 4 ++++
|
||||
2 files changed, 40 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/criu/files-reg.c b/criu/files-reg.c
|
||||
index 57403d2c6..6759e00e5 100644
|
||||
--- a/criu/files-reg.c
|
||||
+++ b/criu/files-reg.c
|
||||
@@ -959,7 +959,25 @@ void free_link_remaps(void)
|
||||
}
|
||||
static int linkat_hard(int odir, char *opath, int ndir, char *npath, uid_t uid, gid_t gid, int flags);
|
||||
|
||||
-static int create_link_remap(char *path, int len, int lfd, u32 *idp, struct ns_id *nsid, const struct stat *st)
|
||||
+static void check_overlayfs_fallback(char *path, const struct fd_parms *parms, bool *fallback)
|
||||
+{
|
||||
+ if (!fallback || parms->fs_type != OVERLAYFS_SUPER_MAGIC)
|
||||
+ return;
|
||||
+
|
||||
+ /*
|
||||
+ * In overlayFS, linkat() fails with ENOENT if the removed file is
|
||||
+ * originated from lower layer. The cause of failure is that linkat()
|
||||
+ * sees the file has st_nlink=0, which is different than st_nlink=1 we
|
||||
+ * got from earlier fstat() on lfd. By setting *fb=true, we will fall
|
||||
+ * back to dump_ghost_remap() as it is what should have been done to
|
||||
+ * removed files with st_nlink=0.
|
||||
+ */
|
||||
+ pr_info("Unable to link-remap %s on overlayFS, fall back to dump_ghost_remap\n", path);
|
||||
+ *fallback = true;
|
||||
+}
|
||||
+
|
||||
+static int create_link_remap(char *path, int len, int lfd, u32 *idp, struct ns_id *nsid, const struct fd_parms *parms,
|
||||
+ bool *fallback)
|
||||
{
|
||||
char link_name[PATH_MAX], *tmp;
|
||||
FileEntry fe = FILE_ENTRY__INIT;
|
||||
@@ -967,6 +985,7 @@ static int create_link_remap(char *path, int len, int lfd, u32 *idp, struct ns_i
|
||||
FownEntry fwn = FOWN_ENTRY__INIT;
|
||||
int mntns_root;
|
||||
int ret;
|
||||
+ const struct stat *ost = &parms->stat;
|
||||
|
||||
if (!opts.link_remap_ok) {
|
||||
pr_err("Can't create link remap for %s. "
|
||||
@@ -1005,11 +1024,12 @@ static int create_link_remap(char *path, int len, int lfd, u32 *idp, struct ns_i
|
||||
mntns_root = mntns_get_root_fd(nsid);
|
||||
|
||||
again:
|
||||
- ret = linkat_hard(lfd, "", mntns_root, link_name, st->st_uid, st->st_gid, AT_EMPTY_PATH);
|
||||
+ ret = linkat_hard(lfd, "", mntns_root, link_name, ost->st_uid, ost->st_gid, AT_EMPTY_PATH);
|
||||
if (ret < 0 && errno == ENOENT) {
|
||||
/* Use grand parent, if parent directory does not exist. */
|
||||
if (trim_last_parent(link_name) < 0) {
|
||||
pr_err("trim failed: @%s@\n", link_name);
|
||||
+ check_overlayfs_fallback(path, parms, fallback);
|
||||
return -1;
|
||||
}
|
||||
goto again;
|
||||
@@ -1028,12 +1048,13 @@ again:
|
||||
return pb_write_one(img_from_set(glob_imgset, CR_FD_FILES), &fe, PB_FILE);
|
||||
}
|
||||
|
||||
-static int dump_linked_remap(char *path, int len, const struct stat *ost, int lfd, u32 id, struct ns_id *nsid)
|
||||
+static int dump_linked_remap(char *path, int len, const struct fd_parms *parms, int lfd, u32 id, struct ns_id *nsid,
|
||||
+ bool *fallback)
|
||||
{
|
||||
u32 lid;
|
||||
RemapFilePathEntry rpe = REMAP_FILE_PATH_ENTRY__INIT;
|
||||
|
||||
- if (create_link_remap(path, len, lfd, &lid, nsid, ost))
|
||||
+ if (create_link_remap(path, len, lfd, &lid, nsid, parms, fallback))
|
||||
return -1;
|
||||
|
||||
rpe.orig_id = id;
|
||||
@@ -1150,6 +1171,7 @@ static int check_path_remap(struct fd_link *link, const struct fd_parms *parms,
|
||||
struct stat pst;
|
||||
const struct stat *ost = &parms->stat;
|
||||
int flags = 0;
|
||||
+ bool fallback = false;
|
||||
|
||||
if (parms->fs_type == PROC_SUPER_MAGIC) {
|
||||
/* The file points to /proc/pid/<foo> where pid is a dead
|
||||
@@ -1239,7 +1261,7 @@ static int check_path_remap(struct fd_link *link, const struct fd_parms *parms,
|
||||
* links on it) to have some persistent name at hands.
|
||||
*/
|
||||
pr_debug("Dump silly-rename linked remap for %x\n", id);
|
||||
- return dump_linked_remap(rpath + 1, plen - 1, ost, lfd, id, nsid);
|
||||
+ return dump_linked_remap(rpath + 1, plen - 1, parms, lfd, id, nsid, NULL);
|
||||
}
|
||||
|
||||
mntns_root = mntns_get_root_fd(nsid);
|
||||
@@ -1260,7 +1282,15 @@ static int check_path_remap(struct fd_link *link, const struct fd_parms *parms,
|
||||
|
||||
if (errno == ENOENT) {
|
||||
link_strip_deleted(link);
|
||||
- return dump_linked_remap(rpath + 1, plen - 1, ost, lfd, id, nsid);
|
||||
+ ret = dump_linked_remap(rpath + 1, plen - 1, parms, lfd, id, nsid, &fallback);
|
||||
+ if (ret < 0 && fallback) {
|
||||
+ /* fallback is true only if following conditions are true:
|
||||
+ * 1. linkat() inside dump_linked_remap() failed with ENOENT
|
||||
+ * 2. parms->fs_type == overlayFS
|
||||
+ */
|
||||
+ return dump_ghost_remap(rpath + 1, ost, lfd, id, nsid);
|
||||
+ }
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
pr_perror("Can't stat path");
|
||||
diff --git a/criu/include/fs-magic.h b/criu/include/fs-magic.h
|
||||
index 46ac8aa27..ad34f4891 100644
|
||||
--- a/criu/include/fs-magic.h
|
||||
+++ b/criu/include/fs-magic.h
|
||||
@@ -53,4 +53,8 @@
|
||||
#define AUTOFS_SUPER_MAGIC 0x0187
|
||||
#endif
|
||||
|
||||
+#ifndef OVERLAYFS_SUPER_MAGIC
|
||||
+#define OVERLAYFS_SUPER_MAGIC 0x794c7630
|
||||
+#endif
|
||||
+
|
||||
#endif /* __CR_FS_MAGIC_H__ */
|
||||
--
|
||||
2.34.1
|
||||
|
||||
63
0067-util-make-page-server-IPv6-safe.patch
Normal file
63
0067-util-make-page-server-IPv6-safe.patch
Normal file
@ -0,0 +1,63 @@
|
||||
From b9ae48172fff77d41b5cf19d334ccbe002ac0686 Mon Sep 17 00:00:00 2001
|
||||
From: Adrian Reber <areber@redhat.com>
|
||||
Date: Tue, 7 Dec 2021 09:10:14 +0000
|
||||
Subject: [PATCH 067/120] util: make page-server IPv6 safe
|
||||
|
||||
The function run_tcp_server() was the last place CRIU was still using
|
||||
the IPv4 only function inet_ntoa(). It was only used during a print, so
|
||||
that it did not really break anything, but with this commit the output
|
||||
is now no longer:
|
||||
|
||||
Accepted connection from 0.0.0.0:58396
|
||||
|
||||
but correctly displaying the IPv6 address
|
||||
|
||||
Accepted connection from ::1:58398
|
||||
|
||||
if connecting via IPv6.
|
||||
|
||||
Signed-off-by: Adrian Reber <areber@redhat.com>
|
||||
---
|
||||
criu/util.c | 15 +++++++++++----
|
||||
1 file changed, 11 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/criu/util.c b/criu/util.c
|
||||
index 2917102fd..822822186 100644
|
||||
--- a/criu/util.c
|
||||
+++ b/criu/util.c
|
||||
@@ -1107,7 +1107,7 @@ out:
|
||||
int run_tcp_server(bool daemon_mode, int *ask, int cfd, int sk)
|
||||
{
|
||||
int ret;
|
||||
- struct sockaddr_in caddr;
|
||||
+ struct sockaddr_storage caddr;
|
||||
socklen_t clen = sizeof(caddr);
|
||||
|
||||
if (daemon_mode) {
|
||||
@@ -1135,13 +1135,20 @@ int run_tcp_server(bool daemon_mode, int *ask, int cfd, int sk)
|
||||
return -1;
|
||||
|
||||
if (sk >= 0) {
|
||||
+ char port[6];
|
||||
+ char address[INET6_ADDRSTRLEN];
|
||||
*ask = accept(sk, (struct sockaddr *)&caddr, &clen);
|
||||
if (*ask < 0) {
|
||||
pr_perror("Can't accept connection to server");
|
||||
goto err;
|
||||
- } else
|
||||
- pr_info("Accepted connection from %s:%u\n", inet_ntoa(caddr.sin_addr),
|
||||
- (int)ntohs(caddr.sin_port));
|
||||
+ }
|
||||
+ ret = getnameinfo((struct sockaddr *)&caddr, clen, address, sizeof(address), port, sizeof(port),
|
||||
+ NI_NUMERICHOST | NI_NUMERICSERV);
|
||||
+ if (ret) {
|
||||
+ pr_err("Failed converting address: %s\n", gai_strerror(ret));
|
||||
+ goto err;
|
||||
+ }
|
||||
+ pr_info("Accepted connection from %s:%s\n", address, port);
|
||||
close(sk);
|
||||
}
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,48 @@
|
||||
From 4cf1336062e06a4d042771d59eac851ea7273a15 Mon Sep 17 00:00:00 2001
|
||||
From: Bui Quang Minh <minhquangbui99@gmail.com>
|
||||
Date: Thu, 2 Dec 2021 23:01:33 +0700
|
||||
Subject: [PATCH 068/120] sk-unix: Fix TCP_ESTABLISHED checks in unix sockets
|
||||
|
||||
Since commit 83301b5367a98 ("af_unix: Set TCP_ESTABLISHED for datagram sockets
|
||||
too") in Linux kernel, SOCK_DGRAM unix sockets can have TCP_ESTABLISHED state
|
||||
when connected. So we need to fix checks that assume SOCK_DRAM sockets cannot
|
||||
have TCP_ESTABLISHED state.
|
||||
|
||||
Signed-off-by: Bui Quang Minh <minhquangbui99@gmail.com>
|
||||
---
|
||||
criu/sk-unix.c | 10 +++-------
|
||||
1 file changed, 3 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/criu/sk-unix.c b/criu/sk-unix.c
|
||||
index a819473b4..d3402c3ac 100644
|
||||
--- a/criu/sk-unix.c
|
||||
+++ b/criu/sk-unix.c
|
||||
@@ -460,7 +460,7 @@ static int dump_one_unix_fd(int lfd, uint32_t id, const struct fd_parms *p)
|
||||
pr_warn("Shutdown mismatch %u:%d -> %u:%d\n", ue->ino, ue->shutdown, peer->sd.ino,
|
||||
peer->shutdown);
|
||||
}
|
||||
- } else if (ue->state == TCP_ESTABLISHED) {
|
||||
+ } else if (ue->state == TCP_ESTABLISHED && ue->type != SOCK_DGRAM) {
|
||||
const struct unix_sk_listen_icon *e;
|
||||
|
||||
e = lookup_unix_listen_icons(ue->ino);
|
||||
@@ -1851,14 +1851,10 @@ static int open_unixsk_standalone(struct unix_sk_info *ui, int *new_fd)
|
||||
|
||||
close(sks[1]);
|
||||
sk = sks[0];
|
||||
- } else if (ui->ue->state == TCP_ESTABLISHED && queuer && queuer->ue->ino == FAKE_INO) {
|
||||
+ } else if ((ui->ue->state == TCP_ESTABLISHED && ui->ue->type == SOCK_STREAM) && queuer &&
|
||||
+ queuer->ue->ino == FAKE_INO) {
|
||||
int ret, sks[2];
|
||||
|
||||
- if (ui->ue->type != SOCK_STREAM) {
|
||||
- pr_err("Non-stream socket %u in established state\n", ui->ue->ino);
|
||||
- return -1;
|
||||
- }
|
||||
-
|
||||
if (ui->ue->shutdown != SK_SHUTDOWN__BOTH) {
|
||||
pr_err("Wrong shutdown/peer state for %u\n", ui->ue->ino);
|
||||
return -1;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
34
0069-ci-Enable-disabled-unix-socket-related-tests.patch
Normal file
34
0069-ci-Enable-disabled-unix-socket-related-tests.patch
Normal file
@ -0,0 +1,34 @@
|
||||
From 1cfca8ec896ed84a6ab8878489854fe0529e14a5 Mon Sep 17 00:00:00 2001
|
||||
From: Bui Quang Minh <minhquangbui99@gmail.com>
|
||||
Date: Tue, 7 Dec 2021 23:40:12 +0700
|
||||
Subject: [PATCH 069/120] ci: Enable disabled unix socket related tests
|
||||
|
||||
As the unix socket broken tests have been fixed in the pull request
|
||||
|
||||
https://github.com/checkpoint-restore/criu/pull/1680
|
||||
|
||||
We re-enable these tests.
|
||||
|
||||
Signed-off-by: Bui Quang Minh <minhquangbui99@gmail.com>
|
||||
---
|
||||
scripts/ci/vagrant.sh | 4 +---
|
||||
1 file changed, 1 insertion(+), 3 deletions(-)
|
||||
|
||||
diff --git a/scripts/ci/vagrant.sh b/scripts/ci/vagrant.sh
|
||||
index 25343f96c..40c8416e1 100755
|
||||
--- a/scripts/ci/vagrant.sh
|
||||
+++ b/scripts/ci/vagrant.sh
|
||||
@@ -50,9 +50,7 @@ fedora-no-vdso() {
|
||||
vagrant reload
|
||||
ssh default cat /proc/cmdline
|
||||
ssh default 'cd /vagrant; tar xf criu.tar; cd criu; make -j 4'
|
||||
- # Disabling tests which are broken on 5.15
|
||||
- # https://github.com/checkpoint-restore/criu/issues/1669
|
||||
- ssh default 'cd /vagrant/criu/test; sudo ./zdtm.py run -a --keep-going -x zdtm/static/socket_close_data -x zdtm/static/socket_close_data01 -x zdtm/static/fifo_upon_unix_socket01 -x zdtm/static/sk-unix-mntns -x zdtm/static/fifo_upon_unix_socket00 -x zdtm/static/socket-ext -x zdtm/static/sk-unix01 -x zdtm/static/socket_dgram_data -x zdtm/static/sockets_dgram -x zdtm/static/sk-unix-dgram-ghost'
|
||||
+ ssh default 'cd /vagrant/criu/test; sudo ./zdtm.py run -a --keep-going'
|
||||
# This test (pidfd_store_sk) requires pidfd_getfd syscall which is guaranteed in Fedora 33.
|
||||
# It is also skipped from -a because it runs in RPC mode only
|
||||
ssh default 'cd /vagrant/criu/test; sudo ./zdtm.py run -t zdtm/transition/pidfd_store_sk --rpc --pre 2'
|
||||
--
|
||||
2.34.1
|
||||
|
||||
29
0070-ci-install-procps-in-Alpine.patch
Normal file
29
0070-ci-install-procps-in-Alpine.patch
Normal file
@ -0,0 +1,29 @@
|
||||
From 010016dc43cd6fec27ba27c636cfd7aa02549433 Mon Sep 17 00:00:00 2001
|
||||
From: Radostin Stoyanov <radostin@redhat.com>
|
||||
Date: Fri, 10 Dec 2021 15:35:29 +0000
|
||||
Subject: [PATCH 070/120] ci: install procps in Alpine
|
||||
|
||||
The version of ps in Alpine image by default is very limited.
|
||||
It is based on the one from busybox and doesn't support options
|
||||
such as '-p'.
|
||||
|
||||
Signed-off-by: Radostin Stoyanov <radostin@redhat.com>
|
||||
---
|
||||
scripts/build/Dockerfile.alpine | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/scripts/build/Dockerfile.alpine b/scripts/build/Dockerfile.alpine
|
||||
index a6579c0bb..cab72e8a1 100644
|
||||
--- a/scripts/build/Dockerfile.alpine
|
||||
+++ b/scripts/build/Dockerfile.alpine
|
||||
@@ -6,6 +6,7 @@ RUN apk update && apk add \
|
||||
bash \
|
||||
build-base \
|
||||
coreutils \
|
||||
+ procps \
|
||||
git \
|
||||
gnutls-dev \
|
||||
libaio-dev \
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,34 @@
|
||||
From 1ddc8a3dca2881bef56855bb7741e8814c3753f6 Mon Sep 17 00:00:00 2001
|
||||
From: Adrian Reber <areber@redhat.com>
|
||||
Date: Fri, 3 Dec 2021 16:59:56 +0000
|
||||
Subject: [PATCH 071/120] test: another try to correctly fix the kernel version
|
||||
|
||||
We try to disable time namespace based testing for kernels older than
|
||||
5.11. But we fail to come up with the correct if condition.
|
||||
|
||||
This changes (major <= 5) to (major < 5). There are no kernels with
|
||||
major > 5 so currently the time namespace based are never run. This
|
||||
should finally change it to run time namespace based tests on kernel
|
||||
versions newer than 5.10.
|
||||
|
||||
Signed-off-by: Adrian Reber <areber@redhat.com>
|
||||
---
|
||||
test/zdtm_ct.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/test/zdtm_ct.c b/test/zdtm_ct.c
|
||||
index e8d45a9e7..e4b17a512 100644
|
||||
--- a/test/zdtm_ct.c
|
||||
+++ b/test/zdtm_ct.c
|
||||
@@ -61,7 +61,7 @@ static int create_timens()
|
||||
if (sscanf(buf.release, "%u.%u", &major, &minor) != 2)
|
||||
return -1;
|
||||
|
||||
- if ((major <= 5) || (major == 5 && minor < 11)) {
|
||||
+ if ((major < 5) || (major == 5 && minor < 11)) {
|
||||
fprintf(stderr, "timens isn't supported on %s\n", buf.release);
|
||||
return 0;
|
||||
}
|
||||
--
|
||||
2.34.1
|
||||
|
||||
59
0072-x86-compel-fault-inject-bound-xsave-features-set.patch
Normal file
59
0072-x86-compel-fault-inject-bound-xsave-features-set.patch
Normal file
@ -0,0 +1,59 @@
|
||||
From b270ce214216d6b74d8e3a6e9c6cbfc0c6ffbddd Mon Sep 17 00:00:00 2001
|
||||
From: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
|
||||
Date: Mon, 13 Dec 2021 15:19:50 +0300
|
||||
Subject: [PATCH 072/120] x86/compel/fault-inject: bound xsave features set
|
||||
|
||||
Since
|
||||
e2e8be37 ("x86/compel/fault-inject: Add a fault-injection for corrupting extended regset")
|
||||
we doing fault-injection test for C/R of threads register set by filling tasks
|
||||
xsave structures with the garbage. But there are some features for which that's not
|
||||
safe. It leads to failures like described in #1635
|
||||
|
||||
In this particular case we meet the problem with PKRU feature, the problem
|
||||
that after corrupting pkru registers we may restrict access to some vma areas,
|
||||
so, after that process with the parasite injected get's segfault and crashes.
|
||||
|
||||
Let's manually specify which features is save to fill with the garbage by
|
||||
keeping proper XFEATURE_MASK_FAULTINJ mask value.
|
||||
|
||||
Fixes: e2e8be37 ("x86/compel/fault-inject: Add a fault-injection for corrupting extended regset")
|
||||
|
||||
https://github.com/checkpoint-restore/criu/issues/1635
|
||||
|
||||
Signed-off-by: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
|
||||
---
|
||||
compel/arch/x86/src/lib/include/uapi/asm/fpu.h | 5 +++++
|
||||
compel/arch/x86/src/lib/infect.c | 1 +
|
||||
2 files changed, 6 insertions(+)
|
||||
|
||||
diff --git a/compel/arch/x86/src/lib/include/uapi/asm/fpu.h b/compel/arch/x86/src/lib/include/uapi/asm/fpu.h
|
||||
index a16b658af..c8ebda097 100644
|
||||
--- a/compel/arch/x86/src/lib/include/uapi/asm/fpu.h
|
||||
+++ b/compel/arch/x86/src/lib/include/uapi/asm/fpu.h
|
||||
@@ -80,6 +80,11 @@ enum xfeature {
|
||||
(XFEATURE_MASK_FP | XFEATURE_MASK_SSE | XFEATURE_MASK_YMM | XFEATURE_MASK_OPMASK | XFEATURE_MASK_ZMM_Hi256 | \
|
||||
XFEATURE_MASK_Hi16_ZMM | XFEATURE_MASK_PKRU | XFEATURE_MASK_BNDREGS | XFEATURE_MASK_BNDCSR)
|
||||
|
||||
+/* xsave structure features which is safe to fill with garbage (see validate_random_xstate()) */
|
||||
+#define XFEATURE_MASK_FAULTINJ \
|
||||
+ (XFEATURE_MASK_FP | XFEATURE_MASK_SSE | XFEATURE_MASK_YMM | XFEATURE_MASK_OPMASK | XFEATURE_MASK_ZMM_Hi256 | \
|
||||
+ XFEATURE_MASK_Hi16_ZMM)
|
||||
+
|
||||
struct fpx_sw_bytes {
|
||||
uint32_t magic1;
|
||||
uint32_t extended_size;
|
||||
diff --git a/compel/arch/x86/src/lib/infect.c b/compel/arch/x86/src/lib/infect.c
|
||||
index 2f6c557d0..37b0ee327 100644
|
||||
--- a/compel/arch/x86/src/lib/infect.c
|
||||
+++ b/compel/arch/x86/src/lib/infect.c
|
||||
@@ -254,6 +254,7 @@ static void validate_random_xstate(struct xsave_struct *xsave)
|
||||
/* No unknown or supervisor features may be set */
|
||||
hdr->xstate_bv &= XFEATURE_MASK_USER;
|
||||
hdr->xstate_bv &= ~XFEATURE_MASK_SUPERVISOR;
|
||||
+ hdr->xstate_bv &= XFEATURE_MASK_FAULTINJ;
|
||||
|
||||
for (i = 0; i < XFEATURE_MAX; i++) {
|
||||
if (!compel_fpu_has_feature(i))
|
||||
--
|
||||
2.34.1
|
||||
|
||||
41
0073-x86-compel-fault-inject-print-the-initial-seed.patch
Normal file
41
0073-x86-compel-fault-inject-print-the-initial-seed.patch
Normal file
@ -0,0 +1,41 @@
|
||||
From ef96f75f2c84575bd5bf702f933807be4275ee40 Mon Sep 17 00:00:00 2001
|
||||
From: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
|
||||
Date: Mon, 13 Dec 2021 15:32:00 +0300
|
||||
Subject: [PATCH 073/120] x86/compel/fault-inject: print the initial seed
|
||||
|
||||
Fixes: e2e8be37 ("x86/compel/fault-inject: Add a fault-injection for corrupting extended regset")
|
||||
|
||||
Signed-off-by: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
|
||||
---
|
||||
compel/arch/x86/src/lib/infect.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/compel/arch/x86/src/lib/infect.c b/compel/arch/x86/src/lib/infect.c
|
||||
index 37b0ee327..de9013c27 100644
|
||||
--- a/compel/arch/x86/src/lib/infect.c
|
||||
+++ b/compel/arch/x86/src/lib/infect.c
|
||||
@@ -283,10 +283,10 @@ static int corrupt_extregs(pid_t pid)
|
||||
bool use_xsave = compel_cpu_has_feature(X86_FEATURE_OSXSAVE);
|
||||
user_fpregs_struct_t ext_regs;
|
||||
int *rand_to = (int *)&ext_regs;
|
||||
- unsigned int seed;
|
||||
+ unsigned int seed, init_seed;
|
||||
size_t i;
|
||||
|
||||
- seed = time(NULL);
|
||||
+ init_seed = seed = time(NULL);
|
||||
for (i = 0; i < sizeof(ext_regs) / sizeof(int); i++)
|
||||
*rand_to++ = rand_r(&seed);
|
||||
|
||||
@@ -296,7 +296,7 @@ static int corrupt_extregs(pid_t pid)
|
||||
* - zdtm.py will grep it auto-magically from logs
|
||||
* (and the seed will be known from an automatical testing)
|
||||
*/
|
||||
- pr_err("Corrupting %s for %d, seed %u\n", use_xsave ? "xsave" : "fpuregs", pid, seed);
|
||||
+ pr_err("Corrupting %s for %d, seed %u\n", use_xsave ? "xsave" : "fpuregs", pid, init_seed);
|
||||
|
||||
if (!use_xsave) {
|
||||
if (ptrace(PTRACE_SETFPREGS, pid, NULL, &ext_regs)) {
|
||||
--
|
||||
2.34.1
|
||||
|
||||
32
0074-ci-enable-x86-xsave-fault-injection-tests-back.patch
Normal file
32
0074-ci-enable-x86-xsave-fault-injection-tests-back.patch
Normal file
@ -0,0 +1,32 @@
|
||||
From df36ad5100646b6c3be4798da92b2c5f0b4aa37f Mon Sep 17 00:00:00 2001
|
||||
From: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
|
||||
Date: Mon, 13 Dec 2021 15:46:47 +0300
|
||||
Subject: [PATCH 074/120] ci: enable x86 xsave fault injection tests back
|
||||
|
||||
Signed-off-by: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
|
||||
---
|
||||
test/jenkins/criu-fault.sh | 8 --------
|
||||
1 file changed, 8 deletions(-)
|
||||
|
||||
diff --git a/test/jenkins/criu-fault.sh b/test/jenkins/criu-fault.sh
|
||||
index 0c5c180e9..9f20091cc 100755
|
||||
--- a/test/jenkins/criu-fault.sh
|
||||
+++ b/test/jenkins/criu-fault.sh
|
||||
@@ -28,14 +28,6 @@ fi
|
||||
./test/zdtm.py run -t zdtm/static/maps04 --fault 131 --report report --pre 2:1 || fail
|
||||
./test/zdtm.py run -t zdtm/transition/maps008 --fault 131 --report report --pre 2:1 || fail
|
||||
./test/zdtm.py run -t zdtm/static/maps01 --fault 132 -f h || fail
|
||||
-
|
||||
-# Error injection with --fault 134 fails on newer CPUs used in Circle CI on EC2
|
||||
-# Skip the --fault 134 tests
|
||||
-# https://github.com/checkpoint-restore/criu/issues/1635
|
||||
-if [ -n "$CIRCLECI" ]; then
|
||||
- exit 0
|
||||
-fi
|
||||
-
|
||||
# 134 is corrupting extended registers set, should run in a sub-thread (fpu03)
|
||||
# without restore (that will check if parasite corrupts extended registers)
|
||||
./test/zdtm.py run -t zdtm/static/fpu03 --fault 134 -f h --norst || fail
|
||||
--
|
||||
2.34.1
|
||||
|
||||
48
0075-Add-documentation-for-timeout-option.patch
Normal file
48
0075-Add-documentation-for-timeout-option.patch
Normal file
@ -0,0 +1,48 @@
|
||||
From 70f20b4460654df0c013f7252365554dc857615b Mon Sep 17 00:00:00 2001
|
||||
From: Radostin Stoyanov <radostin@redhat.com>
|
||||
Date: Tue, 14 Dec 2021 12:54:19 +0000
|
||||
Subject: [PATCH 075/120] Add documentation for --timeout option
|
||||
|
||||
The --timeout option was introduced in [1] to prevent criu dump from
|
||||
being able to hang indefinitely and allow users to adjust the time limit
|
||||
in seconds for collecting tasks during the dump operation.
|
||||
|
||||
[1] https://github.com/checkpoint-restore/criu/commit/d0ff730
|
||||
|
||||
Signed-off-by: Radostin Stoyanov <radostin@redhat.com>
|
||||
---
|
||||
Documentation/criu.txt | 4 ++++
|
||||
criu/crtools.c | 2 ++
|
||||
2 files changed, 6 insertions(+)
|
||||
|
||||
diff --git a/Documentation/criu.txt b/Documentation/criu.txt
|
||||
index 4c6885fc9..f41b1898c 100644
|
||||
--- a/Documentation/criu.txt
|
||||
+++ b/Documentation/criu.txt
|
||||
@@ -367,6 +367,10 @@ mount -t cgroup -o devices,freezer none devices,freezer
|
||||
Allows to link unlinked files back, if possible (modifies filesystem
|
||||
during *restore*).
|
||||
|
||||
+*--timeout* 'number'::
|
||||
+ Set a time limit in seconds for collecting tasks during the
|
||||
+ dump operation. The timeout is 10 seconds by default.
|
||||
+
|
||||
*--ghost-limit* 'size'::
|
||||
Set the maximum size of deleted file to be carried inside image.
|
||||
By default, up to 1M file is allowed. Using this
|
||||
diff --git a/criu/crtools.c b/criu/crtools.c
|
||||
index 81c0aa963..da47bd684 100644
|
||||
--- a/criu/crtools.c
|
||||
+++ b/criu/crtools.c
|
||||
@@ -391,6 +391,8 @@ usage:
|
||||
" -j|--" OPT_SHELL_JOB " allow one to dump and restore shell jobs\n"
|
||||
" -l|--" OPT_FILE_LOCKS " handle file locks, for safety, only used for container\n"
|
||||
" -L|--libdir path to a plugin directory (by default " CR_PLUGIN_DEFAULT ")\n"
|
||||
+ " --timeout NUM a timeout (in seconds) on collecting tasks during dump\n"
|
||||
+ " (default 10 seconds)\n"
|
||||
" --force-irmap force resolving names for inotify/fsnotify watches\n"
|
||||
" --irmap-scan-path FILE\n"
|
||||
" add a path the irmap hints to scan\n"
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,32 @@
|
||||
From fc1e7788ce1cba57afc230c6219d570f5d3074ae Mon Sep 17 00:00:00 2001
|
||||
From: Andrei Vagin <avagin@google.com>
|
||||
Date: Tue, 14 Dec 2021 08:19:16 -0800
|
||||
Subject: [PATCH 076/120] usernsd: UNS_FDOUT should not require an input
|
||||
descriptor
|
||||
|
||||
UNS_FDOUT means only that a userns call will return a file descriptor.
|
||||
|
||||
Signed-off-by: Andrei Vagin <avagin@google.com>
|
||||
---
|
||||
criu/namespaces.c | 5 -----
|
||||
1 file changed, 5 deletions(-)
|
||||
|
||||
diff --git a/criu/namespaces.c b/criu/namespaces.c
|
||||
index 7fa58682b..c36e631cf 100644
|
||||
--- a/criu/namespaces.c
|
||||
+++ b/criu/namespaces.c
|
||||
@@ -1330,11 +1330,6 @@ static int usernsd(int sk)
|
||||
unsc_msg_pid_fd(&um, &pid, &fd);
|
||||
pr_debug("uns: daemon calls %p (%d, %d, %x)\n", call, pid, fd, flags);
|
||||
|
||||
- if (fd < 0 && flags & UNS_FDOUT) {
|
||||
- pr_err("uns: bad flags/fd %p %d %x\n", call, fd, flags);
|
||||
- BUG();
|
||||
- }
|
||||
-
|
||||
/*
|
||||
* Caller has sent us bare address of the routine it
|
||||
* wants to call. Since the caller is fork()-ed from the
|
||||
--
|
||||
2.34.1
|
||||
|
||||
67
0077-libcriu-add-setting-lsm-mount-context-to-libcriu.patch
Normal file
67
0077-libcriu-add-setting-lsm-mount-context-to-libcriu.patch
Normal file
@ -0,0 +1,67 @@
|
||||
From d67af357dfa24f646f2e8abccede1e25d4376267 Mon Sep 17 00:00:00 2001
|
||||
From: Adrian Reber <areber@redhat.com>
|
||||
Date: Wed, 1 Dec 2021 11:08:53 +0000
|
||||
Subject: [PATCH 077/120] libcriu: add setting lsm-mount-context to libcriu
|
||||
|
||||
Signed-off-by: Adrian Reber <areber@redhat.com>
|
||||
---
|
||||
lib/c/criu.c | 15 +++++++++++++++
|
||||
lib/c/criu.h | 2 ++
|
||||
2 files changed, 17 insertions(+)
|
||||
|
||||
diff --git a/lib/c/criu.c b/lib/c/criu.c
|
||||
index ddc6e0731..4ee189aca 100644
|
||||
--- a/lib/c/criu.c
|
||||
+++ b/lib/c/criu.c
|
||||
@@ -238,6 +238,7 @@ void criu_local_free_opts(criu_opts *opts)
|
||||
free(opts->rpc->freeze_cgroup);
|
||||
free(opts->rpc->log_file);
|
||||
free(opts->rpc->lsm_profile);
|
||||
+ free(opts->rpc->lsm_mount_context);
|
||||
free(opts->rpc);
|
||||
criu_free_service(opts);
|
||||
free(opts);
|
||||
@@ -651,6 +652,20 @@ int criu_set_lsm_profile(const char *name)
|
||||
return criu_local_set_lsm_profile(global_opts, name);
|
||||
}
|
||||
|
||||
+int criu_local_set_lsm_mount_context(criu_opts *opts, const char *name)
|
||||
+{
|
||||
+ opts->rpc->lsm_mount_context = strdup(name);
|
||||
+ if (opts->rpc->lsm_mount_context == NULL) {
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+int criu_set_lsm_mount_context(const char *name)
|
||||
+{
|
||||
+ return criu_local_set_lsm_mount_context(global_opts, name);
|
||||
+}
|
||||
+
|
||||
void criu_local_set_timeout(criu_opts *opts, unsigned int timeout)
|
||||
{
|
||||
opts->rpc->timeout = timeout;
|
||||
diff --git a/lib/c/criu.h b/lib/c/criu.h
|
||||
index 949902f55..a374b37f8 100644
|
||||
--- a/lib/c/criu.h
|
||||
+++ b/lib/c/criu.h
|
||||
@@ -92,6 +92,7 @@ void criu_set_manage_cgroups(bool manage);
|
||||
void criu_set_manage_cgroups_mode(enum criu_cg_mode mode);
|
||||
int criu_set_freeze_cgroup(const char *name);
|
||||
int criu_set_lsm_profile(const char *name);
|
||||
+int criu_set_lsm_mount_context(const char *name);
|
||||
void criu_set_timeout(unsigned int timeout);
|
||||
void criu_set_auto_ext_mnt(bool val);
|
||||
void criu_set_ext_sharing(bool val);
|
||||
@@ -249,6 +250,7 @@ void criu_local_set_manage_cgroups(criu_opts *opts, bool manage);
|
||||
void criu_local_set_manage_cgroups_mode(criu_opts *opts, enum criu_cg_mode mode);
|
||||
int criu_local_set_freeze_cgroup(criu_opts *opts, const char *name);
|
||||
int criu_local_set_lsm_profile(criu_opts *opts, const char *name);
|
||||
+int criu_local_set_lsm_mount_context(criu_opts *opts, const char *name);
|
||||
void criu_local_set_timeout(criu_opts *opts, unsigned int timeout);
|
||||
void criu_local_set_auto_ext_mnt(criu_opts *opts, bool val);
|
||||
void criu_local_set_ext_sharing(criu_opts *opts, bool val);
|
||||
--
|
||||
2.34.1
|
||||
|
||||
182
0078-ci-use-unstable-release-for-cross-compile.patch
Normal file
182
0078-ci-use-unstable-release-for-cross-compile.patch
Normal file
@ -0,0 +1,182 @@
|
||||
From 4b75e29f72a84780099798b2e9f5c6651069c6da Mon Sep 17 00:00:00 2001
|
||||
From: Radostin Stoyanov <rstoyanov@fedoraproject.org>
|
||||
Date: Sat, 18 Dec 2021 17:25:17 +0000
|
||||
Subject: [PATCH 078/120] ci: use unstable release for cross-compile
|
||||
|
||||
We added cross-compile tests with testing debian release to be able to
|
||||
replicate the error reported in #1653, however, installing build
|
||||
dependencies in this release currently fails with the following error:
|
||||
|
||||
libc6-dev:armhf : Breaks: libc6-dev-armhf-cross (< 2.33~) but 2.32-1cross4 is to be installed
|
||||
|
||||
This is not something we can fix, therefore using the debian unstable
|
||||
release (instead of testing) could be more reliable option for our CI.
|
||||
This would still replicate the problem reported in #1653.
|
||||
|
||||
Signed-off-by: Radostin Stoyanov <rstoyanov@fedoraproject.org>
|
||||
---
|
||||
.github/workflows/cross-compile.yml | 8 ++++----
|
||||
scripts/build/Dockerfile.aarch64-testing-cross.tmpl | 1 -
|
||||
...ng-cross.hdr => Dockerfile.aarch64-unstable-cross.hdr} | 0
|
||||
scripts/build/Dockerfile.aarch64-unstable-cross.tmpl | 1 +
|
||||
scripts/build/Dockerfile.armv7-testing-cross.tmpl | 1 -
|
||||
...ting-cross.hdr => Dockerfile.armv7-unstable-cross.hdr} | 0
|
||||
scripts/build/Dockerfile.armv7-unstable-cross.tmpl | 1 +
|
||||
scripts/build/Dockerfile.mips64el-testing-cross.tmpl | 1 -
|
||||
...g-cross.hdr => Dockerfile.mips64el-unstable-cross.hdr} | 0
|
||||
scripts/build/Dockerfile.mips64el-unstable-cross.tmpl | 1 +
|
||||
scripts/build/Dockerfile.ppc64-testing-cross.tmpl | 1 -
|
||||
...ting-cross.hdr => Dockerfile.ppc64-unstable-cross.hdr} | 0
|
||||
scripts/build/Dockerfile.ppc64-unstable-cross.tmpl | 1 +
|
||||
....testing-cross.tmpl => Dockerfile.unstable-cross.tmpl} | 2 +-
|
||||
scripts/build/Makefile | 4 ++--
|
||||
15 files changed, 11 insertions(+), 11 deletions(-)
|
||||
delete mode 120000 scripts/build/Dockerfile.aarch64-testing-cross.tmpl
|
||||
rename scripts/build/{Dockerfile.aarch64-testing-cross.hdr => Dockerfile.aarch64-unstable-cross.hdr} (100%)
|
||||
create mode 120000 scripts/build/Dockerfile.aarch64-unstable-cross.tmpl
|
||||
delete mode 120000 scripts/build/Dockerfile.armv7-testing-cross.tmpl
|
||||
rename scripts/build/{Dockerfile.armv7-testing-cross.hdr => Dockerfile.armv7-unstable-cross.hdr} (100%)
|
||||
create mode 120000 scripts/build/Dockerfile.armv7-unstable-cross.tmpl
|
||||
delete mode 120000 scripts/build/Dockerfile.mips64el-testing-cross.tmpl
|
||||
rename scripts/build/{Dockerfile.mips64el-testing-cross.hdr => Dockerfile.mips64el-unstable-cross.hdr} (100%)
|
||||
create mode 120000 scripts/build/Dockerfile.mips64el-unstable-cross.tmpl
|
||||
delete mode 120000 scripts/build/Dockerfile.ppc64-testing-cross.tmpl
|
||||
rename scripts/build/{Dockerfile.ppc64-testing-cross.hdr => Dockerfile.ppc64-unstable-cross.hdr} (100%)
|
||||
create mode 120000 scripts/build/Dockerfile.ppc64-unstable-cross.tmpl
|
||||
rename scripts/build/{Dockerfile.testing-cross.tmpl => Dockerfile.unstable-cross.tmpl} (93%)
|
||||
|
||||
diff --git a/.github/workflows/cross-compile.yml b/.github/workflows/cross-compile.yml
|
||||
index eec6eb577..461a6e618 100644
|
||||
--- a/.github/workflows/cross-compile.yml
|
||||
+++ b/.github/workflows/cross-compile.yml
|
||||
@@ -10,13 +10,13 @@ jobs:
|
||||
matrix:
|
||||
target: [
|
||||
armv7-stable-cross,
|
||||
- armv7-testing-cross,
|
||||
+ armv7-unstable-cross,
|
||||
aarch64-stable-cross,
|
||||
- aarch64-testing-cross,
|
||||
+ aarch64-unstable-cross,
|
||||
ppc64-stable-cross,
|
||||
- ppc64-testing-cross,
|
||||
+ ppc64-unstable-cross,
|
||||
mips64el-stable-cross,
|
||||
- mips64el-testing-cross
|
||||
+ mips64el-unstable-cross
|
||||
]
|
||||
|
||||
steps:
|
||||
diff --git a/scripts/build/Dockerfile.aarch64-testing-cross.tmpl b/scripts/build/Dockerfile.aarch64-testing-cross.tmpl
|
||||
deleted file mode 120000
|
||||
index c1dd38b21..000000000
|
||||
--- a/scripts/build/Dockerfile.aarch64-testing-cross.tmpl
|
||||
+++ /dev/null
|
||||
@@ -1 +0,0 @@
|
||||
-Dockerfile.testing-cross.tmpl
|
||||
\ No newline at end of file
|
||||
diff --git a/scripts/build/Dockerfile.aarch64-testing-cross.hdr b/scripts/build/Dockerfile.aarch64-unstable-cross.hdr
|
||||
similarity index 100%
|
||||
rename from scripts/build/Dockerfile.aarch64-testing-cross.hdr
|
||||
rename to scripts/build/Dockerfile.aarch64-unstable-cross.hdr
|
||||
diff --git a/scripts/build/Dockerfile.aarch64-unstable-cross.tmpl b/scripts/build/Dockerfile.aarch64-unstable-cross.tmpl
|
||||
new file mode 120000
|
||||
index 000000000..955ae1fd4
|
||||
--- /dev/null
|
||||
+++ b/scripts/build/Dockerfile.aarch64-unstable-cross.tmpl
|
||||
@@ -0,0 +1 @@
|
||||
+Dockerfile.unstable-cross.tmpl
|
||||
\ No newline at end of file
|
||||
diff --git a/scripts/build/Dockerfile.armv7-testing-cross.tmpl b/scripts/build/Dockerfile.armv7-testing-cross.tmpl
|
||||
deleted file mode 120000
|
||||
index c1dd38b21..000000000
|
||||
--- a/scripts/build/Dockerfile.armv7-testing-cross.tmpl
|
||||
+++ /dev/null
|
||||
@@ -1 +0,0 @@
|
||||
-Dockerfile.testing-cross.tmpl
|
||||
\ No newline at end of file
|
||||
diff --git a/scripts/build/Dockerfile.armv7-testing-cross.hdr b/scripts/build/Dockerfile.armv7-unstable-cross.hdr
|
||||
similarity index 100%
|
||||
rename from scripts/build/Dockerfile.armv7-testing-cross.hdr
|
||||
rename to scripts/build/Dockerfile.armv7-unstable-cross.hdr
|
||||
diff --git a/scripts/build/Dockerfile.armv7-unstable-cross.tmpl b/scripts/build/Dockerfile.armv7-unstable-cross.tmpl
|
||||
new file mode 120000
|
||||
index 000000000..955ae1fd4
|
||||
--- /dev/null
|
||||
+++ b/scripts/build/Dockerfile.armv7-unstable-cross.tmpl
|
||||
@@ -0,0 +1 @@
|
||||
+Dockerfile.unstable-cross.tmpl
|
||||
\ No newline at end of file
|
||||
diff --git a/scripts/build/Dockerfile.mips64el-testing-cross.tmpl b/scripts/build/Dockerfile.mips64el-testing-cross.tmpl
|
||||
deleted file mode 120000
|
||||
index c1dd38b21..000000000
|
||||
--- a/scripts/build/Dockerfile.mips64el-testing-cross.tmpl
|
||||
+++ /dev/null
|
||||
@@ -1 +0,0 @@
|
||||
-Dockerfile.testing-cross.tmpl
|
||||
\ No newline at end of file
|
||||
diff --git a/scripts/build/Dockerfile.mips64el-testing-cross.hdr b/scripts/build/Dockerfile.mips64el-unstable-cross.hdr
|
||||
similarity index 100%
|
||||
rename from scripts/build/Dockerfile.mips64el-testing-cross.hdr
|
||||
rename to scripts/build/Dockerfile.mips64el-unstable-cross.hdr
|
||||
diff --git a/scripts/build/Dockerfile.mips64el-unstable-cross.tmpl b/scripts/build/Dockerfile.mips64el-unstable-cross.tmpl
|
||||
new file mode 120000
|
||||
index 000000000..955ae1fd4
|
||||
--- /dev/null
|
||||
+++ b/scripts/build/Dockerfile.mips64el-unstable-cross.tmpl
|
||||
@@ -0,0 +1 @@
|
||||
+Dockerfile.unstable-cross.tmpl
|
||||
\ No newline at end of file
|
||||
diff --git a/scripts/build/Dockerfile.ppc64-testing-cross.tmpl b/scripts/build/Dockerfile.ppc64-testing-cross.tmpl
|
||||
deleted file mode 120000
|
||||
index c1dd38b21..000000000
|
||||
--- a/scripts/build/Dockerfile.ppc64-testing-cross.tmpl
|
||||
+++ /dev/null
|
||||
@@ -1 +0,0 @@
|
||||
-Dockerfile.testing-cross.tmpl
|
||||
\ No newline at end of file
|
||||
diff --git a/scripts/build/Dockerfile.ppc64-testing-cross.hdr b/scripts/build/Dockerfile.ppc64-unstable-cross.hdr
|
||||
similarity index 100%
|
||||
rename from scripts/build/Dockerfile.ppc64-testing-cross.hdr
|
||||
rename to scripts/build/Dockerfile.ppc64-unstable-cross.hdr
|
||||
diff --git a/scripts/build/Dockerfile.ppc64-unstable-cross.tmpl b/scripts/build/Dockerfile.ppc64-unstable-cross.tmpl
|
||||
new file mode 120000
|
||||
index 000000000..955ae1fd4
|
||||
--- /dev/null
|
||||
+++ b/scripts/build/Dockerfile.ppc64-unstable-cross.tmpl
|
||||
@@ -0,0 +1 @@
|
||||
+Dockerfile.unstable-cross.tmpl
|
||||
\ No newline at end of file
|
||||
diff --git a/scripts/build/Dockerfile.testing-cross.tmpl b/scripts/build/Dockerfile.unstable-cross.tmpl
|
||||
similarity index 93%
|
||||
rename from scripts/build/Dockerfile.testing-cross.tmpl
|
||||
rename to scripts/build/Dockerfile.unstable-cross.tmpl
|
||||
index 1d5565310..dacfd96ef 100644
|
||||
--- a/scripts/build/Dockerfile.testing-cross.tmpl
|
||||
+++ b/scripts/build/Dockerfile.unstable-cross.tmpl
|
||||
@@ -1,7 +1,7 @@
|
||||
COPY scripts/ci/apt-install /bin/apt-install
|
||||
|
||||
# Add the cross compiler sources
|
||||
-RUN echo "deb http://deb.debian.org/debian/ testing main" >> /etc/apt/sources.list && \
|
||||
+RUN echo "deb http://deb.debian.org/debian/ unstable main" >> /etc/apt/sources.list && \
|
||||
dpkg --add-architecture ${DEBIAN_ARCH}
|
||||
|
||||
RUN apt-install \
|
||||
diff --git a/scripts/build/Makefile b/scripts/build/Makefile
|
||||
index b24fc80ea..2c006ad87 100644
|
||||
--- a/scripts/build/Makefile
|
||||
+++ b/scripts/build/Makefile
|
||||
@@ -1,7 +1,7 @@
|
||||
ARCHES := x86_64 fedora-asan fedora-rawhide centos7 armv7hf centos8
|
||||
STABLE_CROSS_ARCHES := armv7-stable-cross aarch64-stable-cross ppc64-stable-cross mips64el-stable-cross
|
||||
-TESTING_CROSS_ARCHES := armv7-testing-cross aarch64-testing-cross ppc64-testing-cross mips64el-testing-cross
|
||||
-NON_CLANG := $(TESTING_CROSS_ARCHES) $(STABLE_CROSS_ARCHES)
|
||||
+UNSTABLE_CROSS_ARCHES := armv7-unstable-cross aarch64-unstable-cross ppc64-unstable-cross mips64el-unstable-cross
|
||||
+NON_CLANG := $(UNSTABLE_CROSS_ARCHES) $(STABLE_CROSS_ARCHES)
|
||||
CREATE_DOCKERFILES := $(ARCHES) $(NON_CLANG)
|
||||
TARGETS := $(ARCHES) alpine archlinux
|
||||
TARGETS_CLANG := $(addsuffix $(TARGETS),-clang)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
55
0079-ci-disable-glibc-rseq-support.patch
Normal file
55
0079-ci-disable-glibc-rseq-support.patch
Normal file
@ -0,0 +1,55 @@
|
||||
From d99def7dcfa938918368c91021f72a77f738bc61 Mon Sep 17 00:00:00 2001
|
||||
From: Radostin Stoyanov <rstoyanov@fedoraproject.org>
|
||||
Date: Fri, 17 Dec 2021 03:01:49 +0000
|
||||
Subject: [PATCH 079/120] ci: disable glibc rseq support
|
||||
|
||||
This patch sets the glibc.pthread.rseq tunable [1] to disable rseq
|
||||
support in glibc as a temporary solution for the problem described in
|
||||
[2]. This would allow us to run CI tests until CRIU has rseq support.
|
||||
|
||||
This commit also disables the rpc tests as they fail even
|
||||
when GLIBC_TUNABLES is set.
|
||||
|
||||
[1] https://sourceware.org/git/?p=glibc.git;a=commit;h=e3e589829d16af9f7e73c7b70f74f3c5d5003e45
|
||||
[2] https://github.com/checkpoint-restore/criu/issues/1696
|
||||
|
||||
Signed-off-by: Radostin Stoyanov <rstoyanov@fedoraproject.org>
|
||||
---
|
||||
scripts/build/Dockerfile.fedora.tmpl | 3 +++
|
||||
scripts/ci/run-ci-tests.sh | 7 ++++++-
|
||||
2 files changed, 9 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/scripts/build/Dockerfile.fedora.tmpl b/scripts/build/Dockerfile.fedora.tmpl
|
||||
index 9d3bb0f87..fd4ba4aef 100644
|
||||
--- a/scripts/build/Dockerfile.fedora.tmpl
|
||||
+++ b/scripts/build/Dockerfile.fedora.tmpl
|
||||
@@ -1,5 +1,8 @@
|
||||
ARG CC=gcc
|
||||
|
||||
+# FIXME: Temporary solution for https://github.com/checkpoint-restore/criu/issues/1696
|
||||
+ENV GLIBC_TUNABLES=glibc.pthread.rseq=0
|
||||
+
|
||||
COPY scripts/ci/prepare-for-fedora-rawhide.sh /bin/prepare-for-fedora-rawhide.sh
|
||||
RUN /bin/prepare-for-fedora-rawhide.sh
|
||||
|
||||
diff --git a/scripts/ci/run-ci-tests.sh b/scripts/ci/run-ci-tests.sh
|
||||
index 096f907fb..bf7331142 100755
|
||||
--- a/scripts/ci/run-ci-tests.sh
|
||||
+++ b/scripts/ci/run-ci-tests.sh
|
||||
@@ -235,7 +235,12 @@ if [ -n "$TRAVIS" ] || [ -n "$CIRCLECI" ]; then
|
||||
# Error (criu/tty.c:1014): tty: Don't have tty to inherit session from, aborting
|
||||
make -C test/others/shell-job/ run
|
||||
fi
|
||||
-make -C test/others/rpc/ run
|
||||
+
|
||||
+# FIXME: rpc tests fail even with set glibc tunable
|
||||
+# https://github.com/checkpoint-restore/criu/issues/1696
|
||||
+if [ "$GLIBC_TUNABLES" != "glibc.pthread.rseq=0" ]; then
|
||||
+ make -C test/others/rpc/ run
|
||||
+fi
|
||||
|
||||
./test/zdtm.py run -t zdtm/static/env00 --sibling
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
185
0080-libcriu-add-single-pre-dump-support.patch
Normal file
185
0080-libcriu-add-single-pre-dump-support.patch
Normal file
@ -0,0 +1,185 @@
|
||||
From 7b5909592881607f5d5ecc8de144e5bb83f02438 Mon Sep 17 00:00:00 2001
|
||||
From: Adrian Reber <areber@redhat.com>
|
||||
Date: Fri, 3 Dec 2021 14:32:33 +0000
|
||||
Subject: [PATCH 080/120] libcriu: add single pre-dump support
|
||||
|
||||
In contrast to the CLI it is not possible to do a single pre-dump via
|
||||
RPC and thus libcriu. In cr-service.c pre-dump always goes into a
|
||||
pre-dump loop followed by a final dump. runc already works around this
|
||||
to only do a single pre-dump by killing the CRIU process waiting for the
|
||||
message for the final dump.
|
||||
|
||||
Trying to implement pre-dump in crun via libcriu it is not as easy to
|
||||
work around CRIU's pre-dump loop expectations as with runc that directly
|
||||
talks to CRIU via RPC.
|
||||
|
||||
We know that LXC/LXD also does single pre-dumps using the CLI and runc
|
||||
also only does single pre-dumps by misusing the pre-dump loop interface.
|
||||
|
||||
With this commit it is possible to trigger a single pre-dump via RPC and
|
||||
libcriu without misusing the interface provided via cr-service.c. So
|
||||
this commit basically updates CRIU to the existing use cases.
|
||||
|
||||
The existing pre-dump loop still sounds like a very good idea, but so
|
||||
far most tools have decided to implement the pre-dump loop themselves.
|
||||
|
||||
With this change we can implement pre-dump in crun to match what is
|
||||
currently implemented in runc.
|
||||
|
||||
Signed-off-by: Adrian Reber <areber@redhat.com>
|
||||
---
|
||||
criu/cr-service.c | 13 ++++++++-----
|
||||
images/rpc.proto | 2 ++
|
||||
lib/c/criu.c | 21 ++++++++++++++++++---
|
||||
lib/c/criu.h | 2 ++
|
||||
4 files changed, 30 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/criu/cr-service.c b/criu/cr-service.c
|
||||
index 0f8bc4cc1..80d12c7b0 100644
|
||||
--- a/criu/cr-service.c
|
||||
+++ b/criu/cr-service.c
|
||||
@@ -169,11 +169,11 @@ int send_criu_dump_resp(int socket_fd, bool success, bool restored)
|
||||
return send_criu_msg(socket_fd, &msg);
|
||||
}
|
||||
|
||||
-static int send_criu_pre_dump_resp(int socket_fd, bool success)
|
||||
+static int send_criu_pre_dump_resp(int socket_fd, bool success, bool single)
|
||||
{
|
||||
CriuResp msg = CRIU_RESP__INIT;
|
||||
|
||||
- msg.type = CRIU_REQ_TYPE__PRE_DUMP;
|
||||
+ msg.type = single ? CRIU_REQ_TYPE__SINGLE_PRE_DUMP : CRIU_REQ_TYPE__PRE_DUMP;
|
||||
msg.success = success;
|
||||
set_resp_err(&msg);
|
||||
|
||||
@@ -845,7 +845,7 @@ out:
|
||||
return send_criu_msg(sk, &resp);
|
||||
}
|
||||
|
||||
-static int pre_dump_using_req(int sk, CriuOpts *req)
|
||||
+static int pre_dump_using_req(int sk, CriuOpts *req, bool single)
|
||||
{
|
||||
int pid, status;
|
||||
bool success = false;
|
||||
@@ -886,7 +886,7 @@ static int pre_dump_using_req(int sk, CriuOpts *req)
|
||||
|
||||
success = true;
|
||||
out:
|
||||
- if (send_criu_pre_dump_resp(sk, success) == -1) {
|
||||
+ if (send_criu_pre_dump_resp(sk, success, single) == -1) {
|
||||
pr_perror("Can't send pre-dump resp");
|
||||
success = false;
|
||||
}
|
||||
@@ -899,7 +899,7 @@ static int pre_dump_loop(int sk, CriuReq *msg)
|
||||
int ret;
|
||||
|
||||
do {
|
||||
- ret = pre_dump_using_req(sk, msg->opts);
|
||||
+ ret = pre_dump_using_req(sk, msg->opts, false);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@@ -1271,6 +1271,9 @@ more:
|
||||
case CRIU_REQ_TYPE__VERSION:
|
||||
ret = handle_version(sk, msg);
|
||||
break;
|
||||
+ case CRIU_REQ_TYPE__SINGLE_PRE_DUMP:
|
||||
+ ret = pre_dump_using_req(sk, msg->opts, true);
|
||||
+ break;
|
||||
|
||||
default:
|
||||
send_criu_err(sk, "Invalid req");
|
||||
diff --git a/images/rpc.proto b/images/rpc.proto
|
||||
index a9f51ac4b..1d3befd23 100644
|
||||
--- a/images/rpc.proto
|
||||
+++ b/images/rpc.proto
|
||||
@@ -172,6 +172,8 @@ enum criu_req_type {
|
||||
|
||||
WAIT_PID = 11;
|
||||
PAGE_SERVER_CHLD = 12;
|
||||
+
|
||||
+ SINGLE_PRE_DUMP = 13;
|
||||
}
|
||||
|
||||
/*
|
||||
diff --git a/lib/c/criu.c b/lib/c/criu.c
|
||||
index 4ee189aca..500574e33 100644
|
||||
--- a/lib/c/criu.c
|
||||
+++ b/lib/c/criu.c
|
||||
@@ -1527,7 +1527,7 @@ int criu_check(void)
|
||||
return criu_local_check(global_opts);
|
||||
}
|
||||
|
||||
-int criu_local_dump(criu_opts *opts)
|
||||
+static int dump(bool pre_dump, criu_opts *opts)
|
||||
{
|
||||
int ret = -1;
|
||||
CriuReq req = CRIU_REQ__INIT;
|
||||
@@ -1535,7 +1535,7 @@ int criu_local_dump(criu_opts *opts)
|
||||
|
||||
saved_errno = 0;
|
||||
|
||||
- req.type = CRIU_REQ_TYPE__DUMP;
|
||||
+ req.type = pre_dump ? CRIU_REQ_TYPE__SINGLE_PRE_DUMP : CRIU_REQ_TYPE__DUMP;
|
||||
req.opts = opts->rpc;
|
||||
|
||||
ret = send_req_and_recv_resp(opts, &req, &resp);
|
||||
@@ -1543,7 +1543,7 @@ int criu_local_dump(criu_opts *opts)
|
||||
goto exit;
|
||||
|
||||
if (resp->success) {
|
||||
- if (resp->dump->has_restored && resp->dump->restored)
|
||||
+ if (!pre_dump && resp->dump->has_restored && resp->dump->restored)
|
||||
ret = 1;
|
||||
else
|
||||
ret = 0;
|
||||
@@ -1561,11 +1561,26 @@ exit:
|
||||
return ret;
|
||||
}
|
||||
|
||||
+int criu_local_dump(criu_opts *opts)
|
||||
+{
|
||||
+ return dump(false, opts);
|
||||
+}
|
||||
+
|
||||
int criu_dump(void)
|
||||
{
|
||||
return criu_local_dump(global_opts);
|
||||
}
|
||||
|
||||
+int criu_local_pre_dump(criu_opts *opts)
|
||||
+{
|
||||
+ return dump(true, opts);
|
||||
+}
|
||||
+
|
||||
+int criu_pre_dump(void)
|
||||
+{
|
||||
+ return criu_local_pre_dump(global_opts);
|
||||
+}
|
||||
+
|
||||
int criu_local_dump_iters(criu_opts *opts, int (*more)(criu_predump_info pi))
|
||||
{
|
||||
int ret = -1, fd = -1, uret;
|
||||
diff --git a/lib/c/criu.h b/lib/c/criu.h
|
||||
index a374b37f8..c6d4f50a8 100644
|
||||
--- a/lib/c/criu.h
|
||||
+++ b/lib/c/criu.h
|
||||
@@ -161,6 +161,7 @@ int criu_get_orphan_pts_master_fd(void);
|
||||
*/
|
||||
int criu_check(void);
|
||||
int criu_dump(void);
|
||||
+int criu_pre_dump(void);
|
||||
int criu_restore(void);
|
||||
int criu_restore_child(void);
|
||||
|
||||
@@ -279,6 +280,7 @@ void criu_local_set_notify_cb(criu_opts *opts, int (*cb)(char *action, criu_noti
|
||||
|
||||
int criu_local_check(criu_opts *opts);
|
||||
int criu_local_dump(criu_opts *opts);
|
||||
+int criu_local_pre_dump(criu_opts *opts);
|
||||
int criu_local_restore(criu_opts *opts);
|
||||
int criu_local_restore_child(criu_opts *opts);
|
||||
int criu_local_dump_iters(criu_opts *opts, int (*more)(criu_predump_info pi));
|
||||
--
|
||||
2.34.1
|
||||
|
||||
262
0081-tests-added-test-for-single-pre-dump-support.patch
Normal file
262
0081-tests-added-test-for-single-pre-dump-support.patch
Normal file
@ -0,0 +1,262 @@
|
||||
From e4ccdc694a8739125da2c7e8e57f8a30c7451eaf Mon Sep 17 00:00:00 2001
|
||||
From: Adrian Reber <areber@redhat.com>
|
||||
Date: Tue, 14 Dec 2021 13:09:19 +0000
|
||||
Subject: [PATCH 081/120] tests: added test for single pre-dump support
|
||||
|
||||
Signed-off-by: Adrian Reber <areber@redhat.com>
|
||||
---
|
||||
test/others/libcriu/.gitignore | 1 +
|
||||
test/others/libcriu/Makefile | 1 +
|
||||
test/others/libcriu/lib.h | 2 +
|
||||
test/others/libcriu/run.sh | 1 +
|
||||
test/others/libcriu/test_iters.c | 2 -
|
||||
test/others/libcriu/test_notify.c | 2 -
|
||||
test/others/libcriu/test_pre_dump.c | 151 ++++++++++++++++++++++++++++
|
||||
test/others/libcriu/test_sub.c | 2 -
|
||||
8 files changed, 156 insertions(+), 6 deletions(-)
|
||||
create mode 100644 test/others/libcriu/test_pre_dump.c
|
||||
|
||||
diff --git a/test/others/libcriu/.gitignore b/test/others/libcriu/.gitignore
|
||||
index cf1342de2..15abf07ac 100644
|
||||
--- a/test/others/libcriu/.gitignore
|
||||
+++ b/test/others/libcriu/.gitignore
|
||||
@@ -4,5 +4,6 @@ test_notify
|
||||
test_self
|
||||
test_sub
|
||||
test_join_ns
|
||||
+test_pre_dump
|
||||
output/
|
||||
libcriu.so.*
|
||||
diff --git a/test/others/libcriu/Makefile b/test/others/libcriu/Makefile
|
||||
index 734e66c1a..581574da0 100644
|
||||
--- a/test/others/libcriu/Makefile
|
||||
+++ b/test/others/libcriu/Makefile
|
||||
@@ -6,6 +6,7 @@ TESTS += test_notify
|
||||
TESTS += test_iters
|
||||
TESTS += test_errno
|
||||
TESTS += test_join_ns
|
||||
+TESTS += test_pre_dump
|
||||
|
||||
all: $(TESTS)
|
||||
.PHONY: all
|
||||
diff --git a/test/others/libcriu/lib.h b/test/others/libcriu/lib.h
|
||||
index 6fdf8aef2..59372fca5 100644
|
||||
--- a/test/others/libcriu/lib.h
|
||||
+++ b/test/others/libcriu/lib.h
|
||||
@@ -1,3 +1,5 @@
|
||||
void what_err_ret_mean(int ret);
|
||||
int chk_exit(int status, int want);
|
||||
int get_version(void);
|
||||
+
|
||||
+#define SUCC_ECODE 42
|
||||
diff --git a/test/others/libcriu/run.sh b/test/others/libcriu/run.sh
|
||||
index 48f25a5f6..1b6c73448 100755
|
||||
--- a/test/others/libcriu/run.sh
|
||||
+++ b/test/others/libcriu/run.sh
|
||||
@@ -58,6 +58,7 @@ run_test test_notify
|
||||
if [ "$(uname -m)" = "x86_64" ]; then
|
||||
# Skip this on aarch64 as aarch64 has no dirty page tracking
|
||||
run_test test_iters
|
||||
+ run_test test_pre_dump
|
||||
fi
|
||||
run_test test_errno
|
||||
run_test test_join_ns
|
||||
diff --git a/test/others/libcriu/test_iters.c b/test/others/libcriu/test_iters.c
|
||||
index b7e325abb..edbaf87f6 100644
|
||||
--- a/test/others/libcriu/test_iters.c
|
||||
+++ b/test/others/libcriu/test_iters.c
|
||||
@@ -46,8 +46,6 @@ static int next_iter(criu_predump_info pi)
|
||||
return cur_iter < MAX_ITERS;
|
||||
}
|
||||
|
||||
-#define SUCC_ECODE 42
|
||||
-
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int pid, ret, p[2];
|
||||
diff --git a/test/others/libcriu/test_notify.c b/test/others/libcriu/test_notify.c
|
||||
index 9a54b812a..80ad3ffdc 100644
|
||||
--- a/test/others/libcriu/test_notify.c
|
||||
+++ b/test/others/libcriu/test_notify.c
|
||||
@@ -10,8 +10,6 @@
|
||||
|
||||
#include "lib.h"
|
||||
|
||||
-#define SUCC_ECODE 42
|
||||
-
|
||||
static int actions_called = 0;
|
||||
static int notify(char *action, criu_notify_arg_t na)
|
||||
{
|
||||
diff --git a/test/others/libcriu/test_pre_dump.c b/test/others/libcriu/test_pre_dump.c
|
||||
new file mode 100644
|
||||
index 000000000..ed9cd2125
|
||||
--- /dev/null
|
||||
+++ b/test/others/libcriu/test_pre_dump.c
|
||||
@@ -0,0 +1,151 @@
|
||||
+#include "criu.h"
|
||||
+#include <fcntl.h>
|
||||
+#include <stdio.h>
|
||||
+#include <errno.h>
|
||||
+#include <stdlib.h>
|
||||
+#include <signal.h>
|
||||
+#include <fcntl.h>
|
||||
+#include <sys/stat.h>
|
||||
+#include <sys/wait.h>
|
||||
+#include <unistd.h>
|
||||
+#include "lib.h"
|
||||
+
|
||||
+static int wdir_fd, cur_imgdir = -1;
|
||||
+
|
||||
+static int stop = 0;
|
||||
+static void sh(int sig)
|
||||
+{
|
||||
+ stop = 1;
|
||||
+}
|
||||
+
|
||||
+static void open_imgdir(void)
|
||||
+{
|
||||
+ char p[10];
|
||||
+ static int id = 0;
|
||||
+
|
||||
+ if (id > 0) {
|
||||
+ sprintf(p, "../dir-%d", id);
|
||||
+ criu_set_parent_images(p);
|
||||
+ }
|
||||
+ if (cur_imgdir != -1)
|
||||
+ close(cur_imgdir);
|
||||
+ sprintf(p, "dir-%d", ++id);
|
||||
+ mkdirat(wdir_fd, p, 0700);
|
||||
+ cur_imgdir = openat(wdir_fd, p, O_DIRECTORY);
|
||||
+ criu_set_images_dir_fd(cur_imgdir);
|
||||
+}
|
||||
+
|
||||
+int main(int argc, char **argv)
|
||||
+{
|
||||
+ int pid, ret, p[2];
|
||||
+
|
||||
+ wdir_fd = open(argv[2], O_DIRECTORY);
|
||||
+ if (wdir_fd < 0) {
|
||||
+ perror("Can't open wdir");
|
||||
+ return 1;
|
||||
+ }
|
||||
+
|
||||
+ printf("--- Start loop ---\n");
|
||||
+ pipe(p);
|
||||
+ pid = fork();
|
||||
+ if (pid < 0) {
|
||||
+ perror("Can't");
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ if (!pid) {
|
||||
+ printf(" `- loop: initializing\n");
|
||||
+ if (setsid() < 0)
|
||||
+ exit(1);
|
||||
+ if (signal(SIGUSR1, sh) == SIG_ERR)
|
||||
+ exit(1);
|
||||
+
|
||||
+ close(0);
|
||||
+ close(1);
|
||||
+ close(2);
|
||||
+ close(p[0]);
|
||||
+
|
||||
+ ret = SUCC_ECODE;
|
||||
+ write(p[1], &ret, sizeof(ret));
|
||||
+ close(p[1]);
|
||||
+
|
||||
+ while (!stop)
|
||||
+ sleep(1);
|
||||
+ exit(SUCC_ECODE);
|
||||
+ }
|
||||
+
|
||||
+ close(p[1]);
|
||||
+
|
||||
+ /* Wait for kid to start */
|
||||
+ ret = -1;
|
||||
+ read(p[0], &ret, sizeof(ret));
|
||||
+ if (ret != SUCC_ECODE) {
|
||||
+ printf("Error starting loop\n");
|
||||
+ goto err;
|
||||
+ }
|
||||
+
|
||||
+ /* Wait for pipe to get closed, then dump */
|
||||
+ read(p[0], &ret, 1);
|
||||
+ close(p[0]);
|
||||
+
|
||||
+ printf("--- Dump loop ---\n");
|
||||
+ criu_init_opts();
|
||||
+ criu_set_service_binary(argv[1]);
|
||||
+ criu_set_pid(pid);
|
||||
+ criu_set_log_file("dump.log");
|
||||
+ criu_set_log_level(CRIU_LOG_DEBUG);
|
||||
+ criu_set_track_mem(true);
|
||||
+
|
||||
+ open_imgdir();
|
||||
+ ret = criu_pre_dump();
|
||||
+ if (ret < 0) {
|
||||
+ what_err_ret_mean(ret);
|
||||
+ kill(pid, SIGKILL);
|
||||
+ goto err;
|
||||
+ }
|
||||
+
|
||||
+ printf(" `- Pre Dump 1 succeeded\n");
|
||||
+
|
||||
+ open_imgdir();
|
||||
+ ret = criu_pre_dump();
|
||||
+ if (ret < 0) {
|
||||
+ what_err_ret_mean(ret);
|
||||
+ kill(pid, SIGKILL);
|
||||
+ goto err;
|
||||
+ }
|
||||
+
|
||||
+ printf(" `- Pre Dump 2 succeeded\n");
|
||||
+
|
||||
+ open_imgdir();
|
||||
+ ret = criu_dump();
|
||||
+ if (ret < 0) {
|
||||
+ what_err_ret_mean(ret);
|
||||
+ kill(pid, SIGKILL);
|
||||
+ goto err;
|
||||
+ }
|
||||
+
|
||||
+ printf(" `- Final Dump succeeded\n");
|
||||
+ waitpid(pid, NULL, 0);
|
||||
+
|
||||
+ printf("--- Restore ---\n");
|
||||
+ criu_init_opts();
|
||||
+ criu_set_log_level(CRIU_LOG_DEBUG);
|
||||
+ criu_set_log_file("restore.log");
|
||||
+ criu_set_images_dir_fd(cur_imgdir);
|
||||
+
|
||||
+ pid = criu_restore_child();
|
||||
+ if (pid <= 0) {
|
||||
+ what_err_ret_mean(pid);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ printf(" `- Restore returned pid %d\n", pid);
|
||||
+ kill(pid, SIGUSR1);
|
||||
+err:
|
||||
+ if (waitpid(pid, &ret, 0) < 0) {
|
||||
+ perror(" Can't wait kid");
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ return chk_exit(ret, SUCC_ECODE);
|
||||
+}
|
||||
diff --git a/test/others/libcriu/test_sub.c b/test/others/libcriu/test_sub.c
|
||||
index 697abf5d5..af1e09408 100644
|
||||
--- a/test/others/libcriu/test_sub.c
|
||||
+++ b/test/others/libcriu/test_sub.c
|
||||
@@ -15,8 +15,6 @@ static void sh(int sig)
|
||||
stop = 1;
|
||||
}
|
||||
|
||||
-#define SUCC_ECODE 42
|
||||
-
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int pid, ret, fd, p[2];
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,56 @@
|
||||
From 98675175666d97a9eeadfcc396df8b894e318e78 Mon Sep 17 00:00:00 2001
|
||||
From: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
|
||||
Date: Sat, 18 Dec 2021 10:40:11 +0300
|
||||
Subject: [PATCH 082/120] zdtm.py: clean up MAKEFLAGS env variable before
|
||||
running make instance
|
||||
|
||||
In most cases we run tests as:
|
||||
./test/zdtm.py run -a
|
||||
|
||||
But it's also possible to run tests from root makefile:
|
||||
make test
|
||||
|
||||
In this case, if criu tree have no ./test/umount2 binary
|
||||
built we get the error like:
|
||||
make[3]: *** No rule to make target 'umount2'. Stop.
|
||||
|
||||
It's worth to mention this "3". That's because we have
|
||||
build process tree like this:
|
||||
make -> make -> make -> zdtm.py -> make umount2
|
||||
and also we have MAKEFLAGS variable set to:
|
||||
build=-r -R -f ...
|
||||
|
||||
And that's bad because "-r" option means no builtin
|
||||
rules and -R means no builtin variables. That makes
|
||||
`make umount2` not working. Let's just cleanup this
|
||||
variable to make things work properly.
|
||||
|
||||
Fixes: #1699
|
||||
https://github.com/checkpoint-restore/criu/issues/1699
|
||||
|
||||
Signed-off-by: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
|
||||
---
|
||||
test/zdtm.py | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/test/zdtm.py b/test/zdtm.py
|
||||
index b98770079..086ae0285 100755
|
||||
--- a/test/zdtm.py
|
||||
+++ b/test/zdtm.py
|
||||
@@ -607,9 +607,11 @@ class zdtm_test:
|
||||
@staticmethod
|
||||
def available():
|
||||
if not os.access("umount2", os.X_OK):
|
||||
- subprocess.check_call(["make", "umount2"])
|
||||
+ subprocess.check_call(
|
||||
+ ["make", "umount2"], env=dict(os.environ, MAKEFLAGS=""))
|
||||
if not os.access("zdtm_ct", os.X_OK):
|
||||
- subprocess.check_call(["make", "zdtm_ct"])
|
||||
+ subprocess.check_call(
|
||||
+ ["make", "zdtm_ct"], env=dict(os.environ, MAKEFLAGS=""))
|
||||
if not os.access("zdtm/lib/libzdtmtst.a", os.F_OK):
|
||||
subprocess.check_call(["make", "-C", "zdtm/"])
|
||||
subprocess.check_call(
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,33 @@
|
||||
From e0bf87fecbcc353d697dccd3fe0801347caf1423 Mon Sep 17 00:00:00 2001
|
||||
From: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
|
||||
Date: Sat, 18 Dec 2021 11:03:53 +0300
|
||||
Subject: [PATCH 083/120] zdtm: zdtm_ct fix compilation error with
|
||||
strict-prototypes on
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
zdtm_ct.c:44:12: error: function declaration isn’t a prototype [-Werror=strict-prototypes]
|
||||
44 | static int create_timens()
|
||||
|
||||
Signed-off-by: Alexander Mikhalitsyn <alexander.mikhalitsyn@virtuozzo.com>
|
||||
---
|
||||
test/zdtm_ct.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/test/zdtm_ct.c b/test/zdtm_ct.c
|
||||
index e4b17a512..0e8eeff8a 100644
|
||||
--- a/test/zdtm_ct.c
|
||||
+++ b/test/zdtm_ct.c
|
||||
@@ -41,7 +41,7 @@ static inline int _settime(clockid_t clk_id, time_t offset)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int create_timens()
|
||||
+static int create_timens(void)
|
||||
{
|
||||
struct utsname buf;
|
||||
unsigned major, minor;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,21 @@
|
||||
From 5083232273c93f9115bf91bed373d8ab749106d9 Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Fri, 17 Dec 2021 15:33:55 +0300
|
||||
Subject: [PATCH 084/120] zdtm: remove mntns-deleted-dst test leftover from git
|
||||
|
||||
Looks like in commit [1] we've non-intentionally added this tmp file to
|
||||
git, let's remove it.
|
||||
|
||||
Fixes: 01ee29702 ("s390:zdtm: Enable zdtm for s390") [1]
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
test/zdtm/static/mntns-deleted-dst | 0
|
||||
1 file changed, 0 insertions(+), 0 deletions(-)
|
||||
delete mode 100644 test/zdtm/static/mntns-deleted-dst
|
||||
|
||||
diff --git a/test/zdtm/static/mntns-deleted-dst b/test/zdtm/static/mntns-deleted-dst
|
||||
deleted file mode 100644
|
||||
index e69de29bb..000000000
|
||||
--
|
||||
2.34.1
|
||||
|
||||
29
0085-crtools-remove-excess-always-true-condition.patch
Normal file
29
0085-crtools-remove-excess-always-true-condition.patch
Normal file
@ -0,0 +1,29 @@
|
||||
From b8825cd2d4242b13d7ca598211c513c7b1308d84 Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Fri, 10 Dec 2021 15:34:19 +0300
|
||||
Subject: [PATCH 085/120] crtools: remove excess always true condition
|
||||
|
||||
Several lines above if (optind >= argc) we go to usage label and fail,
|
||||
thus we don't need to check (optind < argc) here as it is always true.
|
||||
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
criu/crtools.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/criu/crtools.c b/criu/crtools.c
|
||||
index da47bd684..3adfb190f 100644
|
||||
--- a/criu/crtools.c
|
||||
+++ b/criu/crtools.c
|
||||
@@ -124,7 +124,7 @@ int main(int argc, char *argv[], char *envp[])
|
||||
return 1;
|
||||
}
|
||||
|
||||
- if (optind < argc && !strcmp(argv[optind], "swrk")) {
|
||||
+ if (!strcmp(argv[optind], "swrk")) {
|
||||
if (argc != optind + 2) {
|
||||
fprintf(stderr, "Usage: criu swrk <fd>\n");
|
||||
return 1;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
309
0086-crtools-rpc-export-current-criu-mode-to-opts.mode.patch
Normal file
309
0086-crtools-rpc-export-current-criu-mode-to-opts.mode.patch
Normal file
@ -0,0 +1,309 @@
|
||||
From 6006fc1de4d0ee8181682df7fd7a143f4bd89273 Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Fri, 10 Dec 2021 12:13:06 +0300
|
||||
Subject: [PATCH 086/120] crtools/rpc: export current criu mode to opts.mode
|
||||
|
||||
We have multiple options which are valid only on restore or only on dump
|
||||
or in any other specific criu mode, so it would be useful to have info
|
||||
about current mode in opts so that we can validate other options against
|
||||
current mode.
|
||||
|
||||
Plan is to use it for mount-v2 option as it is only valid on restore,
|
||||
and this would make handling of different types mountpoints much easier.
|
||||
|
||||
Realization is a bit different for general code and rpc:
|
||||
|
||||
- When criu mode is set from main() we just parse mode from argv[optind]
|
||||
just after parse_options() found optind of the command. Note that
|
||||
opts.mode is available before check_options().
|
||||
|
||||
- For rpc service we reset opts.mode to CR_SWRK each time we restart
|
||||
cr_service_work(), in the original service process we still have
|
||||
CR_SERVICE to differentiate between them, and each request handling
|
||||
function which does setup_opts_from_req sets opts.mode in accordance
|
||||
with the processed request type. And it is also available before
|
||||
check_options().
|
||||
|
||||
Now in check_options we can add filters on one mode only options.
|
||||
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
criu/cr-service.c | 8 +++++
|
||||
criu/crtools.c | 73 +++++++++++++++++++++++++++++----------
|
||||
criu/include/cr_options.h | 19 ++++++++++
|
||||
3 files changed, 82 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/criu/cr-service.c b/criu/cr-service.c
|
||||
index 80d12c7b0..59f46b320 100644
|
||||
--- a/criu/cr-service.c
|
||||
+++ b/criu/cr-service.c
|
||||
@@ -735,6 +735,7 @@ static int dump_using_req(int sk, CriuOpts *req)
|
||||
bool success = false;
|
||||
bool self_dump = !req->pid;
|
||||
|
||||
+ opts.mode = CR_DUMP;
|
||||
if (setup_opts_from_req(sk, req))
|
||||
goto exit;
|
||||
|
||||
@@ -777,6 +778,7 @@ static int restore_using_req(int sk, CriuOpts *req)
|
||||
|
||||
opts.restore_detach = true;
|
||||
|
||||
+ opts.mode = CR_RESTORE;
|
||||
if (setup_opts_from_req(sk, req))
|
||||
goto exit;
|
||||
|
||||
@@ -828,6 +830,7 @@ static int check(int sk, CriuOpts *req)
|
||||
if (pid == 0) {
|
||||
setproctitle("check --rpc");
|
||||
|
||||
+ opts.mode = CR_CHECK;
|
||||
if (setup_opts_from_req(sk, req))
|
||||
exit(1);
|
||||
|
||||
@@ -859,6 +862,7 @@ static int pre_dump_using_req(int sk, CriuOpts *req, bool single)
|
||||
if (pid == 0) {
|
||||
int ret = 1;
|
||||
|
||||
+ opts.mode = CR_PRE_DUMP;
|
||||
if (setup_opts_from_req(sk, req))
|
||||
goto cout;
|
||||
|
||||
@@ -936,6 +940,7 @@ static int start_page_server_req(int sk, CriuOpts *req, bool daemon_mode)
|
||||
if (pid == 0) {
|
||||
close(start_pipe[0]);
|
||||
|
||||
+ opts.mode = CR_PAGE_SERVER;
|
||||
if (setup_opts_from_req(sk, req))
|
||||
goto out_ch;
|
||||
|
||||
@@ -1182,6 +1187,7 @@ static int handle_cpuinfo(int sk, CriuReq *msg)
|
||||
if (pid == 0) {
|
||||
int ret = 1;
|
||||
|
||||
+ opts.mode = CR_CPUINFO;
|
||||
if (setup_opts_from_req(sk, msg->opts))
|
||||
goto cout;
|
||||
|
||||
@@ -1231,6 +1237,8 @@ int cr_service_work(int sk)
|
||||
CriuReq *msg = 0;
|
||||
|
||||
more:
|
||||
+ opts.mode = CR_SWRK;
|
||||
+
|
||||
if (recv_criu_msg(sk, &msg) != 0) {
|
||||
pr_perror("Can't recv request");
|
||||
goto err;
|
||||
diff --git a/criu/crtools.c b/criu/crtools.c
|
||||
index 3adfb190f..d10d7f7d0 100644
|
||||
--- a/criu/crtools.c
|
||||
+++ b/criu/crtools.c
|
||||
@@ -67,6 +67,38 @@ static int image_dir_mode(char *argv[], int optind)
|
||||
return -1;
|
||||
}
|
||||
|
||||
+static int parse_criu_mode(char *mode)
|
||||
+{
|
||||
+ if (!strcmp(mode, "dump"))
|
||||
+ opts.mode = CR_DUMP;
|
||||
+ else if (!strcmp(mode, "pre-dump"))
|
||||
+ opts.mode = CR_PRE_DUMP;
|
||||
+ else if (!strcmp(mode, "restore"))
|
||||
+ opts.mode = CR_RESTORE;
|
||||
+ else if (!strcmp(mode, "lazy-pages"))
|
||||
+ opts.mode = CR_LAZY_PAGES;
|
||||
+ else if (!strcmp(mode, "check"))
|
||||
+ opts.mode = CR_CHECK;
|
||||
+ else if (!strcmp(mode, "page-server"))
|
||||
+ opts.mode = CR_PAGE_SERVER;
|
||||
+ else if (!strcmp(mode, "service"))
|
||||
+ opts.mode = CR_SERVICE;
|
||||
+ else if (!strcmp(mode, "swrk"))
|
||||
+ opts.mode = CR_SWRK;
|
||||
+ else if (!strcmp(mode, "dedup"))
|
||||
+ opts.mode = CR_DEDUP;
|
||||
+ else if (!strcmp(mode, "cpuinfo"))
|
||||
+ opts.mode = CR_CPUINFO;
|
||||
+ else if (!strcmp(mode, "exec"))
|
||||
+ opts.mode = CR_EXEC_DEPRECATED;
|
||||
+ else if (!strcmp(mode, "show"))
|
||||
+ opts.mode = CR_SHOW_DEPRECATED;
|
||||
+ else
|
||||
+ return -1;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
int main(int argc, char *argv[], char *envp[])
|
||||
{
|
||||
int ret = -1;
|
||||
@@ -124,7 +156,12 @@ int main(int argc, char *argv[], char *envp[])
|
||||
return 1;
|
||||
}
|
||||
|
||||
- if (!strcmp(argv[optind], "swrk")) {
|
||||
+ if (parse_criu_mode(argv[optind])) {
|
||||
+ pr_err("unknown command: %s\n", argv[optind]);
|
||||
+ goto usage;
|
||||
+ }
|
||||
+
|
||||
+ if (opts.mode == CR_SWRK) {
|
||||
if (argc != optind + 2) {
|
||||
fprintf(stderr, "Usage: criu swrk <fd>\n");
|
||||
return 1;
|
||||
@@ -156,7 +193,7 @@ int main(int argc, char *argv[], char *envp[])
|
||||
goto usage;
|
||||
}
|
||||
|
||||
- if (strcmp(argv[optind], "restore")) {
|
||||
+ if (opts.mode != CR_RESTORE) {
|
||||
pr_err("--exec-cmd is available for the restore command only\n");
|
||||
goto usage;
|
||||
}
|
||||
@@ -173,7 +210,7 @@ int main(int argc, char *argv[], char *envp[])
|
||||
opts.exec_cmd[argc - optind - 1] = NULL;
|
||||
} else {
|
||||
/* No subcommands except for cpuinfo and restore --exec-cmd */
|
||||
- if (strcmp(argv[optind], "cpuinfo") && has_sub_command) {
|
||||
+ if (opts.mode != CR_CPUINFO && has_sub_command) {
|
||||
pr_err("excessive parameter%s for command %s\n", (argc - optind) > 2 ? "s" : "", argv[optind]);
|
||||
goto usage;
|
||||
}
|
||||
@@ -185,7 +222,7 @@ int main(int argc, char *argv[], char *envp[])
|
||||
}
|
||||
|
||||
/* We must not open imgs dir, if service is called */
|
||||
- if (strcmp(argv[optind], "service")) {
|
||||
+ if (opts.mode != CR_SERVICE) {
|
||||
ret = open_image_dir(opts.imgs_dir, image_dir_mode(argv, optind));
|
||||
if (ret < 0) {
|
||||
pr_err("Couldn't open image dir %s\n", opts.imgs_dir);
|
||||
@@ -197,8 +234,7 @@ int main(int argc, char *argv[], char *envp[])
|
||||
* When a process group becomes an orphan,
|
||||
* its processes are sent a SIGHUP signal
|
||||
*/
|
||||
- if (!strcmp(argv[optind], "restore") && opts.restore_detach && opts.final_state == TASK_STOPPED &&
|
||||
- opts.shell_job)
|
||||
+ if (opts.mode == CR_RESTORE && opts.restore_detach && opts.final_state == TASK_STOPPED && opts.shell_job)
|
||||
pr_warn("Stopped and detached shell job will get SIGHUP from OS.\n");
|
||||
|
||||
if (chdir(opts.work_dir)) {
|
||||
@@ -218,7 +254,7 @@ int main(int argc, char *argv[], char *envp[])
|
||||
kdat.can_map_vdso = 0;
|
||||
|
||||
if (!list_empty(&opts.inherit_fds)) {
|
||||
- if (strcmp(argv[optind], "restore")) {
|
||||
+ if (opts.mode != CR_RESTORE) {
|
||||
pr_err("--inherit-fd is restore-only option\n");
|
||||
return 1;
|
||||
}
|
||||
@@ -229,13 +265,14 @@ int main(int argc, char *argv[], char *envp[])
|
||||
if (opts.img_parent)
|
||||
pr_info("Will do snapshot from %s\n", opts.img_parent);
|
||||
|
||||
- if (!strcmp(argv[optind], "dump")) {
|
||||
+ if (opts.mode == CR_DUMP) {
|
||||
if (!opts.tree_id)
|
||||
goto opt_pid_missing;
|
||||
+
|
||||
return cr_dump_tasks(opts.tree_id);
|
||||
}
|
||||
|
||||
- if (!strcmp(argv[optind], "pre-dump")) {
|
||||
+ if (opts.mode == CR_PRE_DUMP) {
|
||||
if (!opts.tree_id)
|
||||
goto opt_pid_missing;
|
||||
|
||||
@@ -247,7 +284,7 @@ int main(int argc, char *argv[], char *envp[])
|
||||
return cr_pre_dump_tasks(opts.tree_id) != 0;
|
||||
}
|
||||
|
||||
- if (!strcmp(argv[optind], "restore")) {
|
||||
+ if (opts.mode == CR_RESTORE) {
|
||||
if (opts.tree_id)
|
||||
pr_warn("Using -t with criu restore is obsoleted\n");
|
||||
|
||||
@@ -262,22 +299,22 @@ int main(int argc, char *argv[], char *envp[])
|
||||
return ret != 0;
|
||||
}
|
||||
|
||||
- if (!strcmp(argv[optind], "lazy-pages"))
|
||||
+ if (opts.mode == CR_LAZY_PAGES)
|
||||
return cr_lazy_pages(opts.daemon_mode) != 0;
|
||||
|
||||
- if (!strcmp(argv[optind], "check"))
|
||||
+ if (opts.mode == CR_CHECK)
|
||||
return cr_check() != 0;
|
||||
|
||||
- if (!strcmp(argv[optind], "page-server"))
|
||||
+ if (opts.mode == CR_PAGE_SERVER)
|
||||
return cr_page_server(opts.daemon_mode, false, -1) != 0;
|
||||
|
||||
- if (!strcmp(argv[optind], "service"))
|
||||
+ if (opts.mode == CR_SERVICE)
|
||||
return cr_service(opts.daemon_mode);
|
||||
|
||||
- if (!strcmp(argv[optind], "dedup"))
|
||||
+ if (opts.mode == CR_DEDUP)
|
||||
return cr_dedup() != 0;
|
||||
|
||||
- if (!strcmp(argv[optind], "cpuinfo")) {
|
||||
+ if (opts.mode == CR_CPUINFO) {
|
||||
if (!argv[optind + 1]) {
|
||||
pr_err("cpuinfo requires an action: dump or check\n");
|
||||
goto usage;
|
||||
@@ -288,12 +325,12 @@ int main(int argc, char *argv[], char *envp[])
|
||||
return cpuinfo_check();
|
||||
}
|
||||
|
||||
- if (!strcmp(argv[optind], "exec")) {
|
||||
+ if (opts.mode == CR_EXEC_DEPRECATED) {
|
||||
pr_err("The \"exec\" action is deprecated by the Compel library.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
- if (!strcmp(argv[optind], "show")) {
|
||||
+ if (opts.mode == CR_SHOW_DEPRECATED) {
|
||||
pr_err("The \"show\" action is deprecated by the CRIT utility.\n");
|
||||
pr_err("To view an image use the \"crit decode -i $name --pretty\" command.\n");
|
||||
return -1;
|
||||
diff --git a/criu/include/cr_options.h b/criu/include/cr_options.h
|
||||
index a34f8dbbf..85648bf1c 100644
|
||||
--- a/criu/include/cr_options.h
|
||||
+++ b/criu/include/cr_options.h
|
||||
@@ -100,6 +100,22 @@ struct irmap_path_opt {
|
||||
struct irmap *ir;
|
||||
};
|
||||
|
||||
+enum criu_mode {
|
||||
+ CR_UNSET = 0,
|
||||
+ CR_DUMP,
|
||||
+ CR_PRE_DUMP,
|
||||
+ CR_RESTORE,
|
||||
+ CR_LAZY_PAGES,
|
||||
+ CR_CHECK,
|
||||
+ CR_PAGE_SERVER,
|
||||
+ CR_SERVICE,
|
||||
+ CR_SWRK,
|
||||
+ CR_DEDUP,
|
||||
+ CR_CPUINFO,
|
||||
+ CR_EXEC_DEPRECATED,
|
||||
+ CR_SHOW_DEPRECATED,
|
||||
+};
|
||||
+
|
||||
struct cr_options {
|
||||
int final_state;
|
||||
int check_extra_features;
|
||||
@@ -188,6 +204,9 @@ struct cr_options {
|
||||
|
||||
/* This stores which method to use for file validation. */
|
||||
int file_validation_method;
|
||||
+
|
||||
+ /* Shows the mode criu is running at the moment: dump/pre-dump/restore/... */
|
||||
+ enum criu_mode mode;
|
||||
};
|
||||
|
||||
extern struct cr_options opts;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
48
0087-crtools-use-new-opts.mode-in-image_dir_mode.patch
Normal file
48
0087-crtools-use-new-opts.mode-in-image_dir_mode.patch
Normal file
@ -0,0 +1,48 @@
|
||||
From 95c3d5131afd2b40271233ea7a024dc19260efd1 Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Wed, 15 Dec 2021 10:49:42 +0300
|
||||
Subject: [PATCH 087/120] crtools: use new opts.mode in image_dir_mode
|
||||
|
||||
Also while on it there is no "cpuinfo restore", let's remove it.
|
||||
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
criu/crtools.c | 19 ++++++++++++++-----
|
||||
1 file changed, 14 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/criu/crtools.c b/criu/crtools.c
|
||||
index d10d7f7d0..7bf92ffd0 100644
|
||||
--- a/criu/crtools.c
|
||||
+++ b/criu/crtools.c
|
||||
@@ -56,14 +56,23 @@ void flush_early_log_to_stderr(void)
|
||||
|
||||
static int image_dir_mode(char *argv[], int optind)
|
||||
{
|
||||
- if (!strcmp(argv[optind], "dump") || !strcmp(argv[optind], "pre-dump") ||
|
||||
- (!strcmp(argv[optind], "cpuinfo") && !strcmp(argv[optind + 1], "dump")))
|
||||
+ switch (opts.mode) {
|
||||
+ case CR_DUMP:
|
||||
+ /* fallthrough */
|
||||
+ case CR_PRE_DUMP:
|
||||
return O_DUMP;
|
||||
-
|
||||
- if (!strcmp(argv[optind], "restore") ||
|
||||
- (!strcmp(argv[optind], "cpuinfo") && !strcmp(argv[optind + 1], "restore")))
|
||||
+ case CR_RESTORE:
|
||||
return O_RSTR;
|
||||
+ case CR_CPUINFO:
|
||||
+ if (!strcmp(argv[optind + 1], "dump"))
|
||||
+ return O_DUMP;
|
||||
+ /* fallthrough */
|
||||
+ default:
|
||||
+ return -1;
|
||||
+ }
|
||||
|
||||
+ /* never reached */
|
||||
+ BUG();
|
||||
return -1;
|
||||
}
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,29 @@
|
||||
From d2632238947d8aa9096deb27ae8ba05971f43de9 Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Thu, 16 Dec 2021 18:05:01 +0300
|
||||
Subject: [PATCH 088/120] crtools: check that cpuinfo command has sub-command
|
||||
|
||||
This fixes segfault on empty sub-command for cpuinfo.
|
||||
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
criu/crtools.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/criu/crtools.c b/criu/crtools.c
|
||||
index 7bf92ffd0..0752800f6 100644
|
||||
--- a/criu/crtools.c
|
||||
+++ b/criu/crtools.c
|
||||
@@ -222,6 +222,9 @@ int main(int argc, char *argv[], char *envp[])
|
||||
if (opts.mode != CR_CPUINFO && has_sub_command) {
|
||||
pr_err("excessive parameter%s for command %s\n", (argc - optind) > 2 ? "s" : "", argv[optind]);
|
||||
goto usage;
|
||||
+ } else if (opts.mode == CR_CPUINFO && !has_sub_command) {
|
||||
+ pr_err("cpuinfo requires an action: dump or check\n");
|
||||
+ goto usage;
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,53 @@
|
||||
From 2407ff4a1f96fe206bcc246d58f90d24aa8f4e1e Mon Sep 17 00:00:00 2001
|
||||
From: Bui Quang Minh <minhquangbui99@gmail.com>
|
||||
Date: Tue, 14 Dec 2021 22:28:27 +0700
|
||||
Subject: [PATCH 089/120] sk-unix: Add support for SOCK_SEQPACKET unix sockets
|
||||
|
||||
Adjust some SOCK_STREAM cases to handle SOCK_SEQPACKET too.
|
||||
|
||||
Signed-off-by: Bui Quang Minh <minhquangbui99@gmail.com>
|
||||
---
|
||||
criu/sk-unix.c | 10 +++++-----
|
||||
1 file changed, 5 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/criu/sk-unix.c b/criu/sk-unix.c
|
||||
index d3402c3ac..194193dff 100644
|
||||
--- a/criu/sk-unix.c
|
||||
+++ b/criu/sk-unix.c
|
||||
@@ -402,12 +402,12 @@ static int dump_one_unix_fd(int lfd, uint32_t id, const struct fd_parms *p)
|
||||
sk_encode_shutdown(ue, sk->shutdown);
|
||||
|
||||
/*
|
||||
- * If a stream listening socket has non-zero rqueue, this
|
||||
- * means there are in-flight connections waiting to get
|
||||
+ * If a stream/seqpacket listening socket has non-zero rqueue,
|
||||
+ * this means there are in-flight connections waiting to get
|
||||
* accept()-ed. We handle them separately with the "icons"
|
||||
* (i stands for in-flight, cons -- for connections) things.
|
||||
*/
|
||||
- if (sk->rqlen != 0 && !(sk->type == SOCK_STREAM && sk->state == TCP_LISTEN)) {
|
||||
+ if (sk->rqlen != 0 && sk->state != TCP_LISTEN) {
|
||||
if (dump_sk_queue(lfd, id))
|
||||
goto err;
|
||||
}
|
||||
@@ -1610,7 +1610,7 @@ static int bind_unix_sk(int sk, struct unix_sk_info *ui)
|
||||
if (ui->ue->name.len == 0)
|
||||
return 0;
|
||||
|
||||
- if ((ui->ue->type == SOCK_STREAM) && (ui->ue->state == TCP_ESTABLISHED)) {
|
||||
+ if ((ui->ue->type != SOCK_DGRAM) && (ui->ue->state == TCP_ESTABLISHED)) {
|
||||
/*
|
||||
* FIXME this can be done, but for doing this properly we
|
||||
* need to bind socket to its name, then rename one to
|
||||
@@ -1851,7 +1851,7 @@ static int open_unixsk_standalone(struct unix_sk_info *ui, int *new_fd)
|
||||
|
||||
close(sks[1]);
|
||||
sk = sks[0];
|
||||
- } else if ((ui->ue->state == TCP_ESTABLISHED && ui->ue->type == SOCK_STREAM) && queuer &&
|
||||
+ } else if ((ui->ue->state == TCP_ESTABLISHED && ui->ue->type != SOCK_DGRAM) && queuer &&
|
||||
queuer->ue->ino == FAKE_INO) {
|
||||
int ret, sks[2];
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
574
0090-zdtm-Add-SOCK_SEQPACKET-variants-to-unix-socket-test.patch
Normal file
574
0090-zdtm-Add-SOCK_SEQPACKET-variants-to-unix-socket-test.patch
Normal file
@ -0,0 +1,574 @@
|
||||
From 41a696dcc5ebef28ce8e9ed28fe9c3e8518868ec Mon Sep 17 00:00:00 2001
|
||||
From: Bui Quang Minh <minhquangbui99@gmail.com>
|
||||
Date: Thu, 16 Dec 2021 09:35:25 +0700
|
||||
Subject: [PATCH 090/120] zdtm: Add SOCK_SEQPACKET variants to unix socket
|
||||
tests
|
||||
|
||||
This commit simply makes copies of SOCK_STREAM unix socket tests and uses
|
||||
SOCK_SEQPACKET instead.
|
||||
|
||||
Signed-off-by: Bui Quang Minh <minhquangbui99@gmail.com>
|
||||
---
|
||||
test/zdtm/static/Makefile | 23 +++++++++++++++++++
|
||||
test/zdtm/static/del_standalone_un.c | 8 ++++++-
|
||||
.../zdtm/static/del_standalone_un_seqpacket.c | 1 +
|
||||
test/zdtm/static/scm03-seqpacket.c | 1 +
|
||||
test/zdtm/static/scm03.c | 8 ++++++-
|
||||
test/zdtm/static/sk-unix-rel-seqpacket.c | 1 +
|
||||
test/zdtm/static/sk-unix-rel.c | 10 ++++++--
|
||||
test/zdtm/static/sk-unix-unconn-seqpacket.c | 1 +
|
||||
test/zdtm/static/sk-unix-unconn.c | 10 ++++++--
|
||||
test/zdtm/static/sk-unix01-seqpacket.c | 1 +
|
||||
test/zdtm/static/sk-unix01-seqpacket.desc | 1 +
|
||||
test/zdtm/static/sk-unix01.c | 12 +++++++---
|
||||
test/zdtm/static/socket_queues.c | 8 ++++++-
|
||||
test/zdtm/static/socket_queues_seqpacket.c | 1 +
|
||||
test/zdtm/static/sockets00-seqpacket.c | 1 +
|
||||
test/zdtm/static/sockets00-seqpacket.desc | 1 +
|
||||
test/zdtm/static/sockets00.c | 12 +++++++---
|
||||
test/zdtm/static/sockets01-seqpacket.c | 1 +
|
||||
test/zdtm/static/sockets01.c | 10 ++++++--
|
||||
test/zdtm/static/sockets02-seqpacket.c | 1 +
|
||||
test/zdtm/static/sockets02.c | 8 ++++++-
|
||||
test/zdtm/static/sockets03-seqpacket.c | 1 +
|
||||
test/zdtm/static/sockets03-seqpacket.desc | 1 +
|
||||
test/zdtm/static/sockets03.c | 10 ++++++--
|
||||
test/zdtm/static/sockets_spair.c | 8 ++++++-
|
||||
test/zdtm/static/sockets_spair_seqpacket.c | 1 +
|
||||
26 files changed, 122 insertions(+), 19 deletions(-)
|
||||
create mode 120000 test/zdtm/static/del_standalone_un_seqpacket.c
|
||||
create mode 120000 test/zdtm/static/scm03-seqpacket.c
|
||||
create mode 120000 test/zdtm/static/sk-unix-rel-seqpacket.c
|
||||
create mode 120000 test/zdtm/static/sk-unix-unconn-seqpacket.c
|
||||
create mode 120000 test/zdtm/static/sk-unix01-seqpacket.c
|
||||
create mode 120000 test/zdtm/static/sk-unix01-seqpacket.desc
|
||||
create mode 120000 test/zdtm/static/socket_queues_seqpacket.c
|
||||
create mode 120000 test/zdtm/static/sockets00-seqpacket.c
|
||||
create mode 120000 test/zdtm/static/sockets00-seqpacket.desc
|
||||
create mode 120000 test/zdtm/static/sockets01-seqpacket.c
|
||||
create mode 120000 test/zdtm/static/sockets02-seqpacket.c
|
||||
create mode 120000 test/zdtm/static/sockets03-seqpacket.c
|
||||
create mode 120000 test/zdtm/static/sockets03-seqpacket.desc
|
||||
create mode 120000 test/zdtm/static/sockets_spair_seqpacket.c
|
||||
|
||||
diff --git a/test/zdtm/static/Makefile b/test/zdtm/static/Makefile
|
||||
index 3e1e0a498..4a21978b5 100644
|
||||
--- a/test/zdtm/static/Makefile
|
||||
+++ b/test/zdtm/static/Makefile
|
||||
@@ -68,9 +68,13 @@ TST_NOFILE := \
|
||||
utsname \
|
||||
pstree \
|
||||
sockets01 \
|
||||
+ sockets01-seqpacket \
|
||||
sockets02 \
|
||||
+ sockets02-seqpacket \
|
||||
sockets_spair \
|
||||
+ sockets_spair_seqpacket \
|
||||
socket_queues \
|
||||
+ socket_queues_seqpacket \
|
||||
socket-raw \
|
||||
socket-tcp \
|
||||
socket-tcp-listen \
|
||||
@@ -119,6 +123,7 @@ TST_NOFILE := \
|
||||
sock_opts01 \
|
||||
sock_opts02 \
|
||||
sk-unix-unconn \
|
||||
+ sk-unix-unconn-seqpacket \
|
||||
ipc_namespace \
|
||||
selfexe00 \
|
||||
sem \
|
||||
@@ -187,6 +192,7 @@ TST_NOFILE := \
|
||||
scm01 \
|
||||
scm02 \
|
||||
scm03 \
|
||||
+ scm03-seqpacket \
|
||||
scm04 \
|
||||
scm05 \
|
||||
scm06 \
|
||||
@@ -284,6 +290,7 @@ TST_FILE = \
|
||||
file_attr \
|
||||
deleted_unix_sock \
|
||||
sk-unix-rel \
|
||||
+ sk-unix-rel-seqpacket \
|
||||
deleted_dev \
|
||||
unlink_fstat00 \
|
||||
unlink_fstat01 \
|
||||
@@ -311,7 +318,9 @@ TST_FILE = \
|
||||
cow01 \
|
||||
fdt_shared \
|
||||
sockets00 \
|
||||
+ sockets00-seqpacket \
|
||||
sockets03 \
|
||||
+ sockets03-seqpacket \
|
||||
sockets_dgram \
|
||||
file_lease00 \
|
||||
file_lease01 \
|
||||
@@ -394,8 +403,10 @@ TST_DIR = \
|
||||
mnt_enablefs \
|
||||
autofs \
|
||||
del_standalone_un \
|
||||
+ del_standalone_un_seqpacket \
|
||||
sk-unix-mntns \
|
||||
sk-unix01 \
|
||||
+ sk-unix01-seqpacket \
|
||||
sk-unix-dgram-ghost \
|
||||
unsupported_children_collision \
|
||||
shared_slave_mount_children \
|
||||
@@ -607,6 +618,18 @@ socket-tcp6-unconn: CFLAGS += -D ZDTM_IPV6
|
||||
socket-tcp4v6-last-ack: CFLAGS += -D ZDTM_TCP_LAST_ACK -D ZDTM_IPV4V6
|
||||
socket-tcp4v6-closing: CFLAGS += -D ZDTM_IPV4V6
|
||||
|
||||
+sockets00-seqpacket: CFLAGS += -D ZDTM_UNIX_SEQPACKET
|
||||
+sockets01-seqpacket: CFLAGS += -D ZDTM_UNIX_SEQPACKET
|
||||
+sockets02-seqpacket: CFLAGS += -D ZDTM_UNIX_SEQPACKET
|
||||
+sockets03-seqpacket: CFLAGS += -D ZDTM_UNIX_SEQPACKET
|
||||
+sk-unix01-seqpacket: CFLAGS += -D ZDTM_UNIX_SEQPACKET
|
||||
+sk-unix-rel-seqpacket: CFLAGS += -D ZDTM_UNIX_SEQPACKET
|
||||
+sockets_spair_seqpacket: CFLAGS += -D ZDTM_UNIX_SEQPACKET
|
||||
+socket_queues_seqpacket: CFLAGS += -D ZDTM_UNIX_SEQPACKET
|
||||
+del_standalone_un_seqpacket: CFLAGS += -D ZDTM_UNIX_SEQPACKET
|
||||
+sk-unix-unconn-seqpacket: CFLAGS += -D ZDTM_UNIX_SEQPACKET
|
||||
+scm03-seqpacket: CFLAGS += -D ZDTM_UNIX_SEQPACKET
|
||||
+
|
||||
pty-console: CFLAGS += -D ZDTM_DEV_CONSOLE
|
||||
|
||||
shm-unaligned: CFLAGS += -DZDTM_SHM_UNALIGNED
|
||||
diff --git a/test/zdtm/static/del_standalone_un.c b/test/zdtm/static/del_standalone_un.c
|
||||
index c9fa84870..b4f99e260 100644
|
||||
--- a/test/zdtm/static/del_standalone_un.c
|
||||
+++ b/test/zdtm/static/del_standalone_un.c
|
||||
@@ -16,11 +16,17 @@ const char *test_author = "Tycho Andersen <tycho.andersen@canonical.com>";
|
||||
char *dirname;
|
||||
TEST_OPTION(dirname, string, "directory name", 1);
|
||||
|
||||
+#ifdef ZDTM_UNIX_SEQPACKET
|
||||
+#define SOCK_TYPE SOCK_SEQPACKET
|
||||
+#else
|
||||
+#define SOCK_TYPE SOCK_STREAM
|
||||
+#endif
|
||||
+
|
||||
static int bind_and_listen(struct sockaddr_un *addr)
|
||||
{
|
||||
int sk;
|
||||
|
||||
- sk = socket(PF_UNIX, SOCK_STREAM, 0);
|
||||
+ sk = socket(PF_UNIX, SOCK_TYPE, 0);
|
||||
if (sk < 0) {
|
||||
fail("socket");
|
||||
return -1;
|
||||
diff --git a/test/zdtm/static/del_standalone_un_seqpacket.c b/test/zdtm/static/del_standalone_un_seqpacket.c
|
||||
new file mode 120000
|
||||
index 000000000..d88fcbad8
|
||||
--- /dev/null
|
||||
+++ b/test/zdtm/static/del_standalone_un_seqpacket.c
|
||||
@@ -0,0 +1 @@
|
||||
+del_standalone_un.c
|
||||
\ No newline at end of file
|
||||
diff --git a/test/zdtm/static/scm03-seqpacket.c b/test/zdtm/static/scm03-seqpacket.c
|
||||
new file mode 120000
|
||||
index 000000000..f1f86dd8b
|
||||
--- /dev/null
|
||||
+++ b/test/zdtm/static/scm03-seqpacket.c
|
||||
@@ -0,0 +1 @@
|
||||
+scm03.c
|
||||
\ No newline at end of file
|
||||
diff --git a/test/zdtm/static/scm03.c b/test/zdtm/static/scm03.c
|
||||
index a40fc0101..4453f7e93 100644
|
||||
--- a/test/zdtm/static/scm03.c
|
||||
+++ b/test/zdtm/static/scm03.c
|
||||
@@ -9,6 +9,12 @@
|
||||
const char *test_doc = "Check that SCM_RIGHTS are preserved";
|
||||
const char *test_author = "Pavel Emelyanov <xemul@virtuozzo.com>";
|
||||
|
||||
+#ifdef ZDTM_UNIX_SEQPACKET
|
||||
+#define SOCK_TYPE SOCK_SEQPACKET
|
||||
+#else
|
||||
+#define SOCK_TYPE SOCK_DGRAM
|
||||
+#endif
|
||||
+
|
||||
static int send_fd(int via, int fd1, int fd2)
|
||||
{
|
||||
struct msghdr h = {};
|
||||
@@ -105,7 +111,7 @@ int main(int argc, char **argv)
|
||||
|
||||
test_init(argc, argv);
|
||||
|
||||
- if (socketpair(PF_UNIX, SOCK_DGRAM, 0, sk) < 0) {
|
||||
+ if (socketpair(PF_UNIX, SOCK_TYPE, 0, sk) < 0) {
|
||||
pr_perror("Can't make unix pair");
|
||||
exit(1);
|
||||
}
|
||||
diff --git a/test/zdtm/static/sk-unix-rel-seqpacket.c b/test/zdtm/static/sk-unix-rel-seqpacket.c
|
||||
new file mode 120000
|
||||
index 000000000..1f98e3845
|
||||
--- /dev/null
|
||||
+++ b/test/zdtm/static/sk-unix-rel-seqpacket.c
|
||||
@@ -0,0 +1 @@
|
||||
+sk-unix-rel.c
|
||||
\ No newline at end of file
|
||||
diff --git a/test/zdtm/static/sk-unix-rel.c b/test/zdtm/static/sk-unix-rel.c
|
||||
index 10c19080a..7e4aeafe6 100644
|
||||
--- a/test/zdtm/static/sk-unix-rel.c
|
||||
+++ b/test/zdtm/static/sk-unix-rel.c
|
||||
@@ -25,6 +25,12 @@ TEST_OPTION(filename, string, "socket file name", 1);
|
||||
|
||||
#define TEST_MODE 0640
|
||||
|
||||
+#ifdef ZDTM_UNIX_SEQPACKET
|
||||
+#define SOCK_TYPE SOCK_SEQPACKET
|
||||
+#else
|
||||
+#define SOCK_TYPE SOCK_STREAM
|
||||
+#endif
|
||||
+
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct sockaddr_un addr;
|
||||
@@ -54,8 +60,8 @@ int main(int argc, char *argv[])
|
||||
memcpy(addr.sun_path, filename, addrlen);
|
||||
addrlen += sizeof(addr.sun_family);
|
||||
|
||||
- sock[0] = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
- sock[1] = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
+ sock[0] = socket(AF_UNIX, SOCK_TYPE, 0);
|
||||
+ sock[1] = socket(AF_UNIX, SOCK_TYPE, 0);
|
||||
if (sock[0] < 0 || sock[1] < 0) {
|
||||
fail("socket");
|
||||
exit(1);
|
||||
diff --git a/test/zdtm/static/sk-unix-unconn-seqpacket.c b/test/zdtm/static/sk-unix-unconn-seqpacket.c
|
||||
new file mode 120000
|
||||
index 000000000..f5c276186
|
||||
--- /dev/null
|
||||
+++ b/test/zdtm/static/sk-unix-unconn-seqpacket.c
|
||||
@@ -0,0 +1 @@
|
||||
+sk-unix-unconn.c
|
||||
\ No newline at end of file
|
||||
diff --git a/test/zdtm/static/sk-unix-unconn.c b/test/zdtm/static/sk-unix-unconn.c
|
||||
index caad3d315..62e48247f 100644
|
||||
--- a/test/zdtm/static/sk-unix-unconn.c
|
||||
+++ b/test/zdtm/static/sk-unix-unconn.c
|
||||
@@ -9,6 +9,12 @@
|
||||
const char *test_doc = "Check unconnected unix sockets";
|
||||
const char *test_author = "Vagin Andrew <avagin@parallels.com>";
|
||||
|
||||
+#ifdef ZDTM_UNIX_SEQPACKET
|
||||
+#define SOCK_TYPE SOCK_SEQPACKET
|
||||
+#else
|
||||
+#define SOCK_TYPE SOCK_STREAM
|
||||
+#endif
|
||||
+
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int sk, skc;
|
||||
@@ -19,13 +25,13 @@ int main(int argc, char **argv)
|
||||
|
||||
test_init(argc, argv);
|
||||
|
||||
- sk = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
+ sk = socket(AF_UNIX, SOCK_TYPE, 0);
|
||||
if (sk == -1) {
|
||||
pr_perror("socket");
|
||||
return 1;
|
||||
}
|
||||
|
||||
- skc = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
+ skc = socket(AF_UNIX, SOCK_TYPE, 0);
|
||||
if (skc == -1) {
|
||||
pr_perror("socket");
|
||||
return 1;
|
||||
diff --git a/test/zdtm/static/sk-unix01-seqpacket.c b/test/zdtm/static/sk-unix01-seqpacket.c
|
||||
new file mode 120000
|
||||
index 000000000..bef734ed6
|
||||
--- /dev/null
|
||||
+++ b/test/zdtm/static/sk-unix01-seqpacket.c
|
||||
@@ -0,0 +1 @@
|
||||
+sk-unix01.c
|
||||
\ No newline at end of file
|
||||
diff --git a/test/zdtm/static/sk-unix01-seqpacket.desc b/test/zdtm/static/sk-unix01-seqpacket.desc
|
||||
new file mode 120000
|
||||
index 000000000..7a30da25c
|
||||
--- /dev/null
|
||||
+++ b/test/zdtm/static/sk-unix01-seqpacket.desc
|
||||
@@ -0,0 +1 @@
|
||||
+sk-unix01.desc
|
||||
\ No newline at end of file
|
||||
diff --git a/test/zdtm/static/sk-unix01.c b/test/zdtm/static/sk-unix01.c
|
||||
index c2bb8b9ed..5146c027f 100644
|
||||
--- a/test/zdtm/static/sk-unix01.c
|
||||
+++ b/test/zdtm/static/sk-unix01.c
|
||||
@@ -24,6 +24,12 @@ const char *test_author = "Cyrill Gorcunov <gorcunov@openvz.org>";
|
||||
char *dirname;
|
||||
TEST_OPTION(dirname, string, "directory name", 1);
|
||||
|
||||
+#ifdef ZDTM_UNIX_SEQPACKET
|
||||
+#define SOCK_TYPE SOCK_SEQPACKET
|
||||
+#else
|
||||
+#define SOCK_TYPE SOCK_STREAM
|
||||
+#endif
|
||||
+
|
||||
static int sk_alloc_bind(int type, struct sockaddr_un *addr)
|
||||
{
|
||||
int sk;
|
||||
@@ -256,7 +262,7 @@ int main(int argc, char **argv)
|
||||
|
||||
unlink(addr.sun_path);
|
||||
|
||||
- sk_st[0] = sk_alloc_bind(SOCK_STREAM, &addr);
|
||||
+ sk_st[0] = sk_alloc_bind(SOCK_TYPE, &addr);
|
||||
if (sk_st[0] < 0)
|
||||
return 1;
|
||||
test_msg("sk-st: alloc/bind/listen %d\n", sk_st[0]);
|
||||
@@ -266,7 +272,7 @@ int main(int argc, char **argv)
|
||||
return 1;
|
||||
}
|
||||
|
||||
- sk_st[1] = sk_alloc_connect(SOCK_STREAM, &addr);
|
||||
+ sk_st[1] = sk_alloc_connect(SOCK_TYPE, &addr);
|
||||
if (sk_st[1] < 0)
|
||||
return 1;
|
||||
test_msg("sk-st: alloc/connect %d\n", sk_st[1]);
|
||||
@@ -279,7 +285,7 @@ int main(int argc, char **argv)
|
||||
}
|
||||
test_msg("sk-st: accept %d\n", sk_st[2]);
|
||||
|
||||
- sk_st[3] = sk_alloc_connect(SOCK_STREAM, &addr);
|
||||
+ sk_st[3] = sk_alloc_connect(SOCK_TYPE, &addr);
|
||||
if (sk_st[3] < 0)
|
||||
return 1;
|
||||
test_msg("sk-st: alloc/connect %d\n", sk_st[3]);
|
||||
diff --git a/test/zdtm/static/socket_queues.c b/test/zdtm/static/socket_queues.c
|
||||
index e30bca0e1..44495f06b 100644
|
||||
--- a/test/zdtm/static/socket_queues.c
|
||||
+++ b/test/zdtm/static/socket_queues.c
|
||||
@@ -24,6 +24,12 @@ const char *test_author = "Stanislav Kinsbursky <skinsbursky@parallels.com>\n";
|
||||
#define SK_DATA_D1 "packet dgram left"
|
||||
#define SK_DATA_D2 "packet dgram right"
|
||||
|
||||
+#ifdef ZDTM_UNIX_SEQPACKET
|
||||
+#define SOCK_TYPE SOCK_SEQPACKET
|
||||
+#else
|
||||
+#define SOCK_TYPE SOCK_STREAM
|
||||
+#endif
|
||||
+
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int ssk_pair_d[2];
|
||||
@@ -32,7 +38,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
test_init(argc, argv);
|
||||
|
||||
- if (socketpair(AF_UNIX, SOCK_STREAM, 0, ssk_pair_s) == -1) {
|
||||
+ if (socketpair(AF_UNIX, SOCK_TYPE, 0, ssk_pair_s) == -1) {
|
||||
fail("socketpair");
|
||||
exit(1);
|
||||
}
|
||||
diff --git a/test/zdtm/static/socket_queues_seqpacket.c b/test/zdtm/static/socket_queues_seqpacket.c
|
||||
new file mode 120000
|
||||
index 000000000..0f3f93ea6
|
||||
--- /dev/null
|
||||
+++ b/test/zdtm/static/socket_queues_seqpacket.c
|
||||
@@ -0,0 +1 @@
|
||||
+socket_queues.c
|
||||
\ No newline at end of file
|
||||
diff --git a/test/zdtm/static/sockets00-seqpacket.c b/test/zdtm/static/sockets00-seqpacket.c
|
||||
new file mode 120000
|
||||
index 000000000..4bce9fc31
|
||||
--- /dev/null
|
||||
+++ b/test/zdtm/static/sockets00-seqpacket.c
|
||||
@@ -0,0 +1 @@
|
||||
+sockets00.c
|
||||
\ No newline at end of file
|
||||
diff --git a/test/zdtm/static/sockets00-seqpacket.desc b/test/zdtm/static/sockets00-seqpacket.desc
|
||||
new file mode 120000
|
||||
index 000000000..4beea2642
|
||||
--- /dev/null
|
||||
+++ b/test/zdtm/static/sockets00-seqpacket.desc
|
||||
@@ -0,0 +1 @@
|
||||
+sockets00.desc
|
||||
\ No newline at end of file
|
||||
diff --git a/test/zdtm/static/sockets00.c b/test/zdtm/static/sockets00.c
|
||||
index 53890077b..ac5d7d6fe 100644
|
||||
--- a/test/zdtm/static/sockets00.c
|
||||
+++ b/test/zdtm/static/sockets00.c
|
||||
@@ -25,6 +25,12 @@ TEST_OPTION(filename, string, "socket file name", 1);
|
||||
|
||||
#define TEST_MODE 0640
|
||||
|
||||
+#ifdef ZDTM_UNIX_SEQPACKET
|
||||
+#define SOCK_TYPE SOCK_SEQPACKET
|
||||
+#else
|
||||
+#define SOCK_TYPE SOCK_STREAM
|
||||
+#endif
|
||||
+
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int ssk_icon[4];
|
||||
@@ -58,9 +64,9 @@ int main(int argc, char *argv[])
|
||||
memcpy(addr.sun_path, path, addrlen);
|
||||
addrlen += sizeof(addr.sun_family);
|
||||
|
||||
- ssk_icon[0] = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
- ssk_icon[1] = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
- ssk_icon[2] = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
+ ssk_icon[0] = socket(AF_UNIX, SOCK_TYPE, 0);
|
||||
+ ssk_icon[1] = socket(AF_UNIX, SOCK_TYPE, 0);
|
||||
+ ssk_icon[2] = socket(AF_UNIX, SOCK_TYPE, 0);
|
||||
if (ssk_icon[0] < 0 || ssk_icon[1] < 0 || ssk_icon[2] < 0) {
|
||||
fail("socket");
|
||||
exit(1);
|
||||
diff --git a/test/zdtm/static/sockets01-seqpacket.c b/test/zdtm/static/sockets01-seqpacket.c
|
||||
new file mode 120000
|
||||
index 000000000..8d51121e1
|
||||
--- /dev/null
|
||||
+++ b/test/zdtm/static/sockets01-seqpacket.c
|
||||
@@ -0,0 +1 @@
|
||||
+sockets01.c
|
||||
\ No newline at end of file
|
||||
diff --git a/test/zdtm/static/sockets01.c b/test/zdtm/static/sockets01.c
|
||||
index e35a31fec..f56cd219e 100644
|
||||
--- a/test/zdtm/static/sockets01.c
|
||||
+++ b/test/zdtm/static/sockets01.c
|
||||
@@ -30,6 +30,12 @@ const char *test_author = "Pavel Emelyanov <xemul@parallels.com>";
|
||||
#define TEST_MSG "test-message"
|
||||
static char buf[sizeof(TEST_MSG)];
|
||||
|
||||
+#ifdef ZDTM_UNIX_SEQPACKET
|
||||
+#define SOCK_TYPE SOCK_SEQPACKET
|
||||
+#else
|
||||
+#define SOCK_TYPE SOCK_STREAM
|
||||
+#endif
|
||||
+
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int spu[2], spb[2], dpu[2], dpb[2], dpd[2];
|
||||
@@ -40,14 +46,14 @@ int main(int argc, char *argv[])
|
||||
signal(SIGPIPE, SIG_IGN);
|
||||
|
||||
/* spu -- stream pair, unidirectional shutdown */
|
||||
- if (socketpair(PF_UNIX, SOCK_STREAM, 0, spu) < 0)
|
||||
+ if (socketpair(PF_UNIX, SOCK_TYPE, 0, spu) < 0)
|
||||
fin("no stream pair 1");
|
||||
|
||||
if (shutdown(spu[0], SHUT_RD) < 0)
|
||||
fin("no stream shutdown 1");
|
||||
|
||||
/* spb -- stream pair, bidirectional shutdown */
|
||||
- if (socketpair(PF_UNIX, SOCK_STREAM, 0, spb) < 0)
|
||||
+ if (socketpair(PF_UNIX, SOCK_TYPE, 0, spb) < 0)
|
||||
fin("no stream pair 2");
|
||||
|
||||
if (shutdown(spb[0], SHUT_RDWR) < 0)
|
||||
diff --git a/test/zdtm/static/sockets02-seqpacket.c b/test/zdtm/static/sockets02-seqpacket.c
|
||||
new file mode 120000
|
||||
index 000000000..b95831599
|
||||
--- /dev/null
|
||||
+++ b/test/zdtm/static/sockets02-seqpacket.c
|
||||
@@ -0,0 +1 @@
|
||||
+sockets02.c
|
||||
\ No newline at end of file
|
||||
diff --git a/test/zdtm/static/sockets02.c b/test/zdtm/static/sockets02.c
|
||||
index 2729ade2c..d7d84d815 100644
|
||||
--- a/test/zdtm/static/sockets02.c
|
||||
+++ b/test/zdtm/static/sockets02.c
|
||||
@@ -16,6 +16,12 @@
|
||||
const char *test_doc = "Test semi-closed unix stream connection\n";
|
||||
const char *test_author = "Pavel Emelyanov <xemul@parallels.com>\n";
|
||||
|
||||
+#ifdef ZDTM_UNIX_SEQPACKET
|
||||
+#define SOCK_TYPE SOCK_SEQPACKET
|
||||
+#else
|
||||
+#define SOCK_TYPE SOCK_STREAM
|
||||
+#endif
|
||||
+
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int ssk_pair[2], ret;
|
||||
@@ -25,7 +31,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
data = (char)lrand48();
|
||||
|
||||
- if (socketpair(AF_UNIX, SOCK_STREAM, 0, ssk_pair) == -1) {
|
||||
+ if (socketpair(AF_UNIX, SOCK_TYPE, 0, ssk_pair) == -1) {
|
||||
fail("socketpair");
|
||||
exit(1);
|
||||
}
|
||||
diff --git a/test/zdtm/static/sockets03-seqpacket.c b/test/zdtm/static/sockets03-seqpacket.c
|
||||
new file mode 120000
|
||||
index 000000000..997cce673
|
||||
--- /dev/null
|
||||
+++ b/test/zdtm/static/sockets03-seqpacket.c
|
||||
@@ -0,0 +1 @@
|
||||
+sockets03.c
|
||||
\ No newline at end of file
|
||||
diff --git a/test/zdtm/static/sockets03-seqpacket.desc b/test/zdtm/static/sockets03-seqpacket.desc
|
||||
new file mode 120000
|
||||
index 000000000..3798a8242
|
||||
--- /dev/null
|
||||
+++ b/test/zdtm/static/sockets03-seqpacket.desc
|
||||
@@ -0,0 +1 @@
|
||||
+sockets03.desc
|
||||
\ No newline at end of file
|
||||
diff --git a/test/zdtm/static/sockets03.c b/test/zdtm/static/sockets03.c
|
||||
index cd6f60831..6b0915aaa 100644
|
||||
--- a/test/zdtm/static/sockets03.c
|
||||
+++ b/test/zdtm/static/sockets03.c
|
||||
@@ -22,6 +22,12 @@ const char *test_author = "Andrey Ryabinin <aryabinin@virtuozzo.com>";
|
||||
char *filename;
|
||||
TEST_OPTION(filename, string, "socket file name", 1);
|
||||
|
||||
+#ifdef ZDTM_UNIX_SEQPACKET
|
||||
+#define SOCK_TYPE SOCK_SEQPACKET
|
||||
+#else
|
||||
+#define SOCK_TYPE SOCK_STREAM
|
||||
+#endif
|
||||
+
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int sk[3];
|
||||
@@ -52,8 +58,8 @@ int main(int argc, char *argv[])
|
||||
memcpy(addr.sun_path, path, addrlen);
|
||||
addrlen += sizeof(addr.sun_family);
|
||||
|
||||
- sk[0] = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
- sk[1] = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
+ sk[0] = socket(AF_UNIX, SOCK_TYPE, 0);
|
||||
+ sk[1] = socket(AF_UNIX, SOCK_TYPE, 0);
|
||||
if (sk[0] < 0 || sk[1] < 0) {
|
||||
fail("socket");
|
||||
exit(1);
|
||||
diff --git a/test/zdtm/static/sockets_spair.c b/test/zdtm/static/sockets_spair.c
|
||||
index 2dbb132aa..202c2e790 100644
|
||||
--- a/test/zdtm/static/sockets_spair.c
|
||||
+++ b/test/zdtm/static/sockets_spair.c
|
||||
@@ -18,6 +18,12 @@ const char *test_author = "Cyrill Gorcunov <gorcunov@openvz.org";
|
||||
|
||||
#define SK_DATA "packet"
|
||||
|
||||
+#ifdef ZDTM_UNIX_SEQPACKET
|
||||
+#define SOCK_TYPE SOCK_SEQPACKET
|
||||
+#else
|
||||
+#define SOCK_TYPE SOCK_STREAM
|
||||
+#endif
|
||||
+
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int ssk_pair[2];
|
||||
@@ -25,7 +31,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
test_init(argc, argv);
|
||||
|
||||
- if (socketpair(AF_UNIX, SOCK_STREAM, 0, ssk_pair) == -1) {
|
||||
+ if (socketpair(AF_UNIX, SOCK_TYPE, 0, ssk_pair) == -1) {
|
||||
fail("socketpair");
|
||||
exit(1);
|
||||
}
|
||||
diff --git a/test/zdtm/static/sockets_spair_seqpacket.c b/test/zdtm/static/sockets_spair_seqpacket.c
|
||||
new file mode 120000
|
||||
index 000000000..a52ccb6c9
|
||||
--- /dev/null
|
||||
+++ b/test/zdtm/static/sockets_spair_seqpacket.c
|
||||
@@ -0,0 +1 @@
|
||||
+sockets_spair.c
|
||||
\ No newline at end of file
|
||||
--
|
||||
2.34.1
|
||||
|
||||
26
0091-tls-fix-typo.patch
Normal file
26
0091-tls-fix-typo.patch
Normal file
@ -0,0 +1,26 @@
|
||||
From 0bef863f00df370b32c7c3288dbe1c805ad6905e Mon Sep 17 00:00:00 2001
|
||||
From: Radostin Stoyanov <radostin@redhat.com>
|
||||
Date: Tue, 7 Dec 2021 21:29:44 +0000
|
||||
Subject: [PATCH 091/120] tls: fix typo
|
||||
|
||||
Signed-off-by: Radostin Stoyanov <radostin@redhat.com>
|
||||
---
|
||||
criu/tls.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/criu/tls.c b/criu/tls.c
|
||||
index 60bd105bc..6a7b523ac 100644
|
||||
--- a/criu/tls.c
|
||||
+++ b/criu/tls.c
|
||||
@@ -8,7 +8,7 @@
|
||||
#include "cr_options.h"
|
||||
#include "xmalloc.h"
|
||||
|
||||
-/* Compatability with GnuTLS verson <3.5 */
|
||||
+/* Compatability with GnuTLS version < 3.5 */
|
||||
#ifndef GNUTLS_E_CERTIFICATE_VERIFICATION_ERROR
|
||||
#define GNUTLS_E_CERTIFICATE_VERIFICATION_ERROR GNUTLS_E_CERTIFICATE_ERROR
|
||||
#endif
|
||||
--
|
||||
2.34.1
|
||||
|
||||
71
0092-tls-use-ssize_t-for-return-value.patch
Normal file
71
0092-tls-use-ssize_t-for-return-value.patch
Normal file
@ -0,0 +1,71 @@
|
||||
From 6ca82330a3bda6b70ea52fcae163a904d0c0b7df Mon Sep 17 00:00:00 2001
|
||||
From: Radostin Stoyanov <radostin@redhat.com>
|
||||
Date: Tue, 7 Dec 2021 22:32:54 +0000
|
||||
Subject: [PATCH 092/120] tls: use ssize_t for return value
|
||||
|
||||
Signed-off-by: Radostin Stoyanov <radostin@redhat.com>
|
||||
---
|
||||
criu/tls.c | 12 ++++++------
|
||||
1 file changed, 6 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/criu/tls.c b/criu/tls.c
|
||||
index 6a7b523ac..626e529f8 100644
|
||||
--- a/criu/tls.c
|
||||
+++ b/criu/tls.c
|
||||
@@ -53,7 +53,7 @@ void tls_terminate_session(void)
|
||||
|
||||
ssize_t tls_send(const void *buf, size_t len, int flags)
|
||||
{
|
||||
- int ret;
|
||||
+ ssize_t ret;
|
||||
|
||||
tls_sk_flags = flags;
|
||||
ret = gnutls_record_send(session, buf, len);
|
||||
@@ -95,7 +95,7 @@ int tls_send_data_from_fd(int fd, unsigned long len)
|
||||
return -1;
|
||||
|
||||
while (len > 0) {
|
||||
- int ret, sent;
|
||||
+ ssize_t ret, sent;
|
||||
|
||||
copied = read(fd, buf, min(len, buf_size));
|
||||
if (copied <= 0) {
|
||||
@@ -119,7 +119,7 @@ err:
|
||||
|
||||
ssize_t tls_recv(void *buf, size_t len, int flags)
|
||||
{
|
||||
- int ret;
|
||||
+ ssize_t ret;
|
||||
|
||||
tls_sk_flags = flags;
|
||||
ret = gnutls_record_recv(session, buf, len);
|
||||
@@ -163,7 +163,7 @@ int tls_recv_data_to_fd(int fd, unsigned long len)
|
||||
gnutls_packet_t packet;
|
||||
|
||||
while (len > 0) {
|
||||
- int ret, w;
|
||||
+ ssize_t ret, w;
|
||||
gnutls_datum_t pdata;
|
||||
|
||||
ret = gnutls_record_recv_packet(session, &packet);
|
||||
@@ -301,7 +301,7 @@ static int tls_x509_setup_creds(void)
|
||||
static ssize_t _tls_push_cb(void *p, const void *data, size_t sz)
|
||||
{
|
||||
int fd = *(int *)(p);
|
||||
- int ret = send(fd, data, sz, tls_sk_flags);
|
||||
+ ssize_t ret = send(fd, data, sz, tls_sk_flags);
|
||||
if (ret < 0 && errno != EAGAIN) {
|
||||
int _errno = errno;
|
||||
pr_perror("Push callback send failed");
|
||||
@@ -313,7 +313,7 @@ static ssize_t _tls_push_cb(void *p, const void *data, size_t sz)
|
||||
static ssize_t _tls_pull_cb(void *p, void *data, size_t sz)
|
||||
{
|
||||
int fd = *(int *)(p);
|
||||
- int ret = recv(fd, data, sz, tls_sk_flags);
|
||||
+ ssize_t ret = recv(fd, data, sz, tls_sk_flags);
|
||||
if (ret < 0 && errno != EAGAIN) {
|
||||
int _errno = errno;
|
||||
pr_perror("Pull callback recv failed");
|
||||
--
|
||||
2.34.1
|
||||
|
||||
111
0093-tls-add-more-comments.patch
Normal file
111
0093-tls-add-more-comments.patch
Normal file
@ -0,0 +1,111 @@
|
||||
From 8bddd88b3e15d167bad53b14b161f5cb628f2923 Mon Sep 17 00:00:00 2001
|
||||
From: Radostin Stoyanov <radostin@redhat.com>
|
||||
Date: Thu, 16 Dec 2021 14:26:53 +0000
|
||||
Subject: [PATCH 093/120] tls: add more comments
|
||||
|
||||
Signed-off-by: Radostin Stoyanov <radostin@redhat.com>
|
||||
---
|
||||
criu/tls.c | 26 +++++++++++++++++++++++++-
|
||||
1 file changed, 25 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/criu/tls.c b/criu/tls.c
|
||||
index 626e529f8..9985b037d 100644
|
||||
--- a/criu/tls.c
|
||||
+++ b/criu/tls.c
|
||||
@@ -40,13 +40,19 @@ void tls_terminate_session(void)
|
||||
|
||||
if (session) {
|
||||
do {
|
||||
- /* don't wait for peer to close connection */
|
||||
+ /*
|
||||
+ * Initiate a connection shutdown but don't
|
||||
+ * wait for peer to close connection.
|
||||
+ */
|
||||
ret = gnutls_bye(session, GNUTLS_SHUT_WR);
|
||||
} while (ret == GNUTLS_E_AGAIN || ret == GNUTLS_E_INTERRUPTED);
|
||||
+ /* Free the session object */
|
||||
gnutls_deinit(session);
|
||||
}
|
||||
|
||||
tls_sk = -1;
|
||||
+
|
||||
+ /* Free the credentials object */
|
||||
if (x509_cred)
|
||||
gnutls_certificate_free_credentials(x509_cred);
|
||||
}
|
||||
@@ -229,6 +235,7 @@ static int tls_handshake(void)
|
||||
{
|
||||
int ret = -1;
|
||||
while (ret != GNUTLS_E_SUCCESS) {
|
||||
+ /* Establish TLS session */
|
||||
ret = gnutls_handshake(session);
|
||||
if (gnutls_error_is_fatal(ret)) {
|
||||
tls_perror("TLS handshake failed", ret);
|
||||
@@ -257,6 +264,7 @@ static int tls_x509_setup_creds(void)
|
||||
if (opts.tls_key)
|
||||
key = opts.tls_key;
|
||||
|
||||
+ /* Load the trusted CA certificates */
|
||||
ret = gnutls_certificate_allocate_credentials(&x509_cred);
|
||||
if (ret != GNUTLS_E_SUCCESS) {
|
||||
tls_perror("Failed to allocate x509 credentials", ret);
|
||||
@@ -298,6 +306,10 @@ static int tls_x509_setup_creds(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * A function used by gnutls to send data. It returns a positive
|
||||
+ * number indicating the bytes sent, and -1 on error.
|
||||
+ */
|
||||
static ssize_t _tls_push_cb(void *p, const void *data, size_t sz)
|
||||
{
|
||||
int fd = *(int *)(p);
|
||||
@@ -310,6 +322,11 @@ static ssize_t _tls_push_cb(void *p, const void *data, size_t sz)
|
||||
return ret;
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * A callback function used by gnutls to receive data.
|
||||
+ * It returns 0 on connection termination, a positive number
|
||||
+ * indicating the number of bytes received, and -1 on error.
|
||||
+ */
|
||||
static ssize_t _tls_pull_cb(void *p, void *data, size_t sz)
|
||||
{
|
||||
int fd = *(int *)(p);
|
||||
@@ -326,26 +343,33 @@ static int tls_x509_setup_session(unsigned int flags)
|
||||
{
|
||||
int ret;
|
||||
|
||||
+ /* Create the session object */
|
||||
ret = gnutls_init(&session, flags);
|
||||
if (ret != GNUTLS_E_SUCCESS) {
|
||||
tls_perror("Failed to initialize session", ret);
|
||||
return -1;
|
||||
}
|
||||
|
||||
+ /* Install the trusted certificates */
|
||||
ret = gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, x509_cred);
|
||||
if (ret != GNUTLS_E_SUCCESS) {
|
||||
tls_perror("Failed to set session credentials", ret);
|
||||
return -1;
|
||||
}
|
||||
|
||||
+ /* Configure the cipher preferences */
|
||||
ret = gnutls_set_default_priority(session);
|
||||
if (ret != GNUTLS_E_SUCCESS) {
|
||||
tls_perror("Failed to set priority", ret);
|
||||
return -1;
|
||||
}
|
||||
|
||||
+ /* Associate the socket with the session object */
|
||||
gnutls_transport_set_ptr(session, &tls_sk);
|
||||
+
|
||||
+ /* Set a push function for gnutls to use to send data */
|
||||
gnutls_transport_set_push_function(session, _tls_push_cb);
|
||||
+ /* set a pull function for gnutls to use to receive data */
|
||||
gnutls_transport_set_pull_function(session, _tls_pull_cb);
|
||||
|
||||
if (flags == GNUTLS_SERVER) {
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,30 @@
|
||||
From c37140662d22e86e1096c953b888b6496b7e1f64 Mon Sep 17 00:00:00 2001
|
||||
From: Andrei Vagin <avagin@gmail.com>
|
||||
Date: Tue, 21 Dec 2021 21:59:13 -0800
|
||||
Subject: [PATCH 094/120] uffd: call disconnect_from_page_server to shutdown a
|
||||
page-server connection
|
||||
|
||||
We need to be sure that page-server doesn't wait for a new command when we
|
||||
call gnutls_bye() that sends an alert containing a close request.
|
||||
|
||||
Signed-off-by: Andrei Vagin <avagin@gmail.com>
|
||||
---
|
||||
criu/uffd.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/criu/uffd.c b/criu/uffd.c
|
||||
index f01e6999b..45ac8ba77 100644
|
||||
--- a/criu/uffd.c
|
||||
+++ b/criu/uffd.c
|
||||
@@ -1468,7 +1468,7 @@ int cr_lazy_pages(bool daemon)
|
||||
|
||||
ret = handle_requests(epollfd, &events, nr_fds);
|
||||
|
||||
- tls_terminate_session();
|
||||
+ disconnect_from_page_server();
|
||||
|
||||
xfree(events);
|
||||
return ret;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
100
0095-tls-allow-to-terminate-connections-synchronously.patch
Normal file
100
0095-tls-allow-to-terminate-connections-synchronously.patch
Normal file
@ -0,0 +1,100 @@
|
||||
From fa03dcfff6a5215ef06c1e579eddb0f5c09f8798 Mon Sep 17 00:00:00 2001
|
||||
From: Andrei Vagin <avagin@gmail.com>
|
||||
Date: Wed, 22 Dec 2021 09:36:09 -0800
|
||||
Subject: [PATCH 095/120] tls: allow to terminate connections synchronously
|
||||
|
||||
GNUTLS_SHUT_RDWR sends an alert containing a close request and waits for
|
||||
the peer to reply with the same message.
|
||||
|
||||
Signed-off-by: Andrei Vagin <avagin@gmail.com>
|
||||
---
|
||||
criu/include/tls.h | 4 ++--
|
||||
criu/page-xfer.c | 5 +++--
|
||||
criu/tls.c | 6 +++---
|
||||
3 files changed, 8 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/criu/include/tls.h b/criu/include/tls.h
|
||||
index 26f9976fd..f563c092c 100644
|
||||
--- a/criu/include/tls.h
|
||||
+++ b/criu/include/tls.h
|
||||
@@ -4,7 +4,7 @@
|
||||
#ifdef CONFIG_GNUTLS
|
||||
|
||||
int tls_x509_init(int sockfd, bool is_server);
|
||||
-void tls_terminate_session(void);
|
||||
+void tls_terminate_session(bool async);
|
||||
|
||||
ssize_t tls_send(const void *buf, size_t len, int flags);
|
||||
ssize_t tls_recv(void *buf, size_t len, int flags);
|
||||
@@ -19,7 +19,7 @@ int tls_recv_data_to_fd(int fd, unsigned long len);
|
||||
#define tls_recv(buf, len, flags) (-1)
|
||||
#define tls_send_data_from_fd(fd, len) (-1)
|
||||
#define tls_recv_data_to_fd(fd, len) (-1)
|
||||
-#define tls_terminate_session()
|
||||
+#define tls_terminate_session(async)
|
||||
|
||||
#endif /* CONFIG_HAS_GNUTLS */
|
||||
|
||||
diff --git a/criu/page-xfer.c b/criu/page-xfer.c
|
||||
index 9adf2c8b2..7ff07680f 100644
|
||||
--- a/criu/page-xfer.c
|
||||
+++ b/criu/page-xfer.c
|
||||
@@ -1259,6 +1259,8 @@ static int page_server_serve(int sk)
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
+ tls_terminate_session(ret != 0);
|
||||
+
|
||||
if (ret == 0 && opts.ps_socket == -1) {
|
||||
char c;
|
||||
|
||||
@@ -1272,7 +1274,6 @@ static int page_server_serve(int sk)
|
||||
}
|
||||
}
|
||||
|
||||
- tls_terminate_session();
|
||||
page_server_close();
|
||||
|
||||
pr_info("Session over\n");
|
||||
@@ -1504,7 +1505,7 @@ int disconnect_from_page_server(void)
|
||||
|
||||
ret = 0;
|
||||
out:
|
||||
- tls_terminate_session();
|
||||
+ tls_terminate_session(ret != 0);
|
||||
close_safe(&page_server_sk);
|
||||
|
||||
return ret ?: status;
|
||||
diff --git a/criu/tls.c b/criu/tls.c
|
||||
index 9985b037d..4feaf613b 100644
|
||||
--- a/criu/tls.c
|
||||
+++ b/criu/tls.c
|
||||
@@ -31,7 +31,7 @@ static gnutls_certificate_credentials_t x509_cred;
|
||||
static int tls_sk = -1;
|
||||
static int tls_sk_flags = 0;
|
||||
|
||||
-void tls_terminate_session(void)
|
||||
+void tls_terminate_session(bool async)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@@ -44,7 +44,7 @@ void tls_terminate_session(void)
|
||||
* Initiate a connection shutdown but don't
|
||||
* wait for peer to close connection.
|
||||
*/
|
||||
- ret = gnutls_bye(session, GNUTLS_SHUT_WR);
|
||||
+ ret = gnutls_bye(session, async ? GNUTLS_SHUT_WR : GNUTLS_SHUT_RDWR);
|
||||
} while (ret == GNUTLS_E_AGAIN || ret == GNUTLS_E_INTERRUPTED);
|
||||
/* Free the session object */
|
||||
gnutls_deinit(session);
|
||||
@@ -399,6 +399,6 @@ int tls_x509_init(int sockfd, bool is_server)
|
||||
|
||||
return 0;
|
||||
err:
|
||||
- tls_terminate_session();
|
||||
+ tls_terminate_session(true);
|
||||
return -1;
|
||||
}
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,66 @@
|
||||
From cc1120addd38d51f38c28fefae669172ba82120d Mon Sep 17 00:00:00 2001
|
||||
From: Andrei Vagin <avagin@gmail.com>
|
||||
Date: Wed, 22 Dec 2021 09:59:11 -0800
|
||||
Subject: [PATCH 096/120] page-xfer: stop waiting for a new command after a
|
||||
close command
|
||||
|
||||
There is no reason to do that and in case of tls, __recv returns EAGAIN
|
||||
instead of 0.
|
||||
|
||||
Signed-off-by: Andrei Vagin <avagin@gmail.com>
|
||||
---
|
||||
criu/page-xfer.c | 16 +++++++++-------
|
||||
1 file changed, 9 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/criu/page-xfer.c b/criu/page-xfer.c
|
||||
index 7ff07680f..60c793009 100644
|
||||
--- a/criu/page-xfer.c
|
||||
+++ b/criu/page-xfer.c
|
||||
@@ -50,8 +50,8 @@ static void psi2iovec(struct page_server_iov *ps, struct iovec *iov)
|
||||
#define PS_IOV_ADD_F 6
|
||||
#define PS_IOV_GET 7
|
||||
|
||||
-#define PS_IOV_FLUSH 0x1023
|
||||
-#define PS_IOV_FLUSH_N_CLOSE 0x1024
|
||||
+#define PS_IOV_CLOSE 0x1023
|
||||
+#define PS_IOV_FORCE_CLOSE 0x1024
|
||||
|
||||
#define PS_CMD_BITS 16
|
||||
#define PS_CMD_MASK ((1 << PS_CMD_BITS) - 1)
|
||||
@@ -1223,8 +1223,8 @@ static int page_server_serve(int sk)
|
||||
ret = page_server_add(sk, &pi, flags);
|
||||
break;
|
||||
}
|
||||
- case PS_IOV_FLUSH:
|
||||
- case PS_IOV_FLUSH_N_CLOSE: {
|
||||
+ case PS_IOV_CLOSE:
|
||||
+ case PS_IOV_FORCE_CLOSE: {
|
||||
int32_t status = 0;
|
||||
|
||||
ret = 0;
|
||||
@@ -1250,7 +1250,9 @@ static int page_server_serve(int sk)
|
||||
break;
|
||||
}
|
||||
|
||||
- if (ret || (pi.cmd == PS_IOV_FLUSH_N_CLOSE))
|
||||
+ if (ret)
|
||||
+ break;
|
||||
+ if (pi.cmd == PS_IOV_CLOSE || pi.cmd == PS_IOV_FORCE_CLOSE)
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1491,9 +1493,9 @@ int disconnect_from_page_server(void)
|
||||
* the parent process) so we must order the
|
||||
* page-server to terminate itself.
|
||||
*/
|
||||
- pi.cmd = PS_IOV_FLUSH_N_CLOSE;
|
||||
+ pi.cmd = PS_IOV_FORCE_CLOSE;
|
||||
else
|
||||
- pi.cmd = PS_IOV_FLUSH;
|
||||
+ pi.cmd = PS_IOV_CLOSE;
|
||||
|
||||
if (send_psi(page_server_sk, &pi))
|
||||
goto out;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,30 @@
|
||||
From 5e975ab787ed677b03aa86f104b90984189c906b Mon Sep 17 00:00:00 2001
|
||||
From: Andrei Vagin <avagin@gmail.com>
|
||||
Date: Wed, 22 Dec 2021 17:03:04 -0800
|
||||
Subject: [PATCH 097/120] ci: reenable the lazy-thp test in the lazy-remote
|
||||
mode
|
||||
|
||||
Signed-off-by: Andrei Vagin <avagin@gmail.com>
|
||||
---
|
||||
scripts/ci/run-ci-tests.sh | 4 +---
|
||||
1 file changed, 1 insertion(+), 3 deletions(-)
|
||||
|
||||
diff --git a/scripts/ci/run-ci-tests.sh b/scripts/ci/run-ci-tests.sh
|
||||
index bf7331142..7eab9f2dc 100755
|
||||
--- a/scripts/ci/run-ci-tests.sh
|
||||
+++ b/scripts/ci/run-ci-tests.sh
|
||||
@@ -212,10 +212,8 @@ LAZY_OPTS="-p 2 -T $LAZY_TESTS $LAZY_EXCLUDE $ZDTM_OPTS"
|
||||
./test/zdtm.py run $LAZY_OPTS --lazy-pages
|
||||
# shellcheck disable=SC2086
|
||||
./test/zdtm.py run $LAZY_OPTS --remote-lazy-pages
|
||||
-# FIXME: post-copy migration of THP over TLS (sometimes) fails with:
|
||||
-# Error (criu/tls.c:321): tls: Pull callback recv failed: Connection reset by peer
|
||||
# shellcheck disable=SC2086
|
||||
-./test/zdtm.py run $LAZY_OPTS --remote-lazy-pages --tls -x lazy-thp
|
||||
+./test/zdtm.py run $LAZY_OPTS --remote-lazy-pages --tls
|
||||
|
||||
bash -x ./test/jenkins/criu-fault.sh
|
||||
if [ "$UNAME_M" == "x86_64" ]; then
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -0,0 +1,38 @@
|
||||
From a5576e1e6b30411aa936ef05c4344121be58f183 Mon Sep 17 00:00:00 2001
|
||||
From: Andrei Vagin <avagin@gmail.com>
|
||||
Date: Wed, 22 Dec 2021 17:06:21 -0800
|
||||
Subject: [PATCH 098/120] test: log testname.out.inprogress if a test has
|
||||
failed
|
||||
|
||||
This is required if the test failed by timeout.
|
||||
|
||||
Signed-off-by: Andrei Vagin <avagin@gmail.com>
|
||||
---
|
||||
test/zdtm.py | 11 ++++++-----
|
||||
1 file changed, 6 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/test/zdtm.py b/test/zdtm.py
|
||||
index 086ae0285..c0e24a41a 100755
|
||||
--- a/test/zdtm.py
|
||||
+++ b/test/zdtm.py
|
||||
@@ -589,11 +589,12 @@ class zdtm_test:
|
||||
os.unlink(self.__pidfile())
|
||||
|
||||
def print_output(self):
|
||||
- if os.access(self.__name + '.out', os.R_OK):
|
||||
- print("Test output: " + "=" * 32)
|
||||
- with open(self.__name + '.out') as output:
|
||||
- print(output.read())
|
||||
- print(" <<< " + "=" * 32)
|
||||
+ for postfix in ['.out', '.out.inprogress']:
|
||||
+ if os.access(self.__name + postfix, os.R_OK):
|
||||
+ print("Test output: " + "=" * 32)
|
||||
+ with open(self.__name + postfix) as output:
|
||||
+ print(output.read())
|
||||
+ print(" <<< " + "=" * 32)
|
||||
|
||||
def static(self):
|
||||
return self.__name.split('/')[1] == 'static'
|
||||
--
|
||||
2.34.1
|
||||
|
||||
53
0100-zdtm-static-uffd-events-add-more-log-messages.patch
Normal file
53
0100-zdtm-static-uffd-events-add-more-log-messages.patch
Normal file
@ -0,0 +1,53 @@
|
||||
From 4152a88cf588e94c9bf6edb3706cdf81fd25bce2 Mon Sep 17 00:00:00 2001
|
||||
From: Andrei Vagin <avagin@gmail.com>
|
||||
Date: Wed, 22 Dec 2021 17:08:42 -0800
|
||||
Subject: [PATCH 100/120] zdtm/static/uffd-events: add more log messages
|
||||
|
||||
Signed-off-by: Andrei Vagin <avagin@gmail.com>
|
||||
---
|
||||
test/zdtm/static/uffd-events.c | 12 +++++++-----
|
||||
1 file changed, 7 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/test/zdtm/static/uffd-events.c b/test/zdtm/static/uffd-events.c
|
||||
index c811bcf4c..edd6c09ca 100644
|
||||
--- a/test/zdtm/static/uffd-events.c
|
||||
+++ b/test/zdtm/static/uffd-events.c
|
||||
@@ -153,28 +153,30 @@ int main(int argc, char **argv)
|
||||
return 1;
|
||||
}
|
||||
|
||||
+ test_msg("For a child process\n");
|
||||
pid = fork();
|
||||
if (pid < 0) {
|
||||
fail("Can't fork");
|
||||
return 1;
|
||||
}
|
||||
|
||||
- /* check madvise(MADV_DONTNEED) */
|
||||
+ test_msg("Check madvise(MADV_DONTNEED)\n");
|
||||
if (check_madv_dn(1))
|
||||
return 1;
|
||||
|
||||
- /* check growing mremap */
|
||||
+ test_msg("Check growing mremap\n");
|
||||
if (check_mremap_grow(2))
|
||||
return 1;
|
||||
|
||||
- /* check swapped mappings */
|
||||
+ test_msg("Check swapped mappings\n");
|
||||
if (check_swapped_mappings(3))
|
||||
return 1;
|
||||
|
||||
if (pid) {
|
||||
- int status;
|
||||
+ int status = -1;
|
||||
|
||||
- waitpid(-1, &status, 0);
|
||||
+ test_msg("Wait for the child %d\n", pid);
|
||||
+ waitpid(pid, &status, 0);
|
||||
if (status) {
|
||||
fail("child failed");
|
||||
return status;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
120
0101-mount-split-check_mountpoint_fd-from-__open_mountpoi.patch
Normal file
120
0101-mount-split-check_mountpoint_fd-from-__open_mountpoi.patch
Normal file
@ -0,0 +1,120 @@
|
||||
From 1d10fc1e0f2589d34b893c6432fcaab2f99018f7 Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Fri, 17 Dec 2021 14:58:47 +0300
|
||||
Subject: [PATCH 101/120] mount: split check_mountpoint_fd from
|
||||
__open_mountpoint
|
||||
|
||||
Now we can reuse "check" part separately in other places.
|
||||
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
criu/include/mount.h | 1 +
|
||||
criu/mount.c | 60 ++++++++++++++++++++++++--------------------
|
||||
2 files changed, 34 insertions(+), 27 deletions(-)
|
||||
|
||||
diff --git a/criu/include/mount.h b/criu/include/mount.h
|
||||
index 7705279e4..23448d5fc 100644
|
||||
--- a/criu/include/mount.h
|
||||
+++ b/criu/include/mount.h
|
||||
@@ -109,6 +109,7 @@ extern int mntns_get_root_by_mnt_id(int mnt_id);
|
||||
extern struct ns_id *lookup_nsid_by_mnt_id(int mnt_id);
|
||||
|
||||
extern int open_mount(unsigned int s_dev);
|
||||
+extern int check_mountpoint_fd(struct mount_info *pm, int mnt_fd);
|
||||
extern int __open_mountpoint(struct mount_info *pm, int mnt_fd);
|
||||
extern int mnt_is_dir(struct mount_info *pm);
|
||||
extern int open_mountpoint(struct mount_info *pm);
|
||||
diff --git a/criu/mount.c b/criu/mount.c
|
||||
index d75ca5598..f6347fd9d 100644
|
||||
--- a/criu/mount.c
|
||||
+++ b/criu/mount.c
|
||||
@@ -1018,39 +1018,20 @@ int mnt_is_dir(struct mount_info *pm)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-/*
|
||||
- * mnt_fd is a file descriptor on the mountpoint, which is closed in an error case.
|
||||
- * If mnt_fd is -1, the mountpoint will be opened by this function.
|
||||
- */
|
||||
-int __open_mountpoint(struct mount_info *pm, int mnt_fd)
|
||||
+int check_mountpoint_fd(struct mount_info *pm, int mnt_fd)
|
||||
{
|
||||
struct stat st;
|
||||
- int dev;
|
||||
- int ret;
|
||||
-
|
||||
- if (mnt_fd == -1) {
|
||||
- int mntns_root;
|
||||
-
|
||||
- mntns_root = mntns_get_root_fd(pm->nsid);
|
||||
- if (mntns_root < 0)
|
||||
- return -1;
|
||||
-
|
||||
- mnt_fd = openat(mntns_root, pm->ns_mountpoint, O_RDONLY);
|
||||
- if (mnt_fd < 0) {
|
||||
- pr_perror("Can't open %s", pm->ns_mountpoint);
|
||||
- return -1;
|
||||
- }
|
||||
- }
|
||||
+ int ret, dev;
|
||||
|
||||
ret = fstat(mnt_fd, &st);
|
||||
if (ret < 0) {
|
||||
pr_perror("fstat(%s) failed", pm->ns_mountpoint);
|
||||
- goto err;
|
||||
+ return -1;
|
||||
}
|
||||
|
||||
if (pm->s_dev_rt == MOUNT_INVALID_DEV) {
|
||||
pr_err("Resolving over invalid device for %#x %s %s\n", pm->s_dev, pm->fstype->name, pm->ns_mountpoint);
|
||||
- goto err;
|
||||
+ return -1;
|
||||
}
|
||||
|
||||
dev = MKKDEV(major(st.st_dev), minor(st.st_dev));
|
||||
@@ -1063,13 +1044,38 @@ int __open_mountpoint(struct mount_info *pm, int mnt_fd)
|
||||
if (dev != pm->s_dev_rt) {
|
||||
pr_err("The file system %#x %#x (%#x) %s %s is inaccessible\n", pm->s_dev, pm->s_dev_rt, dev,
|
||||
pm->fstype->name, pm->ns_mountpoint);
|
||||
- goto err;
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * mnt_fd is a file descriptor on the mountpoint, which is closed in an error case.
|
||||
+ * If mnt_fd is -1, the mountpoint will be opened by this function.
|
||||
+ */
|
||||
+int __open_mountpoint(struct mount_info *pm, int mnt_fd)
|
||||
+{
|
||||
+ if (mnt_fd == -1) {
|
||||
+ int mntns_root;
|
||||
+
|
||||
+ mntns_root = mntns_get_root_fd(pm->nsid);
|
||||
+ if (mntns_root < 0)
|
||||
+ return -1;
|
||||
+
|
||||
+ mnt_fd = openat(mntns_root, pm->ns_mountpoint, O_RDONLY);
|
||||
+ if (mnt_fd < 0) {
|
||||
+ pr_perror("Can't open %s", pm->ns_mountpoint);
|
||||
+ return -1;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (check_mountpoint_fd(pm, mnt_fd)) {
|
||||
+ close(mnt_fd);
|
||||
+ return -1;
|
||||
}
|
||||
|
||||
return mnt_fd;
|
||||
-err:
|
||||
- close(mnt_fd);
|
||||
- return -1;
|
||||
}
|
||||
|
||||
int open_mount(unsigned int s_dev)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
116
0102-mount-remove-mnt_fd-argument-of-__open_mountpoint.patch
Normal file
116
0102-mount-remove-mnt_fd-argument-of-__open_mountpoint.patch
Normal file
@ -0,0 +1,116 @@
|
||||
From 0aed7a86a766fa175bac9d573695edc493e26717 Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Fri, 17 Dec 2021 15:13:35 +0300
|
||||
Subject: [PATCH 102/120] mount: remove mnt_fd argument of __open_mountpoint
|
||||
|
||||
Only place where we used __open_mountpoint with non -1 mnt_fd is
|
||||
open_mountpoint. Let's use check_mountpoint_fd for this case, so that we
|
||||
now can remove mnt_id argument. Also now __open_mountpoint actually
|
||||
always does open.
|
||||
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
criu/fsnotify.c | 4 ++--
|
||||
criu/include/mount.h | 2 +-
|
||||
criu/mount.c | 26 ++++++++++++--------------
|
||||
3 files changed, 15 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/criu/fsnotify.c b/criu/fsnotify.c
|
||||
index b5dd15dd8..22fb74973 100644
|
||||
--- a/criu/fsnotify.c
|
||||
+++ b/criu/fsnotify.c
|
||||
@@ -132,7 +132,7 @@ static char *alloc_openable(unsigned int s_dev, unsigned long i_ino, FhEntry *f_
|
||||
if (!mnt_is_dir(m))
|
||||
continue;
|
||||
|
||||
- mntfd = __open_mountpoint(m, -1);
|
||||
+ mntfd = __open_mountpoint(m);
|
||||
pr_debug("\t\tTrying via mntid %d root %s ns_mountpoint @%s (%d)\n", m->mnt_id, m->root,
|
||||
m->ns_mountpoint, mntfd);
|
||||
if (mntfd < 0)
|
||||
@@ -206,7 +206,7 @@ static int open_handle(unsigned int s_dev, unsigned long i_ino, FhEntry *f_handl
|
||||
if (m->s_dev != s_dev || !mnt_is_dir(m))
|
||||
continue;
|
||||
|
||||
- mntfd = __open_mountpoint(m, -1);
|
||||
+ mntfd = __open_mountpoint(m);
|
||||
if (mntfd < 0) {
|
||||
pr_warn("Can't open mount for s_dev %x, continue\n", s_dev);
|
||||
continue;
|
||||
diff --git a/criu/include/mount.h b/criu/include/mount.h
|
||||
index 23448d5fc..3f3a67afa 100644
|
||||
--- a/criu/include/mount.h
|
||||
+++ b/criu/include/mount.h
|
||||
@@ -110,7 +110,7 @@ extern struct ns_id *lookup_nsid_by_mnt_id(int mnt_id);
|
||||
|
||||
extern int open_mount(unsigned int s_dev);
|
||||
extern int check_mountpoint_fd(struct mount_info *pm, int mnt_fd);
|
||||
-extern int __open_mountpoint(struct mount_info *pm, int mnt_fd);
|
||||
+extern int __open_mountpoint(struct mount_info *pm);
|
||||
extern int mnt_is_dir(struct mount_info *pm);
|
||||
extern int open_mountpoint(struct mount_info *pm);
|
||||
|
||||
diff --git a/criu/mount.c b/criu/mount.c
|
||||
index f6347fd9d..ab6d3ed10 100644
|
||||
--- a/criu/mount.c
|
||||
+++ b/criu/mount.c
|
||||
@@ -1054,20 +1054,18 @@ int check_mountpoint_fd(struct mount_info *pm, int mnt_fd)
|
||||
* mnt_fd is a file descriptor on the mountpoint, which is closed in an error case.
|
||||
* If mnt_fd is -1, the mountpoint will be opened by this function.
|
||||
*/
|
||||
-int __open_mountpoint(struct mount_info *pm, int mnt_fd)
|
||||
+int __open_mountpoint(struct mount_info *pm)
|
||||
{
|
||||
- if (mnt_fd == -1) {
|
||||
- int mntns_root;
|
||||
+ int mntns_root, mnt_fd;
|
||||
|
||||
- mntns_root = mntns_get_root_fd(pm->nsid);
|
||||
- if (mntns_root < 0)
|
||||
- return -1;
|
||||
+ mntns_root = mntns_get_root_fd(pm->nsid);
|
||||
+ if (mntns_root < 0)
|
||||
+ return -1;
|
||||
|
||||
- mnt_fd = openat(mntns_root, pm->ns_mountpoint, O_RDONLY);
|
||||
- if (mnt_fd < 0) {
|
||||
- pr_perror("Can't open %s", pm->ns_mountpoint);
|
||||
- return -1;
|
||||
- }
|
||||
+ mnt_fd = openat(mntns_root, pm->ns_mountpoint, O_RDONLY);
|
||||
+ if (mnt_fd < 0) {
|
||||
+ pr_perror("Can't open %s", pm->ns_mountpoint);
|
||||
+ return -1;
|
||||
}
|
||||
|
||||
if (check_mountpoint_fd(pm, mnt_fd)) {
|
||||
@@ -1086,7 +1084,7 @@ int open_mount(unsigned int s_dev)
|
||||
if (!m)
|
||||
return -ENOENT;
|
||||
|
||||
- return __open_mountpoint(m, -1);
|
||||
+ return __open_mountpoint(m);
|
||||
}
|
||||
|
||||
/* Bind-mount a mount point in a temporary place without children */
|
||||
@@ -1350,7 +1348,7 @@ int open_mountpoint(struct mount_info *pm)
|
||||
|
||||
/* No overmounts and children - the entire mount is visible */
|
||||
if (list_empty(&pm->children) && !mnt_is_overmounted(pm))
|
||||
- return __open_mountpoint(pm, -1);
|
||||
+ return __open_mountpoint(pm);
|
||||
|
||||
pr_info("Mount is not fully visible %s\n", pm->mountpoint);
|
||||
|
||||
@@ -1413,7 +1411,7 @@ int open_mountpoint(struct mount_info *pm)
|
||||
goto err;
|
||||
}
|
||||
|
||||
- return __open_mountpoint(pm, fd);
|
||||
+ return fd < 0 ? __open_mountpoint(pm) : check_mountpoint_fd(pm, fd);
|
||||
err:
|
||||
if (ns_old >= 0)
|
||||
/* coverity[check_return] */
|
||||
--
|
||||
2.34.1
|
||||
|
||||
101
0103-proc_parse-add-helper-to-resolve-sdev-from-fd.patch
Normal file
101
0103-proc_parse-add-helper-to-resolve-sdev-from-fd.patch
Normal file
@ -0,0 +1,101 @@
|
||||
From 758f3be2d4766f478b74d4026e3c16c93d3b07f9 Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Thu, 16 Dec 2021 16:14:41 +0300
|
||||
Subject: [PATCH 103/120] proc_parse: add helper to resolve sdev from fd
|
||||
|
||||
New get_sdev_from_fd helper first gets mnt_id from fd using fdinfo and
|
||||
then converts mnt_id to sdev using mountinfo.
|
||||
|
||||
By default mnt_id to sdev conversion only works for mounts in mntinfo.
|
||||
|
||||
If parse_mountinfo argument is true, will also parse current process
|
||||
mountinfo when looking for mount sdev, this should be used only with
|
||||
temporary mounts just created by criu in current mntns.
|
||||
|
||||
v3: add argument to parse self mountinfo for auxiliary mounts
|
||||
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
criu/include/mount.h | 1 +
|
||||
criu/proc_parse.c | 53 ++++++++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 54 insertions(+)
|
||||
|
||||
diff --git a/criu/include/mount.h b/criu/include/mount.h
|
||||
index 3f3a67afa..9c0d7c010 100644
|
||||
--- a/criu/include/mount.h
|
||||
+++ b/criu/include/mount.h
|
||||
@@ -140,6 +140,7 @@ extern void clean_cr_time_mounts(void);
|
||||
|
||||
extern bool add_skip_mount(const char *mountpoint);
|
||||
struct ns_id;
|
||||
+extern int get_sdev_from_fd(int fd, unsigned int *sdev, bool parse_mountinfo);
|
||||
extern struct mount_info *parse_mountinfo(pid_t pid, struct ns_id *nsid, bool for_dump);
|
||||
|
||||
extern int check_mnt_id(void);
|
||||
diff --git a/criu/proc_parse.c b/criu/proc_parse.c
|
||||
index 094f9b84e..3017a64e1 100644
|
||||
--- a/criu/proc_parse.c
|
||||
+++ b/criu/proc_parse.c
|
||||
@@ -1527,6 +1527,59 @@ out:
|
||||
return exit_code;
|
||||
}
|
||||
|
||||
+static int get_mountinfo_sdev_from_mntid(int mnt_id, unsigned int *sdev)
|
||||
+{
|
||||
+ int exit_code = -1;
|
||||
+ FILE *f;
|
||||
+
|
||||
+ f = fopen_proc(PROC_SELF, "mountinfo");
|
||||
+ if (!f)
|
||||
+ return -1;
|
||||
+
|
||||
+ while (fgets(buf, BUF_SIZE, f)) {
|
||||
+ unsigned int kmaj, kmin;
|
||||
+ int id;
|
||||
+
|
||||
+ if (sscanf(buf, "%i %*i %u:%u", &id, &kmaj, &kmin) != 3) {
|
||||
+ pr_err("Failed to parse mountinfo line %s\n", buf);
|
||||
+ goto err;
|
||||
+ }
|
||||
+
|
||||
+ if (id == mnt_id) {
|
||||
+ *sdev = MKKDEV(kmaj, kmin);
|
||||
+ exit_code = 0;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+err:
|
||||
+ fclose(f);
|
||||
+ return exit_code;
|
||||
+}
|
||||
+
|
||||
+/* This works even on btrfs where stat does not show right sdev */
|
||||
+int get_sdev_from_fd(int fd, unsigned int *sdev, bool parse_mountinfo)
|
||||
+{
|
||||
+ struct mount_info *mi;
|
||||
+ int ret, mnt_id;
|
||||
+
|
||||
+ ret = get_fd_mntid(fd, &mnt_id);
|
||||
+ if (ret < 0)
|
||||
+ return -1;
|
||||
+
|
||||
+ /* Simple case mnt_id is in dumped mntns */
|
||||
+ mi = lookup_mnt_id(mnt_id);
|
||||
+ if (mi) {
|
||||
+ *sdev = mi->s_dev_rt;
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ if (!parse_mountinfo)
|
||||
+ return -1;
|
||||
+
|
||||
+ /* Complex case mnt_id is in mntns created by criu */
|
||||
+ return get_mountinfo_sdev_from_mntid(mnt_id, sdev);
|
||||
+}
|
||||
+
|
||||
struct mount_info *parse_mountinfo(pid_t pid, struct ns_id *nsid, bool for_dump)
|
||||
{
|
||||
struct mount_info *list = NULL;
|
||||
--
|
||||
2.34.1
|
||||
|
||||
140
0104-mount-btrfs-make-check_mountpoint_fd-fallback-to-get.patch
Normal file
140
0104-mount-btrfs-make-check_mountpoint_fd-fallback-to-get.patch
Normal file
@ -0,0 +1,140 @@
|
||||
From ca615ea1fbc2a20b4d92ced9a904325a49ab4518 Mon Sep 17 00:00:00 2001
|
||||
From: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
Date: Thu, 16 Dec 2021 12:57:23 +0300
|
||||
Subject: [PATCH 104/120] mount/btrfs: make check_mountpoint_fd fallback to
|
||||
get_sdev_from_fd
|
||||
|
||||
We face that btrfs returns anonymous device in stat instead of real
|
||||
superblock dev for volumes, thus all btrfs volume mounts does not pass
|
||||
check_mountpoint_fd due to dev missmatch between stat and mountinfo. We
|
||||
can use special helper get_sdev_from_fd instead of stat to try to get
|
||||
real dev of fd for btrfs.
|
||||
|
||||
We move check_mountpoint_fd from open_mountpoint into get_clean_fd and
|
||||
ns_open_mountpoint to the point where temporary mount we open fd to is
|
||||
still in mountinfo, thus get_sdev_from_fd would be able to find tmp
|
||||
mount in mountinfo.
|
||||
|
||||
Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
|
||||
---
|
||||
criu/include/mount.h | 1 +
|
||||
criu/mount.c | 49 ++++++++++++++++++++++++++++++++++++++++----
|
||||
2 files changed, 46 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/criu/include/mount.h b/criu/include/mount.h
|
||||
index 9c0d7c010..b959d131c 100644
|
||||
--- a/criu/include/mount.h
|
||||
+++ b/criu/include/mount.h
|
||||
@@ -109,6 +109,7 @@ extern int mntns_get_root_by_mnt_id(int mnt_id);
|
||||
extern struct ns_id *lookup_nsid_by_mnt_id(int mnt_id);
|
||||
|
||||
extern int open_mount(unsigned int s_dev);
|
||||
+extern int __check_mountpoint_fd(struct mount_info *pm, int mnt_fd, bool parse_mountinfo);
|
||||
extern int check_mountpoint_fd(struct mount_info *pm, int mnt_fd);
|
||||
extern int __open_mountpoint(struct mount_info *pm);
|
||||
extern int mnt_is_dir(struct mount_info *pm);
|
||||
diff --git a/criu/mount.c b/criu/mount.c
|
||||
index ab6d3ed10..4b57ac703 100644
|
||||
--- a/criu/mount.c
|
||||
+++ b/criu/mount.c
|
||||
@@ -1018,10 +1018,11 @@ int mnt_is_dir(struct mount_info *pm)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-int check_mountpoint_fd(struct mount_info *pm, int mnt_fd)
|
||||
+int __check_mountpoint_fd(struct mount_info *pm, int mnt_fd, bool parse_mountinfo)
|
||||
{
|
||||
struct stat st;
|
||||
- int ret, dev;
|
||||
+ unsigned int dev;
|
||||
+ int ret;
|
||||
|
||||
ret = fstat(mnt_fd, &st);
|
||||
if (ret < 0) {
|
||||
@@ -1042,6 +1043,14 @@ int check_mountpoint_fd(struct mount_info *pm, int mnt_fd)
|
||||
* allocates new device ID).
|
||||
*/
|
||||
if (dev != pm->s_dev_rt) {
|
||||
+ /*
|
||||
+ * For btrfs device numbers in stat and mountinfo can be
|
||||
+ * different, fallback to get_sdev_from_fd to get right dev.
|
||||
+ */
|
||||
+ if (!strcmp(pm->fstype->name, "btrfs") && !get_sdev_from_fd(mnt_fd, &dev, parse_mountinfo) &&
|
||||
+ dev == pm->s_dev_rt)
|
||||
+ return 0;
|
||||
+
|
||||
pr_err("The file system %#x %#x (%#x) %s %s is inaccessible\n", pm->s_dev, pm->s_dev_rt, dev,
|
||||
pm->fstype->name, pm->ns_mountpoint);
|
||||
return -1;
|
||||
@@ -1050,6 +1059,11 @@ int check_mountpoint_fd(struct mount_info *pm, int mnt_fd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+int check_mountpoint_fd(struct mount_info *pm, int mnt_fd)
|
||||
+{
|
||||
+ return __check_mountpoint_fd(pm, mnt_fd, false);
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* mnt_fd is a file descriptor on the mountpoint, which is closed in an error case.
|
||||
* If mnt_fd is -1, the mountpoint will be opened by this function.
|
||||
@@ -1114,12 +1128,34 @@ static int get_clean_fd(struct mount_info *mi)
|
||||
char *mnt_path = NULL;
|
||||
char mnt_path_tmp[] = "/tmp/cr-tmpfs.XXXXXX";
|
||||
char mnt_path_root[] = "/cr-tmpfs.XXXXXX";
|
||||
+ int fd;
|
||||
|
||||
mnt_path = get_clean_mnt(mi, mnt_path_tmp, mnt_path_root);
|
||||
if (!mnt_path)
|
||||
return -1;
|
||||
|
||||
- return open_detach_mount(mnt_path);
|
||||
+ fd = open(mnt_path, O_RDONLY | O_DIRECTORY, 0);
|
||||
+ if (fd < 0) {
|
||||
+ pr_perror("Can't open directory %s", mnt_path);
|
||||
+ } else {
|
||||
+ if (__check_mountpoint_fd(mi, fd, true))
|
||||
+ goto err_close;
|
||||
+ }
|
||||
+
|
||||
+ if (umount2(mnt_path, MNT_DETACH)) {
|
||||
+ pr_perror("Can't detach mount %s", mnt_path);
|
||||
+ goto err_close;
|
||||
+ }
|
||||
+
|
||||
+ if (rmdir(mnt_path)) {
|
||||
+ pr_perror("Can't remove tmp dir %s", mnt_path);
|
||||
+ goto err_close;
|
||||
+ }
|
||||
+
|
||||
+ return fd;
|
||||
+err_close:
|
||||
+ close_safe(&fd);
|
||||
+ return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1337,6 +1373,11 @@ int ns_open_mountpoint(void *arg)
|
||||
goto err;
|
||||
}
|
||||
|
||||
+ if (__check_mountpoint_fd(mi, *fd, true)) {
|
||||
+ close(*fd);
|
||||
+ goto err;
|
||||
+ }
|
||||
+
|
||||
return 0;
|
||||
err:
|
||||
return 1;
|
||||
@@ -1411,7 +1452,7 @@ int open_mountpoint(struct mount_info *pm)
|
||||
goto err;
|
||||
}
|
||||
|
||||
- return fd < 0 ? __open_mountpoint(pm) : check_mountpoint_fd(pm, fd);
|
||||
+ return fd < 0 ? __open_mountpoint(pm) : fd;
|
||||
err:
|
||||
if (ns_old >= 0)
|
||||
/* coverity[check_return] */
|
||||
--
|
||||
2.34.1
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user