hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/kernel/trace/trace_irqsoff.c
....@@ -14,6 +14,7 @@
1414 #include <linux/uaccess.h>
1515 #include <linux/module.h>
1616 #include <linux/ftrace.h>
17
+#include <linux/kprobes.h>
1718
1819 #include "trace.h"
1920
....@@ -121,7 +122,7 @@
121122 if (!irqs_disabled_flags(*flags) && !preempt_count())
122123 return 0;
123124
124
- *data = per_cpu_ptr(tr->trace_buffer.data, cpu);
125
+ *data = per_cpu_ptr(tr->array_buffer.data, cpu);
125126 disabled = atomic_inc_return(&(*data)->disabled);
126127
127128 if (likely(disabled == 1))
....@@ -166,7 +167,7 @@
166167 per_cpu(tracing_cpu, cpu) = 0;
167168
168169 tr->max_latency = 0;
169
- tracing_reset_online_cpus(&irqsoff_trace->trace_buffer);
170
+ tracing_reset_online_cpus(&irqsoff_trace->array_buffer);
170171
171172 return start_irqsoff_tracer(irqsoff_trace, set);
172173 }
....@@ -218,6 +219,11 @@
218219 atomic_dec(&data->disabled);
219220 }
220221
222
+static struct fgraph_ops fgraph_ops = {
223
+ .entryfunc = &irqsoff_graph_entry,
224
+ .retfunc = &irqsoff_graph_return,
225
+};
226
+
221227 static void irqsoff_trace_open(struct trace_iterator *iter)
222228 {
223229 if (is_graph(iter->tr))
....@@ -233,7 +239,7 @@
233239
234240 #define GRAPH_TRACER_FLAGS (TRACE_GRAPH_PRINT_CPU | \
235241 TRACE_GRAPH_PRINT_PROC | \
236
- TRACE_GRAPH_PRINT_ABS_TIME | \
242
+ TRACE_GRAPH_PRINT_REL_TIME | \
237243 TRACE_GRAPH_PRINT_DURATION)
238244
239245 static enum print_line_t irqsoff_print_line(struct trace_iterator *iter)
....@@ -272,13 +278,6 @@
272278 #else
273279 #define __trace_function trace_function
274280
275
-#ifdef CONFIG_FUNCTION_TRACER
276
-static int irqsoff_graph_entry(struct ftrace_graph_ent *trace)
277
-{
278
- return -1;
279
-}
280
-#endif
281
-
282281 static enum print_line_t irqsoff_print_line(struct trace_iterator *iter)
283282 {
284283 return TRACE_TYPE_UNHANDLED;
....@@ -288,7 +287,6 @@
288287 static void irqsoff_trace_close(struct trace_iterator *iter) { }
289288
290289 #ifdef CONFIG_FUNCTION_TRACER
291
-static void irqsoff_graph_return(struct ftrace_graph_ret *trace) { }
292290 static void irqsoff_print_header(struct seq_file *s)
293291 {
294292 trace_default_header(s);
....@@ -368,7 +366,7 @@
368366 __trace_function(tr, CALLER_ADDR0, parent_ip, flags, pc);
369367 }
370368
371
-static inline void
369
+static nokprobe_inline void
372370 start_critical_timing(unsigned long ip, unsigned long parent_ip, int pc)
373371 {
374372 int cpu;
....@@ -384,7 +382,7 @@
384382 if (per_cpu(tracing_cpu, cpu))
385383 return;
386384
387
- data = per_cpu_ptr(tr->trace_buffer.data, cpu);
385
+ data = per_cpu_ptr(tr->array_buffer.data, cpu);
388386
389387 if (unlikely(!data) || atomic_read(&data->disabled))
390388 return;
....@@ -404,7 +402,7 @@
404402 atomic_dec(&data->disabled);
405403 }
406404
407
-static inline void
405
+static nokprobe_inline void
408406 stop_critical_timing(unsigned long ip, unsigned long parent_ip, int pc)
409407 {
410408 int cpu;
....@@ -422,7 +420,7 @@
422420 if (!tracer_enabled || !tracing_is_enabled())
423421 return;
424422
425
- data = per_cpu_ptr(tr->trace_buffer.data, cpu);
423
+ data = per_cpu_ptr(tr->array_buffer.data, cpu);
426424
427425 if (unlikely(!data) ||
428426 !data->critical_start || atomic_read(&data->disabled))
....@@ -446,6 +444,7 @@
446444 start_critical_timing(CALLER_ADDR0, CALLER_ADDR1, pc);
447445 }
448446 EXPORT_SYMBOL_GPL(start_critical_timings);
447
+NOKPROBE_SYMBOL(start_critical_timings);
449448
450449 void stop_critical_timings(void)
451450 {
....@@ -455,6 +454,7 @@
455454 stop_critical_timing(CALLER_ADDR0, CALLER_ADDR1, pc);
456455 }
457456 EXPORT_SYMBOL_GPL(stop_critical_timings);
457
+NOKPROBE_SYMBOL(stop_critical_timings);
458458
459459 #ifdef CONFIG_FUNCTION_TRACER
460460 static bool function_enabled;
....@@ -468,8 +468,7 @@
468468 return 0;
469469
470470 if (graph)
471
- ret = register_ftrace_graph(&irqsoff_graph_return,
472
- &irqsoff_graph_entry);
471
+ ret = register_ftrace_graph(&fgraph_ops);
473472 else
474473 ret = register_ftrace_function(tr->ops);
475474
....@@ -485,7 +484,7 @@
485484 return;
486485
487486 if (graph)
488
- unregister_ftrace_graph();
487
+ unregister_ftrace_graph(&fgraph_ops);
489488 else
490489 unregister_ftrace_function(tr->ops);
491490
....@@ -563,6 +562,8 @@
563562 /* non overwrite screws up the latency tracers */
564563 set_tracer_flag(tr, TRACE_ITER_OVERWRITE, 1);
565564 set_tracer_flag(tr, TRACE_ITER_LATENCY_FMT, 1);
565
+ /* without pause, we will produce garbage if another latency occurs */
566
+ set_tracer_flag(tr, TRACE_ITER_PAUSE_ON_TRACE, 1);
566567
567568 tr->max_latency = 0;
568569 irqsoff_trace = tr;
....@@ -584,11 +585,13 @@
584585 {
585586 int lat_flag = save_flags & TRACE_ITER_LATENCY_FMT;
586587 int overwrite_flag = save_flags & TRACE_ITER_OVERWRITE;
588
+ int pause_flag = save_flags & TRACE_ITER_PAUSE_ON_TRACE;
587589
588590 stop_irqsoff_tracer(tr, is_graph(tr));
589591
590592 set_tracer_flag(tr, TRACE_ITER_LATENCY_FMT, lat_flag);
591593 set_tracer_flag(tr, TRACE_ITER_OVERWRITE, overwrite_flag);
594
+ set_tracer_flag(tr, TRACE_ITER_PAUSE_ON_TRACE, pause_flag);
592595 ftrace_reset_array_ops(tr);
593596
594597 irqsoff_busy = false;
....@@ -615,6 +618,7 @@
615618 if (!preempt_trace(pc) && irq_trace())
616619 stop_critical_timing(a0, a1, pc);
617620 }
621
+NOKPROBE_SYMBOL(tracer_hardirqs_on);
618622
619623 void tracer_hardirqs_off(unsigned long a0, unsigned long a1)
620624 {
....@@ -623,6 +627,7 @@
623627 if (!preempt_trace(pc) && irq_trace())
624628 start_critical_timing(a0, a1, pc);
625629 }
630
+NOKPROBE_SYMBOL(tracer_hardirqs_off);
626631
627632 static int irqsoff_tracer_init(struct trace_array *tr)
628633 {