1*86d7f5d3SJohn Marino /*
2*86d7f5d3SJohn Marino * mutex4.c
3*86d7f5d3SJohn Marino *
4*86d7f5d3SJohn Marino * $DragonFly: src/test/sysperf/mutex4.c,v 1.1 2008/05/09 15:49:42 dillon Exp $
5*86d7f5d3SJohn Marino */
6*86d7f5d3SJohn Marino
7*86d7f5d3SJohn Marino #include "blib.h"
8*86d7f5d3SJohn Marino
9*86d7f5d3SJohn Marino #include <sys/types.h>
10*86d7f5d3SJohn Marino #include <machine/atomic.h>
11*86d7f5d3SJohn Marino #include <machine/cpufunc.h>
12*86d7f5d3SJohn Marino
13*86d7f5d3SJohn Marino struct globaldata {
14*86d7f5d3SJohn Marino int gd_cpumask;
15*86d7f5d3SJohn Marino int gd_spinlocks;
16*86d7f5d3SJohn Marino };
17*86d7f5d3SJohn Marino
18*86d7f5d3SJohn Marino int *mtx;
19*86d7f5d3SJohn Marino struct globaldata gd;
20*86d7f5d3SJohn Marino
21*86d7f5d3SJohn Marino typedef struct globaldata *globaldata_t;
22*86d7f5d3SJohn Marino
23*86d7f5d3SJohn Marino void
rd_lock_contested(void)24*86d7f5d3SJohn Marino rd_lock_contested(void)
25*86d7f5d3SJohn Marino {
26*86d7f5d3SJohn Marino }
27*86d7f5d3SJohn Marino
28*86d7f5d3SJohn Marino static __inline void
rd_lock(void)29*86d7f5d3SJohn Marino rd_lock(void)
30*86d7f5d3SJohn Marino {
31*86d7f5d3SJohn Marino atomic_set_int(mtx, 1);
32*86d7f5d3SJohn Marino *mtx = 2;
33*86d7f5d3SJohn Marino *mtx = 3;
34*86d7f5d3SJohn Marino }
35*86d7f5d3SJohn Marino
36*86d7f5d3SJohn Marino static __inline void
rd_unlock(void)37*86d7f5d3SJohn Marino rd_unlock(void)
38*86d7f5d3SJohn Marino {
39*86d7f5d3SJohn Marino }
40*86d7f5d3SJohn Marino
41*86d7f5d3SJohn Marino int
main(int ac,char ** av)42*86d7f5d3SJohn Marino main(int ac, char **av)
43*86d7f5d3SJohn Marino {
44*86d7f5d3SJohn Marino long long count = 0;
45*86d7f5d3SJohn Marino long long max;
46*86d7f5d3SJohn Marino int j;
47*86d7f5d3SJohn Marino int *counter;
48*86d7f5d3SJohn Marino pid_t pid;
49*86d7f5d3SJohn Marino
50*86d7f5d3SJohn Marino printf("Test simple locked bus cycle mutex latency\n");
51*86d7f5d3SJohn Marino printf("auto-forks two processes for the test with shared memory\n");
52*86d7f5d3SJohn Marino printf("This test is only useful on a SMP box\n");
53*86d7f5d3SJohn Marino
54*86d7f5d3SJohn Marino start_timing();
55*86d7f5d3SJohn Marino mtx = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, -1, 0);
56*86d7f5d3SJohn Marino counter = mtx + 64;
57*86d7f5d3SJohn Marino gd.gd_cpumask = 0x00000001;
58*86d7f5d3SJohn Marino gd.gd_spinlocks = 0;
59*86d7f5d3SJohn Marino while (stop_timing(0, NULL) == 0) {
60*86d7f5d3SJohn Marino for (j = 0; j < 100; ++j) {
61*86d7f5d3SJohn Marino rd_lock();
62*86d7f5d3SJohn Marino rd_unlock();
63*86d7f5d3SJohn Marino }
64*86d7f5d3SJohn Marino count += 100;
65*86d7f5d3SJohn Marino }
66*86d7f5d3SJohn Marino max = count;
67*86d7f5d3SJohn Marino *mtx = 0;
68*86d7f5d3SJohn Marino
69*86d7f5d3SJohn Marino start_timing();
70*86d7f5d3SJohn Marino for (count = 0; count < max; count += 100) {
71*86d7f5d3SJohn Marino for (j = 0; j < 100; ++j) {
72*86d7f5d3SJohn Marino rd_lock();
73*86d7f5d3SJohn Marino rd_unlock(); /* release */
74*86d7f5d3SJohn Marino }
75*86d7f5d3SJohn Marino }
76*86d7f5d3SJohn Marino stop_timing(count, "complex_mtx(uncontested/1cpu)");
77*86d7f5d3SJohn Marino
78*86d7f5d3SJohn Marino if ((pid = fork()) == 0) {
79*86d7f5d3SJohn Marino for (;;) {
80*86d7f5d3SJohn Marino for (j = 0; j < 100; ++j) {
81*86d7f5d3SJohn Marino rd_lock();
82*86d7f5d3SJohn Marino rd_unlock(); /* release */
83*86d7f5d3SJohn Marino ++counter[128];
84*86d7f5d3SJohn Marino }
85*86d7f5d3SJohn Marino }
86*86d7f5d3SJohn Marino } else {
87*86d7f5d3SJohn Marino gd.gd_cpumask = 0x00000002;
88*86d7f5d3SJohn Marino gd.gd_spinlocks = 0;
89*86d7f5d3SJohn Marino start_timing();
90*86d7f5d3SJohn Marino for (count = 0; count < max; count += 100) {
91*86d7f5d3SJohn Marino for (j = 0; j < 100; ++j) {
92*86d7f5d3SJohn Marino rd_lock();
93*86d7f5d3SJohn Marino rd_unlock(); /* release */
94*86d7f5d3SJohn Marino ++counter[64];
95*86d7f5d3SJohn Marino }
96*86d7f5d3SJohn Marino }
97*86d7f5d3SJohn Marino stop_timing(count, "complex_mtx");
98*86d7f5d3SJohn Marino printf("proc1=%d proc2=%d\n", counter[64], counter[128]);
99*86d7f5d3SJohn Marino kill(pid, 9);
100*86d7f5d3SJohn Marino }
101*86d7f5d3SJohn Marino return(0);
102*86d7f5d3SJohn Marino }
103*86d7f5d3SJohn Marino
104