From 0bcebe87b89a0885c19a86e16a7743b26fc78130 Mon Sep 17 00:00:00 2001 From: Michael Jeanson Date: Tue, 19 Dec 2017 16:10:23 -0500 Subject: [PATCH] Add preemptirq instrumentation The tracepoints were introduced in kernl 4.15 alongside the config option PREEMPTIRQ_EVENTS. This enables tracing of disable and enable events for preemption and irqs. For tracing preempt disable/enable events, DEBUG_PREEMPT must be enabled. For tracing irq disable/enable events, PROVE_LOCKING must be disabled. See upstream commit: commit d59158162e032917a428704160a2063a02405ec6 Author: Joel Fernandes Date: Tue Oct 10 15:51:37 2017 -0700 tracing: Add support for preempt and irq enable/disable events Preempt and irq trace events can be used for tracing the start and end of an atomic section which can be used by a trace viewer like systrace to graphically view the start and end of an atomic section and correlate them with latencies and scheduling issues. This also serves as a prelude to using synthetic events or probes to rewrite the preempt and irqsoff tracers, along with numerous benefits of using trace events features for these events. Link: http://lkml.kernel.org/r/20171006005432.14244-3-joelaf@google.com Link: http://lkml.kernel.org/r/20171010225137.17370-1-joelaf@google.com Signed-off-by: Michael Jeanson Signed-off-by: Mathieu Desnoyers --- .../events/lttng-module/preemptirq.h | 72 +++++++++++++++++++ probes/Kbuild | 4 ++ probes/lttng-probe-preemptirq.c | 49 +++++++++++++ 3 files changed, 125 insertions(+) create mode 100644 instrumentation/events/lttng-module/preemptirq.h create mode 100644 probes/lttng-probe-preemptirq.c diff --git a/instrumentation/events/lttng-module/preemptirq.h b/instrumentation/events/lttng-module/preemptirq.h new file mode 100644 index 00000000..ec4570c1 --- /dev/null +++ b/instrumentation/events/lttng-module/preemptirq.h @@ -0,0 +1,72 @@ +#ifdef CONFIG_PREEMPTIRQ_EVENTS + +#undef TRACE_SYSTEM +#define TRACE_SYSTEM preemptirq + +#if !defined(LTTNG_TRACE_PREEMPTIRQ_H) || defined(TRACE_HEADER_MULTI_READ) +#define LTTNG_TRACE_PREEMPTIRQ_H + +#include +#include +#include +#include + + +LTTNG_TRACEPOINT_EVENT_CLASS(preemptirq_template, + + TP_PROTO(unsigned long ip, unsigned long parent_ip), + + TP_ARGS(ip, parent_ip), + + TP_FIELDS( + ctf_integer_hex(unsigned long, caller, ip) + ctf_integer_hex(unsigned long, parent, parent_ip) + ) +) + +#ifndef CONFIG_PROVE_LOCKING +LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(preemptirq_template, irq_disable, + + preemptirq_irq_disable, + + TP_PROTO(unsigned long ip, unsigned long parent_ip), + + TP_ARGS(ip, parent_ip) +) + +LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(preemptirq_template, irq_enable, + + preemptirq_irq_enable, + + TP_PROTO(unsigned long ip, unsigned long parent_ip), + + TP_ARGS(ip, parent_ip) +) +#endif /* !CONFIG_PROVE_LOCKING */ + +#ifdef CONFIG_DEBUG_PREEMPT +LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(preemptirq_template, preempt_disable, + + preemptirq_preempt_disable, + + TP_PROTO(unsigned long ip, unsigned long parent_ip), + + TP_ARGS(ip, parent_ip) +) + +LTTNG_TRACEPOINT_EVENT_INSTANCE_MAP(preemptirq_template, preempt_enable, + + preemptirq_preempt_enable, + + TP_PROTO(unsigned long ip, unsigned long parent_ip), + + TP_ARGS(ip, parent_ip) +) +#endif /* CONFIG_DEBUG_PREEMPT */ + +#endif /* LTTNG_TRACE_PREEMPTIRQ_H */ + +/* This part must be outside protection */ +#include + +#endif /* CONFIG_PREEMPTIRQ_EVENTS */ diff --git a/probes/Kbuild b/probes/Kbuild index 70a3d868..ff9c5f56 100644 --- a/probes/Kbuild +++ b/probes/Kbuild @@ -266,4 +266,8 @@ ifneq ($(CONFIG_DYNAMIC_FTRACE),) endif endif # CONFIG_DYNAMIC_FTRACE +ifneq ($(CONFIG_PREEMPTIRQ_EVENTS),) + obj-$(CONFIG_LTTNG) += lttng-probe-preemptirq.o +endif # CONFIG_PREEMPTIRQ_EVENTS + # vim:syntax=make diff --git a/probes/lttng-probe-preemptirq.c b/probes/lttng-probe-preemptirq.c new file mode 100644 index 00000000..1270771b --- /dev/null +++ b/probes/lttng-probe-preemptirq.c @@ -0,0 +1,49 @@ +/* + * probes/lttng-probe-preemptirq.c + * + * LTTng preemptirq probes. + * + * Copyright (C) 2010-2012 Mathieu Desnoyers + * 2017 Michael Jeanson + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include + +/* + * Create the tracepoint static inlines from the kernel to validate that our + * trace event macros match the kernel we run on. + */ +#include + +/* + * Create LTTng tracepoint probes. + */ +#define LTTNG_PACKAGE_BUILD +#define CREATE_TRACE_POINTS +#define TRACE_INCLUDE_PATH instrumentation/events/lttng-module + +#include + +MODULE_LICENSE("GPL and additional rights"); +MODULE_AUTHOR("Michael Jeanson "); +MODULE_DESCRIPTION("LTTng preemptirq probes"); +MODULE_VERSION(__stringify(LTTNG_MODULES_MAJOR_VERSION) "." + __stringify(LTTNG_MODULES_MINOR_VERSION) "." + __stringify(LTTNG_MODULES_PATCHLEVEL_VERSION) + LTTNG_MODULES_EXTRAVERSION); -- 2.34.1