linux.core: Add Priority/Thread name stats view for SWSLatency analysis This commit adds view and viewer classes for the Priority/Thread name statistics view. It also adds the view to SWS Latency analysis. The view groups entries in the SWS Latency analysis based on priority and name. [Added] Priority/Thread name statistics view for SWSLatency analysis Change-Id: I003932ae82f8c6594a9866f8da4bb9cfe2131f06 Signed-off-by: Hoang Thuan Pham <hoang.pham@calian.ca> Reviewed-on: https://git.eclipse.org/r/c/tracecompass/org.eclipse.tracecompass/+/204188 Tested-by: Trace Compass Bot <tracecompass-bot@eclipse.org> Tested-by: Matthew Khouzam <matthew.khouzam@ericsson.com> Reviewed-by: Patrick Tasse <patrick.tasse@gmail.com> Reviewed-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/plugin.xml b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/plugin.xml index 04dae35..d663007 100644 --- a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/plugin.xml +++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/plugin.xml
@@ -141,4 +141,11 @@ id="org.eclipse.tracecompass.internal.analysis.os.linux.core.threadstatus.ResourcesStatusDataProvider"> </dataProviderFactory> </extension> + <extension + point="org.eclipse.tracecompass.tmf.core.dataprovider"> + <dataProviderFactory + class="org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityThreadNameStatisticsDataProviderFactory" + id="org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityThreadNameStatisticsDataProvider"> + </dataProviderFactory> + </extension> </plugin>
diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/swslatency/SchedWS.java b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/swslatency/SchedWS.java index 9ede904..c8fef91 100644 --- a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/swslatency/SchedWS.java +++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/swslatency/SchedWS.java
@@ -15,6 +15,7 @@ import org.eclipse.tracecompass.datastore.core.interval.IHTIntervalReader; import org.eclipse.tracecompass.datastore.core.serialization.ISafeByteBufferWriter; import org.eclipse.tracecompass.datastore.core.serialization.SafeByteBufferFactory; +import org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.IPrioritySegment; import org.eclipse.tracecompass.segmentstore.core.ISegment; import org.eclipse.tracecompass.segmentstore.core.segment.interfaces.INamedSegment; import org.eclipse.tracecompass.tmf.core.model.ICoreElementResolver; @@ -29,7 +30,7 @@ * @author Abdellah Rahmani * @since 8.1 */ -public final class SchedWS implements INamedSegment, ICoreElementResolver { +public final class SchedWS implements INamedSegment, IPrioritySegment, ICoreElementResolver { private static final long serialVersionUID = 4183872871733170072L; @@ -132,6 +133,7 @@ * * @return The priority value of the thread */ + @Override public int getPriority() { return fPriority; }
diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/plugin.properties b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/plugin.properties index 71526e9..4793bad 100644 --- a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/plugin.properties +++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/plugin.properties
@@ -31,6 +31,9 @@ swslatency.table.view.name = Sched_Wakeup/Switch Latencies swslatency.scatter.view.name = Sched_Wakeup/Switch Latency vs Time swslatency.stats.view.name = Sched_Wakeup/Switch Latency Statistics +swslatency.stats.view.name.prioname = Sched_Wakeup/Switch Latency Priority/Thread name Statistics swslatency.density.view.name = Sched_Wakeup/Switch Density +view.segstore.statistics.prioname = Priority/Thread name Statistics + perspective.name = OS Tracing Overview
diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/plugin.xml b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/plugin.xml index d0d4fd0..82cc1a4 100644 --- a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/plugin.xml +++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/plugin.xml
@@ -30,6 +30,23 @@ restorable="true"> </view> <view + category="org.eclipse.linuxtools.tmf.ui.views.category" + class="org.eclipse.tracecompass.analysis.os.linux.ui.segmentstore.statistics.PriorityThreadNameStatisticsView" + icon="icons/eview16/statistics_view.gif" + id="org.eclipse.tracecompass.analysis.os.linux.ui.segmentstore.statistics.prioname" + name="%view.segstore.statistics.prioname" + restorable="true"> + </view> + <view + allowMultiple="false" + category="org.eclipse.linuxtools.lttng2.ui.views.category" + class="org.eclipse.tracecompass.analysis.os.linux.ui.segmentstore.statistics.PriorityThreadNameStatisticsView" + icon="icons/obj16/statistics_view.gif" + id="org.eclipse.tracecompass.analysis.os.linux.ui.segmentstore.statistics.prioname:org.eclipse.tracecompass.analysis.os.linux.core.swslatency.sws" + name="%swslatency.stats.view.name.prioname" + restorable="true"> + </view> + <view category="org.eclipse.linuxtools.lttng2.ui.views.category" class="org.eclipse.tracecompass.internal.analysis.os.linux.ui.views.swslatency.SWSLatencyDensityView" icon="icons/obj16/density.png" @@ -203,6 +220,13 @@ </output> <output class="org.eclipse.tracecompass.tmf.ui.analysis.TmfAnalysisViewOutput" + id="org.eclipse.tracecompass.analysis.os.linux.ui.segmentstore.statistics.prioname:org.eclipse.tracecompass.analysis.os.linux.core.swslatency.sws"> + <analysisModuleClass + class="org.eclipse.tracecompass.analysis.os.linux.core.swslatency.SWSLatencyAnalysis"> + </analysisModuleClass> + </output> + <output + class="org.eclipse.tracecompass.tmf.ui.analysis.TmfAnalysisViewOutput" id="org.eclipse.tracecompass.internal.analysis.os.linux.ui.views.swslatency.density"> <analysisModuleClass class="org.eclipse.tracecompass.analysis.os.linux.core.swslatency.SWSLatencyAnalysis">
diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/analysis/os/linux/ui/segmentstore/statistics/PriorityThreadNameStatisticsView.java b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/analysis/os/linux/ui/segmentstore/statistics/PriorityThreadNameStatisticsView.java new file mode 100644 index 0000000..d07a0d8 --- /dev/null +++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/analysis/os/linux/ui/segmentstore/statistics/PriorityThreadNameStatisticsView.java
@@ -0,0 +1,53 @@ +/********************************************************************** + * Copyright (c) 2023 Ericsson + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License 2.0 which + * accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + **********************************************************************/ + +package org.eclipse.tracecompass.analysis.os.linux.ui.segmentstore.statistics; + +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.statistics.AbstractSegmentsStatisticsView; +import org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.statistics.AbstractSegmentsStatisticsViewer; +import org.eclipse.tracecompass.common.core.NonNullUtils; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.views.IViewDescriptor; + +/** + * A segment store statistics view for showing statistics based on Priority and + * Thread name. The analysis specified by the secondaryId must create segments + * that implement IPrioritySegment. + * + * @author Hoang Thuan Pham + * @since 6.2 + */ +public class PriorityThreadNameStatisticsView extends AbstractSegmentsStatisticsView { + /** + * ID of this view + */ + public static final String ID = "org.eclipse.tracecompass.analysis.os.linux.ui.segmentstore.statistics.prioname"; //$NON-NLS-1$ + + @Override + public void createPartControl(@Nullable Composite parent) { + super.createPartControl(parent); + // Set the title of the view from the actual view ID + IViewDescriptor desc = PlatformUI.getWorkbench().getViewRegistry().find(getViewId()); + if (desc != null) { + setPartName(desc.getLabel()); + } + } + + @Override + protected @NonNull AbstractSegmentsStatisticsViewer createSegmentStoreStatisticsViewer(@NonNull Composite parent) { + // The analysis ID is the secondary ID of the view + String analysisId = NonNullUtils.nullToEmptyString(getViewSite().getSecondaryId()); + return new PriorityThreadNameStatisticsViewer(parent, analysisId); + } +}
diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/analysis/os/linux/ui/segmentstore/statistics/PriorityThreadNameStatisticsViewer.java b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/analysis/os/linux/ui/segmentstore/statistics/PriorityThreadNameStatisticsViewer.java new file mode 100644 index 0000000..433b22d --- /dev/null +++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/analysis/os/linux/ui/segmentstore/statistics/PriorityThreadNameStatisticsViewer.java
@@ -0,0 +1,37 @@ +/********************************************************************** + * Copyright (c) 2023 Ericsson + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License 2.0 which + * accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + **********************************************************************/ +package org.eclipse.tracecompass.analysis.os.linux.ui.segmentstore.statistics; + +import org.eclipse.swt.widgets.Composite; +import org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.statistics.AbstractSegmentsStatisticsViewer; +import org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityThreadNameStatisticsDataProviderFactory; + +/** + * A segment store statistics viewer for showing statistics based on Priority + * and Thread name. + * + * @author Hoang Thuan Pham + * @since 6.2 + */ +public class PriorityThreadNameStatisticsViewer extends AbstractSegmentsStatisticsViewer { + + /** + * Constructor + * + * @param parent + * The parent composite + * @param analysisId + * The ID of the segment store provider to do statistics on + */ + public PriorityThreadNameStatisticsViewer(Composite parent, String analysisId) { + super(parent, PriorityThreadNameStatisticsDataProviderFactory.DATA_PROVIDER_ID + ':' + analysisId); + } +}
diff --git a/releng/org.eclipse.tracecompass.integration.core.tests/src/org/eclipse/tracecompass/integration/core/tests/dataproviders/DataProviderManagerTest.java b/releng/org.eclipse.tracecompass.integration.core.tests/src/org/eclipse/tracecompass/integration/core/tests/dataproviders/DataProviderManagerTest.java index bd03506..fb0fd44 100644 --- a/releng/org.eclipse.tracecompass.integration.core.tests/src/org/eclipse/tracecompass/integration/core/tests/dataproviders/DataProviderManagerTest.java +++ b/releng/org.eclipse.tracecompass.integration.core.tests/src/org/eclipse/tracecompass/integration/core/tests/dataproviders/DataProviderManagerTest.java
@@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright (c) 2021 Ericsson + * Copyright (c) 2021, 2023 Ericsson * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License 2.0 which @@ -98,6 +98,12 @@ .setId("org.eclipse.tracecompass.internal.analysis.timing.core.segmentstore.scatter.dataprovider:lttng.analysis.futex"); EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); builder = new DataProviderDescriptor.Builder(); + builder.setName("Futex Contention Analysis - Priority/Thread name Statistics Table") + .setDescription("Show Priority/Thread name Statistics Table provided by Analysis module: Futex Contention Analysis") + .setProviderType(ProviderType.DATA_TREE) + .setId("org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityThreadNameStatisticsDataProvider:lttng.analysis.futex"); + EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); + builder = new DataProviderDescriptor.Builder(); builder.setName("Histogram") .setDescription("Show a histogram of number of events to time for a trace") .setProviderType(ProviderType.TREE_TIME_XY) @@ -128,6 +134,12 @@ .setId("org.eclipse.tracecompass.internal.analysis.timing.core.segmentstore.scatter.dataprovider:lttng.analysis.irq"); EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); builder = new DataProviderDescriptor.Builder(); + builder.setName("IRQ Analysis - Priority/Thread name Statistics Table") + .setDescription("Show Priority/Thread name Statistics Table provided by Analysis module: IRQ Analysis") + .setProviderType(ProviderType.DATA_TREE) + .setId("org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityThreadNameStatisticsDataProvider:lttng.analysis.irq"); + EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); + builder = new DataProviderDescriptor.Builder(); builder.setName("Memory Usage") .setDescription("Show the relative memory usage in the Linux kernel by process, can be filtered to show only the processes which were active on a time range") .setProviderType(ProviderType.TREE_TIME_XY) @@ -164,27 +176,41 @@ .setId("org.eclipse.tracecompass.internal.analysis.timing.core.segmentstore.scatter.dataprovider:org.eclipse.tracecompass.analysis.os.linux.latency.syscall"); EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); builder = new DataProviderDescriptor.Builder(); + builder.setName("System Call Latency - Priority/Thread name Statistics Table") + .setDescription("Show Priority/Thread name Statistics Table provided by Analysis module: System Call Latency") + .setProviderType(ProviderType.DATA_TREE) + .setId("org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityThreadNameStatisticsDataProvider:org.eclipse.tracecompass.analysis.os.linux.latency.syscall"); + EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); + builder = new DataProviderDescriptor.Builder(); builder.setName("Thread Status") .setDescription("Show the hierarchy of Linux threads and their status (RUNNING, SYSCALL, IRQ, IDLE)") .setProviderType(ProviderType.TIME_GRAPH) .setId("org.eclipse.tracecompass.internal.analysis.os.linux.core.threadstatus.ThreadStatusDataProvider"); EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); + builder = new DataProviderDescriptor.Builder(); builder.setName("Scheduler Wakeup to Scheduler Switch Latency - Latency Statistics") .setDescription("Show latency statistics provided by Analysis module: Scheduler Wakeup to Scheduler Switch Latency") .setProviderType(ProviderType.DATA_TREE) .setId("org.eclipse.tracecompass.analysis.timing.core.segmentstore.SegmentStoreStatisticsDataProvider:org.eclipse.tracecompass.analysis.os.linux.core.swslatency.sws"); EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); + builder = new DataProviderDescriptor.Builder(); builder.setName("Scheduler Wakeup to Scheduler Switch Latency - Latency Table") .setDescription("Show latency table provided by Analysis module: Scheduler Wakeup to Scheduler Switch Latency") .setProviderType(ProviderType.TABLE) .setId("org.eclipse.tracecompass.analysis.timing.core.segmentstore.SegmentStoreTableDataProvider:org.eclipse.tracecompass.analysis.os.linux.core.swslatency.sws"); EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); + builder = new DataProviderDescriptor.Builder(); builder.setName("Scheduler Wakeup to Scheduler Switch Latency - Latency vs Time") .setDescription("Show latencies provided by Analysis module: Scheduler Wakeup to Scheduler Switch Latency") .setProviderType(ProviderType.TREE_TIME_XY) .setId("org.eclipse.tracecompass.internal.analysis.timing.core.segmentstore.scatter.dataprovider:org.eclipse.tracecompass.analysis.os.linux.core.swslatency.sws"); EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); - + builder = new DataProviderDescriptor.Builder(); + builder.setName("Scheduler Wakeup to Scheduler Switch Latency - Priority/Thread name Statistics Table") + .setDescription("Show Priority/Thread name Statistics Table provided by Analysis module: Scheduler Wakeup to Scheduler Switch Latency") + .setProviderType(ProviderType.DATA_TREE) + .setId("org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityThreadNameStatisticsDataProvider:org.eclipse.tracecompass.analysis.os.linux.core.swslatency.sws"); + EXPECTED_KERNEL_DP_DESCRIPTORS.add(builder.build()); // UST Trace builder = new DataProviderDescriptor.Builder(); builder.setName("Events Table") @@ -234,6 +260,12 @@ .setProviderType(ProviderType.TREE_TIME_XY) .setId("org.eclipse.tracecompass.internal.analysis.timing.core.segmentstore.scatter.dataprovider:org.eclipse.linuxtools.lttng2.ust.analysis.callstack"); EXPECTED_UST_DP_DESCRIPTORS.add(builder.build()); + builder = new DataProviderDescriptor.Builder(); + builder.setName("LTTng-UST CallStack - Priority/Thread name Statistics Table") + .setDescription("Show Priority/Thread name Statistics Table provided by Analysis module: LTTng-UST CallStack") + .setProviderType(ProviderType.DATA_TREE) + .setId("org.eclipse.tracecompass.internal.analysis.os.linux.core.segmentstore.PriorityThreadNameStatisticsDataProvider:org.eclipse.linuxtools.lttng2.ust.analysis.callstack"); + EXPECTED_UST_DP_DESCRIPTORS.add(builder.build()); } /**