> 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                                                 rgri...@freebsd.org
_______________________________________________
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