Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 886315 Details for
Bug 1082080
RHEL7 CPUScaling Userspace Governor Failure
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
patched syscpufreq.py
syscpufreq.py (text/plain), 11.36 KB, created by
Greg Nichols
on 2014-04-14 23:35:56 UTC
(
hide
)
Description:
patched syscpufreq.py
Filename:
MIME Type:
Creator:
Greg Nichols
Created:
2014-04-14 23:35:56 UTC
Size:
11.36 KB
patch
obsolete
>#!/usr/bin/python ># Copyright (c) 2014 Red Hat, Inc. All rights reserved. This copyrighted material ># is made available to anyone wishing to use, modify, copy, or ># redistribute it subject to the terms and conditions of the GNU General ># Public License v.2. ># ># This program is distributed in the hope that it will be useful, but WITHOUT ANY ># WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A ># PARTICULAR PURPOSE. See the GNU General Public License for more details. ># ># You should have received a copy of the GNU General Public License ># along with this program; if not, write to the Free Software ># Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ># ># Author: Greg Nichols <gnichols@redhat.com> ># ># SysCPUFreq: python wrapper for the /sys/devices/system/cpu/ directories > >import os, re, sys > >class SysCPUFreq(): > > def __init__(self): > self.sysCPUDirectory = "/sys/devices/system/cpu" > self.cpuNumbers = None > self.cpuToPackage = None > self.packageToCpus = None > self.frequencies = None > self.governors = None > self.currentGovernors = None > self.debug = False > self.cpufreqDirectories = None > self.__getSystemCapabilities() > > > def __getSystemCapabilities(self): > > if not self.__getCPUFreqDirectories(): > return False > > # 1.5 get core/package topology > if self.cpuNumbers: > for cpuNumber in self.cpuNumbers: > sys.stdout.flush() > parameters = self.__getParameters(os.path.join(self.sysCPUDirectory, ("cpu%s" % cpuNumber), "topology"), "physical_package_id") > if parameters and len(parameters) == 1: > packageNumber = int(parameters[0]) > if not self.cpuToPackage: > self.cpuToPackage = dict() > self.cpuToPackage[cpuNumber] = packageNumber > if not self.packageToCpus: > self.packageToCpus = dict() > if not packageNumber in self.packageToCpus: > self.packageToCpus[packageNumber] = list() > if cpuNumber not in self.packageToCpus[packageNumber]: > self.packageToCpus[packageNumber].append(cpuNumber) > > # 2. Check ~/cpu[*]/scaling_available_freq files to ensure that all cpu's scale the same amount > sys.stdout.flush() > freqFileName = "scaling_available_frequencies" > frequencies = self.__checkParameters(freqFileName) > if frequencies: > # sort them as integers > self.frequencies = map(int, frequencies) > self.frequencies.sort() > > # 3. Check ~/cpu[*]/scaling_available_governors files to verify all cpu's support the same control methods > governorFileName = "scaling_available_governors" > self.governors = self.__checkParameters(governorFileName) > self.currentGovernors = self.__getParameterList("scaling_governor") > > def __getCPUFreqDirectories(self): > if not os.path.exists(self.sysCPUDirectory): > return None > > # look for cpu subdirectories > pattern = re.compile("cpu(?P<cpuNumber>[0-9]+)") > self.cpufreqDirectories = None > for subdirectory in os.listdir(self.sysCPUDirectory): > match = pattern.search(subdirectory) > if match and match.group("cpuNumber"): > cpuNumber = int(match.group("cpuNumber")) > if not self.cpuNumbers: > self.cpuNumbers = list() > self.cpuNumbers.append(cpuNumber) > cpufreqDirectory = "%s/%s/cpufreq" % (self.sysCPUDirectory, subdirectory) > if not os.path.exists(cpufreqDirectory): > continue > # otherwise > if not self.cpufreqDirectories: > self.cpufreqDirectories = dict() > self.cpufreqDirectories[cpuNumber] = cpufreqDirectory > return self.cpufreqDirectories > > def __checkParameters(self, file): > current = None > for cpufreqDirectory in self.cpufreqDirectories.values(): > parameters = self.__getParameters(cpufreqDirectory, file) > if not parameters: > return None > # otherwise > if not current: > current = parameters > elif not current == parameters: > return None > > return current > > def __getParameters(self, cpufreqDirectory, file): > try: > file = open("%s/%s" % (cpufreqDirectory, file)) > while 1: > line = file.readline() > if not line: > break > if len(line.strip()) > 0: > return line.strip().split() > except Exception, e: > if self.debug: > print e > return None > > def __setPackageParameter(self, switch, setFile, readFile, value, verify=True): > # try the command for all cpus in the package > result = True > for cpu in self.packageToCpus[self.currentPackage]: > if not self.__setParameter(cpu, switch, setFile, readFile, value, verify): > result = False > return result > > def __setParameter(self, cpu, switch, setFile, readFile, value, verify=True): > result = True > try: > command = Command("cpufreq-selector -c %s -%s %s" % (cpu, switch, value)) > command.echo() > except HwCertCommandException, exception: > print "Note: command failed: %s" % exception > command.printErrors() > result = False > > if not result: > print "Trying alternate method." > try: > command = Command("echo \"%s\" > %s/%s" % (value, self.cpufreqDirectories[cpu], setFile)) > command.echo() > except HwCertCommandException, exception: > print "Error: command failed:" > print exception > return False > # verify it has changed > if verify: > parameterFile = open("%s/%s" % (self.cpufreqDirectories[cpu], readFile)) > line = parameterFile.readline() > if not line or line.strip() != value: > self.logWorkloadError("Error: could not verify that %s/%s was set to %s" % (self.cpufreqDirectories[cpu], readFile, value)) > if line: > print "Actual Value: %s" % line > else: > print "parameter file was empty" > return False > > return True > > def __getPackageParameter(self, package, parameter, logging=False): > packageParameterValue = None > for cpu in self.packageToCpus[package]: > value = self.getParameter(cpu, parameter) > if logging: > print "cpu%s %s = %s" % (cpu, parameter, value) > if value and not packageParameterValue: > packageParameterValue = value > elif value != packageParameterValue: > print "Warning: cpu%s in package %s has the value %s which differs from other cpus in the package" % (cpu, self.currentPackage, value) > > return packageParameterValue > > def __getParameter(self, cpu, parameter, logging=False): > value = None > parameterFilePath = "%s/%s" % (self.cpufreqDirectories[cpu], parameter) > try: > parameterFile = open(parameterFilePath) > line = parameterFile.readline() > if not line: > return None > value = line.strip() > if logging: > print "cpu%s %s = %s" % (cpu, parameter, value) > return value > except IOError, exception: > if logging: > print "Error:" > print exception > > return None > > def __getParameterList(self, parameter): > values = list() > for cpufreqDirectory in self.cpufreqDirectories.values(): > parameterFile = open("%s/%s" % (cpufreqDirectory, parameter)) > line = parameterFile.readline() > if not line: > self.logWorkloadError("Error: failed to get %s for %s" % (parameter, cpufreqDirectory)) > return None > values.append(line.strip()) > > return values > > def isSupported(self): > """ valid if basic topology has been found. > might be missing some control parameters """ > if self.cpufreqDirectories: > return True > return False > > def isValid(self): > return self.isSupported() > > def getMinimumFrequency(self): > if self.frequencies: > return self.frequencies[0] > return None > > def getMaximumFrequency(self): > if self.frequencies: > return self.frequencies[-1] > return None > > > def showCapabilities(self): > > if self.packageToCpus: > print "Packages:" > for package in self.packageToCpus.keys(): > sys.stdout.write("package %s has cpus: " % package) > sys.stdout.write(", ".join(map(str, self.packageToCpus[package]))) > print "" > print "" > else: > print "No package information" > > if self.frequencies: > print "" > print "Supported CPU Frequencies: " > for freq in self.frequencies: > print " %u MHz" % (freq/1000) > print "" > else: > print "No supported frequency information" > > if self.isValid() and self.cpufreqDirectories: > print "\nCurrent Frequencies:" > for cpu in self.getCPUs(): > print " cpu%s: %s" % (cpu, self.getCurrentFrequency(cpu)) > > if self.governors: > print "" > print "Supported Governors: " > for governor in self.governors: > print " %s" % governor > > if self.currentGovernors: > print "" > print "Current governors:" > i = 0 > for g in self.currentGovernors: > sys.stdout.write(" cpu%u: %s\n" % (i, g)) > i += 1 > > def getCPUs(self, package=None): > if package is not None: > if self.packageToCpus: > return self.packageToCpus[package] > # otherwise > return self.cpuNumbers > > def getPackages(self): > if self.packageToCpus: > return self.packageToCpus.keys() > # otherwise, a list of a single package > return [0] > > def setFrequency(self, frequency): > if self.__setPackageParameter("f", "scaling_setspeed", "scaling_cur_freq", frequency, verify=False): > return self.getFrequency() > > # otherwise, set command has failed > return None > > def getCurrentFrequency(self, cpu): > cpuInfoCurrentFreq = self.__getParameter(cpu, "cpuinfo_cur_freq") > scalingCurrentFreq = self.__getParameter(cpu, "scaling_cur_freq") > if cpuInfoCurrentFreq: > return int(cpuInfoCurrentFreq) > if scalingCurrentFreq: > return int(scalingCurrentFreq) > return None > > > def setGovernor(self, governor): > return self.__setPackageParameter("g", "scaling_governor", "scaling_governor", governor) > > >if __name__ == "__main__": > sysCPUFreq = SysCPUFreq() > if not sysCPUFreq.isSupported(): > print "NOT SUPPORTED" > sysCPUFreq.showCapabilities() > print "cpus:" > print sysCPUFreq.getCPUs() > print "package 0 cpus" > print sysCPUFreq.getCPUs(0) >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 1082080
:
879916
|
879983
|
885899
|
886314
| 886315 |
886900
|
886919
|
886920
|
886922
|
886970