]>
Commit | Line | Data |
---|---|---|
716154c5 BB |
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>. | |
715f6251 BB |
6 | * UCRL-CODE-235197 |
7 | * | |
716154c5 | 8 | * This file is part of the SPL, Solaris Porting Layer. |
3d6af2dd | 9 | * For details, see <http://zfsonlinux.org/>. |
716154c5 BB |
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. | |
715f6251 | 15 | * |
716154c5 | 16 | * The SPL is distributed in the hope that it will be useful, but WITHOUT |
715f6251 BB |
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 | |
716154c5 BB |
22 | * with the SPL. If not, see <http://www.gnu.org/licenses/>. |
23 | ***************************************************************************** | |
24 | * Solaris Porting LAyer Tests (SPLAT) Time Tests. | |
25 | \*****************************************************************************/ | |
715f6251 | 26 | |
df870a69 | 27 | #include <sys/time.h> |
79a7ab25 | 28 | #include <linux/slab.h> |
7c50328b | 29 | #include "splat-internal.h" |
f1ca4da6 | 30 | |
7c50328b BB |
31 | #define SPLAT_TIME_NAME "time" |
32 | #define SPLAT_TIME_DESC "Kernel Time Tests" | |
f1ca4da6 | 33 | |
7c50328b BB |
34 | #define SPLAT_TIME_TEST1_ID 0x0801 |
35 | #define SPLAT_TIME_TEST1_NAME "time1" | |
36 | #define SPLAT_TIME_TEST1_DESC "HZ Test" | |
f1ca4da6 | 37 | |
7c50328b BB |
38 | #define SPLAT_TIME_TEST2_ID 0x0802 |
39 | #define SPLAT_TIME_TEST2_NAME "time2" | |
40 | #define SPLAT_TIME_TEST2_DESC "Monotonic Test" | |
f1ca4da6 BB |
41 | |
42 | static int | |
7c50328b | 43 | splat_time_test1(struct file *file, void *arg) |
f1ca4da6 BB |
44 | { |
45 | int myhz = hz; | |
7c50328b | 46 | splat_vprint(file, SPLAT_TIME_TEST1_NAME, "hz is %d\n", myhz); |
f1ca4da6 BB |
47 | return 0; |
48 | } | |
49 | ||
50 | static int | |
7c50328b | 51 | splat_time_test2(struct file *file, void *arg) |
f1ca4da6 BB |
52 | { |
53 | hrtime_t tm1, tm2; | |
54 | int i; | |
55 | ||
56 | tm1 = gethrtime(); | |
7c50328b | 57 | splat_vprint(file, SPLAT_TIME_TEST2_NAME, "time is %lld\n", tm1); |
f1ca4da6 BB |
58 | |
59 | for(i = 0; i < 100; i++) { | |
60 | tm2 = gethrtime(); | |
7c50328b | 61 | splat_vprint(file, SPLAT_TIME_TEST2_NAME, "time is %lld\n", tm2); |
f1ca4da6 BB |
62 | |
63 | if(tm1 > tm2) { | |
7c50328b BB |
64 | splat_print(file, "%s: gethrtime() is not giving " |
65 | "monotonically increasing values\n", | |
66 | SPLAT_TIME_TEST2_NAME); | |
f1ca4da6 BB |
67 | return 1; |
68 | } | |
69 | tm1 = tm2; | |
70 | ||
71 | set_current_state(TASK_INTERRUPTIBLE); | |
72 | schedule_timeout(10); | |
73 | } | |
74 | ||
75 | return 0; | |
76 | } | |
77 | ||
7c50328b BB |
78 | splat_subsystem_t * |
79 | splat_time_init(void) | |
f1ca4da6 | 80 | { |
7c50328b | 81 | splat_subsystem_t *sub; |
f1ca4da6 BB |
82 | |
83 | sub = kmalloc(sizeof(*sub), GFP_KERNEL); | |
84 | if (sub == NULL) | |
85 | return NULL; | |
86 | ||
87 | memset(sub, 0, sizeof(*sub)); | |
7c50328b BB |
88 | strncpy(sub->desc.name, SPLAT_TIME_NAME, SPLAT_NAME_SIZE); |
89 | strncpy(sub->desc.desc, SPLAT_TIME_DESC, SPLAT_DESC_SIZE); | |
f1ca4da6 BB |
90 | INIT_LIST_HEAD(&sub->subsystem_list); |
91 | INIT_LIST_HEAD(&sub->test_list); | |
92 | spin_lock_init(&sub->test_lock); | |
7c50328b | 93 | sub->desc.id = SPLAT_SUBSYSTEM_TIME; |
f1ca4da6 | 94 | |
7c50328b BB |
95 | SPLAT_TEST_INIT(sub, SPLAT_TIME_TEST1_NAME, SPLAT_TIME_TEST1_DESC, |
96 | SPLAT_TIME_TEST1_ID, splat_time_test1); | |
97 | SPLAT_TEST_INIT(sub, SPLAT_TIME_TEST2_NAME, SPLAT_TIME_TEST2_DESC, | |
98 | SPLAT_TIME_TEST2_ID, splat_time_test2); | |
f1ca4da6 BB |
99 | |
100 | return sub; | |
101 | } | |
102 | ||
103 | void | |
7c50328b | 104 | splat_time_fini(splat_subsystem_t *sub) |
f1ca4da6 BB |
105 | { |
106 | ASSERT(sub); | |
107 | ||
7c50328b BB |
108 | SPLAT_TEST_FINI(sub, SPLAT_TIME_TEST2_ID); |
109 | SPLAT_TEST_FINI(sub, SPLAT_TIME_TEST1_ID); | |
f1ca4da6 BB |
110 | |
111 | kfree(sub); | |
112 | } | |
113 | ||
114 | int | |
7c50328b | 115 | splat_time_id(void) |
f1ca4da6 | 116 | { |
7c50328b | 117 | return SPLAT_SUBSYSTEM_TIME; |
f1ca4da6 | 118 | } |