提交 94787bfe 编写于 作者: S Satheesh Rajendran

Add methods to get/set cpuidle states

Add methods to get/set cpuidle states
in host and selftests for the method.
Signed-off-by: NSatheesh Rajendran <sathnaga@linux.vnet.ibm.com>
上级 f5420480
......@@ -23,6 +23,8 @@ Get information from the current's machine CPU.
import re
import os
import platform
import glob
import logging
def _list_matches(lst, pattern):
......@@ -195,3 +197,59 @@ def offline(cpu):
if _get_cpu_status(cpu):
return 1
return 0
def get_cpuidle_state():
"""
Get current cpu idle values
:return: Dict of cpuidle states values for all cpus
:rtype: Dict of dicts
"""
cpus_list = cpu_online_list()
states = range(len(glob.glob("/sys/devices/system/cpu/cpu0/cpuidle/state*")))
cpu_idlestate = {}
for cpu in cpus_list:
cpu_idlestate[cpu] = {}
for state_no in states:
state_file = "/sys/devices/system/cpu/cpu%s/cpuidle/state%s/disable" % (cpu, state_no)
try:
cpu_idlestate[cpu][state_no] = int(open(state_file).read())
except IOError as err:
logging.warning("Failed to read idle state on cpu %s "
"for state %s:\n%s", cpu, state_no, err)
return cpu_idlestate
def set_cpuidle_state(state_number="all", disable=1, setstate=None):
"""
Set/Reset cpu idle states for all cpus
:param state_number: cpuidle state number, default: `all` all states
:param disable: whether to disable/enable given cpu idle state, default: 1
:param setstate: cpuidle state value, output of `get_cpuidle_state()`
"""
cpus_list = cpu_online_list()
if not setstate:
states = []
if state_number == 'all':
states = range(0, len(glob.glob("/sys/devices/system/cpu/cpu0/cpuidle/state*")))
else:
states.append(state_number)
for cpu in cpus_list:
for state_no in states:
state_file = "/sys/devices/system/cpu/cpu%s/cpuidle/state%s/disable" % (cpu, state_no)
try:
open(state_file, "w").write(str(disable))
except IOError as err:
logging.warning("Failed to set idle state on cpu %s "
"for state %s:\n%s", cpu, state_no, err)
else:
for cpu, stateval in setstate.items():
for state_no, value in stateval.items():
state_file = "/sys/devices/system/cpu/cpu%s/cpuidle/state%s/disable" % (cpu, state_no)
try:
open(state_file, "w").write(str(value))
except IOError as err:
logging.warning("Failed to set idle state on cpu %s "
"for state %s:\n%s", cpu, state_no, err)
import io
import unittest
import StringIO
try:
from unittest import mock
......@@ -523,6 +524,54 @@ uarch : sifive,rocket0
return_value=self._get_file_mock(cpu_output)):
self.assertEqual(cpu.get_cpu_arch(), "riscv")
@unittest.skipUnless(recent_mock(),
"mock library version cannot (easily) patch open()")
def test_get_cpuidle_state_off(self):
retval = {0: {0: 0}}
with mock.patch('avocado.utils.cpu.cpu_online_list', return_value=[0]):
with mock.patch('glob.glob', return_value=['/sys/devices/system/cpu/cpu0/cpuidle/state1']):
with mock.patch('avocado.utils.cpu.open', return_value=StringIO.StringIO('0')):
self.assertEqual(cpu.get_cpuidle_state(), retval)
@unittest.skipUnless(recent_mock(),
"mock library version cannot (easily) patch open()")
def test_get_cpuidle_state_on(self):
retval = {0: {0: 1}}
with mock.patch('avocado.utils.cpu.cpu_online_list', return_value=[0]):
with mock.patch('glob.glob', return_value=['/sys/devices/system/cpu/cpu0/cpuidle/state1']):
with mock.patch('avocado.utils.cpu.open', return_value=StringIO.StringIO('1')):
self.assertEqual(cpu.get_cpuidle_state(), retval)
@unittest.skipUnless(recent_mock(),
"mock library version cannot (easily) patch open()")
def test_set_cpuidle_state_default(self):
output = StringIO.StringIO()
with mock.patch('avocado.utils.cpu.cpu_online_list', return_value=[0]):
with mock.patch('glob.glob', return_value=['/sys/devices/system/cpu/cpu0/cpuidle/state1']):
with mock.patch('avocado.utils.cpu.open', return_value=output):
cpu.set_cpuidle_state()
self.assertEqual(output.getvalue(), "1")
@unittest.skipUnless(recent_mock(),
"mock library version cannot (easily) patch open()")
def test_set_cpuidle_state_withstateno(self):
output = StringIO.StringIO()
with mock.patch('avocado.utils.cpu.cpu_online_list', return_value=[0]):
with mock.patch('glob.glob', return_value=['/sys/devices/system/cpu/cpu0/cpuidle/state2']):
with mock.patch('avocado.utils.cpu.open', return_value=output):
cpu.set_cpuidle_state(disable='0', state_number='2')
self.assertEqual(output.getvalue(), "0")
@unittest.skipUnless(recent_mock(),
"mock library version cannot (easily) patch open()")
def test_set_cpuidle_state_withsetstate(self):
output = StringIO.StringIO()
with mock.patch('avocado.utils.cpu.cpu_online_list', return_value=[0, 2]):
with mock.patch('glob.glob', return_value=['/sys/devices/system/cpu/cpu0/cpuidle/state1']):
with mock.patch('avocado.utils.cpu.open', return_value=output):
cpu.set_cpuidle_state(setstate={0: {0: 1}, 2: {0: 0}})
self.assertEqual(output.getvalue(), "10")
if __name__ == "__main__":
unittest.main()
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册