hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/kernel/trace/trace_kdb.c
....@@ -17,22 +17,16 @@
1717 #include "trace.h"
1818 #include "trace_output.h"
1919
20
-static void ftrace_dump_buf(int skip_lines, long cpu_file)
20
+static struct trace_iterator iter;
21
+static struct ring_buffer_iter *buffer_iter[CONFIG_NR_CPUS];
22
+
23
+static void ftrace_dump_buf(int skip_entries, long cpu_file)
2124 {
22
- /* use static because iter can be a bit big for the stack */
23
- static struct trace_iterator iter;
24
- static struct ring_buffer_iter *buffer_iter[CONFIG_NR_CPUS];
2525 struct trace_array *tr;
2626 unsigned int old_userobj;
2727 int cnt = 0, cpu;
2828
29
- trace_init_global_iter(&iter);
30
- iter.buffer_iter = buffer_iter;
3129 tr = iter.tr;
32
-
33
- for_each_tracing_cpu(cpu) {
34
- atomic_inc(&per_cpu_ptr(iter.trace_buffer->data, cpu)->disabled);
35
- }
3630
3731 old_userobj = tr->trace_flags;
3832
....@@ -40,6 +34,8 @@
4034 tr->trace_flags &= ~TRACE_ITER_SYM_USEROBJ;
4135
4236 kdb_printf("Dumping ftrace buffer:\n");
37
+ if (skip_entries)
38
+ kdb_printf("(skipping %d entries)\n", skip_entries);
4339
4440 trace_iterator_reset(&iter);
4541 iter.iter_flags |= TRACE_FILE_LAT_FMT;
....@@ -47,7 +43,7 @@
4743 if (cpu_file == RING_BUFFER_ALL_CPUS) {
4844 for_each_tracing_cpu(cpu) {
4945 iter.buffer_iter[cpu] =
50
- ring_buffer_read_prepare(iter.trace_buffer->buffer,
46
+ ring_buffer_read_prepare(iter.array_buffer->buffer,
5147 cpu, GFP_ATOMIC);
5248 ring_buffer_read_start(iter.buffer_iter[cpu]);
5349 tracing_iter_reset(&iter, cpu);
....@@ -55,7 +51,7 @@
5551 } else {
5652 iter.cpu_file = cpu_file;
5753 iter.buffer_iter[cpu_file] =
58
- ring_buffer_read_prepare(iter.trace_buffer->buffer,
54
+ ring_buffer_read_prepare(iter.array_buffer->buffer,
5955 cpu_file, GFP_ATOMIC);
6056 ring_buffer_read_start(iter.buffer_iter[cpu_file]);
6157 tracing_iter_reset(&iter, cpu_file);
....@@ -66,11 +62,11 @@
6662 kdb_printf("---------------------------------\n");
6763 cnt++;
6864
69
- if (!skip_lines) {
65
+ if (!skip_entries) {
7066 print_trace_line(&iter);
7167 trace_printk_seq(&iter.seq);
7268 } else {
73
- skip_lines--;
69
+ skip_entries--;
7470 }
7571
7672 if (KDB_FLAG(CMD_INTERRUPT))
....@@ -86,10 +82,6 @@
8682 tr->trace_flags = old_userobj;
8783
8884 for_each_tracing_cpu(cpu) {
89
- atomic_dec(&per_cpu_ptr(iter.trace_buffer->data, cpu)->disabled);
90
- }
91
-
92
- for_each_tracing_cpu(cpu) {
9385 if (iter.buffer_iter[cpu]) {
9486 ring_buffer_read_finish(iter.buffer_iter[cpu]);
9587 iter.buffer_iter[cpu] = NULL;
....@@ -102,17 +94,19 @@
10294 */
10395 static int kdb_ftdump(int argc, const char **argv)
10496 {
105
- int skip_lines = 0;
97
+ int skip_entries = 0;
10698 long cpu_file;
10799 char *cp;
100
+ int cnt;
101
+ int cpu;
108102
109103 if (argc > 2)
110104 return KDB_ARGCOUNT;
111105
112106 if (argc) {
113
- skip_lines = simple_strtol(argv[1], &cp, 0);
107
+ skip_entries = simple_strtol(argv[1], &cp, 0);
114108 if (*cp)
115
- skip_lines = 0;
109
+ skip_entries = 0;
116110 }
117111
118112 if (argc == 2) {
....@@ -125,7 +119,29 @@
125119 }
126120
127121 kdb_trap_printk++;
128
- ftrace_dump_buf(skip_lines, cpu_file);
122
+
123
+ trace_init_global_iter(&iter);
124
+ iter.buffer_iter = buffer_iter;
125
+
126
+ for_each_tracing_cpu(cpu) {
127
+ atomic_inc(&per_cpu_ptr(iter.array_buffer->data, cpu)->disabled);
128
+ }
129
+
130
+ /* A negative skip_entries means skip all but the last entries */
131
+ if (skip_entries < 0) {
132
+ if (cpu_file == RING_BUFFER_ALL_CPUS)
133
+ cnt = trace_total_entries(NULL);
134
+ else
135
+ cnt = trace_total_entries_cpu(NULL, cpu_file);
136
+ skip_entries = max(cnt + skip_entries, 0);
137
+ }
138
+
139
+ ftrace_dump_buf(skip_entries, cpu_file);
140
+
141
+ for_each_tracing_cpu(cpu) {
142
+ atomic_dec(&per_cpu_ptr(iter.array_buffer->data, cpu)->disabled);
143
+ }
144
+
129145 kdb_trap_printk--;
130146
131147 return 0;
....@@ -133,8 +149,9 @@
133149
134150 static __init int kdb_ftrace_register(void)
135151 {
136
- kdb_register_flags("ftdump", kdb_ftdump, "[skip_#lines] [cpu]",
137
- "Dump ftrace log", 0, KDB_ENABLE_ALWAYS_SAFE);
152
+ kdb_register_flags("ftdump", kdb_ftdump, "[skip_#entries] [cpu]",
153
+ "Dump ftrace log; -skip dumps last #entries", 0,
154
+ KDB_ENABLE_ALWAYS_SAFE);
138155 return 0;
139156 }
140157