Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.5.6.
  1# mem-phys-addr.py: Resolve physical address samples
  2# SPDX-License-Identifier: GPL-2.0
  3#
  4# Copyright (c) 2018, Intel Corporation.
  5
  6from __future__ import division
  7from __future__ import print_function
  8
  9import os
 10import sys
 11import struct
 12import re
 13import bisect
 14import collections
 15
 16sys.path.append(os.environ['PERF_EXEC_PATH'] + \
 17	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
 18
 19#physical address ranges for System RAM
 20system_ram = []
 21#physical address ranges for Persistent Memory
 22pmem = []
 23#file object for proc iomem
 24f = None
 25#Count for each type of memory
 26load_mem_type_cnt = collections.Counter()
 27#perf event name
 28event_name = None
 29
 30def parse_iomem():
 31	global f
 32	f = open('/proc/iomem', 'r')
 33	for i, j in enumerate(f):
 34		m = re.split('-|:',j,2)
 35		if m[2].strip() == 'System RAM':
 36			system_ram.append(int(m[0], 16))
 37			system_ram.append(int(m[1], 16))
 38		if m[2].strip() == 'Persistent Memory':
 39			pmem.append(int(m[0], 16))
 40			pmem.append(int(m[1], 16))
 41
 42def print_memory_type():
 43	print("Event: %s" % (event_name))
 44	print("%-40s  %10s  %10s\n" % ("Memory type", "count", "percentage"), end='')
 45	print("%-40s  %10s  %10s\n" % ("----------------------------------------",
 46					"-----------", "-----------"),
 47					end='');
 48	total = sum(load_mem_type_cnt.values())
 49	for mem_type, count in sorted(load_mem_type_cnt.most_common(), \
 50					key = lambda kv: (kv[1], kv[0]), reverse = True):
 51		print("%-40s  %10d  %10.1f%%\n" %
 52			(mem_type, count, 100 * count / total),
 53			end='')
 54
 55def trace_begin():
 56	parse_iomem()
 57
 58def trace_end():
 59	print_memory_type()
 60	f.close()
 61
 62def is_system_ram(phys_addr):
 63	#/proc/iomem is sorted
 64	position = bisect.bisect(system_ram, phys_addr)
 65	if position % 2 == 0:
 66		return False
 67	return True
 68
 69def is_persistent_mem(phys_addr):
 70	position = bisect.bisect(pmem, phys_addr)
 71	if position % 2 == 0:
 72		return False
 73	return True
 74
 75def find_memory_type(phys_addr):
 76	if phys_addr == 0:
 77		return "N/A"
 78	if is_system_ram(phys_addr):
 79		return "System RAM"
 80
 81	if is_persistent_mem(phys_addr):
 82		return "Persistent Memory"
 83
 84	#slow path, search all
 85	f.seek(0, 0)
 86	for j in f:
 87		m = re.split('-|:',j,2)
 88		if int(m[0], 16) <= phys_addr <= int(m[1], 16):
 89			return m[2]
 90	return "N/A"
 91
 92def process_event(param_dict):
 93	name       = param_dict["ev_name"]
 94	sample     = param_dict["sample"]
 95	phys_addr  = sample["phys_addr"]
 96
 97	global event_name
 98	if event_name == None:
 99		event_name = name
100	load_mem_type_cnt[find_memory_type(phys_addr)] += 1