svn commit: r297385 - user/pho/stress2/misc

Peter Holm pho at FreeBSD.org
Tue Mar 29 12:17:59 UTC 2016


Author: pho
Date: Tue Mar 29 12:17:58 2016
New Revision: 297385
URL: https://svnweb.freebsd.org/changeset/base/297385

Log:
  Rework test scenario.
  
  Sponsored by:	EMC / Isilon Storage Division

Modified:
  user/pho/stress2/misc/forkbomb.sh

Modified: user/pho/stress2/misc/forkbomb.sh
==============================================================================
--- user/pho/stress2/misc/forkbomb.sh	Tue Mar 29 11:56:00 2016	(r297384)
+++ user/pho/stress2/misc/forkbomb.sh	Tue Mar 29 12:17:58 2016	(r297385)
@@ -53,20 +53,14 @@ bsdlabel -w md$mdstart auto
 newfs $newfs_flags md${mdstart}$part > /dev/null
 mount /dev/md${mdstart}$part $mntpoint
 
-sysctl kern.maxproc
-vmstat -z | sed -n "1p;/PROC/p;/THREAD/p"
-echo
-
-/tmp/forkbomb
-
-vmstat -z | sed -n "/PROC/p;/THREAD/p"
+su $testuser -c /tmp/forkbomb
 
 while mount | grep "on $mntpoint " | grep -q /dev/md; do
 	umount $mntpoint || sleep 1
 done
 mdconfig -d -u $mdstart
 rm -rf /tmp/forkbomb
-exit
+exit 0
 
 EOF
 #include <sys/param.h>
@@ -84,10 +78,14 @@ EOF
 
 volatile u_int *share;
 
-#define R1 0
-#define R2 1
+#define R1 1 /* sync start  */
+#define R2 2 /* forks       */
+#define R3 3 /* exits       */
+#define R4 4 /* fork failed */
 
+//#define DEBUG
 #define MXFAIL 100
+#define MAXPROC 40000	/* Arbitrary cap */
 #define PARALLEL 200
 
 void
@@ -98,37 +96,53 @@ test(void)
 	atomic_add_int(&share[R1], 1);
 	while (share[R1] != PARALLEL)
 		;
+	atomic_add_int(&share[R2], 1);
 
 	for (;;) {
-		r = fork();
-		if (r == -1)
-			atomic_add_int(&share[R2], 1);
-		if (share[R2] > MXFAIL)
+		if (share[R2] >= MAXPROC || share[R4] > MXFAIL)
+			break;
+		atomic_add_int(&share[R2], 1);
+		if ((r = fork()) == -1) {
+			atomic_add_int(&share[R4], 1);
+			atomic_add_int(&share[R2], -1);
 			break;
+		}
 	}
 
+	atomic_add_int(&share[R3], 1);
 	_exit(0);
 }
 
 int
 main(void)
 {
+	struct sigaction sa;
 	size_t len;
 	int i;
 
-	len = getpagesize();
-	if ((share = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED,
-	    -1, 0)) == MAP_FAILED)
+	len = PAGE_SIZE;
+	if ((share = mmap(NULL, len, PROT_READ | PROT_WRITE,
+	    MAP_ANON | MAP_SHARED, -1, 0)) == MAP_FAILED)
 		err(1, "mmap");
 
-	signal(SIGCHLD, SIG_IGN);
+	sa.sa_handler = SIG_IGN;
+	sigemptyset(&sa.sa_mask);
+	sa.sa_flags = 0;
+	if (sigaction(SIGCHLD, &sa, 0) == -1)
+		err(1, "sigaction");
+
 	for (i = 0; i < PARALLEL; i++) {
 		if (fork() == 0)
 			test();
 	}
 
-	while (share[R2] < MXFAIL)
+	while (share[R2] == 0 || share[R3] < share[R2])
 		sleep(1);
 
+#if defined(DEBUG)
+	fprintf(stderr, "MAXPROC: %d. forks: %u / exits: %u / fails: %u\n",
+	    MAXPROC, share[R2], share[R3], share[R4]);
+#endif
+
 	return (0);
 }


More information about the svn-src-user mailing list