From: Michael Jeanson Date: Tue, 19 Dec 2017 21:10:23 +0000 (-0500) Subject: Add preemptirq instrumentation X-Git-Tag: v2.11.0-rc1~68 X-Git-Url: http://git.lttng.org/?p=lttng-modules.git;a=commitdiff_plain;h=0bcebe87b89a0885c19a86e16a7743b26fc78130 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 --- 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);