Track the last read and last write timestamp at the device level and modify
[dragonfly.git] / test / sysperf / upcall1.c
1 /*
2  * UPCALL1.C
3  *
4  *      Test upcall performance.  WARNING!  This test does not reflect 
5  *      reality... the test is effectively making two system calls for
6  *      each upcall when under normal conditions no system calls should be
7  *      necessary when handling an upcall.
8  *
9  * $DragonFly: src/test/sysperf/upcall1.c,v 1.3 2004/01/12 16:48:37 drhodus Exp $
10  */
11
12 #include <sys/types.h>
13 #include <sys/upcall.h>
14 #include <sys/time.h>
15 #include <stdio.h>
16 #include "blib.h"
17
18 #define MAXCOUNT        10000000
19
20 struct upcall   upc;                    /* simple single-cpu upcall test */
21
22 extern void callused_wrapper(void *);   /* assembly */
23 static void myfunc(void *data);
24
25 int count = MAXCOUNT;
26 int id;
27
28 int
29 main(int ac, char **av)
30 {
31         id = upc_register(&upc, callused_wrapper, myfunc, "blah");
32         printf("Warning: extra system calls in test means performance\n");
33         printf("does not reflect reality.  Divide times by 3 for raw\n");
34         printf("per-upcall overhead (approximately)\n");
35         printf("register upcall %d\n", id);
36         printf("try to dispatch the upcall\n");
37         upc_control(UPC_CONTROL_DISPATCH, id, NULL);
38         stop_timing(MAXCOUNT, "Full-up upcall test");
39         printf("final: %d %d (should be 0 0)\n", upc.upc_critoff, upc.upc_pending);
40         return 0;
41 }
42
43 static void
44 myfunc(void *data)
45 {
46     /*
47      * Dispatch a reentrant UPC.  It should not stack because we are in a
48      * critical section, but the context code will catch it when it calls
49      * UPC_CONTROL_NEXT.
50      */
51     if (--count > 0) {
52         upc_control(UPC_CONTROL_DISPATCH, id, NULL);
53     }
54     if (count > MAXCOUNT - 3) {
55         printf("UPCALL! (%s) upc: %d crit=%d pend=%d (should be 32 1) @sp %p\n",
56                 data, upc.upc_magic, upc.upc_critoff, upc.upc_pending, &data);
57         if (count == MAXCOUNT - 2) {
58             printf("(sp should be same as before)\n");
59             printf("doing a total of %d upcalls\n", MAXCOUNT);
60             usleep(20000);
61             start_timing();
62         }
63     }
64 }
65