Skip to content

Commit f6d9804

Browse files
Nicolas Pitrerostedt
Nicolas Pitre
authored andcommitted
tracepoint: add generic tracepoint definitions for IPI tracing
The Inter Processor Interrupt is used to make another processor do a specific action such as rescheduling tasks, signal a timer event or execute something in another CPU's context. IRQs are already traceable but IPIs were not. Tracing them is useful for monitoring IPI latency, or to verify when they are the source of CPU wake-ups with power management implications. Three trace hooks are defined: ipi_raise, ipi_entry and ipi_exit. To make them portable, a string is used to identify them and correlate related events. Additionally, ipi_raise records a bitmask representing targeted CPUs. Link: http://lkml.kernel.org/p/[email protected] Acked-by: Daniel Lezcano <[email protected]> Signed-off-by: Nicolas Pitre <[email protected]> Signed-off-by: Steven Rostedt <[email protected]>
1 parent 3c49b52 commit f6d9804

File tree

1 file changed

+89
-0
lines changed
  • include/trace/events

1 file changed

+89
-0
lines changed

include/trace/events/ipi.h

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
#undef TRACE_SYSTEM
2+
#define TRACE_SYSTEM ipi
3+
4+
#if !defined(_TRACE_IPI_H) || defined(TRACE_HEADER_MULTI_READ)
5+
#define _TRACE_IPI_H
6+
7+
#include <linux/tracepoint.h>
8+
9+
/**
10+
* ipi_raise - called when a smp cross call is made
11+
*
12+
* @mask: mask of recipient CPUs for the IPI
13+
* @reason: string identifying the IPI purpose
14+
*
15+
* It is necessary for @reason to be a static string declared with
16+
* __tracepoint_string.
17+
*/
18+
TRACE_EVENT(ipi_raise,
19+
20+
TP_PROTO(const struct cpumask *mask, const char *reason),
21+
22+
TP_ARGS(mask, reason),
23+
24+
TP_STRUCT__entry(
25+
__bitmask(target_cpus, nr_cpumask_bits)
26+
__field(const char *, reason)
27+
),
28+
29+
TP_fast_assign(
30+
__assign_bitmask(target_cpus, cpumask_bits(mask), nr_cpumask_bits);
31+
__entry->reason = reason;
32+
),
33+
34+
TP_printk("target_mask=%s (%s)", __get_bitmask(target_cpus), __entry->reason)
35+
);
36+
37+
DECLARE_EVENT_CLASS(ipi_handler,
38+
39+
TP_PROTO(const char *reason),
40+
41+
TP_ARGS(reason),
42+
43+
TP_STRUCT__entry(
44+
__field(const char *, reason)
45+
),
46+
47+
TP_fast_assign(
48+
__entry->reason = reason;
49+
),
50+
51+
TP_printk("(%s)", __entry->reason)
52+
);
53+
54+
/**
55+
* ipi_entry - called immediately before the IPI handler
56+
*
57+
* @reason: string identifying the IPI purpose
58+
*
59+
* It is necessary for @reason to be a static string declared with
60+
* __tracepoint_string, ideally the same as used with trace_ipi_raise
61+
* for that IPI.
62+
*/
63+
DEFINE_EVENT(ipi_handler, ipi_entry,
64+
65+
TP_PROTO(const char *reason),
66+
67+
TP_ARGS(reason)
68+
);
69+
70+
/**
71+
* ipi_exit - called immediately after the IPI handler returns
72+
*
73+
* @reason: string identifying the IPI purpose
74+
*
75+
* It is necessary for @reason to be a static string declared with
76+
* __tracepoint_string, ideally the same as used with trace_ipi_raise for
77+
* that IPI.
78+
*/
79+
DEFINE_EVENT(ipi_handler, ipi_exit,
80+
81+
TP_PROTO(const char *reason),
82+
83+
TP_ARGS(reason)
84+
);
85+
86+
#endif /* _TRACE_IPI_H */
87+
88+
/* This part must be outside protection */
89+
#include <trace/define_trace.h>

0 commit comments

Comments
 (0)