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