1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #undef TRACE_SYSTEM 3 #define TRACE_SYSTEM ipi 4 5 #if !defined(_TRACE_IPI_H) || defined(TRACE_HEADER_MULTI_READ) 6 #define _TRACE_IPI_H 7 8 #include <linux/tracepoint.h> 9 10 /** 11 * ipi_raise - called when a smp cross call is made 12 * 13 * @mask: mask of recipient CPUs for the IPI 14 * @reason: string identifying the IPI purpose 15 * 16 * It is necessary for @reason to be a static string declared with 17 * __tracepoint_string. 18 */ 19 TRACE_EVENT(ipi_raise, 20 21 TP_PROTO(const struct cpumask *mask, const char *reason), 22 23 TP_ARGS(mask, reason), 24 25 TP_STRUCT__entry( 26 __bitmask(target_cpus, nr_cpumask_bits) 27 __field(const char *, reason) 28 ), 29 30 TP_fast_assign( 31 __assign_bitmask(target_cpus, cpumask_bits(mask), nr_cpumask_bits); 32 __entry->reason = reason; 33 ), 34 35 TP_printk("target_mask=%s (%s)", __get_bitmask(target_cpus), __entry->reason) 36 ); 37 38 TRACE_EVENT(ipi_send_cpu, 39 40 TP_PROTO(const unsigned int cpu, unsigned long callsite, void *callback), 41 42 TP_ARGS(cpu, callsite, callback), 43 44 TP_STRUCT__entry( 45 __field(unsigned int, cpu) 46 __field(void *, callsite) 47 __field(void *, callback) 48 ), 49 50 TP_fast_assign( 51 __entry->cpu = cpu; 52 __entry->callsite = (void *)callsite; 53 __entry->callback = callback; 54 ), 55 56 TP_printk("cpu=%u callsite=%pS callback=%pS", 57 __entry->cpu, __entry->callsite, __entry->callback) 58 ); 59 60 TRACE_EVENT(ipi_send_cpumask, 61 62 TP_PROTO(const struct cpumask *cpumask, unsigned long callsite, void *callback), 63 64 TP_ARGS(cpumask, callsite, callback), 65 66 TP_STRUCT__entry( 67 __cpumask(cpumask) 68 __field(void *, callsite) 69 __field(void *, callback) 70 ), 71 72 TP_fast_assign( 73 __assign_cpumask(cpumask, cpumask_bits(cpumask)); 74 __entry->callsite = (void *)callsite; 75 __entry->callback = callback; 76 ), 77 78 TP_printk("cpumask=%s callsite=%pS callback=%pS", 79 __get_cpumask(cpumask), __entry->callsite, __entry->callback) 80 ); 81 82 DECLARE_EVENT_CLASS(ipi_handler, 83 84 TP_PROTO(const char *reason), 85 86 TP_ARGS(reason), 87 88 TP_STRUCT__entry( 89 __field(const char *, reason) 90 ), 91 92 TP_fast_assign( 93 __entry->reason = reason; 94 ), 95 96 TP_printk("(%s)", __entry->reason) 97 ); 98 99 /** 100 * ipi_entry - called immediately before the IPI handler 101 * 102 * @reason: string identifying the IPI purpose 103 * 104 * It is necessary for @reason to be a static string declared with 105 * __tracepoint_string, ideally the same as used with trace_ipi_raise 106 * for that IPI. 107 */ 108 DEFINE_EVENT(ipi_handler, ipi_entry, 109 110 TP_PROTO(const char *reason), 111 112 TP_ARGS(reason) 113 ); 114 115 /** 116 * ipi_exit - called immediately after the IPI handler returns 117 * 118 * @reason: string identifying the IPI purpose 119 * 120 * It is necessary for @reason to be a static string declared with 121 * __tracepoint_string, ideally the same as used with trace_ipi_raise for 122 * that IPI. 123 */ 124 DEFINE_EVENT(ipi_handler, ipi_exit, 125 126 TP_PROTO(const char *reason), 127 128 TP_ARGS(reason) 129 ); 130 131 #endif /* _TRACE_IPI_H */ 132 133 /* This part must be outside protection */ 134 #include <trace/define_trace.h> 135