xref: /OK3568_Linux_fs/kernel/tools/perf/scripts/python/net_dropmonitor.py (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun# Monitor the system for dropped packets and proudce a report of drop locations and counts
2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0
3*4882a593Smuzhiyun
4*4882a593Smuzhiyunfrom __future__ import print_function
5*4882a593Smuzhiyun
6*4882a593Smuzhiyunimport os
7*4882a593Smuzhiyunimport sys
8*4882a593Smuzhiyun
9*4882a593Smuzhiyunsys.path.append(os.environ['PERF_EXEC_PATH'] + \
10*4882a593Smuzhiyun	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
11*4882a593Smuzhiyun
12*4882a593Smuzhiyunfrom perf_trace_context import *
13*4882a593Smuzhiyunfrom Core import *
14*4882a593Smuzhiyunfrom Util import *
15*4882a593Smuzhiyun
16*4882a593Smuzhiyundrop_log = {}
17*4882a593Smuzhiyunkallsyms = []
18*4882a593Smuzhiyun
19*4882a593Smuzhiyundef get_kallsyms_table():
20*4882a593Smuzhiyun	global kallsyms
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun	try:
23*4882a593Smuzhiyun		f = open("/proc/kallsyms", "r")
24*4882a593Smuzhiyun	except:
25*4882a593Smuzhiyun		return
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun	for line in f:
28*4882a593Smuzhiyun		loc = int(line.split()[0], 16)
29*4882a593Smuzhiyun		name = line.split()[2]
30*4882a593Smuzhiyun		kallsyms.append((loc, name))
31*4882a593Smuzhiyun	kallsyms.sort()
32*4882a593Smuzhiyun
33*4882a593Smuzhiyundef get_sym(sloc):
34*4882a593Smuzhiyun	loc = int(sloc)
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun	# Invariant: kallsyms[i][0] <= loc for all 0 <= i <= start
37*4882a593Smuzhiyun	#            kallsyms[i][0] > loc for all end <= i < len(kallsyms)
38*4882a593Smuzhiyun	start, end = -1, len(kallsyms)
39*4882a593Smuzhiyun	while end != start + 1:
40*4882a593Smuzhiyun		pivot = (start + end) // 2
41*4882a593Smuzhiyun		if loc < kallsyms[pivot][0]:
42*4882a593Smuzhiyun			end = pivot
43*4882a593Smuzhiyun		else:
44*4882a593Smuzhiyun			start = pivot
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun	# Now (start == -1 or kallsyms[start][0] <= loc)
47*4882a593Smuzhiyun	# and (start == len(kallsyms) - 1 or loc < kallsyms[start + 1][0])
48*4882a593Smuzhiyun	if start >= 0:
49*4882a593Smuzhiyun		symloc, name = kallsyms[start]
50*4882a593Smuzhiyun		return (name, loc - symloc)
51*4882a593Smuzhiyun	else:
52*4882a593Smuzhiyun		return (None, 0)
53*4882a593Smuzhiyun
54*4882a593Smuzhiyundef print_drop_table():
55*4882a593Smuzhiyun	print("%25s %25s %25s" % ("LOCATION", "OFFSET", "COUNT"))
56*4882a593Smuzhiyun	for i in drop_log.keys():
57*4882a593Smuzhiyun		(sym, off) = get_sym(i)
58*4882a593Smuzhiyun		if sym == None:
59*4882a593Smuzhiyun			sym = i
60*4882a593Smuzhiyun		print("%25s %25s %25s" % (sym, off, drop_log[i]))
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun
63*4882a593Smuzhiyundef trace_begin():
64*4882a593Smuzhiyun	print("Starting trace (Ctrl-C to dump results)")
65*4882a593Smuzhiyun
66*4882a593Smuzhiyundef trace_end():
67*4882a593Smuzhiyun	print("Gathering kallsyms data")
68*4882a593Smuzhiyun	get_kallsyms_table()
69*4882a593Smuzhiyun	print_drop_table()
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun# called from perf, when it finds a correspoinding event
72*4882a593Smuzhiyundef skb__kfree_skb(name, context, cpu, sec, nsec, pid, comm, callchain,
73*4882a593Smuzhiyun		   skbaddr, location, protocol):
74*4882a593Smuzhiyun	slocation = str(location)
75*4882a593Smuzhiyun	try:
76*4882a593Smuzhiyun		drop_log[slocation] = drop_log[slocation] + 1
77*4882a593Smuzhiyun	except:
78*4882a593Smuzhiyun		drop_log[slocation] = 1
79