From 5aa7fe19cf2e2ada8d40c66c6b232f9331d51b99 Mon Sep 17 00:00:00 2001 From: Francis Giraldeau Date: Thu, 29 Oct 2015 10:15:23 -0400 Subject: [PATCH] analysis: support sched_waking event Use sched_waking event if available. This change is backward compatible with previous instrumentation. Change-Id: I28b07dc5cdfe988db8a1e11656eceac9856b1ae2 Signed-off-by: Francis Giraldeau Reviewed-on: https://git.eclipse.org/r/59231 Reviewed-by: Hudson CI Reviewed-by: Alexandre Montplaisir --- .../analysis/graph/core/base/TmfEdge.java | 5 +- .../CriticalPathAlgorithmBounded.java | 1 + .../CriticalPathPresentationProvider.java | 4 + .../criticalpath/view/CriticalPathView.java | 3 + .../LttngKernelExecGraphProvider.java | 30 ++-- .../analysis/graph/handlers/BaseHandler.java | 138 ++++++++++++++++-- .../graph/handlers/EventContextHandler.java | 14 +- .../TraceEventHandlerExecutionGraph.java | 33 ++--- .../handlers/TraceEventHandlerSched.java | 29 ++-- .../handlers/TraceEventHandlerStatedump.java | 4 +- 10 files changed, 186 insertions(+), 75 deletions(-) diff --git a/analysis/org.eclipse.tracecompass.analysis.graph.core/src/org/eclipse/tracecompass/analysis/graph/core/base/TmfEdge.java b/analysis/org.eclipse.tracecompass.analysis.graph.core/src/org/eclipse/tracecompass/analysis/graph/core/base/TmfEdge.java index e777a88702..5c9f4be159 100644 --- a/analysis/org.eclipse.tracecompass.analysis.graph.core/src/org/eclipse/tracecompass/analysis/graph/core/base/TmfEdge.java +++ b/analysis/org.eclipse.tracecompass.analysis.graph.core/src/org/eclipse/tracecompass/analysis/graph/core/base/TmfEdge.java @@ -79,8 +79,9 @@ public class TmfEdge { /** Worker is waiting for user input */ USER_INPUT, /** Block device */ - BLOCK_DEVICE - + BLOCK_DEVICE, + /** inter-processor interrupt */ + IPI, } private EdgeType fType; diff --git a/analysis/org.eclipse.tracecompass.analysis.graph.core/src/org/eclipse/tracecompass/internal/analysis/graph/core/criticalpath/CriticalPathAlgorithmBounded.java b/analysis/org.eclipse.tracecompass.analysis.graph.core/src/org/eclipse/tracecompass/internal/analysis/graph/core/criticalpath/CriticalPathAlgorithmBounded.java index 3649de80bf..ce5714b4cf 100644 --- a/analysis/org.eclipse.tracecompass.analysis.graph.core/src/org/eclipse/tracecompass/internal/analysis/graph/core/criticalpath/CriticalPathAlgorithmBounded.java +++ b/analysis/org.eclipse.tracecompass.analysis.graph.core/src/org/eclipse/tracecompass/internal/analysis/graph/core/criticalpath/CriticalPathAlgorithmBounded.java @@ -78,6 +78,7 @@ public class CriticalPathAlgorithmBounded extends AbstractCriticalPathAlgorithm break; } switch (nextEdge.getType()) { + case IPI: case USER_INPUT: case BLOCK_DEVICE: case TIMER: diff --git a/analysis/org.eclipse.tracecompass.analysis.graph.ui/src/org/eclipse/tracecompass/internal/analysis/graph/ui/criticalpath/view/CriticalPathPresentationProvider.java b/analysis/org.eclipse.tracecompass.analysis.graph.ui/src/org/eclipse/tracecompass/internal/analysis/graph/ui/criticalpath/view/CriticalPathPresentationProvider.java index 01d8dcba43..7c75c65171 100644 --- a/analysis/org.eclipse.tracecompass.analysis.graph.ui/src/org/eclipse/tracecompass/internal/analysis/graph/ui/criticalpath/view/CriticalPathPresentationProvider.java +++ b/analysis/org.eclipse.tracecompass.analysis.graph.ui/src/org/eclipse/tracecompass/internal/analysis/graph/ui/criticalpath/view/CriticalPathPresentationProvider.java @@ -42,6 +42,8 @@ public class CriticalPathPresentationProvider extends TimeGraphPresentationProvi USER_INPUT (new RGB(0x5a, 0x01, 0x01)), /** Worker is waiting on network */ NETWORK (new RGB(0xff, 0x9b, 0xff)), + /** Worker is waiting for an IPI */ + IPI (new RGB(0x66, 0x66, 0xcc)), /** Any other reason */ UNKNOWN (new RGB(0x40, 0x3b, 0x33)); @@ -92,6 +94,8 @@ public class CriticalPathPresentationProvider extends TimeGraphPresentationProvi return State.USER_INPUT; case 6: return State.NETWORK; + case 7: + return State.IPI; default: return State.UNKNOWN; } diff --git a/analysis/org.eclipse.tracecompass.analysis.graph.ui/src/org/eclipse/tracecompass/internal/analysis/graph/ui/criticalpath/view/CriticalPathView.java b/analysis/org.eclipse.tracecompass.analysis.graph.ui/src/org/eclipse/tracecompass/internal/analysis/graph/ui/criticalpath/view/CriticalPathView.java index a067abc813..cbd7306149 100644 --- a/analysis/org.eclipse.tracecompass.analysis.graph.ui/src/org/eclipse/tracecompass/internal/analysis/graph/ui/criticalpath/view/CriticalPathView.java +++ b/analysis/org.eclipse.tracecompass.analysis.graph.ui/src/org/eclipse/tracecompass/internal/analysis/graph/ui/criticalpath/view/CriticalPathView.java @@ -458,6 +458,9 @@ public class CriticalPathView extends AbstractTimeGraphView { case USER_INPUT: state = State.USER_INPUT; break; + case IPI: + state = State.IPI; + break; case EPS: case UNKNOWN: case DEFAULT: diff --git a/lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/building/LttngKernelExecGraphProvider.java b/lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/building/LttngKernelExecGraphProvider.java index 8ce57e0938..0f0e87d903 100644 --- a/lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/building/LttngKernelExecGraphProvider.java +++ b/lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/building/LttngKernelExecGraphProvider.java @@ -19,6 +19,7 @@ import org.eclipse.tracecompass.analysis.graph.core.base.TmfGraph; import org.eclipse.tracecompass.analysis.graph.core.base.TmfVertex; import org.eclipse.tracecompass.analysis.graph.core.base.TmfVertex.EdgeDirection; import org.eclipse.tracecompass.analysis.graph.core.building.AbstractTmfGraphProvider; +import org.eclipse.tracecompass.analysis.os.linux.core.trace.IKernelAnalysisEventLayout; import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.handlers.EventContextHandler; import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.handlers.TraceEventHandlerExecutionGraph; import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.handlers.TraceEventHandlerSched; @@ -51,7 +52,6 @@ import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; */ public class LttngKernelExecGraphProvider extends AbstractTmfGraphProvider { - private final LttngEventLayout fEventLayout; private final LttngSystemModel fSystem; /** @@ -65,7 +65,9 @@ public class LttngKernelExecGraphProvider extends AbstractTmfGraphProvider { /** The interrupt is an IRQ */ IRQ, /** The interrupt is a timer */ - HRTIMER + HRTIMER, + /** The inter-processor interrupt */ + IPI, } /** @@ -125,18 +127,6 @@ public class LttngKernelExecGraphProvider extends AbstractTmfGraphProvider { super(trace, "LTTng Kernel"); //$NON-NLS-1$ fSystem = new LttngSystemModel(); - /* - * TODO: factorize this code because it is duplicated everywhere to - * access layout - */ - if (trace instanceof LttngKernelTrace) { - - fEventLayout = (LttngEventLayout) ((LttngKernelTrace) trace).getKernelEventLayout(); - } else { - /* Fall-back to the base LttngEventLayout */ - fEventLayout = (LttngEventLayout) LttngEventLayout.getInstance(); - } - registerHandler(new TraceEventHandlerStatedump(this)); registerHandler(new TraceEventHandlerSched(this)); registerHandler(new EventContextHandler(this)); @@ -193,12 +183,18 @@ public class LttngKernelExecGraphProvider extends AbstractTmfGraphProvider { } /** - * Returns the event layout for the current trace + * Returns the event layout for the given trace + * + * @param trace + * the trace * * @return the eventLayout */ - public LttngEventLayout getEventLayout() { - return fEventLayout; + public IKernelAnalysisEventLayout getEventLayout(ITmfTrace trace) { + if (trace instanceof LttngKernelTrace) { + return ((LttngKernelTrace) trace).getKernelEventLayout(); + } + return LttngEventLayout.getInstance(); } /** diff --git a/lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/handlers/BaseHandler.java b/lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/handlers/BaseHandler.java index 460392d112..f0d6ef964d 100644 --- a/lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/handlers/BaseHandler.java +++ b/lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/handlers/BaseHandler.java @@ -15,7 +15,11 @@ import java.util.Map; import java.util.Set; import org.eclipse.tracecompass.analysis.graph.core.building.AbstractTraceEventHandler; +import org.eclipse.tracecompass.analysis.os.linux.core.trace.IKernelAnalysisEventLayout; +import org.eclipse.tracecompass.common.core.NonNullUtils; import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.building.LttngKernelExecGraphProvider; +import org.eclipse.tracecompass.internal.lttng2.kernel.core.trace.layout.Lttng27EventLayout; +import org.eclipse.tracecompass.internal.lttng2.kernel.core.trace.layout.Lttng28EventLayout; import org.eclipse.tracecompass.internal.lttng2.kernel.core.trace.layout.LttngEventLayout; import org.eclipse.tracecompass.tmf.core.event.ITmfEvent; import org.eclipse.tracecompass.tmf.core.event.ITmfEventType; @@ -33,20 +37,63 @@ import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager; public class BaseHandler extends AbstractTraceEventHandler { private final LttngKernelExecGraphProvider fProvider; - private Map fHasEventSchedTTWU; + + /** + * The fWakeupEventMap is populated with the prefered wake-up event for a + * given trace. Here is the possible values for LTTng, that are in priority + * order: + * + *
+     * - linux all versions and lttng all versions: sched_ttwu
+     * - linux >= 4.3 and lttng >= 2.8: sched_waking + sched_wakeup_new
+     * - linux < 3.8.0: sched_wakeup + sched_wakeup_new
+     * 
+ * + * The acronym ttwu stands for "Try To Wake Up". The sched_ttwu requires + * lttng-modules addons and works with all versions of linux and LTTng. This + * event alone is sufficient, because it a placeholder for both sched_wakeup + * and sched_wakeup_new. The event sched_wakeup_new is a special case, and + * is emitted when a process is created and is scheduled for the first time. + * Therefore, we use in priority sched_ttwu if available, then sched_waking + * and as a last resort, we use sched_wakup, but this last option will work + * only for older kernels. + * + * If the trace has more than one type of wake-up event enabled, we ensure + * that only one type will be processed. + */ + private Map fWakeupEventMap; BaseHandler(LttngKernelExecGraphProvider provider) { fProvider = provider; - fHasEventSchedTTWU = new HashMap<>(); + fWakeupEventMap = new HashMap<>(); ITmfTrace trace = getProvider().getTrace(); - LttngEventLayout layout = getProvider().getEventLayout(); Collection traceSet = TmfTraceManager.getTraceSet(trace); for (ITmfTrace traceItem : traceSet) { + IKernelAnalysisEventLayout layout = getProvider().getEventLayout(traceItem); if (traceItem instanceof ITmfTraceWithPreDefinedEvents) { Set content = ((ITmfTraceWithPreDefinedEvents) traceItem).getContainedEventTypes(); Set traceEvents = TmfEventTypeCollectionHelper.getEventNames(content); - boolean hasEvent = traceEvents.contains(layout.eventSchedProcessTTWU()); - fHasEventSchedTTWU.put(traceItem, hasEvent); + + /* default wake-up event */ + String wakeupEvent = layout.eventSchedProcessWakeup(); + + /* + * FIXME: downcast in the client should be avoided + */ + if (layout instanceof LttngEventLayout) { + LttngEventLayout lttngLayout = (LttngEventLayout) layout; + if (traceEvents.contains(lttngLayout.eventSchedProcessTTWU())) { + /* use sched_ttwu if available */ + wakeupEvent = lttngLayout.eventSchedProcessTTWU(); + } else if (layout instanceof Lttng28EventLayout) { + /* use sched_waking if available */ + Lttng28EventLayout layout28 = (Lttng28EventLayout) layout; + if (traceEvents.contains(layout28.eventSchedProcessWaking())) { + wakeupEvent = layout28.eventSchedProcessWaking(); + } + } + } + fWakeupEventMap.put(traceItem, wakeupEvent); } } } @@ -57,22 +104,85 @@ public class BaseHandler extends AbstractTraceEventHandler { * @return the graph provider */ public LttngKernelExecGraphProvider getProvider() { - return fProvider; + return NonNullUtils.checkNotNull(fProvider); } /** - * Return if the trace has the try to wake-up event + * Return if this event is a wake-up event for this trace * - * @param trace + * @param event * the trace to check - * @return if the trace has the try to wake-up event + * @return true if this is a wake-up event to process, false otherwise + */ + public boolean isWakeupEvent(ITmfEvent event) { + String eventName = event.getName(); + ITmfTrace trace = event.getTrace(); + IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace()); + String wakeupEventName = NonNullUtils.nullToEmptyString(fWakeupEventMap.get(trace)); + + /* First, check if sched_ttwu is the current wake-up event for this trace */ + if (eventLayout instanceof LttngEventLayout) { + LttngEventLayout layoutDefault = (LttngEventLayout) eventLayout; + if (wakeupEventName.equals(layoutDefault.eventSchedProcessTTWU())) { + return eventName.equals(layoutDefault.eventSchedProcessTTWU()); + } + } + + /* Fall back to built-in sched_waking and sched_wakeup_new */ + if (eventLayout instanceof Lttng28EventLayout) { + Lttng28EventLayout layout28 = (Lttng28EventLayout) eventLayout; + if (wakeupEventName.equals(layout28.eventSchedProcessWaking())) { + return (eventName.equals(layout28.eventSchedProcessWaking()) || + eventName.equals(layout28.eventSchedProcessWakeupNew())); + } + } + + /* Legacy support using built-in sched_wakeup and sched_wakeup_new */ + if (eventLayout instanceof LttngEventLayout) { + LttngEventLayout layoutDefault = (LttngEventLayout) eventLayout; + if (wakeupEventName.equals(layoutDefault.eventSchedProcessWakeup())) { + return (eventName.equals(layoutDefault.eventSchedProcessWakeup()) || + eventName.equals(layoutDefault.eventSchedProcessWakeupNew())); + } + } + return false; + } + + /** + * Return true if this event is an IPI entry + * + * @param event + * the event + * @return true of this is an IPI entry, false otherwise */ - public boolean traceHasEventSchedTTWU(ITmfTrace trace) { - Boolean ret = fHasEventSchedTTWU.get(trace); - if (ret == null) { - return false; + public boolean isIpiEntry(ITmfEvent event) { + return layoutContainsEvent(event, true); + } + + /** + * Return true if this event is an IPI exit + * + * @param event + * the event + * @return true of this is an IPI exit, false otherwise + */ + public boolean isIpiExit(ITmfEvent event) { + return layoutContainsEvent(event, false); + } + + private boolean layoutContainsEvent(ITmfEvent event, boolean entry) { + String eventName = event.getName(); + ITmfTrace trace = event.getTrace(); + IKernelAnalysisEventLayout layout = getProvider().getEventLayout(trace); + /* awkward downcast */ + if (layout instanceof Lttng27EventLayout) { + Lttng27EventLayout layout27 = (Lttng27EventLayout) layout; + if (entry) { + return layout27.getX86IrqVectorsEntry().contains(eventName); + } + return layout27.getX86IrqVectorsExit().contains(eventName); } - return ret; + return false; } @Override diff --git a/lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/handlers/EventContextHandler.java b/lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/handlers/EventContextHandler.java index d742dcae57..e6239b3558 100644 --- a/lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/handlers/EventContextHandler.java +++ b/lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/handlers/EventContextHandler.java @@ -40,7 +40,7 @@ public class EventContextHandler extends BaseHandler { @Override public void handleEvent(ITmfEvent event) { String eventName = event.getName(); - IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(); + IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace()); if (eventName.equals(eventLayout.eventSoftIrqEntry())) { handleSoftirqEntry(event); } else if (eventName.equals(eventLayout.eventSoftIrqExit())) { @@ -53,6 +53,10 @@ public class EventContextHandler extends BaseHandler { handleIrqHandlerEntry(event); } else if (eventName.equals(eventLayout.eventIrqHandlerExit())) { handleIrqHandlerExit(event); + } else if (isIpiEntry(event)) { + handleIpiEntry(event); + } else if (isIpiExit(event)) { + handleIpiExit(event); } } @@ -100,4 +104,12 @@ public class EventContextHandler extends BaseHandler { popInterruptContext(event, Context.HRTIMER); } + private void handleIpiEntry(ITmfEvent event) { + pushInterruptContext(event, Context.IPI); + } + + private void handleIpiExit(ITmfEvent event) { + popInterruptContext(event, Context.IPI); + } + } diff --git a/lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/handlers/TraceEventHandlerExecutionGraph.java b/lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/handlers/TraceEventHandlerExecutionGraph.java index bda64f932a..d72c238ff8 100644 --- a/lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/handlers/TraceEventHandlerExecutionGraph.java +++ b/lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/handlers/TraceEventHandlerExecutionGraph.java @@ -23,6 +23,7 @@ import org.eclipse.tracecompass.analysis.graph.core.base.TmfVertex; import org.eclipse.tracecompass.analysis.graph.core.base.TmfVertex.EdgeDirection; import org.eclipse.tracecompass.analysis.os.linux.core.kernelanalysis.LinuxValues; import org.eclipse.tracecompass.analysis.os.linux.core.model.HostThread; +import org.eclipse.tracecompass.analysis.os.linux.core.trace.IKernelAnalysisEventLayout; import org.eclipse.tracecompass.common.core.NonNullUtils; import org.eclipse.tracecompass.internal.lttng2.kernel.core.TcpEventStrings; import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.building.LttngKernelExecGraphProvider; @@ -32,7 +33,6 @@ import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model.LttngInterruptContext; import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model.LttngSystemModel; import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model.LttngWorker; -import org.eclipse.tracecompass.internal.lttng2.kernel.core.trace.layout.LttngEventLayout; import org.eclipse.tracecompass.tmf.core.event.ITmfEvent; import org.eclipse.tracecompass.tmf.core.event.aspect.TmfCpuAspect; import org.eclipse.tracecompass.tmf.core.event.matching.IMatchProcessingUnit; @@ -128,22 +128,10 @@ public class TraceEventHandlerExecutionGraph extends BaseHandler { @Override public void handleEvent(ITmfEvent ev) { String eventName = ev.getName(); - LttngEventLayout eventLayout = getProvider().getEventLayout(); + IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(ev.getTrace()); if (eventName.equals(eventLayout.eventSchedSwitch())) { handleSchedSwitch(ev); - } else if (eventName.equals(eventLayout.eventSchedProcessTTWU())) { - if (traceHasEventSchedTTWU(ev.getTrace())) { - handleSchedWakeup(ev); - } - } else if (eventName.equals(eventLayout.eventSchedProcessWakeup())) { - if (!traceHasEventSchedTTWU(ev.getTrace())) { - handleSchedWakeup(ev); - } - } else if (eventName.equals(eventLayout.eventSchedProcessWakeupNew())) { - if (!traceHasEventSchedTTWU(ev.getTrace())) { - handleSchedWakeup(ev); - } } else if (eventName.equals(eventLayout.eventSoftIrqEntry())) { handleSoftirqEntry(ev); } else if (eventName.equals(TcpEventStrings.INET_SOCK_LOCAL_IN) || @@ -152,6 +140,8 @@ public class TraceEventHandlerExecutionGraph extends BaseHandler { } else if (eventName.equals(TcpEventStrings.INET_SOCK_LOCAL_OUT) || eventName.equals(TcpEventStrings.NET_DEV_QUEUE)) { handleInetSockLocalOut(ev); + } else if (isWakeupEvent(ev)) { + handleSchedWakeup(ev); } } @@ -202,7 +192,7 @@ public class TraceEventHandlerExecutionGraph extends BaseHandler { private void handleSchedSwitch(ITmfEvent event) { String host = event.getTrace().getHostId(); long ts = event.getTimestamp().getValue(); - LttngEventLayout eventLayout = getProvider().getEventLayout(); + IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace()); LttngSystemModel system = getProvider().getSystem(); Integer next = EventField.getInt(event, eventLayout.fieldNextTid()); @@ -222,7 +212,7 @@ public class TraceEventHandlerExecutionGraph extends BaseHandler { TmfGraph graph = NonNullUtils.checkNotNull(getProvider().getAssignedGraph()); String host = event.getTrace().getHostId(); Integer cpu = NonNullUtils.checkNotNull(TmfTraceUtils.resolveIntEventAspectOfClassForEvent(event.getTrace(), TmfCpuAspect.class, event)); - LttngEventLayout eventLayout = getProvider().getEventLayout(); + IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace()); LttngSystemModel system = getProvider().getSystem(); long ts = event.getTimestamp().getValue(); @@ -254,7 +244,7 @@ public class TraceEventHandlerExecutionGraph extends BaseHandler { } } - private void waitBlocked(ITmfEvent event, TmfGraph graph, String host, Integer cpu, LttngEventLayout eventLayout, LttngSystemModel system, long ts, LttngWorker target, @Nullable LttngWorker current) { + private void waitBlocked(ITmfEvent event, TmfGraph graph, String host, Integer cpu, IKernelAnalysisEventLayout eventLayout, LttngSystemModel system, long ts, LttngWorker target, @Nullable LttngWorker current) { LttngInterruptContext context = system.peekContextStack(host, cpu); switch (context.getContext()) { case HRTIMER: @@ -267,6 +257,9 @@ public class TraceEventHandlerExecutionGraph extends BaseHandler { case SOFTIRQ: softIrq(event, graph, cpu, eventLayout, ts, target, context); break; + case IPI: + graph.append(target, new TmfVertex(ts), EdgeType.IPI); + break; case NONE: none(ts, target, current); break; @@ -275,7 +268,7 @@ public class TraceEventHandlerExecutionGraph extends BaseHandler { } } - private void softIrq(ITmfEvent event, TmfGraph graph, Integer cpu, LttngEventLayout eventLayout, long ts, LttngWorker target, LttngInterruptContext context) { + private void softIrq(ITmfEvent event, TmfGraph graph, Integer cpu, IKernelAnalysisEventLayout eventLayout, long ts, LttngWorker target, LttngInterruptContext context) { TmfVertex wup = new TmfVertex(ts); TmfEdge l2 = graph.append(target, wup); if (l2 != null) { @@ -306,7 +299,7 @@ public class TraceEventHandlerExecutionGraph extends BaseHandler { } } - private static void irq(TmfGraph graph, LttngEventLayout eventLayout, long ts, LttngWorker target, LttngInterruptContext context) { + private static void irq(TmfGraph graph, IKernelAnalysisEventLayout eventLayout, long ts, LttngWorker target, LttngInterruptContext context) { TmfEdge link = graph.append(target, new TmfVertex(ts)); if (link != null) { int vec = EventField.getLong(context.getEvent(), eventLayout.fieldIrq()).intValue(); @@ -402,7 +395,7 @@ public class TraceEventHandlerExecutionGraph extends BaseHandler { } private void handleSoftirqEntry(ITmfEvent event) { - LttngEventLayout eventLayout = getProvider().getEventLayout(); + IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace()); TmfGraph graph = NonNullUtils.checkNotNull(getProvider().getAssignedGraph()); Long vec = EventField.getLong(event, eventLayout.fieldVec()); if (vec == LinuxValues.SOFTIRQ_NET_RX || vec == LinuxValues.SOFTIRQ_NET_TX) { diff --git a/lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/handlers/TraceEventHandlerSched.java b/lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/handlers/TraceEventHandlerSched.java index 96b5a06882..d14bf52eee 100644 --- a/lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/handlers/TraceEventHandlerSched.java +++ b/lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/handlers/TraceEventHandlerSched.java @@ -11,13 +11,13 @@ package org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.hand import org.eclipse.tracecompass.analysis.os.linux.core.kernelanalysis.LinuxValues; import org.eclipse.tracecompass.analysis.os.linux.core.model.HostThread; +import org.eclipse.tracecompass.analysis.os.linux.core.trace.IKernelAnalysisEventLayout; import org.eclipse.tracecompass.common.core.NonNullUtils; import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.building.LttngKernelExecGraphProvider; import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.building.LttngKernelExecGraphProvider.ProcessStatus; import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model.EventField; import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model.LttngSystemModel; import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model.LttngWorker; -import org.eclipse.tracecompass.internal.lttng2.kernel.core.trace.layout.LttngEventLayout; import org.eclipse.tracecompass.tmf.core.event.ITmfEvent; import org.eclipse.tracecompass.tmf.core.event.aspect.TmfCpuAspect; import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils; @@ -43,34 +43,24 @@ public class TraceEventHandlerSched extends BaseHandler { @Override public void handleEvent(ITmfEvent ev) { String eventName = ev.getName(); - LttngEventLayout eventLayout = getProvider().getEventLayout(); + IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(ev.getTrace()); if (eventName.equals(eventLayout.eventSchedSwitch())) { handleSchedSwitch(ev); - } else if (eventName.equals(eventLayout.eventSchedProcessTTWU())) { - if (traceHasEventSchedTTWU(ev.getTrace())) { - handleSchedWakeup(ev); - } - } else if (eventName.equals(eventLayout.eventSchedProcessWakeup())) { - if (!traceHasEventSchedTTWU(ev.getTrace())) { - handleSchedWakeup(ev); - } - } else if (eventName.equals(eventLayout.eventSchedProcessWakeupNew())) { - if (!traceHasEventSchedTTWU(ev.getTrace())) { - handleSchedWakeup(ev); - } } else if (eventName.equals(eventLayout.eventSchedProcessFork())) { handleSchedProcessFork(ev); } else if (eventName.equals(eventLayout.eventSchedProcessExit())) { handleSchedProcessExit(ev); } else if (eventName.equals(eventLayout.eventSchedProcessExec())) { handleSchedProcessExec(ev); + } else if (isWakeupEvent(ev)) { + handleSchedWakeup(ev); } } private void handleSchedSwitch(ITmfEvent event) { Integer cpu = NonNullUtils.checkNotNull(TmfTraceUtils.resolveIntEventAspectOfClassForEvent(event.getTrace(), TmfCpuAspect.class, event)); - LttngEventLayout eventLayout = getProvider().getEventLayout(); + IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace()); LttngSystemModel system = getProvider().getSystem(); Integer next = EventField.getInt(event, eventLayout.fieldNextTid()); @@ -108,7 +98,7 @@ public class TraceEventHandlerSched extends BaseHandler { private void handleSchedProcessFork(ITmfEvent event) { String host = event.getTrace().getHostId(); - LttngEventLayout eventLayout = getProvider().getEventLayout(); + IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace()); LttngSystemModel system = getProvider().getSystem(); Integer childTid = EventField.getInt(event, eventLayout.fieldChildTid()); @@ -129,7 +119,7 @@ public class TraceEventHandlerSched extends BaseHandler { private void handleSchedWakeup(ITmfEvent event) { String host = event.getTrace().getHostId(); Integer cpu = NonNullUtils.checkNotNull(TmfTraceUtils.resolveIntEventAspectOfClassForEvent(event.getTrace(), TmfCpuAspect.class, event)); - LttngEventLayout eventLayout = getProvider().getEventLayout(); + IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace()); LttngSystemModel system = getProvider().getSystem(); Integer tid = EventField.getInt(event, eventLayout.fieldTid()); @@ -137,6 +127,7 @@ public class TraceEventHandlerSched extends BaseHandler { LttngWorker target = system.findWorker(targetHt); LttngWorker current = system.getWorkerOnCpu(host, cpu); + if (target == null) { String name = EventField.getOrDefault(event, eventLayout.fieldComm(), NonNullUtils.checkNotNull(Messages.TraceEventHandlerSched_UnknownThreadName)); target = new LttngWorker(targetHt, name, event.getTimestamp().getValue()); @@ -159,7 +150,7 @@ public class TraceEventHandlerSched extends BaseHandler { private void handleSchedProcessExit(ITmfEvent event) { String host = event.getTrace().getHostId(); - LttngEventLayout eventLayout = getProvider().getEventLayout(); + IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace()); LttngSystemModel system = getProvider().getSystem(); Integer tid = EventField.getInt(event, eventLayout.fieldTid()); @@ -173,7 +164,7 @@ public class TraceEventHandlerSched extends BaseHandler { private void handleSchedProcessExec(ITmfEvent event) { String host = event.getTrace().getHostId(); Integer cpu = NonNullUtils.checkNotNull(TmfTraceUtils.resolveIntEventAspectOfClassForEvent(event.getTrace(), TmfCpuAspect.class, event)); - LttngEventLayout eventLayout = getProvider().getEventLayout(); + IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace()); LttngSystemModel system = getProvider().getSystem(); String filename = EventField.getString(event, eventLayout.fieldFilename()); diff --git a/lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/handlers/TraceEventHandlerStatedump.java b/lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/handlers/TraceEventHandlerStatedump.java index 0c17d0cbd7..226aa200d6 100644 --- a/lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/handlers/TraceEventHandlerStatedump.java +++ b/lttng/org.eclipse.tracecompass.lttng2.kernel.core/src/org/eclipse/tracecompass/internal/lttng2/kernel/core/analysis/graph/handlers/TraceEventHandlerStatedump.java @@ -10,12 +10,12 @@ package org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.handlers; import org.eclipse.tracecompass.analysis.os.linux.core.model.HostThread; +import org.eclipse.tracecompass.analysis.os.linux.core.trace.IKernelAnalysisEventLayout; import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.building.LttngKernelExecGraphProvider; import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.building.LttngKernelExecGraphProvider.ProcessStatus; import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model.EventField; import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model.LttngSystemModel; import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model.LttngWorker; -import org.eclipse.tracecompass.internal.lttng2.kernel.core.trace.layout.LttngEventLayout; import org.eclipse.tracecompass.tmf.core.event.ITmfEvent; /** @@ -38,7 +38,7 @@ public class TraceEventHandlerStatedump extends BaseHandler { @Override public void handleEvent(ITmfEvent event) { - LttngEventLayout eventLayout = getProvider().getEventLayout(); + IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace()); LttngSystemModel system = getProvider().getSystem(); String eventName = event.getName(); if (!eventName.equals(eventLayout.eventStatedumpProcessState())) { -- 2.34.1