diff options
| -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 2c92b3d9ea30..1c80521fd436 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
| @@ -8910,12 +8910,8 @@ void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) | |||
| 8910 | 8910 | ||
| 8911 | cnt++; | 8911 | cnt++; |
| 8912 | 8912 | ||
| 8913 | /* reset all but tr, trace, and overruns */ | 8913 | trace_iterator_reset(&iter); |
| 8914 | memset(&iter.seq, 0, | ||
| 8915 | sizeof(struct trace_iterator) - | ||
| 8916 | offsetof(struct trace_iterator, seq)); | ||
| 8917 | iter.iter_flags |= TRACE_FILE_LAT_FMT; | 8914 | iter.iter_flags |= TRACE_FILE_LAT_FMT; |
| 8918 | iter.pos = -1; | ||
| 8919 | 8915 | ||
| 8920 | if (trace_find_next_entry_inc(&iter) != NULL) { | 8916 | if (trace_find_next_entry_inc(&iter) != NULL) { |
| 8921 | int ret; | 8917 | int ret; |
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 82c70b63d375..005f08629b8b 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h | |||
| @@ -1966,4 +1966,22 @@ static inline void tracer_hardirqs_off(unsigned long a0, unsigned long a1) { } | |||
| 1966 | 1966 | ||
| 1967 | extern struct trace_iterator *tracepoint_print_iter; | 1967 | extern struct trace_iterator *tracepoint_print_iter; |
| 1968 | 1968 | ||
| 1969 | /* | ||
| 1970 | * Reset the state of the trace_iterator so that it can read consumed data. | ||
| 1971 | * Normally, the trace_iterator is used for reading the data when it is not | ||
| 1972 | * consumed, and must retain state. | ||
| 1973 | */ | ||
| 1974 | static __always_inline void trace_iterator_reset(struct trace_iterator *iter) | ||
| 1975 | { | ||
| 1976 | const size_t offset = offsetof(struct trace_iterator, seq); | ||
| 1977 | |||
| 1978 | /* | ||
| 1979 | * Keep gcc from complaining about overwriting more than just one | ||
| 1980 | * member in the structure. | ||
| 1981 | */ | ||
| 1982 | memset((char *)iter + offset, 0, sizeof(struct trace_iterator) - offset); | ||
| 1983 | |||
| 1984 | iter->pos = -1; | ||
| 1985 | } | ||
| 1986 | |||
| 1969 | #endif /* _LINUX_KERNEL_TRACE_H */ | 1987 | #endif /* _LINUX_KERNEL_TRACE_H */ |
diff --git a/kernel/trace/trace_kdb.c b/kernel/trace/trace_kdb.c index 6c1ae6b752d1..cca65044c14c 100644 --- a/kernel/trace/trace_kdb.c +++ b/kernel/trace/trace_kdb.c | |||
| @@ -37,12 +37,8 @@ static void ftrace_dump_buf(int skip_entries, long cpu_file) | |||
| 37 | if (skip_entries) | 37 | if (skip_entries) |
| 38 | kdb_printf("(skipping %d entries)\n", skip_entries); | 38 | kdb_printf("(skipping %d entries)\n", skip_entries); |
| 39 | 39 | ||
| 40 | /* reset all but tr, trace, and overruns */ | 40 | trace_iterator_reset(&iter); |
| 41 | memset(&iter.seq, 0, | ||
| 42 | sizeof(struct trace_iterator) - | ||
| 43 | offsetof(struct trace_iterator, seq)); | ||
| 44 | iter.iter_flags |= TRACE_FILE_LAT_FMT; | 41 | iter.iter_flags |= TRACE_FILE_LAT_FMT; |
| 45 | iter.pos = -1; | ||
| 46 | 42 | ||
| 47 | if (cpu_file == RING_BUFFER_ALL_CPUS) { | 43 | if (cpu_file == RING_BUFFER_ALL_CPUS) { |
| 48 | for_each_tracing_cpu(cpu) { | 44 | for_each_tracing_cpu(cpu) { |
