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 },
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to