sysperf - Adjust syscall tests
authorMatthew Dillon <dillon@apollo.backplane.com>
Thu, 16 Apr 2015 16:39:01 +0000 (09:39 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Thu, 16 Apr 2015 16:39:01 +0000 (09:39 -0700)
* Remove getuid_msg.c, no longer used.

* Adjust syscall1.c to be more verbose.

* Refactor syscall2.c to test on all threads in a somewhat more
  sophisticated manner.  The test expects the scheduler to move
  the threads to their own cpus (and it should).

test/sysperf/Makefile
test/sysperf/getuid_msg.c [deleted file]
test/sysperf/syscall1.c
test/sysperf/syscall2.c
test/sysperf/syscall3.c

index a77c282..eae531a 100644 (file)
@@ -26,11 +26,11 @@ all:        $(TARGETS)
 /tmp/sc1: syscall1.c blib.c
        $(CC) $(CFLAGS) syscall1.c blib.c -o /tmp/sc1
 
-/tmp/sc2: syscall2.c getuid_msg.c blib.c
-       $(CC) $(CFLAGS) syscall2.c getuid_msg.c blib.c -o /tmp/sc2
+/tmp/sc2: syscall2.c blib.c
+       $(CC) $(CFLAGS) syscall2.c blib.c -o /tmp/sc2
 
-/tmp/sc3: syscall3.c getuid_msg.c blib.c
-       $(CC) $(CFLAGS) syscall3.c getuid_msg.c blib.c -o /tmp/sc3
+/tmp/sc3: syscall3.c blib.c
+       $(CC) $(CFLAGS) syscall3.c blib.c -o /tmp/sc3
 
 /tmp/sc4: syscall4.c blib.c
        $(CC) $(CFLAGS) syscall4.c blib.c -o /tmp/sc4
diff --git a/test/sysperf/getuid_msg.c b/test/sysperf/getuid_msg.c
deleted file mode 100644 (file)
index ac5f29c..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * getuid_msg.c
- *
- * $DragonFly: src/test/sysperf/getuid_msg.c,v 1.3 2004/10/31 20:19:23 eirikn Exp $
- */
-
-#include "../sysmsg/syscall.h"
-
-int
-getuid_msg(void)
-{
-       struct getuid_args getuidmsg;
-       int error;
-
-       INITMSGSYSCALL(getuid, 0);
-       DOMSGSYSCALL(getuid);
-       FINISHMSGSYSCALL(getuid, error);
-}
-
index 92f2cb0..96d1b8e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * syscall1.c
  *
- * $DragonFly: src/test/sysperf/syscall1.c,v 1.3 2007/05/20 23:22:17 dillon Exp $
+ * Single thread getuid timing test.
  */
 
 #include "blib.h"
@@ -9,26 +9,27 @@
 int
 main(int ac, char **av)
 {
-    long long count = 0;
-    long long max;
-    char c;
-    int j;
+       long long count = 0;
+       long long max;
+       char c;
+       int j;
 
-    printf("timing standard getuid() syscall\n");
+       printf("timing standard getuid() syscall, single thread\n");
+       printf("if using powerd, run several times\n");
 
-    start_timing();
-    while (stop_timing(0, NULL) == 0) {
-       for (j = 0; j < 100; ++j)
-           getuid();
-       count += 100;
-    }
-    max = count;
-    start_timing();
-    for (count = 0; count < max; count += 100) {
-       for (j = 0; j < 100; ++j)
-           getuid();
-    }
-    stop_timing(count, "getuid()");
-    return(0);
+       start_timing();
+       while (stop_timing(0, NULL) == 0) {
+               for (j = 0; j < 100; ++j)
+                       getuid();
+               count += 100;
+       }
+       max = count;
+       start_timing();
+       for (count = 0; count < max; count += 100) {
+               for (j = 0; j < 100; ++j)
+                       getuid();
+       }
+       stop_timing(count, "getuid()");
+       return(0);
 }
 
index 09101f5..e9468bb 100644 (file)
@@ -1,10 +1,16 @@
 /*
  * syscall2.c
  *
- * $DragonFly: src/test/sysperf/syscall2.c,v 1.2 2004/10/31 20:19:24 eirikn Exp $
+ * All-threads getuid timing test.
  */
 
+#include <sys/types.h>
+#include <sys/errno.h>
+#include <sys/mman.h>
 #include <time.h>
+#include <stdio.h>
+
+#include <machine/atomic.h>
 
 #include "blib.h"
 
@@ -18,18 +24,73 @@ main(void)
        long long count = 0;
        long long max;
        int j;
+       int cpuno;
+       int ncpu;
+       int *done;
+       size_t ncpu_size;
+
+       done = mmap(NULL, 4096, PROT_READ|PROT_WRITE,
+                    MAP_SHARED|MAP_ANON, -1, 0);
 
+       /*
+        * How many cpu threads are there?
+        */
+       ncpu = 0;
+       ncpu_size = sizeof(ncpu);
+       if (sysctlbyname("hw.ncpu", &ncpu, &ncpu_size, NULL, 0) < 0) {
+               perror("sysctl hw.ncpu");
+               exit(1);
+       }
+       printf("timing standard getuid() syscall, %d threads\n", ncpu);
+       printf("if using powerd, run several times\n");
+       *done = 0;
+
+       /*
+        * Approximate timing run length
+        */
        start_timing();
        while (stop_timing(0, NULL) == 0) {
                for (j = 0; j < 100; ++j)
-                       getuid_msg();
+                       getuid();
                count += 100;
        }
        max = count;
-       start_timing();
-       for (count = 0; count < max; count += 100) {
-               for (j = 0; j < 100; ++j)
-                       getuid_msg();
+
+       /*
+        * Run same length on all threads.
+        */
+       for (cpuno = 0; cpuno < ncpu; ++cpuno) {
+               if (fork() == 0) {
+                       /*
+                        * Give scheduler time to move threads around
+                        */
+                       start_timing();
+                       while (stop_timing(0, NULL) == 0) {
+                               for (j = 0; j < 100; ++j)
+                                       getuid();
+                       }
+
+                       /*
+                        * Actual timing test is here.
+                        */
+                       start_timing();
+                       for (count = 0; count < max; count += 100) {
+                               for (j = 0; j < 100; ++j)
+                                       getuid();
+                       }
+                       stop_timing(count, "getuid() sysmsg");
+
+                       /*
+                        * Don't unbusy the cpu until the other threads are
+                        * done.
+                        */
+                       atomic_add_int(done, 1);
+                       while (*done < ncpu)    /* wait for other threads */
+                               getuid();
+                       exit(0);
+               }
        }
-       stop_timing(count, "getuid() sysmsg");
+       while (wait3(NULL, 0, NULL) > 0 || errno == EINTR)
+               ;
+       return 0;
 }
index 9af628a..04f9dc9 100644 (file)
@@ -1,19 +1,15 @@
 /*
  * syscall3.c
- *
- * $DragonFly: src/test/sysperf/syscall3.c,v 1.2 2004/10/31 20:19:24 eirikn Exp $
  */
 
 #include "blib.h"
 
-extern int getuid_msg(void);
-
 int
 main(int ac, char **av)
 {
-    printf("(non timing) one process, endless loop calling getuid_msg()\n");
+    printf("(non timing) one process, endless loop calling getuid()\n");
     for (;;) 
-       getuid_msg();
+       getuid();
     /* not reached */
     return(0);
 }