1 Star 0 Fork 35

hd_zhoujie/criu

forked from src-openEuler/criu 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
0062-zdtm-add-host-ns-sysvshm-ipc-case.patch 6.22 KB
一键复制 编辑 原始数据 按行查看 历史
river 提交于 2022-04-13 15:05 . criu: backport kinds of features/bugfix
From 3d945368250958f5ebf3b4053e07c816adafba33 Mon Sep 17 00:00:00 2001
From: "fu.lin" <fulin10@huawei.com>
Date: Fri, 21 Jan 2022 17:20:05 +0800
Subject: [PATCH 62/72] zdtm: add host ns sysvshm ipc case
---
test/zdtm/Makefile | 2 +-
test/zdtm/customization/Makefile | 53 ++++++++
test/zdtm/customization/ipc.c | 202 +++++++++++++++++++++++++++++++
test/zdtm/customization/ipc.desc | 1 +
4 files changed, 257 insertions(+), 1 deletion(-)
create mode 100644 test/zdtm/customization/Makefile
create mode 100644 test/zdtm/customization/ipc.c
create mode 100644 test/zdtm/customization/ipc.desc
diff --git a/test/zdtm/Makefile b/test/zdtm/Makefile
index 24a33f2..8f9857b 100644
--- a/test/zdtm/Makefile
+++ b/test/zdtm/Makefile
@@ -1,4 +1,4 @@
-SUBDIRS := lib static transition
+SUBDIRS := lib static transition customization
all: $(SUBDIRS)
.PHONY: all $(SUBDIRS)
diff --git a/test/zdtm/customization/Makefile b/test/zdtm/customization/Makefile
new file mode 100644
index 0000000..563b7b1
--- /dev/null
+++ b/test/zdtm/customization/Makefile
@@ -0,0 +1,53 @@
+LIBDIR := ../lib
+LIB := $(LIBDIR)/libzdtmtst.a
+LDLIBS += $(LIB)
+CPPFLAGS += -I$(LIBDIR)
+
+TST = \
+ ipc
+
+SRC = $(TST:%=%.c)
+OBJ = $(SRC:%.c=%.o)
+DEP = $(SRC:%.c=%.d)
+PID = $(TST:%=%.pid)
+OUT = $(TST:%=%.out)
+
+include ../Makefile.inc
+
+all: $(TST)
+install: all
+.PHONY: all install
+
+$(TST:%=%.pid): %.pid: %
+ $(<D)/$(<F) --pidfile=$@ --outfile=$<.out
+
+%.out: %.pid %
+ -kill -TERM `cat $<`
+
+start: $(PID)
+
+%.is_running: %.pid
+ kill -0 `cat $<`
+
+check_start: $(PID:%.pid=%.is_running)
+
+stop:
+ -kill -TERM `awk '{print}' *.pid`
+
+WAIT_TIME=10
+wait_stop:
+ -for i in `seq 1 $(WAIT_TIME)`; do \
+ kill -0 `awk '{print}' *.pid 2>/dev/null` 2>/dev/null || break; \
+ sleep 1; \
+ done
+
+$(TST): | $(LIB)
+
+%: %.sh
+ cp $< $@
+ chmod +x $@
+
+$(LIB): force
+ $(Q) $(MAKE) -C $(LIBDIR)
+
+.PHONY: force start check_start stop wait_stop
diff --git a/test/zdtm/customization/ipc.c b/test/zdtm/customization/ipc.c
new file mode 100644
index 0000000..2b3c2b1
--- /dev/null
+++ b/test/zdtm/customization/ipc.c
@@ -0,0 +1,202 @@
+#include <sched.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/sem.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <signal.h>
+#include <errno.h>
+
+#include "zdtmtst.h"
+
+const char *test_doc="Tests ipc sems and shmems migrate fine";
+const char *test_author="Pavel Emelianov <xemul@parallels.com>";
+
+static struct sembuf unlock = {
+ .sem_op = 1,
+ .sem_num = 0,
+ .sem_flg = 0,
+};
+
+static struct sembuf lock = {
+ .sem_op = -1,
+ .sem_num = 0,
+ .sem_flg = 0,
+};
+
+#define DEF_MEM_SIZE (40960)
+unsigned int shmem_size = DEF_MEM_SIZE;
+TEST_OPTION(shmem_size, uint, "Size of shared memory segment", 0);
+
+#define INIT_CRC (~0)
+
+#define POISON 0xac
+static inline void poison_area(int *mem)
+{
+ memset(mem, POISON, shmem_size);
+}
+
+static int child(key_t key)
+{
+ int sem, shm, ret, res = 0;
+ uint8_t *mem;
+ uint32_t crc;
+
+ sem = semget(key, 1, 0777);
+ if (sem == -1)
+ return -1;
+ shm = shmget(key, shmem_size, 0777);
+ if (shm == -1)
+ return -2;
+ mem = shmat(shm, NULL, 0);
+ if (mem == (uint8_t *)-1)
+ return -3;
+
+ while (test_go()) {
+ ret = semop(sem, &lock, 1);
+ if (ret) {
+ if (errno == EINTR)
+ continue;
+ fail("Error in semop lock");
+ res = errno;
+ break;
+ }
+ crc = INIT_CRC;
+ datagen(mem, shmem_size, &crc);
+ while ((ret = semop(sem, &unlock, 1)) && (errno == EINTR));
+ if (ret) {
+ fail("Error in semop unlock");
+ res = errno;
+ break;
+ }
+ }
+ shmdt(mem);
+ return res;
+}
+
+int main(int argc, char **argv)
+{
+ key_t key;
+ int sem, shm, pid1, pid2;
+ int fail_count = 0;
+ uint8_t *mem;
+ uint32_t crc;
+ int ret;
+
+ test_init(argc, argv);
+
+ /* using the large number to fill string length */
+ key = ftok(argv[0], 1822155650);
+ if (key == -1) {
+ pr_perror("Can't make key");
+ goto out;
+ }
+
+ sem = semget(key, 1, 0777 | IPC_CREAT | IPC_EXCL);
+ if (sem == -1) {
+ pr_perror("Can't get sem");
+ goto out;
+ }
+
+ if (semctl(sem, 0, SETVAL, 1) == -1) {
+ pr_perror("Can't init sem");
+ fail_count++;
+ goto out_sem;
+ }
+
+ shm = shmget(key, shmem_size, 0777 | IPC_CREAT | IPC_EXCL);
+ if (shm == -1) {
+ pr_perror("Can't get shm");
+ fail_count++;
+ goto out_sem;
+ }
+
+ mem = shmat(shm, NULL, 0);
+ if (mem == (void *)-1) {
+ pr_perror("Can't attach shm");
+ fail_count++;
+ goto out_shm;
+ }
+
+ poison_area((int *)mem);
+
+ pid1 = test_fork();
+ if (pid1 == -1) {
+ pr_perror("Can't fork 1st time");
+ goto out_shdt;
+ } else if (pid1 == 0)
+ exit(child(key));
+
+ pid2 = test_fork();
+ if (pid2 == -1) {
+ pr_perror("Can't fork 2nd time");
+ fail_count++;
+ goto out_child;
+ } else if (pid2 == 0)
+ exit(child(key));
+
+ test_daemon();
+ while (test_go()) {
+ ret = semop(sem, &lock, 1);
+ if (ret) {
+ if (errno == EINTR)
+ continue;
+ fail_count++;
+ fail("Error in semop lock");
+ break;
+ }
+ if (mem[0] != POISON) {
+ crc = INIT_CRC;
+ if (datachk(mem, shmem_size, &crc)) {
+ fail_count++;
+ fail("Semaphore protection is broken or "
+ "shmem pages are messed");
+ semop(sem, &unlock, 1);
+ break;
+ }
+ poison_area((int *)mem);
+ }
+ while ((ret = semop(sem, &unlock, 1)) && (errno == EINTR));
+ if (ret) {
+ fail_count++;
+ fail("Error in semop unlock");
+ break;
+ }
+ }
+ test_waitsig();
+
+ kill(pid2, SIGTERM);
+ waitpid(pid2, &ret, 0);
+ if (!WIFEXITED(ret)) {
+ fail_count++;
+ pr_perror("Child 2 was killed");
+ } else if (WEXITSTATUS(ret)) {
+ fail_count++;
+ pr_perror("Child 2 couldn't inititalise");
+ }
+out_child:
+ kill(pid1, SIGTERM);
+ waitpid(pid1, &ret, 0);
+ if (!WIFEXITED(ret)) {
+ fail_count++;
+ pr_perror("Child 1 was killed");
+ } else if (WEXITSTATUS(ret)) {
+ fail_count++;
+ pr_perror("Child 1 couldn't inititalise");
+ }
+out_shdt:
+ shmdt(mem);
+out_shm:
+ shmctl(shm, IPC_RMID, NULL);
+out_sem:
+ semctl(sem, 1, IPC_RMID);
+ if (fail_count == 0)
+ pass();
+out:
+ return 0;
+}
diff --git a/test/zdtm/customization/ipc.desc b/test/zdtm/customization/ipc.desc
new file mode 100644
index 0000000..63df42a
--- /dev/null
+++ b/test/zdtm/customization/ipc.desc
@@ -0,0 +1 @@
+{'flavor': 'h'}
--
2.34.1
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/hd-zhoujie/criu.git
git@gitee.com:hd-zhoujie/criu.git
hd-zhoujie
criu
criu
master

搜索帮助