svn commit: r335941 - head/tools/tools/syscall_timing

Edward Tomasz Napierala trasz at FreeBSD.org
Wed Jul 4 13:34:46 UTC 2018


Author: trasz
Date: Wed Jul  4 13:34:43 2018
New Revision: 335941
URL: https://svnweb.freebsd.org/changeset/base/335941

Log:
  Add a trivial "pipe ping" (two processes) benchmark.
  
  Obtained from:	CheriBSD
  MFC after:	2 weeks
  Sponsored by:	DARPA, AFRL

Modified:
  head/tools/tools/syscall_timing/syscall_timing.c

Modified: head/tools/tools/syscall_timing/syscall_timing.c
==============================================================================
--- head/tools/tools/syscall_timing/syscall_timing.c	Wed Jul  4 13:31:55 2018	(r335940)
+++ head/tools/tools/syscall_timing/syscall_timing.c	Wed Jul  4 13:34:43 2018	(r335941)
@@ -31,6 +31,7 @@
 
 #include <sys/types.h>
 #include <sys/mman.h>
+#include <sys/procdesc.h>
 #include <sys/resource.h>
 #include <sys/socket.h>
 #include <sys/stat.h>
@@ -251,6 +252,52 @@ test_select(uintmax_t num, uintmax_t int_arg __unused,
 }
 
 static uintmax_t
+test_pipeping(uintmax_t num, uintmax_t int_arg, const char *path __unused)
+{
+	char buf[int_arg];
+	uintmax_t i;
+	ssize_t ret;
+	pid_t pid;
+	int fd[2], procfd;
+
+	if (pipe(fd) < 0)
+		err(-1, "pipe");
+
+	pid = pdfork(&procfd, 0);
+	if (pid < 0)
+		err(1, "pdfork");
+
+	if (pid == 0) {
+		close(fd[0]);
+
+		for (;;) {
+			ret = read(fd[1], buf, int_arg);
+			if ((uintmax_t)ret != int_arg)
+				err(1, "read");
+			ret = write(fd[1], buf, int_arg);
+			if ((uintmax_t)ret != int_arg)
+				err(1, "write");
+		}
+	}
+
+	close(fd[1]);
+
+	benchmark_start();
+	BENCHMARK_FOREACH(i, num) {
+		ret = write(fd[0], buf, int_arg);
+		if ((uintmax_t)ret != int_arg)
+			err(1, "write");
+		ret = read(fd[0], buf, int_arg);
+		if ((uintmax_t)ret != int_arg)
+			err(1, "read");
+	}
+	benchmark_stop();
+
+	close(procfd);
+	return (i);
+}
+
+static uintmax_t
 test_socket_stream(uintmax_t num, uintmax_t int_arg, const char *path __unused)
 {
 	uintmax_t i;
@@ -694,6 +741,18 @@ static const struct test tests[] = {
 	{ "getppid", test_getppid, .t_flags = 0 },
 	{ "getresuid", test_getresuid, .t_flags = 0 },
 	{ "clock_gettime", test_clock_gettime, .t_flags = 0 },
+	{ "pipeping_1", test_pipeping, .t_flags = 0, .t_int = 1 },
+	{ "pipeping_10", test_pipeping, .t_flags = 0, .t_int = 10 },
+	{ "pipeping_100", test_pipeping, .t_flags = 0, .t_int = 100 },
+	{ "pipeping_1000", test_pipeping, .t_flags = 0, .t_int = 1000 },
+	{ "pipeping_10000", test_pipeping, .t_flags = 0, .t_int = 10000 },
+#ifdef notyet
+	/*
+	 * XXX: Doesn't work; kernel pipe buffer too small?
+	 */
+	{ "pipeping_100000", test_pipeping, .t_flags = 0, .t_int = 100000 },
+	{ "pipeping_1000000", test_pipeping, .t_flags = 0, .t_int = 1000000 },
+ #endif
 	{ "gettimeofday", test_gettimeofday, .t_flags = 0 },
 	{ "getpriority", test_getpriority, .t_flags = 0 },
 	{ "getprogname", test_getprogname, .t_flags = 0 },


More information about the svn-src-all mailing list