Date: Wed, 4 Jul 2018 08:15:48 -0700 (PDT) From: "Rodney W. Grimes" <freebsd@pdx.rh.CN85.dnsmgr.net> To: Edward Tomasz Napierala <trasz@freebsd.org> Cc: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: Re: svn commit: r335941 - head/tools/tools/syscall_timing Message-ID: <201807041515.w64FFmXY043458@pdx.rh.CN85.dnsmgr.net> In-Reply-To: <201807041334.w64DYhQu007746@repo.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
> 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 Can you get the size of the pipe buffer and make a run time decision on this? Not all of us run with defaults.... Hum, does not seem it is easy to get this pipe size info from userland... > { "gettimeofday", test_gettimeofday, .t_flags = 0 }, > { "getpriority", test_getpriority, .t_flags = 0 }, > { "getprogname", test_getprogname, .t_flags = 0 }, > > -- Rod Grimes rgrimes@freebsd.org
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201807041515.w64FFmXY043458>