Skip to content

Commit

Permalink
Merge back earlier power management tools updates for v5.4.
Browse files Browse the repository at this point in the history
  • Loading branch information
rafaeljw committed Sep 7, 2019
2 parents a41f7f0 + 4216148 commit e3e2ffd
Show file tree
Hide file tree
Showing 4 changed files with 391 additions and 300 deletions.
6 changes: 5 additions & 1 deletion tools/power/pm-graph/README
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
p m - g r a p h

pm-graph: suspend/resume/boot timing analysis tools
Version: 5.4
Version: 5.5
Author: Todd Brandt <[email protected]>
Home Page: https://01.org/pm-graph

Expand All @@ -18,6 +18,10 @@
- upstream version in git:
https://github.com/intel/pm-graph/

Requirements:
- runs with python2 or python3, choice is made by /usr/bin/python link
- python2 now requires python-configparser be installed

Table of Contents
- Overview
- Setup
Expand Down
59 changes: 40 additions & 19 deletions tools/power/pm-graph/bootgraph.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
#!/usr/bin/python2
#!/usr/bin/python
# SPDX-License-Identifier: GPL-2.0-only
#
# Tool for analyzing boot timing
# Copyright (c) 2013, Intel Corporation.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms and conditions of the GNU General Public License,
# version 2, as published by the Free Software Foundation.
#
# This program is distributed in the hope 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.
#
# Authors:
# Todd Brandt <[email protected]>
#
Expand Down Expand Up @@ -81,7 +90,7 @@ def kernelParams(self):
cmdline = 'initcall_debug log_buf_len=32M'
if self.useftrace:
if self.cpucount > 0:
bs = min(self.memtotal / 2, 2*1024*1024) / self.cpucount
bs = min(self.memtotal // 2, 2*1024*1024) // self.cpucount
else:
bs = 131072
cmdline += ' trace_buf_size=%dK trace_clock=global '\
Expand Down Expand Up @@ -137,13 +146,13 @@ def cronjobCmdString(self):
if arg in ['-h', '-v', '-cronjob', '-reboot', '-verbose']:
continue
elif arg in ['-o', '-dmesg', '-ftrace', '-func']:
args.next()
next(args)
continue
elif arg == '-result':
cmdline += ' %s "%s"' % (arg, os.path.abspath(args.next()))
cmdline += ' %s "%s"' % (arg, os.path.abspath(next(args)))
continue
elif arg == '-cgskip':
file = self.configFile(args.next())
file = self.configFile(next(args))
cmdline += ' %s "%s"' % (arg, os.path.abspath(file))
continue
cmdline += ' '+arg
Expand Down Expand Up @@ -292,11 +301,11 @@ def parseKernelLog():
tp = aslib.TestProps()
devtemp = dict()
if(sysvals.dmesgfile):
lf = open(sysvals.dmesgfile, 'r')
lf = open(sysvals.dmesgfile, 'rb')
else:
lf = Popen('dmesg', stdout=PIPE).stdout
for line in lf:
line = line.replace('\r\n', '')
line = aslib.ascii(line).replace('\r\n', '')
# grab the stamp and sysinfo
if re.match(tp.stampfmt, line):
tp.stamp = line
Expand Down Expand Up @@ -649,7 +658,7 @@ def createBootGraph(data):
statinfo += '\t"%s": [\n\t\t"%s",\n' % (n, devstats[n]['info'])
if 'fstat' in devstats[n]:
funcs = devstats[n]['fstat']
for f in sorted(funcs, key=funcs.get, reverse=True):
for f in sorted(funcs, key=lambda k:(funcs[k], k), reverse=True):
if funcs[f][0] < 0.01 and len(funcs) > 10:
break
statinfo += '\t\t"%f|%s|%d",\n' % (funcs[f][0], f, funcs[f][1])
Expand Down Expand Up @@ -729,7 +738,7 @@ def updateCron(restore=False):
op.write('@reboot python %s\n' % sysvals.cronjobCmdString())
op.close()
res = call([cmd, cronfile])
except Exception, e:
except Exception as e:
pprint('Exception: %s' % str(e))
shutil.move(backfile, cronfile)
res = -1
Expand All @@ -745,7 +754,7 @@ def updateGrub(restore=False):
try:
call(sysvals.blexec, stderr=PIPE, stdout=PIPE,
env={'PATH': '.:/sbin:/usr/sbin:/usr/bin:/sbin:/bin'})
except Exception, e:
except Exception as e:
pprint('Exception: %s\n' % str(e))
return
# extract the option and create a grub config without it
Expand Down Expand Up @@ -792,7 +801,7 @@ def updateGrub(restore=False):
op.close()
res = call(sysvals.blexec)
os.remove(grubfile)
except Exception, e:
except Exception as e:
pprint('Exception: %s' % str(e))
res = -1
# cleanup
Expand Down Expand Up @@ -866,6 +875,7 @@ def printHelp():
'Other commands:\n'\
' -flistall Print all functions capable of being captured in ftrace\n'\
' -sysinfo Print out system info extracted from BIOS\n'\
' -which exec Print an executable path, should function even without PATH\n'\
' [redo]\n'\
' -dmesg file Create HTML output using dmesg input (used with -ftrace)\n'\
' -ftrace file Create HTML output using ftrace input (used with -dmesg)\n'\
Expand Down Expand Up @@ -907,13 +917,13 @@ def printHelp():
sysvals.mincglen = aslib.getArgFloat('-mincg', args, 0.0, 10000.0)
elif(arg == '-cgfilter'):
try:
val = args.next()
val = next(args)
except:
doError('No callgraph functions supplied', True)
sysvals.setCallgraphFilter(val)
elif(arg == '-cgskip'):
try:
val = args.next()
val = next(args)
except:
doError('No file supplied', True)
if val.lower() in switchoff:
Expand All @@ -924,7 +934,7 @@ def printHelp():
doError('%s does not exist' % cgskip)
elif(arg == '-bl'):
try:
val = args.next()
val = next(args)
except:
doError('No boot loader name supplied', True)
if val.lower() not in ['grub']:
Expand All @@ -937,7 +947,7 @@ def printHelp():
sysvals.max_graph_depth = aslib.getArgInt('-maxdepth', args, 0, 1000)
elif(arg == '-func'):
try:
val = args.next()
val = next(args)
except:
doError('No filter functions supplied', True)
sysvals.useftrace = True
Expand All @@ -946,7 +956,7 @@ def printHelp():
sysvals.setGraphFilter(val)
elif(arg == '-ftrace'):
try:
val = args.next()
val = next(args)
except:
doError('No ftrace file supplied', True)
if(os.path.exists(val) == False):
Expand All @@ -959,7 +969,7 @@ def printHelp():
sysvals.cgexp = True
elif(arg == '-dmesg'):
try:
val = args.next()
val = next(args)
except:
doError('No dmesg file supplied', True)
if(os.path.exists(val) == False):
Expand All @@ -968,13 +978,13 @@ def printHelp():
sysvals.dmesgfile = val
elif(arg == '-o'):
try:
val = args.next()
val = next(args)
except:
doError('No subdirectory name supplied', True)
sysvals.testdir = sysvals.setOutputFolder(val)
elif(arg == '-result'):
try:
val = args.next()
val = next(args)
except:
doError('No result file supplied', True)
sysvals.result = val
Expand All @@ -986,6 +996,17 @@ def printHelp():
# remaining options are only for cron job use
elif(arg == '-cronjob'):
sysvals.iscronjob = True
elif(arg == '-which'):
try:
val = next(args)
except:
doError('No executable supplied', True)
out = sysvals.getExec(val)
if not out:
print('%s not found' % val)
sys.exit(1)
print(out)
sys.exit(0)
else:
doError('Invalid argument: '+arg, True)

Expand Down
8 changes: 4 additions & 4 deletions tools/power/pm-graph/sleepgraph.8
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,10 @@ disable rtcwake and require a user keypress to resume.
Add the dmesg and ftrace logs to the html output. They will be viewable by
clicking buttons in the timeline.
.TP
\fB-turbostat\fR
Use turbostat to execute the command in freeze mode (default: disabled). This
will provide turbostat output in the log which will tell you which actual
power modes were entered.
\fB-noturbostat\fR
By default, if turbostat is found and the requested mode is freeze, sleepgraph
will execute the suspend via turbostat and collect data in the timeline log.
This option disables the use of turbostat.
.TP
\fB-result \fIfile\fR
Export a results table to a text file for parsing.
Expand Down
Loading

0 comments on commit e3e2ffd

Please sign in to comment.