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

Edward Tomasz Napierala trasz at FreeBSD.org
Wed Jul 4 13:45:30 UTC 2018


Author: trasz
Date: Wed Jul  4 13:45:29 2018
New Revision: 335944
URL: https://svnweb.freebsd.org/changeset/base/335944

Log:
  Make the pipeping benchmarks work with larger buffer sizes.
  
  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:39:48 2018	(r335943)
+++ head/tools/tools/syscall_timing/syscall_timing.c	Wed Jul  4 13:45:29 2018	(r335944)
@@ -159,74 +159,7 @@ test_clock_gettime(uintmax_t num, uintmax_t int_arg __
 	return (i);
 }
 
-struct pipepingtd_ctx {
-	int		fd;
-	uintmax_t	int_arg;
-};
-
-static void *
-pipepingtd_proc(void *arg)
-{
-	struct pipepingtd_ctx *ctxp;
-	int fd;
-	void *buf;
-	uintmax_t int_arg;
-	ssize_t ret;
-
-	ctxp = arg;
-	fd = ctxp->fd;
-	int_arg = ctxp->int_arg;
-
-	buf = malloc(int_arg);
-	if (buf == NULL)
-		err(1, "malloc");
-
-	for (;;) {
-		ret = read(fd, buf, int_arg);
-		if ((uintmax_t)ret != int_arg)
-			err(1, "read");
-		ret = write(fd, buf, int_arg);
-		if ((uintmax_t)ret != int_arg)
-			err(1, "write");
-	}
-}
-
 static uintmax_t
-test_pipepingtd(uintmax_t num, uintmax_t int_arg, const char *path __unused)
-{
-	struct pipepingtd_ctx ctx;
-	char buf[int_arg];
-	pthread_t td;
-	uintmax_t i;
-	ssize_t ret;
-	int error, fd[2];
-
-	if (pipe(fd) < 0)
-		err(-1, "pipe");
-
-	ctx.fd = fd[1];
-	ctx.int_arg = int_arg;
-
-	error = pthread_create(&td, NULL, pipepingtd_proc, &ctx);
-	if (error != 0)
-		err(1, "pthread_create");
-
-	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();
-	pthread_cancel(td);
-
-	return (i);
-}
-
-static uintmax_t
 test_gettimeofday(uintmax_t num, uintmax_t int_arg __unused, const char *path __unused)
 {
 	struct timeval tv;
@@ -319,12 +252,41 @@ test_select(uintmax_t num, uintmax_t int_arg __unused,
 	return (i);
 }
 
+static void
+readx(int fd, char *buf, size_t size)
+{
+	ssize_t ret;
+
+	do {
+		ret = read(fd, buf, size);
+		if (ret == -1)
+			err(1, "read");
+		assert((size_t)ret <= size);
+		size -= ret;
+		buf += ret;
+	} while (size > 0);
+}
+
+static void
+writex(int fd, const char *buf, size_t size)
+{
+	ssize_t ret;
+
+	do {
+		ret = write(fd, buf, size);
+		if (ret == -1)
+			err(1, "write");
+		assert((size_t)ret <= size);
+		size -= ret;
+		buf += ret;
+	} while (size > 0);
+}
+
 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;
 
@@ -339,12 +301,8 @@ test_pipeping(uintmax_t num, uintmax_t int_arg, const 
 		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");
+			readx(fd[1], buf, int_arg);
+			writex(fd[1], buf, int_arg);
 		}
 	}
 
@@ -352,12 +310,8 @@ test_pipeping(uintmax_t num, uintmax_t int_arg, const 
 
 	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");
+		writex(fd[0], buf, int_arg);
+		readx(fd[0], buf, int_arg);
 	}
 	benchmark_stop();
 
@@ -365,7 +319,64 @@ test_pipeping(uintmax_t num, uintmax_t int_arg, const 
 	return (i);
 }
 
+struct pipepingtd_ctx {
+	int		fd;
+	uintmax_t	int_arg;
+};
+
+static void *
+pipepingtd_proc(void *arg)
+{
+	struct pipepingtd_ctx *ctxp;
+	int fd;
+	void *buf;
+	uintmax_t int_arg;
+
+	ctxp = arg;
+	fd = ctxp->fd;
+	int_arg = ctxp->int_arg;
+
+	buf = malloc(int_arg);
+	if (buf == NULL)
+		err(1, "malloc");
+
+	for (;;) {
+		readx(fd, buf, int_arg);
+		writex(fd, buf, int_arg);
+	}
+}
+
 static uintmax_t
+test_pipepingtd(uintmax_t num, uintmax_t int_arg, const char *path __unused)
+{
+	struct pipepingtd_ctx ctx;
+	char buf[int_arg];
+	pthread_t td;
+	uintmax_t i;
+	int error, fd[2];
+
+	if (pipe(fd) < 0)
+		err(-1, "pipe");
+
+	ctx.fd = fd[1];
+	ctx.int_arg = int_arg;
+
+	error = pthread_create(&td, NULL, pipepingtd_proc, &ctx);
+	if (error != 0)
+		err(1, "pthread_create");
+
+	benchmark_start();
+	BENCHMARK_FOREACH(i, num) {
+		writex(fd[0], buf, int_arg);
+		readx(fd[0], buf, int_arg);
+	}
+	benchmark_stop();
+	pthread_cancel(td);
+
+	return (i);
+}
+
+static uintmax_t
 test_socket_stream(uintmax_t num, uintmax_t int_arg, const char *path __unused)
 {
 	uintmax_t i;
@@ -814,25 +825,15 @@ static const struct test tests[] = {
 	{ "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
 	{ "pipepingtd_1", test_pipepingtd, .t_flags = 0, .t_int = 1 },
 	{ "pipepingtd_10", test_pipepingtd, .t_flags = 0, .t_int = 10 },
 	{ "pipepingtd_100", test_pipepingtd, .t_flags = 0, .t_int = 100 },
 	{ "pipepingtd_1000", test_pipepingtd, .t_flags = 0, .t_int = 1000 },
 	{ "pipepingtd_10000", test_pipepingtd, .t_flags = 0, .t_int = 10000 },
-#ifdef notyet
-	/*
-	 * XXX: Doesn't work; kernel pipe buffer too small?
-	 */
 	{ "pipepingtd_100000", test_pipepingtd, .t_flags = 0, .t_int = 100000 },
 	{ "pipepingtd_1000000", test_pipepingtd, .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-head mailing list