# 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.
#
import logging
import os
from test import LisaTest
import trappy
from bart.common.Analyzer import Analyzer
TESTS_DIRECTORY = os.path.dirname(os.path.realpath(__file__))
TESTS_CONF = os.path.join(TESTS_DIRECTORY, "smoke_test_ramp.config")
class STune(LisaTest):
"""
Goal
====
Verify that a task in a SchedTune cgroup is boosted
Detailed Description
====================
The test runs a ramp task that has increasing load as time passes.
The load increases from 5% to 60% over 1 second. It is run in
four different configurations: no boost, 15% boost, 30% boost and
60% boost.
Expected Behaviour
==================
The margin of the task should match the formula
.. math::
(sched\_load\_scale - util) \\times boost
for all configurations
"""
test_conf = TESTS_CONF
experiments_conf = TESTS_CONF
@classmethod
def setUpClass(cls, *args, **kwargs):
super(STune, cls).runExperiments(*args, **kwargs)
def test_boosted_utilization_signal(self):
"""Tasks in stune groups are boosted"""
for tc in self.confs:
conf_id = tc["tag"]
wload_id = self.wloads.keys()[0]
run_dir = os.path.join(self.te.res_dir,
"rtapp:{}:{}".format(conf_id, wload_id),
"1")
ftrace_events = ["sched_boost_task"]
ftrace = trappy.FTrace(run_dir, scope="custom",
events=ftrace_events)
first_task_params = self.wloads[wload_id]["conf"]["params"]
first_task_name = first_task_params.keys()[0]
rta_task_name = "task_{}".format(first_task_name)
# Avoid the first period as the task starts with a very
# high load and it overutilizes the CPU
rtapp_period = first_task_params[first_task_name]["params"]["period_ms"]
sbt_dfr = ftrace.sched_boost_task.data_frame
task_start = sbt_dfr[sbt_dfr.comm == rta_task_name].index[0]
after_first_period = task_start + (rtapp_period / 1000.)
boost = tc["cgroups"]["conf"]["schedtune"]["/stune"]["boost"]
analyzer_const = {
"SCHED_LOAD_SCALE": 1024,
"BOOST": boost,
}
analyzer = Analyzer(ftrace, analyzer_const,
window=(after_first_period, None),
filters={"comm": rta_task_name})
statement = "(((SCHED_LOAD_SCALE - sched_boost_task:util) * BOOST) // 100) == sched_boost_task:margin"
error_msg = "task was not boosted to the expected margin: {:.2f}"\
.format(boost / 100.)
self.assertTrue(analyzer.assertStatement(statement), msg=error_msg)
# vim :set tabstop=4 shiftwidth=4 expandtab