~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/tools/perf/scripts/python/mem-phys-addr.py

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /tools/perf/scripts/python/mem-phys-addr.py (Version linux-6.12-rc7) and /tools/perf/scripts/python/mem-phys-addr.py (Version linux-5.6.19)


  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
                                                      

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php