diff options
author | Tina Ruchandani <ruchandani.tina@gmail.com> | 2015-01-28 09:16:11 -0500 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2015-01-28 11:02:05 -0500 |
commit | da194930ede6d87945786f72b1c36c7a4ed0f3a6 (patch) | |
tree | 2f80664ea7f783844220d78907bdc17701a69862 /kernel | |
parent | 6ea22486ba46bcb665de36514094d74575cd1330 (diff) |
trace: Use 64-bit timekeeping
The ring_buffer_producer uses 'struct timeval' to measure
its start and end times. 'struct timeval' on 32-bit systems
will have its tv_sec value overflow in year 2038 and beyond.
This patch replaces struct timeval with 'ktime_t' which uses
64-bit representation for nanoseconds.
Link: http://lkml.kernel.org/r/20150128141611.GA2701@tinar
Suggested-by: Arnd Bergmann <arnd@arndb.de>
Suggested-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Tina Ruchandani <ruchandani.tina@gmail.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/trace/ring_buffer_benchmark.c | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/kernel/trace/ring_buffer_benchmark.c b/kernel/trace/ring_buffer_benchmark.c index 3f9e328c30b5..13d945c0d03f 100644 --- a/kernel/trace/ring_buffer_benchmark.c +++ b/kernel/trace/ring_buffer_benchmark.c | |||
@@ -7,7 +7,7 @@ | |||
7 | #include <linux/completion.h> | 7 | #include <linux/completion.h> |
8 | #include <linux/kthread.h> | 8 | #include <linux/kthread.h> |
9 | #include <linux/module.h> | 9 | #include <linux/module.h> |
10 | #include <linux/time.h> | 10 | #include <linux/ktime.h> |
11 | #include <asm/local.h> | 11 | #include <asm/local.h> |
12 | 12 | ||
13 | struct rb_page { | 13 | struct rb_page { |
@@ -17,7 +17,7 @@ struct rb_page { | |||
17 | }; | 17 | }; |
18 | 18 | ||
19 | /* run time and sleep time in seconds */ | 19 | /* run time and sleep time in seconds */ |
20 | #define RUN_TIME 10 | 20 | #define RUN_TIME 10ULL |
21 | #define SLEEP_TIME 10 | 21 | #define SLEEP_TIME 10 |
22 | 22 | ||
23 | /* number of events for writer to wake up the reader */ | 23 | /* number of events for writer to wake up the reader */ |
@@ -212,8 +212,7 @@ static void ring_buffer_consumer(void) | |||
212 | 212 | ||
213 | static void ring_buffer_producer(void) | 213 | static void ring_buffer_producer(void) |
214 | { | 214 | { |
215 | struct timeval start_tv; | 215 | ktime_t start_time, end_time, timeout; |
216 | struct timeval end_tv; | ||
217 | unsigned long long time; | 216 | unsigned long long time; |
218 | unsigned long long entries; | 217 | unsigned long long entries; |
219 | unsigned long long overruns; | 218 | unsigned long long overruns; |
@@ -227,7 +226,8 @@ static void ring_buffer_producer(void) | |||
227 | * make the system stall) | 226 | * make the system stall) |
228 | */ | 227 | */ |
229 | trace_printk("Starting ring buffer hammer\n"); | 228 | trace_printk("Starting ring buffer hammer\n"); |
230 | do_gettimeofday(&start_tv); | 229 | start_time = ktime_get(); |
230 | timeout = ktime_add_ns(start_time, RUN_TIME * NSEC_PER_SEC); | ||
231 | do { | 231 | do { |
232 | struct ring_buffer_event *event; | 232 | struct ring_buffer_event *event; |
233 | int *entry; | 233 | int *entry; |
@@ -244,7 +244,7 @@ static void ring_buffer_producer(void) | |||
244 | ring_buffer_unlock_commit(buffer, event); | 244 | ring_buffer_unlock_commit(buffer, event); |
245 | } | 245 | } |
246 | } | 246 | } |
247 | do_gettimeofday(&end_tv); | 247 | end_time = ktime_get(); |
248 | 248 | ||
249 | cnt++; | 249 | cnt++; |
250 | if (consumer && !(cnt % wakeup_interval)) | 250 | if (consumer && !(cnt % wakeup_interval)) |
@@ -264,7 +264,7 @@ static void ring_buffer_producer(void) | |||
264 | cond_resched(); | 264 | cond_resched(); |
265 | #endif | 265 | #endif |
266 | 266 | ||
267 | } while (end_tv.tv_sec < (start_tv.tv_sec + RUN_TIME) && !kill_test); | 267 | } while (ktime_before(end_time, timeout) && !kill_test); |
268 | trace_printk("End ring buffer hammer\n"); | 268 | trace_printk("End ring buffer hammer\n"); |
269 | 269 | ||
270 | if (consumer) { | 270 | if (consumer) { |
@@ -280,9 +280,7 @@ static void ring_buffer_producer(void) | |||
280 | wait_for_completion(&read_done); | 280 | wait_for_completion(&read_done); |
281 | } | 281 | } |
282 | 282 | ||
283 | time = end_tv.tv_sec - start_tv.tv_sec; | 283 | time = ktime_us_delta(end_time, start_time); |
284 | time *= USEC_PER_SEC; | ||
285 | time += (long long)((long)end_tv.tv_usec - (long)start_tv.tv_usec); | ||
286 | 284 | ||
287 | entries = ring_buffer_entries(buffer); | 285 | entries = ring_buffer_entries(buffer); |
288 | overruns = ring_buffer_overruns(buffer); | 286 | overruns = ring_buffer_overruns(buffer); |