[PATCH v3 3/4] trace/preemptirq: add TRACE_IRQFLAGS_TOGGLE

Wander Lairson Costa posted 4 patches 3 weeks, 6 days ago
[PATCH v3 3/4] trace/preemptirq: add TRACE_IRQFLAGS_TOGGLE
Posted by Wander Lairson Costa 3 weeks, 6 days ago
The IRQ disable/enable tracepoints are currently gated behind
TRACE_IRQFLAGS, a hidden config that cannot be selected directly by
users. It is only enabled when selected by PROVE_LOCKING or
IRQSOFF_TRACER, both of which carry overhead beyond what is needed
for just the tracepoints.

Introduce TRACE_IRQFLAGS_TOGGLE, a user-selectable config that enables
the irq_disable and irq_enable tracepoints independently. It is
mutually exclusive with TRACE_IRQFLAGS and mirrors how
TRACE_PREEMPT_TOGGLE works for preemption tracepoints.

Make this option depend on CONFIG_JUMP_LABEL to avoid a circular header
dependency. Without TRACE_IRQFLAGS, irqflags.h must check the static
key before invoking the tracepoint. Using tracepoint_enabled() for this
check pulls in tracepoint_defs.h, which eventually includes atomic.h
and cmpxchg.h, circling back to irqflags.h. Enforcing CONFIG_JUMP_LABEL
allows the use of static_key_false() directly, avoiding the inclusion
of the full tracepoint header chain and preventing the cycle.

Signed-off-by: Wander Lairson Costa <wander@redhat.com>
---
 kernel/trace/Kconfig | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/kernel/trace/Kconfig b/kernel/trace/Kconfig
index e007459ecf361..8bea77b5f1200 100644
--- a/kernel/trace/Kconfig
+++ b/kernel/trace/Kconfig
@@ -162,7 +162,7 @@ config RING_BUFFER_ALLOW_SWAP
 
 config PREEMPTIRQ_TRACEPOINTS
 	bool
-	depends on TRACE_PREEMPT_TOGGLE || TRACE_IRQFLAGS
+	depends on TRACE_PREEMPT_TOGGLE || TRACE_IRQFLAGS || TRACE_IRQFLAGS_TOGGLE
 	select TRACING
 	default y
 	help
@@ -418,6 +418,17 @@ config TRACE_PREEMPT_TOGGLE
 	  Enables hooks into preemption disable and enable paths for
 	  tracing or latency measurement.
 
+config TRACE_IRQFLAGS_TOGGLE
+	bool "IRQ disable/enable tracing hooks"
+	default n
+	depends on TRACE_IRQFLAGS_SUPPORT && JUMP_LABEL && !TRACE_IRQFLAGS
+	help
+	  Enables hooks into IRQ disable and enable paths for tracing.
+
+	  This provides the irq_disable and irq_enable tracepoints
+	  without pulling in the full TRACE_IRQFLAGS infrastructure
+	  used by lockdep and the irqsoff latency tracer.
+
 config IRQSOFF_TRACER
 	bool "Interrupts-off Latency Tracer"
 	default n
-- 
2.53.0