diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2019-08-01 03:18:11 -0700 |
|---|---|---|
| committer | Linux Build Service Account <lnxbuild@localhost> | 2019-08-01 03:18:11 -0700 |
| commit | 12f1cbf68dc1628166291cc338457cdd752dac49 (patch) | |
| tree | a25f2f1b4643a0f7ed518dc4d6892369fc1da4ca /kernel/trace | |
| parent | b67de9bff3349bd73a16cecef3f1c3ef3806d3ed (diff) | |
| parent | 80cb08efce94fb197b05bc1c9dfaeb72a765eb96 (diff) | |
Merge 80cb08efce94fb197b05bc1c9dfaeb72a765eb96 on remote branch
Change-Id: I270427b762a19e22283edf694d7ca2585a228ad1
Diffstat (limited to 'kernel/trace')
| -rw-r--r-- | kernel/trace/trace.c | 6 | ||||
| -rw-r--r-- | kernel/trace/trace.h | 18 | ||||
| -rw-r--r-- | kernel/trace/trace_kdb.c | 6 |
3 files changed, 20 insertions, 10 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 1a9e7a6c2134..6368792ab807 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -7353,12 +7353,8 @@ void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) cnt++; - /* reset all but tr, trace, and overruns */ - memset(&iter.seq, 0, - sizeof(struct trace_iterator) - - offsetof(struct trace_iterator, seq)); + trace_iterator_reset(&iter); iter.iter_flags |= TRACE_FILE_LAT_FMT; - iter.pos = -1; if (trace_find_next_entry_inc(&iter) != NULL) { int ret; diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index e1265f95457f..f62768288592 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h @@ -1383,4 +1383,22 @@ static inline void trace_event_enum_update(struct trace_enum_map **map, int len) extern struct trace_iterator *tracepoint_print_iter; +/* + * Reset the state of the trace_iterator so that it can read consumed data. + * Normally, the trace_iterator is used for reading the data when it is not + * consumed, and must retain state. + */ +static __always_inline void trace_iterator_reset(struct trace_iterator *iter) +{ + const size_t offset = offsetof(struct trace_iterator, seq); + + /* + * Keep gcc from complaining about overwriting more than just one + * member in the structure. + */ + memset((char *)iter + offset, 0, sizeof(struct trace_iterator) - offset); + + iter->pos = -1; +} + #endif /* _LINUX_KERNEL_TRACE_H */ diff --git a/kernel/trace/trace_kdb.c b/kernel/trace/trace_kdb.c index 896458285fdd..cf6337dc41f4 100644 --- a/kernel/trace/trace_kdb.c +++ b/kernel/trace/trace_kdb.c @@ -40,12 +40,8 @@ static void ftrace_dump_buf(int skip_lines, long cpu_file) kdb_printf("Dumping ftrace buffer:\n"); - /* reset all but tr, trace, and overruns */ - memset(&iter.seq, 0, - sizeof(struct trace_iterator) - - offsetof(struct trace_iterator, seq)); + trace_iterator_reset(&iter); iter.iter_flags |= TRACE_FILE_LAT_FMT; - iter.pos = -1; if (cpu_file == RING_BUFFER_ALL_CPUS) { for_each_tracing_cpu(cpu) { |
