Misc sysperf cleanups. Add another mutex tester to test the xchgl
authorMatthew Dillon <dillon@dragonflybsd.org>
Sat, 22 Apr 2006 22:32:52 +0000 (22:32 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Sat, 22 Apr 2006 22:32:52 +0000 (22:32 +0000)
instruction.

test/sysperf/Makefile
test/sysperf/blib.c
test/sysperf/blib.h
test/sysperf/loop2.c
test/sysperf/loop3.c
test/sysperf/mtx.s
test/sysperf/mutex1.c [copied from test/sysperf/mutex2.c with 60% similarity]
test/sysperf/mutex2.c

index b65b970..c5e78b1 100644 (file)
@@ -1,5 +1,5 @@
 #
-# $DragonFly: src/test/sysperf/Makefile,v 1.13 2005/08/03 13:37:27 hmp Exp $
+# $DragonFly: src/test/sysperf/Makefile,v 1.14 2006/04/22 22:32:52 dillon Exp $
 #
 
 TARGETS=/tmp/sc1 /tmp/sc2 /tmp/sc3 /tmp/sc4 /tmp/sc5 \
@@ -70,6 +70,9 @@ all:  $(TARGETS)
 /tmp/mbw1: mbwtest.c
        $(CC) -O mbwtest.c -o /tmp/mbw1
 
+/tmp/mt1: mutex1.c blib.c mtx.s
+       $(CC) $(CFLAGS) mutex1.c blib.c mtx.s -o /tmp/mt1
+
 /tmp/mt2: mutex2.c blib.c mtx.s
        $(CC) $(CFLAGS) mutex2.c blib.c mtx.s -o /tmp/mt2
 
index cb514e2..d8419d1 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Simple benchmarking library
  *
- * $DragonFly: src/test/sysperf/blib.c,v 1.4 2004/03/20 02:02:20 dillon Exp $
+ * $DragonFly: src/test/sysperf/blib.c,v 1.5 2006/04/22 22:32:52 dillon Exp $
  */
 
 #include <sys/types.h>
@@ -71,3 +71,7 @@ get_timing(void)
     return(us);
 }
 
+void
+nop(void)
+{
+}
index 06b949a..c5b6a6a 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Simple benchmarking library
  *
- * $DragonFly: src/test/sysperf/blib.h,v 1.3 2004/02/09 18:08:57 dillon Exp $
+ * $DragonFly: src/test/sysperf/blib.h,v 1.4 2006/04/22 22:32:52 dillon Exp $
  */
 
 #include <sys/types.h>
@@ -20,4 +20,5 @@ void start_timing(void);
 int stop_timing(long long count, const char *ctl, ...);
 int stop_timing2(long long count, long long us, const char *ctl, ...);
 long long get_timing(void);
+void nop(void);
 
index ada6b82..4aa356e 100644 (file)
@@ -4,32 +4,41 @@
  * Used as a helper to test AST delivery.  Loops in user mode for a few
  * seconds.  This one forks and runs the loop in two processes.
  *
- * $DragonFly: src/test/sysperf/loop2.c,v 1.1 2003/08/12 02:29:44 dillon Exp $
+ * $DragonFly: src/test/sysperf/loop2.c,v 1.2 2006/04/22 22:32:52 dillon Exp $
  */
 
 #include "blib.h"
 
-#define LOOP 100000000
-
-static void nop() { }
+#define LOOP 1000000
+#define INNER 100
 
 int
 main(int ac, char **av)
 {
     int i;
+    int j;
+    int count = LOOP;
     pid_t pid;
 
+    if (ac > 1)
+       count = strtoul(av[1], NULL, 0);
+
     printf("SMP contention, userland-only loop, duel-forks.  Run just one\n");
 
     start_timing();
     if (fork() == 0) {
-       for (i = 0; i < LOOP; ++i)
-           nop();
+       for (i = count; i > 0; --i) {
+           for (j = INNER; j > 0; --j)
+               nop();
+       }
        _exit(1);
     } else {
-       for (i = 0; i < LOOP; ++i)
-           nop();
-       while (wait(NULL) > 0);
+       for (i = count; i > 0; --i) {
+           for (j = INNER; j > 0; --j)
+               nop();
+       }
+       while (wait(NULL) > 0)
+           ;
        stop_timing(LOOP, "loop2/2xfork");
     }
     return(0);
index dd4d8ee..c70fb80 100644 (file)
@@ -3,13 +3,11 @@
  *
  * used as a helper to test AST delivery.  This is an endless loop.
  *
- * $DragonFly: src/test/sysperf/loop3.c,v 1.1 2003/08/12 02:29:44 dillon Exp $
+ * $DragonFly: src/test/sysperf/loop3.c,v 1.2 2006/04/22 22:32:52 dillon Exp $
  */
 
 #include "blib.h"
 
-static void nop() { }
-
 int
 main(int ac, char **av)
 {
index c16596e..2ac10b6 100644 (file)
@@ -1,9 +1,11 @@
                /*
-                * $DragonFly: src/test/sysperf/mtx.s,v 1.1 2003/08/12 02:29:44 dillon Exp $
+                * $DragonFly: src/test/sysperf/mtx.s,v 1.2 2006/04/22 22:32:52 dillon Exp $
                 */
                .text
                .globl  get_mtx
                .globl  rel_mtx
+               .globl  try_spin_mtx
+               .globl  rel_spin_mtx
 
 get_mtx:
                movl    mtx,%edx
@@ -17,3 +19,14 @@ rel_mtx:
                movl    mtx,%edx
                movl $0,(%edx)
                ret
+
+try_spin_mtx:
+               movl    mtx,%edx
+               movl    $1,%eax
+               xchgl   %eax,(%edx)
+               ret
+
+rel_spin_mtx:
+               movl    mtx,%edx
+               movl    $0,(%edx)
+               ret
similarity index 60%
copy from test/sysperf/mutex2.c
copy to test/sysperf/mutex1.c
index 5990d91..d3f3986 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * mutex2.c
+ * mutex1.c
  *
- * $DragonFly: src/test/sysperf/mutex2.c,v 1.1 2003/08/12 02:29:44 dillon Exp $
+ * $DragonFly: src/test/sysperf/mutex1.c,v 1.1 2006/04/22 22:32:52 dillon Exp $
  */
 
 #include "blib.h"
@@ -26,18 +26,34 @@ main(int ac, char **av)
     counter = mtx + 64;
     while (stop_timing(0, NULL) == 0) {
        for (j = 0; j < 100; ++j) {
-           get_mtx(1);
-           rel_mtx();
+           try_spin_mtx();
+           rel_spin_mtx();
        }
        count += 100;
     }
     max = count;
     *mtx = 0;
+
+    /*
+     * Single cpu case
+     */
+    start_timing();
+    for (count = 0; count < max; count += 100) {
+       for (j = 0; j < 100; ++j) {
+           while (try_spin_mtx(1) != 0)
+               ;
+           rel_spin_mtx();     /* release */
+           ++counter[64];
+       }
+    }
+    stop_timing(count, "simple_mtx(uncontested/1cpu)");
+
     if ((pid = fork()) == 0) {
        for (;;) {
            for (j = 0; j < 100; ++j) {
-               get_mtx(2);
-               rel_mtx();      /* release */
+               while (try_spin_mtx() != 0)
+                   ;
+               rel_spin_mtx(); /* release */
                ++counter[128];
            }
        }
@@ -45,12 +61,13 @@ main(int ac, char **av)
        start_timing();
        for (count = 0; count < max; count += 100) {
            for (j = 0; j < 100; ++j) {
-               get_mtx(1);
-               rel_mtx();      /* release */
+               while (try_spin_mtx() != 0)
+                   ;
+               rel_spin_mtx(); /* release */
                ++counter[64];
            }
        }
-       stop_timing(count, "getuid()");
+       stop_timing(count, "simple_mtx");
        printf("proc1=%d proc2=%d\n", counter[64], counter[128]);
        kill(pid, 9);
     }
index 5990d91..093228b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * mutex2.c
  *
- * $DragonFly: src/test/sysperf/mutex2.c,v 1.1 2003/08/12 02:29:44 dillon Exp $
+ * $DragonFly: src/test/sysperf/mutex2.c,v 1.2 2006/04/22 22:32:52 dillon Exp $
  */
 
 #include "blib.h"
@@ -33,6 +33,17 @@ main(int ac, char **av)
     }
     max = count;
     *mtx = 0;
+
+    start_timing();
+    for (count = 0; count < max; count += 100) {
+       for (j = 0; j < 100; ++j) {
+           get_mtx(1);
+           rel_mtx();  /* release */
+           ++counter[64];
+       }
+    }
+    stop_timing(count, "complex_mtx(uncontested/1cpu)");
+
     if ((pid = fork()) == 0) {
        for (;;) {
            for (j = 0; j < 100; ++j) {
@@ -50,7 +61,7 @@ main(int ac, char **av)
                ++counter[64];
            }
        }
-       stop_timing(count, "getuid()");
+       stop_timing(count, "complex_mtx");
        printf("proc1=%d proc2=%d\n", counter[64], counter[128]);
        kill(pid, 9);
     }