diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-01-30 22:15:14 +0300 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-01-30 22:15:14 +0300 | 
| commit | d8b91dde38f4c43bd0bbbf17a90f735b16aaff2c (patch) | |
| tree | bd72dabf6e4b23e060fce429c87e60504f69de54 /tools/perf/scripts/python/mem-phys-addr.py | |
| parent | 5e7481a25e90b661d1dbbba18be3fd3dfe12ec6f (diff) | |
| parent | e4c1091cb495d9cbec8956d642644a71a1689958 (diff) | |
| download | linux-d8b91dde38f4c43bd0bbbf17a90f735b16aaff2c.tar.xz | |
Merge branch 'perf-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull perf updates from Ingo Molnar:
 "Kernel side changes:
   - Clean up the x86 instruction decoder (Masami Hiramatsu)
   - Add new uprobes optimization for PUSH instructions on x86 (Yonghong
     Song)
   - Add MSR_IA32_THERM_STATUS to the MSR events (Stephane Eranian)
   - Fix misc bugs, update documentation, plus various cleanups (Jiri
     Olsa)
  There's a large number of tooling side improvements:
   - Intel-PT/BTS improvements (Adrian Hunter)
   - Numerous 'perf trace' improvements (Arnaldo Carvalho de Melo)
   - Introduce an errno code to string facility (Hendrik Brueckner)
   - Various build system improvements (Jiri Olsa)
   - Add support for CoreSight trace decoding by making the perf tools
     use the external openCSD (Mathieu Poirier, Tor Jeremiassen)
   - Add ARM Statistical Profiling Extensions (SPE) support (Kim
     Phillips)
   - libtraceevent updates (Steven Rostedt)
   - Intel vendor event JSON updates (Andi Kleen)
   - Introduce 'perf report --mmaps' and 'perf report --tasks' to show
     info present in 'perf.data' (Jiri Olsa, Arnaldo Carvalho de Melo)
   - Add infrastructure to record first and last sample time to the
     perf.data file header, so that when processing all samples in a
     'perf record' session, such as when doing build-id processing, or
     when specifically requesting that that info be recorded, use that
     in 'perf report --time', that also got support for percent slices
     in addition to absolute ones.
     I.e. now it is possible to ask for the samples in the 10%-20% time
     slice of a perf.data file (Jin Yao)
   - Allow system wide 'perf stat --per-thread', sorting the result (Jin
     Yao)
     E.g.:
      [root@jouet ~]# perf stat --per-thread --metrics IPC
      ^C
       Performance counter stats for 'system wide':
                  make-22229  23,012,094,032  inst_retired.any   #  0.8 IPC
                   cc1-22419     692,027,497  inst_retired.any   #  0.8 IPC
                   gcc-22418     328,231,855  inst_retired.any   #  0.9 IPC
                   cc1-22509     220,853,647  inst_retired.any   #  0.8 IPC
                   gcc-22486     199,874,810  inst_retired.any   #  1.0 IPC
                    as-22466     177,896,365  inst_retired.any   #  0.9 IPC
                   cc1-22465     150,732,374  inst_retired.any   #  0.8 IPC
                   gcc-22508     112,555,593  inst_retired.any   #  0.9 IPC
                   cc1-22487     108,964,079  inst_retired.any   #  0.7 IPC
       qemu-system-x86-2697       21,330,550  inst_retired.any   #  0.3 IPC
       systemd-journal-551        20,642,951  inst_retired.any   #  0.4 IPC
       docker-containe-17651       9,552,892  inst_retired.any   #  0.5 IPC
       dockerd-current-9809        7,528,586  inst_retired.any   #  0.5 IPC
                  make-22153  12,504,194,380  inst_retired.any   #  0.8 IPC
               python2-22429  12,081,290,954  inst_retired.any   #  0.8 IPC
      <SNIP>
               python2-22429  15,026,328,103  cpu_clk_unhalted.thread
                   cc1-22419     826,660,193  cpu_clk_unhalted.thread
                   gcc-22418     365,321,295  cpu_clk_unhalted.thread
                   cc1-22509     279,169,362  cpu_clk_unhalted.thread
                   gcc-22486     210,156,950  cpu_clk_unhalted.thread
      <SNIP>
           5.638075538 seconds time elapsed
     [root@jouet ~]#
   - Improve shell auto-completion of perf events (Jin Yao)
   - 'perf probe' improvements (Masami Hiramatsu)
   - Improve PMU infrastructure to support amp64's ThunderX2
     implementation defined core events (Ganapatrao Kulkarni)
   - Various annotation related improvements and fixes (Thomas Richter)
   - Clarify usage of 'overwrite' and 'backward' in the evlist/mmap
     code, removing the 'overwrite' parameter from several functions as
     it was always used it as 'false' (Wang Nan)
   - Fix/improve 'perf record' reverse recording support (Wang Nan)
   - Improve command line options documentation (Sihyeon Jang)
   - Optimize sample parsing for ordering events, where we don't need to
     parse all the PERF_SAMPLE_ bits, just the ones leading to the
     timestamp needed to reorder events (Jiri Olsa)
   - Generalize the annotation code to support other source information
     besides objdump/DWARF obtained ones, starting with python scripts,
     that will is slated to be merged soon (Jiri Olsa)
   - ... and a lot more that I failed to list, see the shortlog and
     changelog for details"
* 'perf-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (262 commits)
  perf trace beauty flock: Move to separate object file
  perf evlist: Remove fcntl.h from evlist.h
  perf trace beauty futex: Beautify FUTEX_BITSET_MATCH_ANY
  perf trace: Do not print from time delta for interrupted syscall lines
  perf trace: Add --print-sample
  perf bpf: Remove misplaced __maybe_unused attribute
  MAINTAINERS: Adding entry for CoreSight trace decoding
  perf tools: Add mechanic to synthesise CoreSight trace packets
  perf tools: Add full support for CoreSight trace decoding
  pert tools: Add queue management functionality
  perf tools: Add functionality to communicate with the openCSD decoder
  perf tools: Add support for decoding CoreSight trace data
  perf tools: Add decoder mechanic to support dumping trace data
  perf tools: Add processing of coresight metadata
  perf tools: Add initial entry point for decoder CoreSight traces
  perf tools: Integrating the CoreSight decoding library
  perf vendor events intel: Update IvyTown files to V20
  perf vendor events intel: Update IvyBridge files to V20
  perf vendor events intel: Update BroadwellDE events to V7
  perf vendor events intel: Update SkylakeX events to V1.06
  ...
Diffstat (limited to 'tools/perf/scripts/python/mem-phys-addr.py')
| -rw-r--r-- | tools/perf/scripts/python/mem-phys-addr.py | 95 | 
1 files changed, 95 insertions, 0 deletions
diff --git a/tools/perf/scripts/python/mem-phys-addr.py b/tools/perf/scripts/python/mem-phys-addr.py new file mode 100644 index 000000000000..ebee2c5ae496 --- /dev/null +++ b/tools/perf/scripts/python/mem-phys-addr.py @@ -0,0 +1,95 @@ +# mem-phys-addr.py: Resolve physical address samples +# SPDX-License-Identifier: GPL-2.0 +# +# Copyright (c) 2018, Intel Corporation. + +from __future__ import division +import os +import sys +import struct +import re +import bisect +import collections + +sys.path.append(os.environ['PERF_EXEC_PATH'] + \ +	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace') + +#physical address ranges for System RAM +system_ram = [] +#physical address ranges for Persistent Memory +pmem = [] +#file object for proc iomem +f = None +#Count for each type of memory +load_mem_type_cnt = collections.Counter() +#perf event name +event_name = None + +def parse_iomem(): +	global f +	f = open('/proc/iomem', 'r') +	for i, j in enumerate(f): +		m = re.split('-|:',j,2) +		if m[2].strip() == 'System RAM': +			system_ram.append(long(m[0], 16)) +			system_ram.append(long(m[1], 16)) +		if m[2].strip() == 'Persistent Memory': +			pmem.append(long(m[0], 16)) +			pmem.append(long(m[1], 16)) + +def print_memory_type(): +	print "Event: %s" % (event_name) +	print "%-40s  %10s  %10s\n" % ("Memory type", "count", "percentage"), +	print "%-40s  %10s  %10s\n" % ("----------------------------------------", \ +					"-----------", "-----------"), +	total = sum(load_mem_type_cnt.values()) +	for mem_type, count in sorted(load_mem_type_cnt.most_common(), \ +					key = lambda(k, v): (v, k), reverse = True): +		print "%-40s  %10d  %10.1f%%\n" % (mem_type, count, 100 * count / total), + +def trace_begin(): +	parse_iomem() + +def trace_end(): +	print_memory_type() +	f.close() + +def is_system_ram(phys_addr): +	#/proc/iomem is sorted +	position = bisect.bisect(system_ram, phys_addr) +	if position % 2 == 0: +		return False +	return True + +def is_persistent_mem(phys_addr): +	position = bisect.bisect(pmem, phys_addr) +	if position % 2 == 0: +		return False +	return True + +def find_memory_type(phys_addr): +	if phys_addr == 0: +		return "N/A" +	if is_system_ram(phys_addr): +		return "System RAM" + +	if is_persistent_mem(phys_addr): +		return "Persistent Memory" + +	#slow path, search all +	f.seek(0, 0) +	for j in f: +		m = re.split('-|:',j,2) +		if long(m[0], 16) <= phys_addr <= long(m[1], 16): +			return m[2] +	return "N/A" + +def process_event(param_dict): +	name       = param_dict["ev_name"] +	sample     = param_dict["sample"] +	phys_addr  = sample["phys_addr"] + +	global event_name +	if event_name == None: +		event_name = name +	load_mem_type_cnt[find_memory_type(phys_addr)] += 1  | 
