mem-phys-addr.py 2.3 KB

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