Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 4 Jul 2018 13:39:49 +0000 (UTC)
From:      Edward Tomasz Napierala <trasz@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r335943 - head/tools/tools/syscall_timing
Message-ID:  <201807041339.w64Ddndw008168@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: trasz
Date: Wed Jul  4 13:39:48 2018
New Revision: 335943
URL: https://svnweb.freebsd.org/changeset/base/335943

Log:
  Add threaded pipe ping benchmark.
  
  Obtained from:	CheriBSD
  MFC after:	2 weeks
  Sponsored by:	DARPA, AFRL

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

Modified: head/tools/tools/syscall_timing/Makefile
==============================================================================
--- head/tools/tools/syscall_timing/Makefile	Wed Jul  4 13:38:02 2018	(r335942)
+++ head/tools/tools/syscall_timing/Makefile	Wed Jul  4 13:39:48 2018	(r335943)
@@ -6,6 +6,8 @@ PROG=	syscall_timing
 CFLAGS+=	-static -O
 MAN=
 
+LIBADD=	pthread
+
 WARNS=	6
 
 .include <bsd.prog.mk>

Modified: head/tools/tools/syscall_timing/syscall_timing.c
==============================================================================
--- head/tools/tools/syscall_timing/syscall_timing.c	Wed Jul  4 13:38:02 2018	(r335942)
+++ head/tools/tools/syscall_timing/syscall_timing.c	Wed Jul  4 13:39:48 2018	(r335943)
@@ -44,6 +44,7 @@
 #include <fcntl.h>
 #include <inttypes.h>
 #include <limits.h>
+#include <pthread.h>
 #include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -158,7 +159,74 @@ 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;
@@ -752,6 +820,18 @@ static const struct test tests[] = {
 	 */
 	{ "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 },



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