661 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			661 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|                                                 _
 | |
|     _ __  _ __ ___         __ _ _ __ __ _ _ __ | |__
 | |
|    | '_ \| '_ ` _ \ _____ / _` | '__/ _` | '_ \| '_ \
 | |
|    | |_) | | | | | |_____| (_| | | | (_| | |_) | | | |
 | |
|    | .__/|_| |_| |_|      \__, |_|  \__,_| .__/|_| |_|
 | |
|    |_|                    |___/          |_|
 | |
| 
 | |
|    pm-graph: suspend/resume/boot timing analysis tools
 | |
|     Version: 5.10
 | |
|      Author: Todd Brandt <todd.e.brandt@intel.com>
 | |
|   Home Page: https://www.intel.com/content/www/us/en/developer/topic-technology/open/pm-graph/overview.html
 | |
| 
 | |
|  Report bugs/issues at bugzilla.kernel.org Tools/pm-graph
 | |
| 	- https://bugzilla.kernel.org/buglist.cgi?component=pm-graph&product=Tools
 | |
| 
 | |
|  Full documentation available online & in man pages
 | |
| 	- Getting Started:
 | |
| 	  https://www.intel.com/content/www/us/en/developer/articles/technical/usage.html
 | |
| 
 | |
| 	- Feature Summary:
 | |
| 	  https://www.intel.com/content/www/us/en/developer/topic-technology/open/pm-graph/features.html
 | |
| 
 | |
| 	- upstream version in git:
 | |
| 	  git clone https://github.com/intel/pm-graph/
 | |
| 
 | |
|  Table of Contents
 | |
| 	- Overview
 | |
| 	- Setup
 | |
| 	- Usage
 | |
| 		- Basic Usage
 | |
| 		- Dev Mode Usage
 | |
| 		- Proc Mode Usage
 | |
| 	- Endurance Testing
 | |
| 		- Usage Examples
 | |
| 	- Configuration Files
 | |
| 		- Usage Examples
 | |
| 		- Config File Options
 | |
| 	- Custom Timeline Entries
 | |
| 		- Adding/Editing Timeline Functions
 | |
| 		- Adding/Editing Dev Timeline Source Functions
 | |
| 		- Verifying your Custom Functions
 | |
| 	- Testing on consumer linux Operating Systems
 | |
| 		- Android
 | |
| 
 | |
| ------------------------------------------------------------------
 | |
| |                          OVERVIEW                              |
 | |
| ------------------------------------------------------------------
 | |
| 
 | |
|  This tool suite is designed to assist kernel and OS developers in optimizing
 | |
|  their linux stack's suspend/resume & boot time. Using a kernel image built
 | |
|  with a few extra options enabled, the tools will execute a suspend or boot,
 | |
|  and will capture dmesg and ftrace data. This data is transformed into a set of
 | |
|  timelines and a callgraph to give a quick and detailed view of which devices
 | |
|  and kernel processes are taking the most time in suspend/resume & boot.
 | |
| 
 | |
| ------------------------------------------------------------------
 | |
| |                            SETUP                               |
 | |
| ------------------------------------------------------------------
 | |
| 
 | |
|     Package Requirements
 | |
|        - runs with python2 or python3, choice is made by /usr/bin/python link
 | |
|        - python
 | |
|        - python-configparser (for python2 sleepgraph)
 | |
|        - python-requests (for stresstester.py)
 | |
|        - linux-tools-common (for turbostat usage in sleepgraph)
 | |
| 
 | |
|        Ubuntu:
 | |
|           sudo apt-get install python python-configparser python-requests linux-tools-common
 | |
| 
 | |
|        Fedora:
 | |
|           sudo dnf install python python-configparser python-requests linux-tools-common
 | |
| 
 | |
|     The tools can most easily be installed via git clone and make install
 | |
| 
 | |
|     $> git clone http://github.com/intel/pm-graph.git
 | |
|     $> cd pm-graph
 | |
|     $> sudo make install
 | |
|     $> man sleepgraph ; man bootgraph
 | |
| 
 | |
|     Setup involves some minor kernel configuration
 | |
| 
 | |
|     The following kernel build options are required for all kernels:
 | |
|         CONFIG_DEVMEM=y
 | |
|         CONFIG_PM_DEBUG=y
 | |
|         CONFIG_PM_SLEEP_DEBUG=y
 | |
|         CONFIG_FTRACE=y
 | |
|         CONFIG_FUNCTION_TRACER=y
 | |
|         CONFIG_FUNCTION_GRAPH_TRACER=y
 | |
|         CONFIG_KPROBES=y
 | |
|         CONFIG_KPROBES_ON_FTRACE=y
 | |
| 
 | |
| 	In kernel 3.15.0, two patches were upstreamed which enable the
 | |
|         v3.0 behavior. These patches allow the tool to read all the
 | |
|         data from trace events instead of from dmesg. You can enable
 | |
|         this behavior on earlier kernels with these patches:
 | |
| 
 | |
|         (kernel/pre-3.15/enable_trace_events_suspend_resume.patch)
 | |
|         (kernel/pre-3.15/enable_trace_events_device_pm_callback.patch)
 | |
| 
 | |
| 	If you're using bootgraph, or sleepgraph with a kernel older than 3.15.0,
 | |
| 		the following additional kernel parameters are required:
 | |
|         (e.g. in file /etc/default/grub)
 | |
|         GRUB_CMDLINE_LINUX_DEFAULT="... initcall_debug log_buf_len=32M ..."
 | |
| 
 | |
| 	If you're using a kernel older than 3.11-rc2, the following simple
 | |
| 		patch must be applied to enable ftrace data:
 | |
|         in file: kernel/power/suspend.c
 | |
|         in function: int suspend_devices_and_enter(suspend_state_t state)
 | |
|         remove call to "ftrace_stop();"
 | |
|         remove call to "ftrace_start();"
 | |
| 
 | |
|         There is a patch which does this for kernel v3.8.0:
 | |
|         (kernel/pre-3.11-rc2/enable_ftrace_in_suspendresume.patch)
 | |
| 
 | |
| 
 | |
| 
 | |
| ------------------------------------------------------------------
 | |
| |                            USAGE                               |
 | |
| ------------------------------------------------------------------
 | |
| 
 | |
| Basic Usage
 | |
| ___________
 | |
| 
 | |
|  1) First configure a kernel using the instructions from the previous sections.
 | |
|     Then build, install, and boot with it.
 | |
|  2) Open up a terminal window and execute the mode list command:
 | |
| 
 | |
| 	%> sudo ./sleepgraph.py -modes
 | |
| 		['freeze', 'mem', 'disk']
 | |
| 
 | |
|  Execute a test using one of the available power modes, e.g. mem (S3):
 | |
| 
 | |
| 	%> sudo ./sleepgraph.py -m mem -rtcwake 15
 | |
| 
 | |
| 		or with a config file
 | |
| 
 | |
| 	%> sudo ./sleepgraph.py -config config/suspend.cfg
 | |
| 
 | |
|  When the system comes back you'll see the script finishing up and
 | |
|  creating the output files in the test subdir. It generates output
 | |
|  files in subdirectory: suspend-mmddyy-HHMMSS. The ftrace file can
 | |
|  be used to regenerate the html timeline with different options
 | |
| 
 | |
|      HTML output:                    <hostname>_<mode>.html
 | |
|      raw dmesg output:               <hostname>_<mode>_dmesg.txt
 | |
|      raw ftrace output:              <hostname>_<mode>_ftrace.txt
 | |
| 
 | |
|  View the html in firefox or chrome.
 | |
| 
 | |
| 
 | |
| Dev Mode Usage
 | |
| ______________
 | |
| 
 | |
|  Developer mode adds information on low level source calls to the timeline.
 | |
|  The tool sets kprobes on all delay and mutex calls to see which devices
 | |
|  are waiting for something and when. It also sets a suite of kprobes on
 | |
|  subsystem dependent calls to better fill out the timeline.
 | |
| 
 | |
|  The tool will also expose kernel threads that don't normally show up in the
 | |
|  timeline. This is useful in discovering dependent threads to get a better
 | |
|  idea of what each device is waiting for. For instance, the scsi_eh thread,
 | |
|  a.k.a. scsi resume error handler, is what each SATA disk device waits for
 | |
|  before it can continue resume.
 | |
| 
 | |
|  The timeline will be much larger if run with dev mode, so it can be useful
 | |
|  to set the -mindev option to clip out any device blocks that are too small
 | |
|  to see easily. The following command will give a nice dev mode run:
 | |
| 
 | |
|  %> sudo ./sleepgraph.py -m mem -rtcwake 15 -mindev 1 -dev
 | |
| 
 | |
| 	or with a config file
 | |
| 
 | |
|  %> sudo ./sleepgraph.py -config config/suspend-dev.cfg
 | |
| 
 | |
| 
 | |
| Proc Mode Usage
 | |
| _______________
 | |
| 
 | |
|  Proc mode adds user process info to the timeline. This is done in a manner
 | |
|  similar to the bootchart utility, which graphs init processes and their
 | |
|  execution as the system boots. This tool option does the same thing but for
 | |
|  the period before and after suspend/resume.
 | |
| 
 | |
|  In order to see any process info, there needs to be some delay before or
 | |
|  after resume since processes are frozen in suspend_prepare and thawed in
 | |
|  resume_complete. The predelay and postdelay args allow you to do this. It
 | |
|  can also be useful to run in x2 mode with an x2 delay, this way you can
 | |
|  see process activity before and after resume, and in between two
 | |
|  successive suspend/resumes.
 | |
| 
 | |
|  The command can be run like this:
 | |
| 
 | |
|  %> sudo ./sleepgraph.py -m mem -rtcwake 15 -x2 -x2delay 1000 -predelay 1000 -postdelay 1000 -proc
 | |
| 
 | |
| 	or with a config file
 | |
| 
 | |
|  %> sudo ./sleepgraph.py -config config/suspend-proc.cfg
 | |
| 
 | |
| ------------------------------------------------------------------
 | |
| |                     ENDURANCE TESTING                          |
 | |
| ------------------------------------------------------------------
 | |
| 
 | |
|  The best way to gauge the health of a system is to run a series of
 | |
|  suspend/resumes over an extended period and analyze the behavior. This can be
 | |
|  accomplished with sleepgraph's -multi argument. You specify two numbers: the
 | |
|  number of tests to run OR the duration in days, hours, or minutes, and the
 | |
|  delay in seconds between them. For instance, -multi 20 5: execute 20 tests with
 | |
|  a 5 second delay between each, or -multi 24h 0: execute tests over a 24 hour
 | |
|  period with no delay between tests. You can include any other options you like
 | |
|  to generate the data you want. It's most useful to collect dev mode timelines
 | |
|  as the kprobes don't alter the performance much and you get more insight.
 | |
| 
 | |
|  On completion, the output folder contains a series of folders for the
 | |
|  individual test data and a set of summary pages in the root. The summary.html
 | |
|  file is a tabular list of the tests with relevant info and links. The
 | |
|  summary-issue.html and summary-devices.html files include data taken from
 | |
|  all tests on kernel issues and device performance. The folder looks like this:
 | |
| 
 | |
|   suspend-xN-{date}-{time}:
 | |
| 	summary.html
 | |
| 	summary-issues.html
 | |
| 	summary-devices.html
 | |
| 	suspend-{date}-{time} (1)
 | |
| 	suspend-{date}-{time} (2)
 | |
| 	...
 | |
| 
 | |
|  These are the relevant arguments to use for testing:
 | |
| 
 | |
|   -m mode
 | |
| 	Mode to initiate for suspend e.g. mem, freeze, standby (default: mem).
 | |
| 
 | |
|   -rtcwake t
 | |
| 	Use rtcwake to autoresume after t seconds (default: 15).
 | |
| 
 | |
|   -gzip (optional)
 | |
| 	Gzip the trace and dmesg logs to save space. The tool can also read in
 | |
| 	gzipped logs for processing. This reduces the multitest folder size.
 | |
| 
 | |
|   -dev (optional)
 | |
| 	Add kernel source calls and threads to the timeline (default: disabled).
 | |
| 
 | |
|   -multi n d
 | |
| 	Execute n consecutive tests at d seconds intervals. The outputs will be
 | |
| 	created in a new subdirectory: suspend-xN-{date}-{time}. When the multitest
 | |
| 	run is done, the -summary command is called automatically to create summary
 | |
| 	html files for all the data (unless you use -skiphtml). -skiphtml will
 | |
| 	speed up the testing by not creating timelines or summary html files. You
 | |
| 	can then run the tool again at a later time with -summary and -genhtml to
 | |
| 	create the timelines.
 | |
| 
 | |
|   -skiphtml (optional)
 | |
| 	Run the test and capture the trace logs, but skip the timeline and summary
 | |
| 	html generation. This can greatly speed up overall testing. You can then
 | |
| 	copy the data to a faster host machine and run -summary -genhtml to
 | |
| 	generate the timelines and summary.
 | |
| 
 | |
|  These are the relevant commands to use after testing is complete:
 | |
| 
 | |
|   -summary indir
 | |
| 	Generate or regenerate the summary for a -multi test run. Creates three
 | |
| 	files: summary.html, summary-issues.html, and summary-devices.html in the
 | |
| 	current folder. summary.html is a table of tests with relevant info sorted
 | |
| 	by kernel/host/mode, and links to the test html files. summary-issues.html
 | |
| 	is a list of kernel issues found in dmesg from all the tests.
 | |
| 	summary-devices.html is a list of devices and times from all the tests.
 | |
| 
 | |
|   -genhtml
 | |
| 	Used  with -summary to regenerate any missing html timelines from their
 | |
| 	dmesg and ftrace logs. This will require a significant amount of time if
 | |
| 	there are thousands of tests.
 | |
| 
 | |
| Usage Examples
 | |
| _______________
 | |
| 
 | |
|  A multitest is initiated like this:
 | |
| 
 | |
|   %> sudo ./sleepgraph.py -m mem -rtcwake 10 -dev -gzip -multi 2000 0
 | |
| 
 | |
| 	or you can skip timeline generation in order to speed things up
 | |
| 
 | |
|   %> sudo ./sleepgraph.py -m mem -rtcwake 10 -dev -gzip -multi 2000 0 -skiphtml
 | |
| 
 | |
|  The tool will produce an output folder with all the test subfolders inside.
 | |
|  Each test subfolder contains the dmesg/ftrace logs and/or the html timeline
 | |
|  depending on whether you used the -skiphtml option. The root folder contains
 | |
|  the summary.html files.
 | |
| 
 | |
|  The summary for an existing multitest is generated like this:
 | |
| 
 | |
|   %> cd suspend-x2000-{date}-{time}
 | |
|   %> sleepgraph.py -summary .
 | |
| 
 | |
| 	or if you need to generate the html timelines you can use -genhtml
 | |
| 
 | |
|   %> cd suspend-xN-{date}-{time}
 | |
|   %> sleepgraph.py -summary . -genhtml
 | |
| 
 | |
| ------------------------------------------------------------------
 | |
| |                    CONFIGURATION FILES                         |
 | |
| ------------------------------------------------------------------
 | |
| 
 | |
|  Since 4.0 we've moved to using config files in lieu of command line options.
 | |
|  The config folder contains a collection of typical use cases.
 | |
|  There are corresponding configs for other power modes:
 | |
| 
 | |
| 	Simple suspend/resume with basic timeline (mem/freeze/standby)
 | |
| 		config/suspend.cfg
 | |
| 		config/freeze.cfg
 | |
| 		config/standby.cfg
 | |
| 
 | |
| 	Dev mode suspend/resume with dev timeline (mem/freeze/standby)
 | |
| 		config/suspend-dev.cfg
 | |
| 		config/freeze-dev.cfg
 | |
| 		config/standby-dev.cfg
 | |
| 
 | |
| 	Simple suspend/resume with timeline and callgraph (mem/freeze/standby)
 | |
| 		config/suspend-callgraph.cfg
 | |
| 		config/freeze-callgraph.cfg
 | |
| 		config/standby-callgraph.cfg
 | |
| 
 | |
| 	Sample proc mode x2 run using mem suspend
 | |
| 		config/suspend-x2-proc.cfg
 | |
| 
 | |
| 	Sample for editing timeline funcs (moves internal functions into config)
 | |
| 		config/custom-timeline-functions.cfg
 | |
| 
 | |
| 	Sample debug config for serio subsystem
 | |
| 		config/debug-serio-suspend.cfg
 | |
| 
 | |
| 
 | |
| Usage Examples
 | |
| ______________
 | |
| 
 | |
|  Run a simple mem suspend:
 | |
|  %> sudo ./sleepgraph.py -config config/suspend.cfg
 | |
| 
 | |
|  Run a mem suspend with callgraph data:
 | |
|  %> sudo ./sleepgraph.py -config config/suspend-callgraph.cfg
 | |
| 
 | |
|  Run a mem suspend with dev mode detail:
 | |
|  %> sudo ./sleepgraph.py -config config/suspend-dev.cfg
 | |
| 
 | |
| 
 | |
| Config File Options
 | |
| ___________________
 | |
| 
 | |
|  [Settings]
 | |
| 
 | |
|  # Verbosity: print verbose messages (def: false)
 | |
|  verbose: false
 | |
| 
 | |
|  # Suspend Mode: e.g. standby, mem, freeze, disk (def: mem)
 | |
|  mode: mem
 | |
| 
 | |
|  # Output Directory Format: {hostname}, {date}, {time} give current values
 | |
|  output-dir: suspend-{hostname}-{date}-{time}
 | |
| 
 | |
|  # Automatic Wakeup: use rtcwake to wakeup after X seconds (def: infinity)
 | |
|  rtcwake: 15
 | |
| 
 | |
|  # Add Logs: add the dmesg and ftrace log to the html output (def: false)
 | |
|  addlogs: false
 | |
| 
 | |
|  # Sus/Res Gap: insert a gap between sus & res in the timeline (def: false)
 | |
|  srgap: false
 | |
| 
 | |
|  # Custom Command: Command to execute in lieu of suspend (def: "")
 | |
|  command: echo mem > /sys/power/state
 | |
| 
 | |
|  # Proc mode: graph user processes and cpu usage in the timeline (def: false)
 | |
|  proc: false
 | |
| 
 | |
|  # Dev mode: graph source functions in the timeline (def: false)
 | |
|  dev: false
 | |
| 
 | |
|  # Suspend/Resume x2: run 2 suspend/resumes back to back (def: false)
 | |
|  x2: false
 | |
| 
 | |
|  # x2 Suspend Delay: time delay between the two test runs in ms (def: 0 ms)
 | |
|  x2delay: 0
 | |
| 
 | |
|  # Pre Suspend Delay: nclude an N ms delay before (1st) suspend (def: 0 ms)
 | |
|  predelay: 0
 | |
| 
 | |
|  # Post Resume Delay: include an N ms delay after (last) resume (def: 0 ms)
 | |
|  postdelay: 0
 | |
| 
 | |
|  # Min Device Length: graph only dev callbacks longer than min (def: 0.001 ms)
 | |
|  mindev: 0.001
 | |
| 
 | |
|  # Callgraph: gather ftrace callgraph data on all timeline events (def: false)
 | |
|  callgraph: false
 | |
| 
 | |
|  # Expand Callgraph: pre-expand the callgraph treeviews in html (def: false)
 | |
|  expandcg: false
 | |
| 
 | |
|  # Min Callgraph Length: show callgraphs only if longer than min (def: 1 ms)
 | |
|  mincg: 1
 | |
| 
 | |
|  # Timestamp Precision: number of sig digits in timestamps (0:S, [3:ms], 6:us)
 | |
|  timeprec: 3
 | |
| 
 | |
|  # Device Filter: show only devs whose name/driver includes one of these strings
 | |
|  devicefilter: _cpu_up,_cpu_down,i915,usb
 | |
| 
 | |
|  # Override default timeline entries:
 | |
|  # Do not use the internal default functions for timeline entries (def: false)
 | |
|  # Set this to true if you intend to only use the ones defined in the config
 | |
|  override-timeline-functions: true
 | |
| 
 | |
|  # Override default dev timeline entries:
 | |
|  # Do not use the internal default functions for dev timeline entries (def: false)
 | |
|  # Set this to true if you intend to only use the ones defined in the config
 | |
|  override-dev-timeline-functions: true
 | |
| 
 | |
|  # Call Loop Max Gap (dev mode only)
 | |
|  # merge loops of the same call if each is less than maxgap apart (def: 100us)
 | |
|  callloop-maxgap: 0.0001
 | |
| 
 | |
|  # Call Loop Max Length (dev mode only)
 | |
|  # merge loops of the same call if each is less than maxlen in length (def: 5ms)
 | |
|  callloop-maxlen: 0.005
 | |
| 
 | |
| ------------------------------------------------------------------
 | |
| |                   CUSTOM TIMELINE ENTRIES                      |
 | |
| ------------------------------------------------------------------
 | |
| 
 | |
| Adding or Editing Timeline Functions
 | |
| ____________________________________
 | |
| 
 | |
|  The tool uses an array of function names to fill out empty spaces in the
 | |
|  timeline where device callbacks don't appear. For instance, in suspend_prepare
 | |
|  the tool adds the sys_sync and freeze_processes calls as virtual device blocks
 | |
|  in the timeline to show you where the time is going. These calls should fill
 | |
|  the timeline with contiguous data so that most kernel execution is covered.
 | |
| 
 | |
|  It is possible to add new function calls to the timeline by adding them to
 | |
|  the config. It's also possible to copy the internal timeline functions into
 | |
|  the config so that you can override and edit them. Place them in the
 | |
|  timeline_functions_ARCH section with the name of your architecture appended.
 | |
|  i.e. for x86_64: [timeline_functions_x86_64]
 | |
| 
 | |
|  Use the override-timeline-functions option if you only want to use your
 | |
|  custom calls, or leave it false to append them to the internal ones.
 | |
| 
 | |
|  This section includes a list of functions (set using kprobes) which use both
 | |
|  symbol data and function arg data. The args are pulled directly from the
 | |
|  stack using this architecture's registers and stack formatting. Each entry
 | |
|  can include up to four pieces of info: The function name, a format string,
 | |
|  an argument list, and a color. But only a function name is required.
 | |
| 
 | |
|  For a full example config, see config/custom-timeline-functions.cfg. It pulls
 | |
|  all the internal timeline functions into the config and allows you to edit
 | |
|  them.
 | |
| 
 | |
|   Entry format:
 | |
| 
 | |
|     function: format{fn_arg1}_{fn_arg2} fn_arg1 fn_arg2 ... [color=purple]
 | |
| 
 | |
|   Required Arguments:
 | |
| 
 | |
|     function: The symbol name for the function you want probed, this is the
 | |
|               minimum required for an entry, it will show up as the function
 | |
|               name with no arguments.
 | |
| 
 | |
|         example: _cpu_up:
 | |
| 
 | |
|   Optional Arguments:
 | |
| 
 | |
|     format: The format to display the data on the timeline in. Use braces to
 | |
|             enclose the arg names.
 | |
| 
 | |
|         example: CPU_ON[{cpu}]
 | |
| 
 | |
|     color: The color of the entry block in the timeline. The default color is
 | |
|            transparent, so the entry shares the phase color. The color is an
 | |
|            html color string, either a word, or an RGB.
 | |
| 
 | |
|         example: [color=#CC00CC]
 | |
| 
 | |
|     arglist: A list of arguments from registers/stack addresses. See URL:
 | |
|              https://www.kernel.org/doc/Documentation/trace/kprobetrace.txt
 | |
| 
 | |
|         example: cpu=%di:s32
 | |
| 
 | |
|  Here is a full example entry. It displays cpu resume calls in the timeline
 | |
|  in orange. They will appear as CPU_ON[0], CPU_ON[1], etc.
 | |
| 
 | |
|   [timeline_functions_x86_64]
 | |
|   _cpu_up: CPU_ON[{cpu}] cpu=%di:s32 [color=orange]
 | |
| 
 | |
| 
 | |
| Adding or Editing Dev Mode Timeline Source Functions
 | |
| ____________________________________________________
 | |
| 
 | |
|  In dev mode, the tool uses an array of function names to monitor source
 | |
|  execution within the timeline entries.
 | |
| 
 | |
|  The function calls are displayed inside the main device/call blocks in the
 | |
|  timeline. However, if a function call is not within a main timeline event,
 | |
|  it will spawn an entirely new event named after the caller's kernel thread.
 | |
|  These asynchronous kernel threads will populate in a separate section
 | |
|  beneath the main device/call section.
 | |
| 
 | |
|  The tool has a set of hard coded calls which focus on the most common use
 | |
|  cases: msleep, udelay, schedule_timeout, mutex_lock_slowpath, etc. These are
 | |
|  the functions that add a hardcoded time delay to the suspend/resume path.
 | |
|  The tool also includes some common functions native to important
 | |
|  subsystems: ata, i915, and ACPI, etc.
 | |
| 
 | |
|  It is possible to add new function calls to the dev timeline by adding them
 | |
|  to the config. It's also possible to copy the internal dev timeline
 | |
|  functions into the config so that you can override and edit them. Place them
 | |
|  in the dev_timeline_functions_ARCH section with the name of your architecture
 | |
|  appended. i.e. for x86_64: [dev_timeline_functions_x86_64]
 | |
| 
 | |
|  Use the override-dev-timeline-functions option if you only want to use your
 | |
|  custom calls, or leave it false to append them to the internal ones.
 | |
| 
 | |
|  The format is the same as the timeline_functions_x86_64 section. It's a
 | |
|  list of functions (set using kprobes) which use both symbol data and function
 | |
|  arg data. The args are pulled directly from the stack using this
 | |
|  architecture's registers and stack formatting. Each entry can include up
 | |
|  to four pieces of info: The function name, a format string, an argument list,
 | |
|  and a color. But only the function name is required.
 | |
| 
 | |
|  For a full example config, see config/custom-timeline-functions.cfg. It pulls
 | |
|  all the internal dev timeline functions into the config and allows you to edit
 | |
|  them.
 | |
| 
 | |
|  Here is a full example entry. It displays the ATA port reset calls as
 | |
|  ataN_port_reset in the timeline. This is where most of the SATA disk resume
 | |
|  time goes, so it can be helpful to see the low level call.
 | |
| 
 | |
|   [dev_timeline_functions_x86_64]
 | |
|   ata_eh_recover: ata{port}_port_reset port=+36(%di):s32 [color=#CC00CC]
 | |
| 
 | |
| 
 | |
| Verifying your custom functions
 | |
| _______________________________
 | |
| 
 | |
|  Once you have a set of functions (kprobes) defined, it can be useful to
 | |
|  perform a quick check to see if you formatted them correctly and if the system
 | |
|  actually supports them. To do this, run the tool with your config file
 | |
|  and the -status option. The tool will go through all the kprobes (both
 | |
|  custom and internal if you haven't overridden them) and actually attempts
 | |
|  to set them in ftrace. It will then print out success or fail for you.
 | |
| 
 | |
|  Note that kprobes which don't actually exist in the kernel won't stop the
 | |
|  tool, they just wont show up.
 | |
| 
 | |
|  For example:
 | |
| 
 | |
|  sudo ./sleepgraph.py -config config/custom-timeline-functions.cfg -status
 | |
|  Checking this system (myhostname)...
 | |
|     have root access: YES
 | |
|     is sysfs mounted: YES
 | |
|     is "mem" a valid power mode: YES
 | |
|     is ftrace supported: YES
 | |
|     are kprobes supported: YES
 | |
|     timeline data source: FTRACE (all trace events found)
 | |
|     is rtcwake supported: YES
 | |
|     verifying timeline kprobes work:
 | |
|          _cpu_down: YES
 | |
|          _cpu_up: YES
 | |
|          acpi_pm_finish: YES
 | |
|          acpi_pm_prepare: YES
 | |
|          freeze_kernel_threads: YES
 | |
|          freeze_processes: YES
 | |
|          sys_sync: YES
 | |
|          thaw_processes: YES
 | |
|     verifying dev kprobes work:
 | |
|          __const_udelay: YES
 | |
|          __mutex_lock_slowpath: YES
 | |
|          acpi_os_stall: YES
 | |
|          acpi_ps_parse_aml: YES
 | |
|          intel_opregion_init: NO
 | |
|          intel_opregion_register: NO
 | |
|          intel_opregion_setup: NO
 | |
|          msleep: YES
 | |
|          schedule_timeout: YES
 | |
|          schedule_timeout_uninterruptible: YES
 | |
|          usleep_range: YES
 | |
| 
 | |
| 
 | |
| ------------------------------------------------------------------
 | |
| |           TESTING ON CONSUMER LINUX OPERATING SYSTEMS          |
 | |
| ------------------------------------------------------------------
 | |
| 
 | |
| Android
 | |
| _______
 | |
| 
 | |
|  The easiest way to execute on an android device is to run the android.sh
 | |
|  script on the device, then pull the ftrace log back to the host and run
 | |
|  sleepgraph.py on it.
 | |
| 
 | |
|  Here are the steps:
 | |
| 
 | |
|  [download and install the tool on the device]
 | |
| 
 | |
| 	host%> wget https://raw.githubusercontent.com/intel/pm-graph/master/tools/android.sh
 | |
| 	host%> adb connect 192.168.1.6
 | |
| 	host%> adb root
 | |
| 	# push the script to a writeable location
 | |
| 	host%> adb push android.sh /sdcard/
 | |
| 
 | |
|  [check whether the tool will run on your device]
 | |
| 
 | |
| 	host%> adb shell
 | |
| 	dev%> cd /sdcard
 | |
| 	dev%> sh android.sh status
 | |
| 		host    : asus_t100
 | |
| 		kernel  : 3.14.0-i386-dirty
 | |
| 		modes   : freeze mem
 | |
| 		rtcwake : supported
 | |
| 		ftrace  : supported
 | |
| 		trace events {
 | |
| 		    suspend_resume: found
 | |
| 		    device_pm_callback_end: found
 | |
| 		    device_pm_callback_start: found
 | |
| 		}
 | |
| 	# the above is what you see on a system that's properly patched
 | |
| 
 | |
|  [execute the suspend]
 | |
| 
 | |
| 	# NOTE: The suspend will only work if the screen isn't timed out,
 | |
| 	# so you have to press some keys first to wake it up b4 suspend)
 | |
| 	dev%> sh android.sh suspend mem
 | |
| 	------------------------------------
 | |
| 	Suspend/Resume timing test initiated
 | |
| 	------------------------------------
 | |
| 	hostname   : asus_t100
 | |
| 	kernel     : 3.14.0-i386-dirty
 | |
| 	mode       : mem
 | |
| 	ftrace out : /mnt/shell/emulated/0/ftrace.txt
 | |
| 	dmesg out  : /mnt/shell/emulated/0/dmesg.txt
 | |
| 	log file   : /mnt/shell/emulated/0/log.txt
 | |
| 	------------------------------------
 | |
| 	INITIALIZING FTRACE........DONE
 | |
| 	STARTING FTRACE
 | |
| 	SUSPEND START @ 21:24:02 (rtcwake in 10 seconds)
 | |
| 	<adb connection will now terminate>
 | |
| 
 | |
|  [retrieve the data from the device]
 | |
| 
 | |
| 	# I find that you have to actually kill the adb process and
 | |
| 	# reconnect sometimes in order for the connection to work post-suspend
 | |
| 	host%> adb connect 192.168.1.6
 | |
| 	# (required) get the ftrace data, this is the most important piece
 | |
| 	host%> adb pull /sdcard/ftrace.txt
 | |
| 	# (optional) get the dmesg data, this is for debugging
 | |
| 	host%> adb pull /sdcard/dmesg.txt
 | |
| 	# (optional) get the log, which just lists some test times for comparison
 | |
| 	host%> adb pull /sdcard/log.txt
 | |
| 
 | |
|  [create an output html file using sleepgraph.py]
 | |
| 
 | |
| 	host%> sleepgraph.py -ftrace ftrace.txt
 | |
| 
 | |
|  You should now have an output.html with the android data, enjoy!
 |