summaryrefslogtreecommitdiff
path: root/tools/perf/scripts/python/mem-phys-addr.py
blob: 1f332e72b9b0f3435a352e3cc7d67d5ff33357d3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# mem-phys-addr.py: Resolve physical address samples
# SPDX-License-Identifier: GPL-2.0
#
# Copyright (c) 2018, Intel Corporation.

from __future__ import division
from __future__ import print_function

import os
import sys
import struct
import re
import bisect
import collections

sys.path.append(os.environ['PERF_EXEC_PATH'] + \
	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')

#physical address ranges for System RAM
system_ram = []
#physical address ranges for Persistent Memory
pmem = []
#file object for proc iomem
f = None
#Count for each type of memory
load_mem_type_cnt = collections.Counter()
#perf event name
event_name = None

def parse_iomem():
	global f
	f = open('/proc/iomem', 'r')
	for i, j in enumerate(f):
		m = re.split('-|:',j,2)
		if m[2].strip() == 'System RAM':
			system_ram.append(int(m[0], 16))
			system_ram.append(int(m[1], 16))
		if m[2].strip() == 'Persistent Memory':
			pmem.append(int(m[0], 16))
			pmem.append(int(m[1], 16))

def print_memory_type():
	print("Event: %s" % (event_name))
	print("%-40s  %10s  %10s\n" % ("Memory type", "count", "percentage"), end='')
	print("%-40s  %10s  %10s\n" % ("----------------------------------------",
					"-----------", "-----------"),
					end='');
	total = sum(load_mem_type_cnt.values())
	for mem_type, count in sorted(load_mem_type_cnt.most_common(), \
					key = lambda kv: (kv[1], kv[0]), reverse = True):
		print("%-40s  %10d  %10.1f%%\n" %
			(mem_type, count, 100 * count / total),
			end='')

def trace_begin():
	parse_iomem()

def trace_end():
	print_memory_type()
	f.close()

def is_system_ram(phys_addr):
	#/proc/iomem is sorted
	position = bisect.bisect(system_ram, phys_addr)
	if position % 2 == 0:
		return False
	return True

def is_persistent_mem(phys_addr):
	position = bisect.bisect(pmem, phys_addr)
	if position % 2 == 0:
		return False
	return True

def find_memory_type(phys_addr):
	if phys_addr == 0:
		return "N/A"
	if is_system_ram(phys_addr):
		return "System RAM"

	if is_persistent_mem(phys_addr):
		return "Persistent Memory"

	#slow path, search all
	f.seek(0, 0)
	for j in f:
		m = re.split('-|:',j,2)
		if int(m[0], 16) <= phys_addr <= int(m[1], 16):
			return m[2]
	return "N/A"

def process_event(param_dict):
	name       = param_dict["ev_name"]
	sample     = param_dict["sample"]
	phys_addr  = sample["phys_addr"]

	global event_name
	if event_name == None:
		event_name = name
	load_mem_type_cnt[find_memory_type(phys_addr)] += 1
ogy in part, so they are related. Thomas did random spot checks in about 500 files from the spreadsheets for the uapi headers and agreed with SPDX license identifier in the files he inspected. For the non-uapi files Thomas did random spot checks in about 15000 files. In initial set of patches against 4.14-rc6, 3 files were found to have copy/paste license identifier errors, and have been fixed to reflect the correct identifier. Additionally Philippe spent 10 hours this week doing a detailed manual inspection and review of the 12,461 patched files from the initial patch version early this week with: - a full scancode scan run, collecting the matched texts, detected license ids and scores - reviewing anything where there was a license detected (about 500+ files) to ensure that the applied SPDX license was correct - reviewing anything where there was no detection but the patch license was not GPL-2.0 WITH Linux-syscall-note to ensure that the applied SPDX license was correct This produced a worksheet with 20 files needing minor correction. This worksheet was then exported into 3 different .csv files for the different types of files to be modified. These .csv files were then reviewed by Greg. Thomas wrote a script to parse the csv files and add the proper SPDX tag to the file, in the format that the file expected. This script was further refined by Greg based on the output to detect more types of files automatically and to distinguish between header and source .c files (which need different comment types.) Finally Greg ran the script using the .csv files to generate the patches. Reviewed-by: Kate Stewart <kstewart@linuxfoundation.org> Reviewed-by: Philippe Ombredanne <pombredanne@nexb.com> Reviewed-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> 2017-03-03tools include: Adopt kernel's refcount.hArnaldo Carvalho de Melo To aid in catching bugs when using atomics as a reference count. This is a trimmed down version with just what is used by tools/ at this point. After this, the patches submitted by Elena for tools/ doing the conversion from atomic_ to recount_ methods can be applied and tested. To activate it, buint perf with: make DEBUG=1 -C tools/perf Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Elena Reshetova <elena.reshetova@intel.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Wang Nan <wangnan0@huawei.com> Link: http://lkml.kernel.org/n/tip-dqtxsumns9ov0l9r5x398f19@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>