1 # mem-phys-addr.py: Resolve physical address samples
2 # SPDX-License-Identifier: GPL-2.0
4 # Copyright (c) 2018, Intel Corporation.
6 from __future__
import division
14 sys
.path
.append(os
.environ
['PERF_EXEC_PATH'] + \
15 '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
17 #physical address ranges for System RAM
19 #physical address ranges for Persistent Memory
21 #file object for proc iomem
23 #Count for each type of memory
24 load_mem_type_cnt
= collections
.Counter()
30 f
= open('/proc/iomem', 'r')
31 for i
, j
in enumerate(f
):
32 m
= re
.split('-|:',j
,2)
33 if m
[2].strip() == 'System RAM':
34 system_ram
.append(long(m
[0], 16))
35 system_ram
.append(long(m
[1], 16))
36 if m
[2].strip() == 'Persistent Memory':
37 pmem
.append(long(m
[0], 16))
38 pmem
.append(long(m
[1], 16))
40 def print_memory_type():
41 print "Event: %s" % (event_name
)
42 print "%-40s %10s %10s\n" % ("Memory type", "count", "percentage"),
43 print "%-40s %10s %10s\n" % ("----------------------------------------", \
44 "-----------", "-----------"),
45 total
= sum(load_mem_type_cnt
.values())
46 for mem_type
, count
in sorted(load_mem_type_cnt
.most_common(), \
47 key
= lambda(k
, v
): (v
, k
), reverse
= True):
48 print "%-40s %10d %10.1f%%\n" % (mem_type
, count
, 100 * count
/ total
),
57 def is_system_ram(phys_addr
):
58 #/proc/iomem is sorted
59 position
= bisect
.bisect(system_ram
, phys_addr
)
64 def is_persistent_mem(phys_addr
):
65 position
= bisect
.bisect(pmem
, phys_addr
)
70 def find_memory_type(phys_addr
):
73 if is_system_ram(phys_addr
):
76 if is_persistent_mem(phys_addr
):
77 return "Persistent Memory"
79 #slow path, search all
82 m
= re
.split('-|:',j
,2)
83 if long(m
[0], 16) <= phys_addr
<= long(m
[1], 16):
87 def process_event(param_dict
):
88 name
= param_dict
["ev_name"]
89 sample
= param_dict
["sample"]
90 phys_addr
= sample
["phys_addr"]
93 if event_name
== None:
95 load_mem_type_cnt
[find_memory_type(phys_addr
)] += 1