diff options
author | Johannes Berg <johannes.berg@intel.com> | 2019-05-06 08:39:38 -0400 |
---|---|---|
committer | Richard Weinberger <richard@nod.at> | 2019-07-02 17:27:00 -0400 |
commit | 56fc187065451ebca74edb30d50de5f10a88339b (patch) | |
tree | f1370d263c22e3e6597f2228280d2d5eb88ed8ed /arch/um | |
parent | fcd242c6c835dff4b5334b4db870f9fc23a8e7b7 (diff) |
um: Timer code cleanup
There are some unused functions, and some others that have
unused arguments; clean up the timer code a bit.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
Diffstat (limited to 'arch/um')
-rw-r--r-- | arch/um/include/shared/os.h | 8 | ||||
-rw-r--r-- | arch/um/kernel/time.c | 4 | ||||
-rw-r--r-- | arch/um/os-Linux/time.c | 119 |
3 files changed, 31 insertions, 100 deletions
diff --git a/arch/um/include/shared/os.h b/arch/um/include/shared/os.h index d579adcb2690..449e71edefaa 100644 --- a/arch/um/include/shared/os.h +++ b/arch/um/include/shared/os.h | |||
@@ -250,15 +250,13 @@ extern void os_warn(const char *fmt, ...) | |||
250 | 250 | ||
251 | /* time.c */ | 251 | /* time.c */ |
252 | extern void os_idle_sleep(unsigned long long nsecs); | 252 | extern void os_idle_sleep(unsigned long long nsecs); |
253 | extern int os_timer_create(void* timer); | 253 | extern int os_timer_create(void); |
254 | extern int os_timer_set_interval(void* timer, void* its); | 254 | extern int os_timer_set_interval(void); |
255 | extern int os_timer_one_shot(unsigned long ticks); | 255 | extern int os_timer_one_shot(unsigned long ticks); |
256 | extern long long os_timer_disable(void); | 256 | extern void os_timer_disable(void); |
257 | extern long os_timer_remain(void* timer); | ||
258 | extern void uml_idle_timer(void); | 257 | extern void uml_idle_timer(void); |
259 | extern long long os_persistent_clock_emulation(void); | 258 | extern long long os_persistent_clock_emulation(void); |
260 | extern long long os_nsecs(void); | 259 | extern long long os_nsecs(void); |
261 | extern long long os_vnsecs(void); | ||
262 | 260 | ||
263 | /* skas/mem.c */ | 261 | /* skas/mem.c */ |
264 | extern long run_syscall_stub(struct mm_id * mm_idp, | 262 | extern long run_syscall_stub(struct mm_id * mm_idp, |
diff --git a/arch/um/kernel/time.c b/arch/um/kernel/time.c index 0c572a48158e..3898119f773e 100644 --- a/arch/um/kernel/time.c +++ b/arch/um/kernel/time.c | |||
@@ -37,7 +37,7 @@ static int itimer_shutdown(struct clock_event_device *evt) | |||
37 | 37 | ||
38 | static int itimer_set_periodic(struct clock_event_device *evt) | 38 | static int itimer_set_periodic(struct clock_event_device *evt) |
39 | { | 39 | { |
40 | os_timer_set_interval(NULL, NULL); | 40 | os_timer_set_interval(); |
41 | return 0; | 41 | return 0; |
42 | } | 42 | } |
43 | 43 | ||
@@ -107,7 +107,7 @@ static void __init um_timer_setup(void) | |||
107 | printk(KERN_ERR "register_timer : request_irq failed - " | 107 | printk(KERN_ERR "register_timer : request_irq failed - " |
108 | "errno = %d\n", -err); | 108 | "errno = %d\n", -err); |
109 | 109 | ||
110 | err = os_timer_create(NULL); | 110 | err = os_timer_create(); |
111 | if (err != 0) { | 111 | if (err != 0) { |
112 | printk(KERN_ERR "creation of timer failed - errno = %d\n", -err); | 112 | printk(KERN_ERR "creation of timer failed - errno = %d\n", -err); |
113 | return; | 113 | return; |
diff --git a/arch/um/os-Linux/time.c b/arch/um/os-Linux/time.c index b28cc35da21f..ea720149f5b8 100644 --- a/arch/um/os-Linux/time.c +++ b/arch/um/os-Linux/time.c | |||
@@ -26,11 +26,11 @@ static inline long long timeval_to_ns(const struct timeval *tv) | |||
26 | 26 | ||
27 | static inline long long timespec_to_ns(const struct timespec *ts) | 27 | static inline long long timespec_to_ns(const struct timespec *ts) |
28 | { | 28 | { |
29 | return ((long long) ts->tv_sec * UM_NSEC_PER_SEC) + | 29 | return ((long long) ts->tv_sec * UM_NSEC_PER_SEC) + ts->tv_nsec; |
30 | ts->tv_nsec; | ||
31 | } | 30 | } |
32 | 31 | ||
33 | long long os_persistent_clock_emulation (void) { | 32 | long long os_persistent_clock_emulation(void) |
33 | { | ||
34 | struct timespec realtime_tp; | 34 | struct timespec realtime_tp; |
35 | 35 | ||
36 | clock_gettime(CLOCK_REALTIME, &realtime_tp); | 36 | clock_gettime(CLOCK_REALTIME, &realtime_tp); |
@@ -40,94 +40,45 @@ long long os_persistent_clock_emulation (void) { | |||
40 | /** | 40 | /** |
41 | * os_timer_create() - create an new posix (interval) timer | 41 | * os_timer_create() - create an new posix (interval) timer |
42 | */ | 42 | */ |
43 | int os_timer_create(void* timer) { | 43 | int os_timer_create(void) |
44 | 44 | { | |
45 | timer_t* t = timer; | 45 | timer_t *t = &event_high_res_timer; |
46 | |||
47 | if(t == NULL) { | ||
48 | t = &event_high_res_timer; | ||
49 | } | ||
50 | 46 | ||
51 | if (timer_create( | 47 | if (timer_create(CLOCK_MONOTONIC, NULL, t) == -1) |
52 | CLOCK_MONOTONIC, | ||
53 | NULL, | ||
54 | t) == -1) { | ||
55 | return -1; | 48 | return -1; |
56 | } | 49 | |
57 | return 0; | 50 | return 0; |
58 | } | 51 | } |
59 | 52 | ||
60 | int os_timer_set_interval(void* timer, void* i) | 53 | int os_timer_set_interval(void) |
61 | { | 54 | { |
62 | struct itimerspec its; | 55 | struct itimerspec its; |
63 | unsigned long long nsec; | 56 | unsigned long long nsec; |
64 | timer_t* t = timer; | ||
65 | struct itimerspec* its_in = i; | ||
66 | |||
67 | if(t == NULL) { | ||
68 | t = &event_high_res_timer; | ||
69 | } | ||
70 | 57 | ||
71 | nsec = UM_NSEC_PER_SEC / UM_HZ; | 58 | nsec = UM_NSEC_PER_SEC / UM_HZ; |
72 | 59 | ||
73 | if(its_in != NULL) { | 60 | its.it_value.tv_sec = 0; |
74 | its.it_value.tv_sec = its_in->it_value.tv_sec; | 61 | its.it_value.tv_nsec = nsec; |
75 | its.it_value.tv_nsec = its_in->it_value.tv_nsec; | ||
76 | } else { | ||
77 | its.it_value.tv_sec = 0; | ||
78 | its.it_value.tv_nsec = nsec; | ||
79 | } | ||
80 | 62 | ||
81 | its.it_interval.tv_sec = 0; | 63 | its.it_interval.tv_sec = 0; |
82 | its.it_interval.tv_nsec = nsec; | 64 | its.it_interval.tv_nsec = nsec; |
83 | 65 | ||
84 | if(timer_settime(*t, 0, &its, NULL) == -1) { | 66 | if (timer_settime(event_high_res_timer, 0, &its, NULL) == -1) |
85 | return -errno; | 67 | return -errno; |
86 | } | ||
87 | 68 | ||
88 | return 0; | 69 | return 0; |
89 | } | 70 | } |
90 | 71 | ||
91 | /** | ||
92 | * os_timer_remain() - returns the remaining nano seconds of the given interval | ||
93 | * timer | ||
94 | * Because this is the remaining time of an interval timer, which correspondends | ||
95 | * to HZ, this value can never be bigger than one second. Just | ||
96 | * the nanosecond part of the timer is returned. | ||
97 | * The returned time is relative to the start time of the interval timer. | ||
98 | * Return an negative value in an error case. | ||
99 | */ | ||
100 | long os_timer_remain(void* timer) | ||
101 | { | ||
102 | struct itimerspec its; | ||
103 | timer_t* t = timer; | ||
104 | |||
105 | if(t == NULL) { | ||
106 | t = &event_high_res_timer; | ||
107 | } | ||
108 | |||
109 | if(timer_gettime(t, &its) == -1) { | ||
110 | return -errno; | ||
111 | } | ||
112 | |||
113 | return its.it_value.tv_nsec; | ||
114 | } | ||
115 | |||
116 | int os_timer_one_shot(unsigned long ticks) | 72 | int os_timer_one_shot(unsigned long ticks) |
117 | { | 73 | { |
118 | struct itimerspec its; | 74 | unsigned long long nsec = ticks + 1; |
119 | unsigned long long nsec; | 75 | struct itimerspec its = { |
120 | unsigned long sec; | 76 | .it_value.tv_sec = nsec / UM_NSEC_PER_SEC, |
77 | .it_value.tv_nsec = nsec % UM_NSEC_PER_SEC, | ||
121 | 78 | ||
122 | nsec = (ticks + 1); | 79 | .it_interval.tv_sec = 0, |
123 | sec = nsec / UM_NSEC_PER_SEC; | 80 | .it_interval.tv_nsec = 0, // we cheat here |
124 | nsec = nsec % UM_NSEC_PER_SEC; | 81 | }; |
125 | |||
126 | its.it_value.tv_sec = nsec / UM_NSEC_PER_SEC; | ||
127 | its.it_value.tv_nsec = nsec; | ||
128 | |||
129 | its.it_interval.tv_sec = 0; | ||
130 | its.it_interval.tv_nsec = 0; // we cheat here | ||
131 | 82 | ||
132 | timer_settime(event_high_res_timer, 0, &its, NULL); | 83 | timer_settime(event_high_res_timer, 0, &its, NULL); |
133 | return 0; | 84 | return 0; |
@@ -135,24 +86,13 @@ int os_timer_one_shot(unsigned long ticks) | |||
135 | 86 | ||
136 | /** | 87 | /** |
137 | * os_timer_disable() - disable the posix (interval) timer | 88 | * os_timer_disable() - disable the posix (interval) timer |
138 | * Returns the remaining interval timer time in nanoseconds | ||
139 | */ | 89 | */ |
140 | long long os_timer_disable(void) | 90 | void os_timer_disable(void) |
141 | { | 91 | { |
142 | struct itimerspec its; | 92 | struct itimerspec its; |
143 | 93 | ||
144 | memset(&its, 0, sizeof(struct itimerspec)); | 94 | memset(&its, 0, sizeof(struct itimerspec)); |
145 | timer_settime(event_high_res_timer, 0, &its, &its); | 95 | timer_settime(event_high_res_timer, 0, &its, NULL); |
146 | |||
147 | return its.it_value.tv_sec * UM_NSEC_PER_SEC + its.it_value.tv_nsec; | ||
148 | } | ||
149 | |||
150 | long long os_vnsecs(void) | ||
151 | { | ||
152 | struct timespec ts; | ||
153 | |||
154 | clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&ts); | ||
155 | return timespec_to_ns(&ts); | ||
156 | } | 96 | } |
157 | 97 | ||
158 | long long os_nsecs(void) | 98 | long long os_nsecs(void) |
@@ -169,21 +109,14 @@ long long os_nsecs(void) | |||
169 | */ | 109 | */ |
170 | void os_idle_sleep(unsigned long long nsecs) | 110 | void os_idle_sleep(unsigned long long nsecs) |
171 | { | 111 | { |
172 | struct timespec ts; | 112 | struct timespec ts = { |
173 | 113 | .tv_sec = nsecs / UM_NSEC_PER_SEC, | |
174 | if (nsecs <= 0) { | 114 | .tv_nsec = nsecs % UM_NSEC_PER_SEC |
175 | return; | 115 | }; |
176 | } | ||
177 | |||
178 | ts = ((struct timespec) { | ||
179 | .tv_sec = nsecs / UM_NSEC_PER_SEC, | ||
180 | .tv_nsec = nsecs % UM_NSEC_PER_SEC | ||
181 | }); | ||
182 | 116 | ||
183 | /* | 117 | /* |
184 | * Relay the signal if clock_nanosleep is interrupted. | 118 | * Relay the signal if clock_nanosleep is interrupted. |
185 | */ | 119 | */ |
186 | if (clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, NULL)) { | 120 | if (clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, NULL)) |
187 | deliver_alarm(); | 121 | deliver_alarm(); |
188 | } | ||
189 | } | 122 | } |