Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 3 Feb 2010 16:02:59 +0000 (UTC)
From:      Robert Watson <rwatson@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r203431 - projects/capabilities8/tools/tools/syscall_timing
Message-ID:  <201002031602.o13G2xQ4040744@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rwatson
Date: Wed Feb  3 16:02:58 2010
New Revision: 203431
URL: http://svn.freebsd.org/changeset/base/203431

Log:
  Merge c174234, c174235, c174236, c174238, c174242 from the p4 TrustedBSD
  Capabilities branch to capabilities8:
  
    Consistently don't stick "test_" in front of printed test names,
    since they are all tests.  On the other hand, we do use test_ in
    front of internal function names.
  
    Improve debugging output.
  
    Use _exit(0) not exit(0) after fork, or I/O may be flushed more than
    once.
  
    Add a 'pingpong' test, which is socketpair + fork + send + recv +
    send + recv + exit + waitpid.  A bit like sandbox but no exec or
    sandboxy magic.
  
    Force at least one benchmark to be run.
    Submitted by:   antoine
  
  Sponsored by:	Google, Inc.

Modified:
  projects/capabilities8/tools/tools/syscall_timing/syscall_timing.c

Modified: projects/capabilities8/tools/tools/syscall_timing/syscall_timing.c
==============================================================================
--- projects/capabilities8/tools/tools/syscall_timing/syscall_timing.c	Wed Feb  3 14:35:33 2010	(r203430)
+++ projects/capabilities8/tools/tools/syscall_timing/syscall_timing.c	Wed Feb  3 16:02:58 2010	(r203431)
@@ -371,7 +371,7 @@ test_fork(int num)
 	if (pid < 0)
 		err(-1, "test_fork: fork");
 	if (pid == 0)
-		exit(0);
+		_exit(0);
 	if (waitpid(pid, NULL, 0) < 0)
 		err(-1, "test_fork: waitpid");
 	benchmark_start();
@@ -380,7 +380,7 @@ test_fork(int num)
 		if (pid < 0)
 			err(-1, "test_fork: fork");
 		if (pid == 0)
-			exit(0);
+			_exit(0);
 		if (waitpid(pid, NULL, 0) < 0)
 			err(-1, "test_fork: waitpid");
 	}
@@ -397,7 +397,7 @@ test_vfork(int num)
 	if (pid < 0)
 		err(-1, "test_vfork: vfork");
 	if (pid == 0)
-		exit(0);
+		_exit(0);
 	if (waitpid(pid, NULL, 0) < 0)
 		err(-1, "test_vfork: waitpid");
 	benchmark_start();
@@ -406,7 +406,7 @@ test_vfork(int num)
 		if (pid < 0)
 			err(-1, "test_vfork: vfork");
 		if (pid == 0)
-			exit(0);
+			_exit(0);
 		if (waitpid(pid, NULL, 0) < 0)
 			err(-1, "test_vfork: waitpid");
 	}
@@ -424,15 +424,15 @@ test_pdfork(int num)
 	if (pid < 0)
 		err(-1, "test_pdfork: pdfork");
 	if (pid == 0)
-		exit(0);
+		_exit(0);
 	pollfd.fd = fd;
 	pollfd.events = POLLHUP;
 	pollfd.revents = 0;
 	n = poll(&pollfd, 1, INFTIM);
 	if (n < 0)
-		err(-1, "poll");
+		err(-1, "test_pdfork: poll");
 	if (n != 1)
-		errx(-1, "poll returned %d", n);
+		errx(-1, "test_pdfork: poll returned %d", n);
 	close(fd);
 
 	benchmark_start();
@@ -441,15 +441,15 @@ test_pdfork(int num)
 		if (pid < 0)
 			err(-1, "test_pdfork: pdfork");
 		if (pid == 0)
-			exit(0);
+			_exit(0);
 		pollfd.fd = fd;
 		pollfd.events = POLLHUP;
 		pollfd.revents = 0;
 		n = poll(&pollfd, 1, INFTIM);
 		if (n < 0)
-			err(-1, "poll");
+			err(-1, "test_pdfork: poll");
 		if (n != 1)
-			errx(-1, "poll returned %d", n);
+			errx(-1, "test_pdfork: poll returned %d", n);
 		close(fd);
 	}
 	benchmark_stop();
@@ -467,7 +467,7 @@ test_fork_exec(int num)
 
 	pid = fork();
 	if (pid < 0)
-		err(-1, "test_fork: fork");
+		err(-1, "test_fork_exec: fork");
 	if (pid == 0) {
 		(void)execve(USR_BIN_TRUE, execve_args, environ);
 		err(-1, "execve");
@@ -478,13 +478,13 @@ test_fork_exec(int num)
 	for (i = 0; i < num; i++) {
 		pid = fork();
 		if (pid < 0)
-			err(-1, "test_fork: fork");
+			err(-1, "test_fork_exec: fork");
 		if (pid == 0) {
 			(void)execve(USR_BIN_TRUE, execve_args, environ);
-			err(-1, "execve");
+			err(-1, "test_fork_exec: execve");
 		}
 		if (waitpid(pid, NULL, 0) < 0)
-			err(-1, "test_fork: waitpid");
+			err(-1, "test_fork_exec: waitpid");
 	}
 	benchmark_stop();
 }
@@ -497,24 +497,24 @@ test_vfork_exec(int num)
 
 	pid = vfork();
 	if (pid < 0)
-		err(-1, "test_vfork: vfork");
+		err(-1, "test_vfork_exec: vfork");
 	if (pid == 0) {
 		(void)execve(USR_BIN_TRUE, execve_args, environ);
-		err(-1, "execve");
+		err(-1, "test_vfork_exec: execve");
 	}
 	if (waitpid(pid, NULL, 0) < 0)
-		err(-1, "test_vfork: waitpid");
+		err(-1, "test_vfork_exec: waitpid");
 	benchmark_start();
 	for (i = 0; i < num; i++) {
 		pid = vfork();
 		if (pid < 0)
-			err(-1, "test_vfork: vfork");
+			err(-1, "test_vfork_exec: vfork");
 		if (pid == 0) {
 			(void)execve(USR_BIN_TRUE, execve_args, environ);
 			err(-1, "execve");
 		}
 		if (waitpid(pid, NULL, 0) < 0)
-			err(-1, "test_vfork: waitpid");
+			err(-1, "test_vfork_exec: waitpid");
 	}
 	benchmark_stop();
 }
@@ -528,43 +528,131 @@ test_pdfork_exec(int num)
 
 	pid = pdfork(&fd);
 	if (pid < 0)
-		err(-1, "test_pdfork: pdfork");
+		err(-1, "test_pdfork_exec: pdfork");
 	if (pid == 0) {
 		(void)execve(USR_BIN_TRUE, execve_args, environ);
-		err(-1, "execve");
+		err(-1, "test_pdfork_exec: execve");
 	}
 	pollfd.fd = fd;
 	pollfd.events = POLLHUP;
 	pollfd.revents = 0;
 	n = poll(&pollfd, 1, INFTIM);
 	if (n < 0)
-		err(-1, "poll");
+		err(-1, "test_pdfork_exec: poll");
 	if (n != 1)
-		errx(-1, "poll returned %d", n);
+		errx(-1, "test_pdfork_exec: poll returned %d", n);
 	close(fd);
 
 	benchmark_start();
 	for (i = 0; i < num; i++) {
 		pid = pdfork(&fd);
 		if (pid < 0)
-			err(-1, "test_pdfork: pdfork");
+			err(-1, "test_pdfork_exec: pdfork");
 		if (pid == 0) {
 			(void)execve(USR_BIN_TRUE, execve_args, environ);
-			err(-1, "execve");
+			err(-1, "test_pdfork_exec: execve");
 		}
 		pollfd.fd = fd;
 		pollfd.events = POLLHUP;
 		pollfd.revents = 0;
 		n = poll(&pollfd, 1, INFTIM);
 		if (n < 0)
-			err(-1, "poll");
+			err(-1, "test_pdfork_exec: poll");
 		if (n != 1)
-			errx(-1, "poll returned %d", n);
+			errx(-1, "test_pdfork_exec: poll returned %d", n);
 		close(fd);
 	}
 	benchmark_stop();
 }
 
+/*
+ * A bit like sandbox, in that a process is forked, IPC ping-pong is done,
+ * but with none of the sandboxing goo.
+ */
+void
+test_pingpong(int num)
+{
+	char ch;
+	int so[2];
+	pid_t pid;
+	ssize_t len;
+	int i;
+
+	if (socketpair(PF_LOCAL, SOCK_STREAM, 0, so) < 0)
+		err(-1, "test_pingpong: socketpair");
+	pid = fork();
+	if (pid < 0)
+		err(-1, "test_pingpong: fork");
+	if (pid == 0) {
+		close(so[0]);
+		len = recv(so[1], &ch, sizeof(ch), 0);
+		if (len < 0)
+			err(-1, "test_pingpong: child: recv");
+		if (len != 1)
+			errx(-1, "test_pingpong: child: recv %d", (int)len);
+		len = send(so[1], &ch, sizeof(ch), 0);
+		if (len < 0)
+			err(-1, "test_pingpong: child: send");
+		if (len != 1)
+			errx(-1, "test_pingpong: child: send %d", (int)len);
+		_exit(0);
+	}
+	close(so[1]);
+	len = send(so[0], &ch, sizeof(ch), 0);
+	if (len < 0)
+		err(-1, "test_pingpong: parent: send");
+	if (len != 1)
+		errx(-1, "test_pingpong: parent: send %d", (int)len);
+	len = recv(so[0], &ch, sizeof(ch), 0);
+	if (len < 0)
+		err(-1, "test_pingpong: parent: recv");
+	if (len != 1)
+		errx(-1, "test_pingpong: parent: recv %d", (int)len);
+	close(so[0]);
+	if (waitpid(pid, NULL, 0) < 0)
+		err(-1, "test_pingpong: waitpid");
+
+	benchmark_start();
+	for (i = 0; i < num; i++) {
+		if (socketpair(PF_LOCAL, SOCK_STREAM, 0, so) < 0)
+			err(-1, "test_pingpong: socketpair");
+		pid = fork();
+		if (pid < 0)
+			err(-1, "test_pingpong: fork");
+		if (pid == 0) {
+			close(so[0]);
+			len = recv(so[1], &ch, sizeof(ch), 0);
+			if (len < 0)
+				err(-1, "test_pingpong: child: recv");
+			if (len != 1)
+				errx(-1, "test_pingpong: child: recv %d",
+				    (int)len);
+			len = send(so[1], &ch, sizeof(ch), 0);
+			if (len < 0)
+				err(-1, "test_pingpong: child: send");
+			if (len != 1)
+				errx(-1, "test_pingpong: child: send %d",
+				    (int)len);
+			_exit(0);
+		}
+		close(so[1]);
+		len = send(so[0], &ch, sizeof(ch), 0);
+		if (len < 0)
+			err(-1, "test_pingpong: parent: send");
+		if (len != 1)
+			errx(-1, "test_pingpong: parent: send %d", (int)len);
+		len = recv(so[0], &ch, sizeof(ch), 0);
+		if (len < 0)
+			err(-1, "test_pingpong: parent: recv");
+		if (len != 1)
+			errx(-1, "test_pingpong: parent: recv %d", (int)len);
+		close(so[0]);
+		if (waitpid(pid, NULL, 0) < 0)
+			err(-1, "test_pingpong: waitpid");
+	}
+	benchmark_stop();
+}
+
 #define	MYNAME	"./syscall_timing"		/* Binary to run in sandbox. */
 
 /*
@@ -674,8 +762,8 @@ static const struct test tests[] = {
 	{ "socketpair_dgram", test_socketpair_dgram },
 	{ "dup", test_dup },
 	{ "cap_new", test_cap_new },
-	{ "test_shmfd", test_shmfd },
-	{ "test_cap_shmfd", test_cap_shmfd },
+	{ "shmfd", test_shmfd },
+	{ "cap_shmfd", test_cap_shmfd },
 	{ "fstat_shmfd", test_fstat_shmfd },
 	{ "fstat_cap_shmfd", test_fstat_cap_shmfd },
 	{ "cap_enter", test_cap_enter },
@@ -685,6 +773,7 @@ static const struct test tests[] = {
 	{ "fork_exec", test_fork_exec },
 	{ "vfork_exec", test_vfork_exec },
 	{ "pdfork_exec", test_pdfork_exec },
+	{ "pingpong", test_pingpong },
 	{ "sandbox", test_sandbox },
 };
 static const int tests_count = sizeof(tests) / sizeof(tests[0]);
@@ -710,7 +799,7 @@ main(int argc, char *argv[])
 	int i, j, k;
 	int iterations, loops;
 
-	if (argc < 3)
+	if (argc < 4)
 		usage();
 
 	ll = strtoll(argv[1], &endp, 10);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201002031602.o13G2xQ4040744>