]>
Commit | Line | Data |
---|---|---|
87d546d8 TG |
1 | /*****************************************************************************\ |
2 | * Copyright (C) 2007-2010 Lawrence Livermore National Security, LLC. | |
3 | * Copyright (C) 2007 The Regents of the University of California. | |
4 | * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). | |
5 | * Written by Brian Behlendorf <behlendorf1@llnl.gov>. | |
6 | * UCRL-CODE-235197 | |
7 | * | |
8 | * This file is part of the SPL, Solaris Porting Layer. | |
9 | * For details, see <http://zfsonlinux.org/>. | |
10 | * | |
11 | * The SPL is free software; you can redistribute it and/or modify it | |
12 | * under the terms of the GNU General Public License as published by the | |
13 | * Free Software Foundation; either version 2 of the License, or (at your | |
14 | * option) any later version. | |
15 | * | |
16 | * The SPL is distributed in the hope that it will be useful, but WITHOUT | |
17 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
18 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
19 | * for more details. | |
20 | * | |
21 | * You should have received a copy of the GNU General Public License along | |
22 | * with the SPL. If not, see <http://www.gnu.org/licenses/>. | |
23 | ***************************************************************************** | |
24 | * Solaris Porting LAyer Tests (SPLAT) Time Tests. | |
25 | \*****************************************************************************/ | |
26 | ||
27 | #include <sys/time.h> | |
28 | #include <linux/mm_compat.h> | |
29 | #include <linux/slab.h> | |
30 | #include "splat-internal.h" | |
31 | ||
32 | #define SPLAT_TIME_NAME "time" | |
33 | #define SPLAT_TIME_DESC "Kernel Time Tests" | |
34 | ||
35 | #define SPLAT_TIME_TEST1_ID 0x0801 | |
36 | #define SPLAT_TIME_TEST1_NAME "time1" | |
37 | #define SPLAT_TIME_TEST1_DESC "HZ Test" | |
38 | ||
39 | #define SPLAT_TIME_TEST2_ID 0x0802 | |
40 | #define SPLAT_TIME_TEST2_NAME "time2" | |
41 | #define SPLAT_TIME_TEST2_DESC "Monotonic Test" | |
42 | ||
43 | static int | |
44 | splat_time_test1(struct file *file, void *arg) | |
45 | { | |
46 | int myhz = hz; | |
47 | splat_vprint(file, SPLAT_TIME_TEST1_NAME, "hz is %d\n", myhz); | |
48 | return 0; | |
49 | } | |
50 | ||
51 | static int | |
52 | splat_time_test2(struct file *file, void *arg) | |
53 | { | |
54 | hrtime_t tm1, tm2; | |
55 | int i; | |
56 | ||
57 | tm1 = gethrtime(); | |
58 | splat_vprint(file, SPLAT_TIME_TEST2_NAME, "time is %lld\n", tm1); | |
59 | ||
60 | for(i = 0; i < 100; i++) { | |
61 | tm2 = gethrtime(); | |
62 | splat_vprint(file, SPLAT_TIME_TEST2_NAME, "time is %lld\n", tm2); | |
63 | ||
64 | if(tm1 > tm2) { | |
65 | splat_print(file, "%s: gethrtime() is not giving " | |
66 | "monotonically increasing values\n", | |
67 | SPLAT_TIME_TEST2_NAME); | |
68 | return 1; | |
69 | } | |
70 | tm1 = tm2; | |
71 | ||
72 | set_current_state(TASK_INTERRUPTIBLE); | |
73 | schedule_timeout(10); | |
74 | } | |
75 | ||
76 | return 0; | |
77 | } | |
78 | ||
79 | splat_subsystem_t * | |
80 | splat_time_init(void) | |
81 | { | |
82 | splat_subsystem_t *sub; | |
83 | ||
84 | sub = kmalloc(sizeof(*sub), GFP_KERNEL); | |
85 | if (sub == NULL) | |
86 | return NULL; | |
87 | ||
88 | memset(sub, 0, sizeof(*sub)); | |
89 | strncpy(sub->desc.name, SPLAT_TIME_NAME, SPLAT_NAME_SIZE); | |
90 | strncpy(sub->desc.desc, SPLAT_TIME_DESC, SPLAT_DESC_SIZE); | |
91 | INIT_LIST_HEAD(&sub->subsystem_list); | |
92 | INIT_LIST_HEAD(&sub->test_list); | |
93 | spin_lock_init(&sub->test_lock); | |
94 | sub->desc.id = SPLAT_SUBSYSTEM_TIME; | |
95 | ||
96 | SPLAT_TEST_INIT(sub, SPLAT_TIME_TEST1_NAME, SPLAT_TIME_TEST1_DESC, | |
97 | SPLAT_TIME_TEST1_ID, splat_time_test1); | |
98 | SPLAT_TEST_INIT(sub, SPLAT_TIME_TEST2_NAME, SPLAT_TIME_TEST2_DESC, | |
99 | SPLAT_TIME_TEST2_ID, splat_time_test2); | |
100 | ||
101 | return sub; | |
102 | } | |
103 | ||
104 | void | |
105 | splat_time_fini(splat_subsystem_t *sub) | |
106 | { | |
107 | ASSERT(sub); | |
108 | ||
109 | SPLAT_TEST_FINI(sub, SPLAT_TIME_TEST2_ID); | |
110 | SPLAT_TEST_FINI(sub, SPLAT_TIME_TEST1_ID); | |
111 | ||
112 | kfree(sub); | |
113 | } | |
114 | ||
115 | int | |
116 | splat_time_id(void) | |
117 | { | |
118 | return SPLAT_SUBSYSTEM_TIME; | |
119 | } |