aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/ring_buffer.h2
-rw-r--r--kernel/trace/ring_buffer.c11
-rw-r--r--kernel/trace/trace.c33
-rw-r--r--kernel/trace/trace.h3
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);
179void ring_buffer_set_clock(struct ring_buffer *buffer, 179void ring_buffer_set_clock(struct ring_buffer *buffer,
180 u64 (*clock)(void)); 180 u64 (*clock)(void));
181void ring_buffer_set_time_stamp_abs(struct ring_buffer *buffer, bool abs);
182bool ring_buffer_time_stamp_abs(struct ring_buffer *buffer);
181 183
182size_t ring_buffer_page_len(void *page); 184size_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
493struct ring_buffer_iter { 494struct 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
1386void ring_buffer_set_time_stamp_abs(struct ring_buffer *buffer, bool abs)
1387{
1388 buffer->time_stamp_abs = abs;
1389}
1390
1391bool ring_buffer_time_stamp_abs(struct ring_buffer *buffer)
1392{
1393 return buffer->time_stamp_abs;
1394}
1395
1385static void rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer); 1396static void rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer);
1386 1397
1387static inline unsigned long rb_page_entries(struct buffer_page *bpage) 1398static 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
6285int 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
6285struct ftrace_buffer_info { 6316struct 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
278enum { 279enum {
@@ -286,6 +287,8 @@ extern struct mutex trace_types_lock;
286extern int trace_array_get(struct trace_array *tr); 287extern int trace_array_get(struct trace_array *tr);
287extern void trace_array_put(struct trace_array *tr); 288extern void trace_array_put(struct trace_array *tr);
288 289
290extern 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.