diff options
-rw-r--r-- | include/linux/ring_buffer.h | 2 | ||||
-rw-r--r-- | kernel/trace/ring_buffer.c | 11 | ||||
-rw-r--r-- | kernel/trace/trace.c | 33 | ||||
-rw-r--r-- | kernel/trace/trace.h | 3 |
4 files changed, 48 insertions, 1 deletions
diff --git a/include/linux/ring_buffer.h b/include/linux/ring_buffer.h index 7d9eb39fa76a..025159e17e1b 100644 --- a/include/linux/ring_buffer.h +++ b/include/linux/ring_buffer.h | |||
@@ -178,6 +178,8 @@ void ring_buffer_normalize_time_stamp(struct ring_buffer *buffer, | |||
178 | int cpu, u64 *ts); | 178 | int cpu, u64 *ts); |
179 | void ring_buffer_set_clock(struct ring_buffer *buffer, | 179 | void ring_buffer_set_clock(struct ring_buffer *buffer, |
180 | u64 (*clock)(void)); | 180 | u64 (*clock)(void)); |
181 | void ring_buffer_set_time_stamp_abs(struct ring_buffer *buffer, bool abs); | ||
182 | bool ring_buffer_time_stamp_abs(struct ring_buffer *buffer); | ||
181 | 183 | ||
182 | size_t ring_buffer_page_len(void *page); | 184 | size_t ring_buffer_page_len(void *page); |
183 | 185 | ||
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index dcf1c4dd3efe..2a03e069bbc6 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c | |||
@@ -488,6 +488,7 @@ struct ring_buffer { | |||
488 | u64 (*clock)(void); | 488 | u64 (*clock)(void); |
489 | 489 | ||
490 | struct rb_irq_work irq_work; | 490 | struct rb_irq_work irq_work; |
491 | bool time_stamp_abs; | ||
491 | }; | 492 | }; |
492 | 493 | ||
493 | struct ring_buffer_iter { | 494 | struct ring_buffer_iter { |
@@ -1382,6 +1383,16 @@ void ring_buffer_set_clock(struct ring_buffer *buffer, | |||
1382 | buffer->clock = clock; | 1383 | buffer->clock = clock; |
1383 | } | 1384 | } |
1384 | 1385 | ||
1386 | void ring_buffer_set_time_stamp_abs(struct ring_buffer *buffer, bool abs) | ||
1387 | { | ||
1388 | buffer->time_stamp_abs = abs; | ||
1389 | } | ||
1390 | |||
1391 | bool ring_buffer_time_stamp_abs(struct ring_buffer *buffer) | ||
1392 | { | ||
1393 | return buffer->time_stamp_abs; | ||
1394 | } | ||
1395 | |||
1385 | static void rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer); | 1396 | static void rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer); |
1386 | 1397 | ||
1387 | static inline unsigned long rb_page_entries(struct buffer_page *bpage) | 1398 | static inline unsigned long rb_page_entries(struct buffer_page *bpage) |
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 20a2300ae4e8..cba003f0362e 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
@@ -2269,7 +2269,7 @@ trace_event_buffer_lock_reserve(struct ring_buffer **current_rb, | |||
2269 | 2269 | ||
2270 | *current_rb = trace_file->tr->trace_buffer.buffer; | 2270 | *current_rb = trace_file->tr->trace_buffer.buffer; |
2271 | 2271 | ||
2272 | if ((trace_file->flags & | 2272 | if (!ring_buffer_time_stamp_abs(*current_rb) && (trace_file->flags & |
2273 | (EVENT_FILE_FL_SOFT_DISABLED | EVENT_FILE_FL_FILTERED)) && | 2273 | (EVENT_FILE_FL_SOFT_DISABLED | EVENT_FILE_FL_FILTERED)) && |
2274 | (entry = this_cpu_read(trace_buffered_event))) { | 2274 | (entry = this_cpu_read(trace_buffered_event))) { |
2275 | /* Try to use the per cpu buffer first */ | 2275 | /* Try to use the per cpu buffer first */ |
@@ -6282,6 +6282,37 @@ static int tracing_clock_open(struct inode *inode, struct file *file) | |||
6282 | return ret; | 6282 | return ret; |
6283 | } | 6283 | } |
6284 | 6284 | ||
6285 | int tracing_set_time_stamp_abs(struct trace_array *tr, bool abs) | ||
6286 | { | ||
6287 | int ret = 0; | ||
6288 | |||
6289 | mutex_lock(&trace_types_lock); | ||
6290 | |||
6291 | if (abs && tr->time_stamp_abs_ref++) | ||
6292 | goto out; | ||
6293 | |||
6294 | if (!abs) { | ||
6295 | if (WARN_ON_ONCE(!tr->time_stamp_abs_ref)) { | ||
6296 | ret = -EINVAL; | ||
6297 | goto out; | ||
6298 | } | ||
6299 | |||
6300 | if (--tr->time_stamp_abs_ref) | ||
6301 | goto out; | ||
6302 | } | ||
6303 | |||
6304 | ring_buffer_set_time_stamp_abs(tr->trace_buffer.buffer, abs); | ||
6305 | |||
6306 | #ifdef CONFIG_TRACER_MAX_TRACE | ||
6307 | if (tr->max_buffer.buffer) | ||
6308 | ring_buffer_set_time_stamp_abs(tr->max_buffer.buffer, abs); | ||
6309 | #endif | ||
6310 | out: | ||
6311 | mutex_unlock(&trace_types_lock); | ||
6312 | |||
6313 | return ret; | ||
6314 | } | ||
6315 | |||
6285 | struct ftrace_buffer_info { | 6316 | struct ftrace_buffer_info { |
6286 | struct trace_iterator iter; | 6317 | struct trace_iterator iter; |
6287 | void *spare; | 6318 | void *spare; |
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 2a6d0325a761..477341710ebf 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h | |||
@@ -273,6 +273,7 @@ struct trace_array { | |||
273 | /* function tracing enabled */ | 273 | /* function tracing enabled */ |
274 | int function_enabled; | 274 | int function_enabled; |
275 | #endif | 275 | #endif |
276 | int time_stamp_abs_ref; | ||
276 | }; | 277 | }; |
277 | 278 | ||
278 | enum { | 279 | enum { |
@@ -286,6 +287,8 @@ extern struct mutex trace_types_lock; | |||
286 | extern int trace_array_get(struct trace_array *tr); | 287 | extern int trace_array_get(struct trace_array *tr); |
287 | extern void trace_array_put(struct trace_array *tr); | 288 | extern void trace_array_put(struct trace_array *tr); |
288 | 289 | ||
290 | extern int tracing_set_time_stamp_abs(struct trace_array *tr, bool abs); | ||
291 | |||
289 | /* | 292 | /* |
290 | * The global tracer (top) should be the first trace array added, | 293 | * The global tracer (top) should be the first trace array added, |
291 | * but we check the flag anyway. | 294 | * but we check the flag anyway. |