diff --git a/ipynb/sched_tune/stune_accounting_check_from_trace.ipynb b/ipynb/sched_tune/stune_accounting_check_from_trace.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..7d207e8e5b374e4c819eb2a1a61d789a94ddb900
--- /dev/null
+++ b/ipynb/sched_tune/stune_accounting_check_from_trace.ipynb
@@ -0,0 +1,193 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "SchedTune on JUNO
\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "2018-02-13 11:47:25,729 INFO : root : Using LISA logging configuration:\n",
+ "2018-02-13 11:47:25,746 INFO : root : /data/Code/lisa/logging.conf\n"
+ ]
+ }
+ ],
+ "source": [
+ "import logging\n",
+ "from conf import LisaLogging\n",
+ "LisaLogging.setup()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Populating the interactive namespace from numpy and matplotlib\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Generate plots inline\n",
+ "%pylab inline\n",
+ "\n",
+ "# Support for trace events analysis\n",
+ "from trace import Trace"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Experimental data loading"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Define here the trace to be analyized"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "2018-02-13 11:47:34,008 INFO : root : Content of the output folder ../../results_latest/\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\u001b[01;34m../../results_latest/\u001b[00m\r\n",
+ "├── BenchmarkResults.sqlite\r\n",
+ "├── \u001b[01;34mdmesg\u001b[00m\r\n",
+ "│ ├── after\r\n",
+ "│ └── before\r\n",
+ "├── jankbench_frames.csv\r\n",
+ "├── logcat.log\r\n",
+ "├── result.json\r\n",
+ "└── trace.dat\r\n",
+ "\r\n",
+ "1 directory, 7 files\r\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Base folder where tests folder are located\n",
+ "res_dir = '../../results_latest/'\n",
+ "logging.info('Content of the output folder %s', res_dir)\n",
+ "!tree {res_dir}"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Load Trace data\n",
+ "events = [\n",
+ " \"sched_switch\",\n",
+ "# \"sched_load_avg_cpu\",\n",
+ "# \"sched_load_avg_task\",\n",
+ " \"sched_tune_tasks_update\",\n",
+ "# \"sched_boost_cpu\",\n",
+ "# \"sched_boost_task\",\n",
+ "# \"sched_energy_diff\",\n",
+ "# \"cpu_frequency\",\n",
+ "# \"cpu_capacity\"\n",
+ "]\n",
+ "trace = Trace(None, res_dir, events)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "2018-02-13 11:47:35,951 INFO : root : Plotting SchedTune Accounting [2 CGroups, 2 CPUs]\n",
+ "2018-02-13 11:47:36,196 INFO : root : Detected maximum number of RUNNABLE tasks: 6\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\n/aDz3pH9i/9qfVY6Z32v2dXFVz58EwBrd5/ik6u2s/pP7+RD/2cLS2dPpe26yTyx4QC7Hr+fVltg\n739iM/u7evjZn7yfJzcfpn3XKb75+wtZs+sUa3d3FWwrJy72c8fyjZ6O6ZNPbc/6vPfkZRZfM9nT\nb2udcwM6079uvnbEZ//u/23NbD+xweqrux+/nw+76Go5ePzf9rDygRauf2R11mCYbje/+bfPlZT/\ntzcdGrPvPzz5kqffdi5fRjKls8YTrWHeY2voXL6MFZsP87X2N3ntsfsyAbSTfV3dOfPuGUxw4xfX\n8pnfnMO3Og4Qm3sl//RHbWPGrs7ly7jQO8T/3Xgws+/NU93c8Gg7Kx9oyUo755F2PrpkJl/73fd6\nOj4vzHmknc7ly9jf1T1mHHDS8ed3c/2Vra7fpWOAOgWHv+auB/1DSeZ/YQ2fvmc2s6a28Oc/fj3r\n+87ly/j7+CH+eu2+zL5XOi8w63Or6Vy+jLavrCel4fUvWmN9IpliziPtfHzpLB5dNp85j7Tz8O3X\n8viDN2bl+8SGA3yr4wC5WL3zJH/y9Gvct+AqnvyjNt7tiGfc2P+VD7oGlHMeaecPb72Gr/7OTXl/\n/6mntrNuTx+d9zKmrHSfmO3Q7NHfudm+9s/uYu60iTy55TD/e/WbbH/0t3hnq3ssMvfRdqZNambr\nX96btT89TqTbXLq+RnPP38Qz2xf6hnnw28/zxvFLmX3zv7Cm4JhQCoEFvEqpTwCfAGiaNjuobCvC\nrzZuCdsEALYdHyDo69p/v343iS5LDJ/auj+z321mZNXmvfSeHDsAAMSPJYjH41n72ju2cPDi2HxG\npxtN77A9W5xIsGrrwTHfP/v625ntjbuOEZ98zrJ/uxVU/qzjRVa+NhJIapcyf/TqcT409ULm8xNr\n93B94igAFwYKz6ZfuHDedb+znH87ZAWmP9j4WmbfL7f+Oit9+3PbuK55IPO7Q0esqxnHjh9jbWci\nk+dTr2TPLufy4Y87XuKuGY30DeuCafPRPVT491s2Z/eLsz2DmbRP7xrM2AOw9eBZ9h636qm9YzNX\nTrBEfX+XdTa/at0rtB+0jn3F+p3sPZ8qaHtPTy//uuEFz8e0ftQJ35qX3+Tq/iOef19rODW75apr\neSpuLffdfvRCvp+xdlPuwKYc9PT0oHW2Lvpp80ETj8e51N2Lm2bH43FWbe0D4FcbtzJzovusWa7j\n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\nQYg0/x/jdbOmCGtylwAAAABJRU5ErkJggg==\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "trace.analysis.stune.plotTasksUpdate(cpus=range(2), cgroups=range(2))"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 2",
+ "language": "python",
+ "name": "python2"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 2
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython2",
+ "version": "2.7.12"
+ },
+ "toc": {
+ "colors": {
+ "hover_highlight": "#DAA520",
+ "running_highlight": "#FF0000",
+ "selected_highlight": "#FFD700"
+ },
+ "moveMenuLeft": true,
+ "nav_menu": {
+ "height": "119px",
+ "width": "253px"
+ },
+ "navigate_menu": true,
+ "number_sections": true,
+ "sideBar": true,
+ "threshold": 4,
+ "toc_cell": false,
+ "toc_section_display": "block",
+ "toc_window_display": false
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
diff --git a/libs/utils/analysis/stune_analysis.py b/libs/utils/analysis/stune_analysis.py
new file mode 100644
index 0000000000000000000000000000000000000000..32bcd7789f5ed7f561a8a7279476e083402f4629
--- /dev/null
+++ b/libs/utils/analysis/stune_analysis.py
@@ -0,0 +1,129 @@
+# SPDX-License-Identifier: Apache-2.0
+#
+# Copyright (C) 2015, ARM Limited and contributors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+""" SchedTune Analysis Module """
+
+import matplotlib.gridspec as gridspec
+import matplotlib.pyplot as plt
+import numpy as np
+import pylab as pl
+
+from analysis_module import AnalysisModule
+from devlib.utils.misc import memoized
+from trappy.utils import listify
+
+# Configure logging
+import logging
+
+
+class STuneAnalysis(AnalysisModule):
+ """
+ Support for SchedTune signals anaysis
+
+ :param trace: input Trace object
+ :type trace: :mod:`libs.utils.Trace`
+ """
+
+ def __init__(self, trace):
+ super(STuneAnalysis, self).__init__(trace)
+
+###############################################################################
+# DataFrame Getter Methods
+###############################################################################
+
+ @memoized
+ def _dfg_tasks_updates(self, cpus=None, cgroups=None):
+ if not self._trace.hasEvents('sched_tune_tasks_update'):
+ logging.warn('Events [sched_tune_tasks_updates] not found, '
+ 'cannot get schedtune tasks updates!')
+ return None
+
+ # Get SchedTune Accouting data
+ df = self._dfg_trace_event('sched_tune_tasks_update')
+
+ # Get number of CPUs to plot
+ if cpus:
+ # Filter on requested CPUs
+ cpus = listify(cpus)
+ df = df[df.cpu.isin(cpus)]
+
+ # Get number of CGROUPs to plot
+ if cgroups:
+ # Filter on requested CGROUPs
+ cgroups = listify(cgroups)
+ df = df[df.idx.isin(cgroups)]
+
+ return df
+
+
+###############################################################################
+# Plotting Methods
+###############################################################################
+
+ def plotTasksUpdate(self, cpus=None, cgroups=None, xlim=(0,None)):
+ """ Plot SchedTune accouting on specified cpus/cgroups
+ """
+
+ if not self._trace.hasEvents('sched_tune_tasks_update'):
+ logging.warn('Event [sched_tune_tasks_update] not found, plot DISABLED!')
+ return
+ df = self._dfg_tasks_updates(cpus, cgroups)
+ if df is None:
+ return
+
+ # Get number of CPUs to plot
+ cpus = df.cpu.unique()
+ cpus_cnt = cpus.size
+ cpus = sorted(cpus.tolist())
+
+ # Ger number of CGROUPS to plot
+ cgroups = df.idx.unique()
+ cgroups_cnt = cgroups.size
+ cgroups = sorted(cgroups.tolist())
+
+ # Get maximum number of RUNNABLE tasks in a single RQ
+ ymax = df.tasks.max() + 1
+
+ logging.info("Plotting SchedTune Accounting [%d CGroups, %d CPUs]",
+ cgroups_cnt, cpus_cnt)
+ gs = gridspec.GridSpec(cpus_cnt, cgroups_cnt);
+ fig = plt.figure(figsize=(6*cgroups_cnt, 3*cpus_cnt));
+
+ for cpu_idx, cpu in enumerate(cpus):
+ for cg_idx, cg in enumerate(cgroups):
+ axes = plt.subplot(gs[cpu_idx, cg_idx])
+
+ # Get accouting data for current CPU and CGroup
+ data = df[(df.cpu == cpu) & (df.idx == cg)][['tasks']]
+ if not data.empty:
+ data.plot(ax=axes, drawstyle='steps-post', xlim=xlim, ylim=(0, ymax))
+
+ axes.set_title("CPU_{:02d}, CGroup_{:02d}".format(cpu, cg))
+ axes.grid(True)
+ if cpu_idx < cpus_cnt-1:
+ axes.set_xlabel('')
+ axes.set_xticklabels([])
+
+ # Set Y ticks to be integer
+ axes.yaxis.set_ticks(np.arange(0, ymax, 1))
+
+ logging.info("Detected maximum number of RUNNABLE tasks: %d", ymax-1)
+ if ymax > 100:
+ logging.warn("Suspecious number of RUNNABLE tasks, ")
+ logging.warn("Check for possible core accouting issue!")
+
+# vim :set tabstop=4 shiftwidth=4 expandtab