[CRIU] [PATCH] zdtm: Make thread-bomb be bomb

Pavel Emelyanov xemul at parallels.com
Wed Nov 11 08:23:45 PST 2015


In current implementation of thread bomb effectively only one
thread runs, the rest sit in the read from pipe.

Fix this by making threads constantly creating new ones and 
just exiting.

Signed-off-by: Pavel Emelyanov <xemul at parallels.com>

---

diff --git a/test/zdtm.py b/test/zdtm.py
index 87051ac..a3af1ef 100755
--- a/test/zdtm.py
+++ b/test/zdtm.py
@@ -258,7 +258,7 @@ class zdtm_test:
 
 		print "Start test"
 
-		env['ZDTM_THREAD_BOMB'] = "100"
+		env['ZDTM_THREAD_BOMB'] = "5"
 		if not test_flag(self.__desc, 'suid'):
 			env['ZDTM_UID'] = "18943"
 			env['ZDTM_GID'] = "58467"
diff --git a/test/zdtm/live/transition/thread-bomb.c b/test/zdtm/live/transition/thread-bomb.c
index a21320f..0b794ef 100644
--- a/test/zdtm/live/transition/thread-bomb.c
+++ b/test/zdtm/live/transition/thread-bomb.c
@@ -8,61 +8,46 @@
 
 #include "zdtmtst.h"
 
-static int p[2];
-static char *buf;
-static int buf_size = 1024;
-
 #define exit_group(code)	\
 	syscall(__NR_exit_group, code)
 
 static void *thread_fn(void *arg)
 {
-	pthread_t t;
-	char c = 0;
-	int ret;
+	pthread_t t, p, *self;
 
-	while (test_go()) {
-		ret = read(p[0], &c, 1);
-		if (ret == -1 && errno == EAGAIN)
-			return NULL;
-		if (ret != 1)
-			goto err;
-		if (pthread_create(&t, NULL, thread_fn, NULL))
-			goto err;
-		pthread_join(t, NULL);
-		if (write(p[1], &c, 1) != 1)
-			goto err;
+	if (arg) {
+		p = *(pthread_t *)arg;
+		pthread_join(p, NULL);
+		free(arg);
 	}
 
-	return NULL;
-err:
-	exit_group(1);
+	self = malloc(sizeof(*self));
+	*self = pthread_self();
+
+	pthread_create(&t, NULL, thread_fn, self);
 	return NULL;
 }
 
 int main(int argc, char **argv)
 {
 	char *val;
+	int max_nr = 1024, i;
 
 	val = getenv("ZDTM_THREAD_BOMB");
 	if (val)
-		buf_size = atoi(val);
-	test_msg("%d\n", buf_size);
-	buf = malloc(buf_size);
-	if (!buf)
-		return 1;
-
-	if (pipe(p))
-		return 1;
-	fcntl(p[0], F_SETFL, O_NONBLOCK);
+		max_nr = atoi(val);
 
-	if (write(p[1], buf, buf_size) != buf_size)
-		return 1;
+	test_msg("%d\n", max_nr);
 
 	test_init(argc, argv);
-	test_daemon();
 
-	thread_fn(NULL);
+	for (i = 0; i < max_nr; i++) {
+		pthread_t p;
+		pthread_create(&p, NULL, thread_fn, NULL);
+	}
+
+	test_daemon();
+	test_waitsig();
 
 	pass();
 


More information about the CRIU mailing list