mirror of
https://github.com/torvalds/linux.git
synced 2026-05-12 16:18:45 +02:00
Bugzilla 217447 points out that ftrace bitmask fields still use the legacy dynamic-array format, which makes trace consumers treat them as unsigned long arrays instead of bitmaps. This is visible in the ipi events today: ipi_send_cpumask already reports its CPU mask as '__data_loc cpumask_t', but ipi_raise still exposes target_cpus as '__data_loc unsigned long[]'. Switch ipi_raise to __cpumask() and the matching helpers so its tracefs format matches the existing cpumask representation used by the other ipi event. The underlying storage size stays the same, but trace data consumers can now recognize the field as a cpumask directly. Link: https://patch.msgid.link/20260406162434.40767-1-create0818@163.com Link: https://bugzilla.kernel.org/show_bug.cgi?id=217447 Signed-off-by: CaoRuichuang <create0818@163.com> Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
137 lines
2.9 KiB
C
137 lines
2.9 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#undef TRACE_SYSTEM
|
|
#define TRACE_SYSTEM ipi
|
|
|
|
#if !defined(_TRACE_IPI_H) || defined(TRACE_HEADER_MULTI_READ)
|
|
#define _TRACE_IPI_H
|
|
|
|
#include <linux/tracepoint.h>
|
|
|
|
TRACE_EVENT(ipi_send_cpu,
|
|
|
|
TP_PROTO(const unsigned int cpu, unsigned long callsite, void *callback),
|
|
|
|
TP_ARGS(cpu, callsite, callback),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(unsigned int, cpu)
|
|
__field(void *, callsite)
|
|
__field(void *, callback)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->cpu = cpu;
|
|
__entry->callsite = (void *)callsite;
|
|
__entry->callback = callback;
|
|
),
|
|
|
|
TP_printk("cpu=%u callsite=%pS callback=%pS",
|
|
__entry->cpu, __entry->callsite, __entry->callback)
|
|
);
|
|
|
|
TRACE_EVENT(ipi_send_cpumask,
|
|
|
|
TP_PROTO(const struct cpumask *cpumask, unsigned long callsite, void *callback),
|
|
|
|
TP_ARGS(cpumask, callsite, callback),
|
|
|
|
TP_STRUCT__entry(
|
|
__cpumask(cpumask)
|
|
__field(void *, callsite)
|
|
__field(void *, callback)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__assign_cpumask(cpumask, cpumask_bits(cpumask));
|
|
__entry->callsite = (void *)callsite;
|
|
__entry->callback = callback;
|
|
),
|
|
|
|
TP_printk("cpumask=%s callsite=%pS callback=%pS",
|
|
__get_cpumask(cpumask), __entry->callsite, __entry->callback)
|
|
);
|
|
|
|
#ifdef CONFIG_HAVE_EXTRA_IPI_TRACEPOINTS
|
|
/**
|
|
* ipi_raise - called when a smp cross call is made
|
|
*
|
|
* @mask: mask of recipient CPUs for the IPI
|
|
* @reason: string identifying the IPI purpose
|
|
*
|
|
* It is necessary for @reason to be a static string declared with
|
|
* __tracepoint_string.
|
|
*/
|
|
TRACE_EVENT(ipi_raise,
|
|
|
|
TP_PROTO(const struct cpumask *mask, const char *reason),
|
|
|
|
TP_ARGS(mask, reason),
|
|
|
|
TP_STRUCT__entry(
|
|
__cpumask(target_cpus)
|
|
__field(const char *, reason)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__assign_cpumask(target_cpus, cpumask_bits(mask));
|
|
__entry->reason = reason;
|
|
),
|
|
|
|
TP_printk("target_mask=%s (%s)", __get_cpumask(target_cpus), __entry->reason)
|
|
);
|
|
|
|
DECLARE_EVENT_CLASS(ipi_handler,
|
|
|
|
TP_PROTO(const char *reason),
|
|
|
|
TP_ARGS(reason),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(const char *, reason)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->reason = reason;
|
|
),
|
|
|
|
TP_printk("(%s)", __entry->reason)
|
|
);
|
|
|
|
/**
|
|
* ipi_entry - called immediately before the IPI handler
|
|
*
|
|
* @reason: string identifying the IPI purpose
|
|
*
|
|
* It is necessary for @reason to be a static string declared with
|
|
* __tracepoint_string, ideally the same as used with trace_ipi_raise
|
|
* for that IPI.
|
|
*/
|
|
DEFINE_EVENT(ipi_handler, ipi_entry,
|
|
|
|
TP_PROTO(const char *reason),
|
|
|
|
TP_ARGS(reason)
|
|
);
|
|
|
|
/**
|
|
* ipi_exit - called immediately after the IPI handler returns
|
|
*
|
|
* @reason: string identifying the IPI purpose
|
|
*
|
|
* It is necessary for @reason to be a static string declared with
|
|
* __tracepoint_string, ideally the same as used with trace_ipi_raise for
|
|
* that IPI.
|
|
*/
|
|
DEFINE_EVENT(ipi_handler, ipi_exit,
|
|
|
|
TP_PROTO(const char *reason),
|
|
|
|
TP_ARGS(reason)
|
|
);
|
|
#endif /* CONFIG_HAVE_EXTRA_IPI_TRACEPOINTS */
|
|
|
|
#endif /* _TRACE_IPI_H */
|
|
|
|
/* This part must be outside protection */
|
|
#include <trace/define_trace.h>
|