brintos

brintos / linux-shallow public Read only

0
0
Text · 2.4 KiB · 1f332e7 Raw
101 lines · python
1# mem-phys-addr.py: Resolve physical address samples2# SPDX-License-Identifier: GPL-2.03#4# Copyright (c) 2018, Intel Corporation.5 6from __future__ import division7from __future__ import print_function8 9import os10import sys11import struct12import re13import bisect14import collections15 16sys.path.append(os.environ['PERF_EXEC_PATH'] + \17	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')18 19#physical address ranges for System RAM20system_ram = []21#physical address ranges for Persistent Memory22pmem = []23#file object for proc iomem24f = None25#Count for each type of memory26load_mem_type_cnt = collections.Counter()27#perf event name28event_name = None29 30def parse_iomem():31	global f32	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 sorted64	position = bisect.bisect(system_ram, phys_addr)65	if position % 2 == 0:66		return False67	return True68 69def is_persistent_mem(phys_addr):70	position = bisect.bisect(pmem, phys_addr)71	if position % 2 == 0:72		return False73	return True74 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 all85	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_name98	if event_name == None:99		event_name = name100	load_mem_type_cnt[find_memory_type(phys_addr)] += 1101