svn commit: r335956 - head/tools/tools/syscall_timing
Edward Tomasz Napierala
trasz at FreeBSD.org
Wed Jul 4 14:20:20 UTC 2018
Author: trasz
Date: Wed Jul 4 14:20:19 2018
New Revision: 335956
URL: https://svnweb.freebsd.org/changeset/base/335956
Log:
Add a semaphore ping 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 14:18:12 2018 (r335955)
+++ head/tools/tools/syscall_timing/syscall_timing.c Wed Jul 4 14:20:19 2018 (r335956)
@@ -29,6 +29,7 @@
* $FreeBSD$
*/
+#include <sys/param.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/procdesc.h>
@@ -47,6 +48,7 @@
#ifdef WITH_PTHREAD
#include <pthread.h>
#endif
+#include <semaphore.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
@@ -606,6 +608,65 @@ test_select(uintmax_t num, uintmax_t int_arg __unused,
}
static uintmax_t
+test_semaping(uintmax_t num, uintmax_t int_arg __unused, const char *path __unused)
+{
+ uintmax_t i;
+ pid_t pid;
+ sem_t *buf;
+ int error, j, procfd;
+
+ buf = mmap(0, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0);
+ if (buf == MAP_FAILED)
+ err(1, "mmap");
+
+ for (j = 0; j < 2; j++) {
+ error = sem_init(&buf[j], 1, 0);
+ if (error != 0)
+ err(1, "sem_init");
+ }
+
+ pid = pdfork(&procfd, 0);
+ if (pid < 0)
+ err(1, "pdfork");
+
+ if (pid == 0) {
+ for (;;) {
+ error = sem_wait(&buf[0]);
+ if (error != 0)
+ err(1, "sem_wait");
+ error = sem_post(&buf[1]);
+ if (error != 0)
+ err(1, "sem_post");
+ }
+ }
+
+ benchmark_start();
+ BENCHMARK_FOREACH(i, num) {
+ error = sem_post(&buf[0]);
+ if (error != 0)
+ err(1, "sem_post");
+ error = sem_wait(&buf[1]);
+ if (error != 0)
+ err(1, "sem_wait");
+ }
+ benchmark_stop();
+
+ close(procfd);
+
+ for (j = 0; j < 2; j++) {
+ error = sem_destroy(&buf[j]);
+ if (error != 0)
+ err(1, "sem_destroy");
+ }
+
+ error = munmap(buf, PAGE_SIZE);
+ if (error != 0)
+ err(1, "munmap");
+
+ return (i);
+}
+
+static uintmax_t
test_setuid(uintmax_t num, uintmax_t int_arg __unused, const char *path __unused)
{
uid_t uid;
@@ -900,6 +961,7 @@ static const struct test tests[] = {
{ "read_100000", test_read, .t_flags = FLAG_PATH, .t_int = 100000 },
{ "read_1000000", test_read, .t_flags = FLAG_PATH, .t_int = 1000000 },
{ "select", test_select, .t_flags = 0 },
+ { "semaping", test_semaping, .t_flags = 0 },
{ "setuid", test_setuid, .t_flags = 0 },
{ "shmfd", test_shmfd, .t_flags = 0 },
{ "shmfd_dup", test_shmfd_dup, .t_flags = 0 },
More information about the svn-src-all
mailing list