From bd0e2f70acf7bbec9fab2acc4922030d30412d68 Mon Sep 17 00:00:00 2001 From: Alexandre Montplaisir Date: Sat, 8 Nov 2014 17:51:55 +0000 Subject: [PATCH] lttng: Experimental support for perf-CTF traces Implement initial support for perf kernel traces in CTF format. They can re-use the event layout capabilities introduced previously, so that we can add this support without implementing a completely new trace type and accompanying analyses. Also rename the "LTTng Kernel" trace type and analysis to "Linux Kernel", as they are now tracer-agnostic. The perf-in-CTF format is not set in stone yet, so the settings used here will most probably have to be updated in the future. Change-Id: I099f6e21caf40b9bfbe1a305c51947f1a264124b Signed-off-by: Alexandre Montplaisir Reviewed-on: https://git.eclipse.org/r/36200 Reviewed-by: Matthew Khouzam Tested-by: Hudson CI --- .../plugin.properties | 4 +- .../layout/IKernelAnalysisEventLayout.java | 4 +- .../core/trace/layout/LttngEventLayout.java | 2 +- .../core/trace/layout/PerfEventLayout.java | 175 ++++++++++++++++++ .../kernel/LttngKernelStateProvider.java | 5 +- .../kernel/core/trace/LttngKernelTrace.java | 13 +- 6 files changed, 195 insertions(+), 8 deletions(-) create mode 100644 org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/trace/layout/PerfEventLayout.java diff --git a/org.eclipse.tracecompass.lttng2.kernel.core/plugin.properties b/org.eclipse.tracecompass.lttng2.kernel.core/plugin.properties index 49100d405a..b5bafe2237 100644 --- a/org.eclipse.tracecompass.lttng2.kernel.core/plugin.properties +++ b/org.eclipse.tracecompass.lttng2.kernel.core/plugin.properties @@ -13,8 +13,8 @@ Bundle-Vendor = Eclipse Trace Compass Bundle-Name = Trace Compass LTTng Kernel Analysis Core Plug-in -tracetype.type.kernel = LTTng Kernel Trace -analysis.lttngkernel = LTTng Kernel Analysis +tracetype.type.kernel = Linux Kernel Trace +analysis.lttngkernel = Linux Kernel Analysis cpuusage.lttng.kernel = CPU usage diff --git a/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/trace/layout/IKernelAnalysisEventLayout.java b/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/trace/layout/IKernelAnalysisEventLayout.java index e10ff790ef..f2d39f1740 100644 --- a/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/trace/layout/IKernelAnalysisEventLayout.java +++ b/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/trace/layout/IKernelAnalysisEventLayout.java @@ -14,6 +14,8 @@ package org.eclipse.tracecompass.internal.lttng2.kernel.core.trace.layout; import java.util.Collection; +import org.eclipse.jdt.annotation.Nullable; + /** * Interface to define "concepts" present in the Linux kernel (represented by * its tracepoints), that can then be exposed by different tracers under @@ -52,7 +54,7 @@ public interface IKernelAnalysisEventLayout { String eventSchedProcessFork(); String eventSchedProcessExit(); String eventSchedProcessFree(); - String eventStatedumpProcessState(); + @Nullable String eventStatedumpProcessState(); String eventSyscallEntryPrefix(); String eventCompatSyscallEntryPrefix(); String eventSyscallExitPrefix(); diff --git a/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/trace/layout/LttngEventLayout.java b/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/trace/layout/LttngEventLayout.java index caae5710d4..494216c0ed 100644 --- a/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/trace/layout/LttngEventLayout.java +++ b/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/trace/layout/LttngEventLayout.java @@ -136,7 +136,7 @@ public class LttngEventLayout implements IKernelAnalysisEventLayout { } @Override - public String eventStatedumpProcessState() { + public @NonNull String eventStatedumpProcessState() { return STATEDUMP_PROCESS_STATE; } diff --git a/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/trace/layout/PerfEventLayout.java b/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/trace/layout/PerfEventLayout.java new file mode 100644 index 0000000000..bd39d2f39b --- /dev/null +++ b/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/trace/layout/PerfEventLayout.java @@ -0,0 +1,175 @@ +/******************************************************************************* + * Copyright (c) 2012, 2014 Ericsson + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License v1.0 which + * accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Alexandre Montplaisir - Initial API and implementation + ******************************************************************************/ + +package org.eclipse.tracecompass.internal.lttng2.kernel.core.trace.layout; + +import java.util.Collection; + +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; + +import com.google.common.collect.ImmutableList; + +/** + * Event and field definitions for perf traces in CTF format. + * + * @author Alexandre Montplaisir + */ +public class PerfEventLayout implements IKernelAnalysisEventLayout { + + private PerfEventLayout() {} + + private static final PerfEventLayout INSTANCE = new PerfEventLayout(); + + /** + * Get the singleton instance of this event layout object. + * + * @return The instance + */ + public static PerfEventLayout getInstance() { + return INSTANCE; + } + + // ------------------------------------------------------------------------ + // Event names + // ------------------------------------------------------------------------ + + @Override + public String eventIrqHandlerEntry() { + return "irq:irq_handler_exit"; //$NON-NLS-1$ + } + + @Override + public String eventIrqHandlerExit() { + return "irq:irq_handler_entry"; //$NON-NLS-1$ + } + + @Override + public String eventSoftIrqEntry() { + return "irq:softirq_entry"; //$NON-NLS-1$ + } + + @Override + public String eventSoftIrqExit() { + return "irq:softirq_exit"; //$NON-NLS-1$ + } + + @Override + public String eventSoftIrqRaise() { + return "irq:softirq_raise"; //$NON-NLS-1$ + } + + @Override + public String eventSchedSwitch() { + return "sched:sched_switch"; //$NON-NLS-1$ + } + + @SuppressWarnings("null") + private static final @NonNull Collection WAKEUP_EVENTS = ImmutableList.of( + "sched:sched_wakeup", "sched:sched_wakeup_new"); //$NON-NLS-1$ //$NON-NLS-2$ + + @Override + public Collection eventsSchedWakeup() { + return WAKEUP_EVENTS; + } + + @Override + public String eventSchedProcessFork() { + return "sched:sched_process_fork"; //$NON-NLS-1$ + } + + @Override + public String eventSchedProcessExit() { + return "sched:sched_process_exit"; //$NON-NLS-1$ + } + + @Override + public String eventSchedProcessFree() { + return "sched:sched_process_free"; //$NON-NLS-1$ + } + + @Override + public @Nullable String eventStatedumpProcessState() { + /* Not present in perf traces */ + return null; + } + + @Override + public String eventSyscallEntryPrefix() { + return "raw_syscalls:sys_enter"; //$NON-NLS-1$ + } + + @Override + public String eventCompatSyscallEntryPrefix() { + return eventSyscallEntryPrefix(); + } + + @Override + public String eventSyscallExitPrefix() { + return "raw_syscalls:sys_exit"; //$NON-NLS-1$ + } + + // ------------------------------------------------------------------------ + // Field names + // ------------------------------------------------------------------------ + + @Override + public String fieldIrq() { + return "irq"; //$NON-NLS-1$ + } + + @Override + public String fieldVec() { + return "vec"; //$NON-NLS-1$ + } + + @Override + public String fieldTid() { + return "pid"; //$NON-NLS-1$ + } + + @Override + public String fieldPrevTid() { + return "prev_pid"; //$NON-NLS-1$ + } + + @Override + public String fieldPrevState() { + return "prev_state"; //$NON-NLS-1$ + } + + @Override + public String fieldNextComm() { + return "next_comm"; //$NON-NLS-1$ + } + + @Override + public String fieldNextTid() { + return "next_pid"; //$NON-NLS-1$ + } + + @Override + public String fieldChildComm() { + return "child_comm"; //$NON-NLS-1$ + } + + @Override + public String fieldParentTid() { + return "parent_pid"; //$NON-NLS-1$ + } + + @Override + public String fieldChildTid() { + return "child_pid"; //$NON-NLS-1$ + } + +} diff --git a/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/lttng2/kernel/core/analysis/kernel/LttngKernelStateProvider.java b/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/lttng2/kernel/core/analysis/kernel/LttngKernelStateProvider.java index dc82941da7..b670fb0fde 100644 --- a/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/lttng2/kernel/core/analysis/kernel/LttngKernelStateProvider.java +++ b/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/lttng2/kernel/core/analysis/kernel/LttngKernelStateProvider.java @@ -107,7 +107,10 @@ public class LttngKernelStateProvider extends AbstractTmfStateProvider { builder.put(layout.eventSchedProcessFork(), SCHED_PROCESS_FORK_INDEX); builder.put(layout.eventSchedProcessExit(), SCHED_PROCESS_EXIT_INDEX); builder.put(layout.eventSchedProcessFree(), SCHED_PROCESS_FREE_INDEX); - builder.put(layout.eventStatedumpProcessState(), STATEDUMP_PROCESS_STATE_INDEX); + + if (layout.eventStatedumpProcessState() != null) { + builder.put(layout.eventStatedumpProcessState(), STATEDUMP_PROCESS_STATE_INDEX); + } for (String eventSchedWakeup : layout.eventsSchedWakeup()) { builder.put(eventSchedWakeup, SCHED_WAKEUP_INDEX); diff --git a/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/lttng2/kernel/core/trace/LttngKernelTrace.java b/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/lttng2/kernel/core/trace/LttngKernelTrace.java index bd225baaa6..c818492cee 100644 --- a/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/lttng2/kernel/core/trace/LttngKernelTrace.java +++ b/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/lttng2/kernel/core/trace/LttngKernelTrace.java @@ -26,6 +26,7 @@ import org.eclipse.tracecompass.ctf.core.trace.CTFTrace; import org.eclipse.tracecompass.internal.lttng2.kernel.core.Activator; import org.eclipse.tracecompass.internal.lttng2.kernel.core.trace.layout.IKernelAnalysisEventLayout; import org.eclipse.tracecompass.internal.lttng2.kernel.core.trace.layout.LttngEventLayout; +import org.eclipse.tracecompass.internal.lttng2.kernel.core.trace.layout.PerfEventLayout; import org.eclipse.tracecompass.tmf.core.event.ITmfEvent; import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException; import org.eclipse.tracecompass.internal.lttng2.kernel.core.trace.layout.Lttng26EventLayout; @@ -45,7 +46,8 @@ public class LttngKernelTrace extends CtfTmfTrace { */ private enum OriginTracer { LTTNG(LttngEventLayout.getInstance()), - LTTNG26(Lttng26EventLayout.getInstance()); + LTTNG26(Lttng26EventLayout.getInstance()), + PERF(PerfEventLayout.getInstance()); private final @NonNull IKernelAnalysisEventLayout fLayout; @@ -94,14 +96,19 @@ public class LttngKernelTrace extends CtfTmfTrace { * metadata */ Map traceEnv = this.getCTFTrace().getEnvironment(); + String domain = traceEnv.get("domain"); //$NON-NLS-1$ String tracerName = traceEnv.get("tracer_name"); //$NON-NLS-1$ String tracerMajor = traceEnv.get("tracer_major"); //$NON-NLS-1$ String tracerMinor = traceEnv.get("tracer_minor"); //$NON-NLS-1$ - if ("\"lttng-modules\"".equals(tracerName) && //$NON-NLS-1$ + if ("\"kernel-perf\"".equals(domain)) { //$NON-NLS-1$ + fOriginTracer = OriginTracer.PERF; + + } else if ("\"lttng-modules\"".equals(tracerName) && //$NON-NLS-1$ tracerMajor != null && (Integer.valueOf(tracerMajor) >= 2) && tracerMinor != null && (Integer.valueOf(tracerMinor) >= 6)) { fOriginTracer = OriginTracer.LTTNG26; + } else { fOriginTracer = OriginTracer.LTTNG; } @@ -122,7 +129,7 @@ public class LttngKernelTrace extends CtfTmfTrace { try (CTFTrace temp = new CTFTrace(path);) { /* Make sure the domain is "kernel" in the trace's env vars */ String dom = temp.getEnvironment().get("domain"); //$NON-NLS-1$ - if (dom != null && dom.equals("\"kernel\"")) { //$NON-NLS-1$ + if (dom != null && dom.startsWith("\"kernel")) { //$NON-NLS-1$ return new TraceValidationStatus(CONFIDENCE, Activator.PLUGIN_ID); } return new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.LttngKernelTrace_DomainError); -- 2.34.1