163e03724SNeil Horman# Monitor the system for dropped packets and proudce a report of drop locations and counts
2b2441318SGreg Kroah-Hartman# SPDX-License-Identifier: GPL-2.0
363e03724SNeil Horman
48c42b960STony Jonesfrom __future__ import print_function
58c42b960STony Jones
663e03724SNeil Hormanimport os
763e03724SNeil Hormanimport sys
863e03724SNeil Horman
963e03724SNeil Hormansys.path.append(os.environ['PERF_EXEC_PATH'] + \
1063e03724SNeil Horman	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
1163e03724SNeil Horman
1263e03724SNeil Hormanfrom perf_trace_context import *
1363e03724SNeil Hormanfrom Core import *
1463e03724SNeil Hormanfrom Util import *
1563e03724SNeil Horman
1663e03724SNeil Hormandrop_log = {}
1763e03724SNeil Hormankallsyms = []
1863e03724SNeil Horman
1963e03724SNeil Hormandef get_kallsyms_table():
2063e03724SNeil Horman	global kallsyms
216b75c735SBen Hutchings
2263e03724SNeil Horman	try:
2363e03724SNeil Horman		f = open("/proc/kallsyms", "r")
2463e03724SNeil Horman	except:
2563e03724SNeil Horman		return
2663e03724SNeil Horman
2763e03724SNeil Horman	for line in f:
2863e03724SNeil Horman		loc = int(line.split()[0], 16)
2963e03724SNeil Horman		name = line.split()[2]
30326017c7SBen Hutchings		kallsyms.append((loc, name))
3163e03724SNeil Horman	kallsyms.sort()
3263e03724SNeil Horman
3363e03724SNeil Hormandef get_sym(sloc):
3463e03724SNeil Horman	loc = int(sloc)
350ce58baeSBen Hutchings
360ce58baeSBen Hutchings	# Invariant: kallsyms[i][0] <= loc for all 0 <= i <= start
370ce58baeSBen Hutchings	#            kallsyms[i][0] > loc for all end <= i < len(kallsyms)
380ce58baeSBen Hutchings	start, end = -1, len(kallsyms)
390ce58baeSBen Hutchings	while end != start + 1:
400ce58baeSBen Hutchings		pivot = (start + end) // 2
410ce58baeSBen Hutchings		if loc < kallsyms[pivot][0]:
420ce58baeSBen Hutchings			end = pivot
430ce58baeSBen Hutchings		else:
440ce58baeSBen Hutchings			start = pivot
450ce58baeSBen Hutchings
460ce58baeSBen Hutchings	# Now (start == -1 or kallsyms[start][0] <= loc)
470ce58baeSBen Hutchings	# and (start == len(kallsyms) - 1 or loc < kallsyms[start + 1][0])
480ce58baeSBen Hutchings	if start >= 0:
490ce58baeSBen Hutchings		symloc, name = kallsyms[start]
50326017c7SBen Hutchings		return (name, loc - symloc)
510ce58baeSBen Hutchings	else:
5263e03724SNeil Horman		return (None, 0)
5363e03724SNeil Horman
5463e03724SNeil Hormandef print_drop_table():
558c42b960STony Jones	print("%25s %25s %25s" % ("LOCATION", "OFFSET", "COUNT"))
5663e03724SNeil Horman	for i in drop_log.keys():
5763e03724SNeil Horman		(sym, off) = get_sym(i)
5863e03724SNeil Horman		if sym == None:
5963e03724SNeil Horman			sym = i
608c42b960STony Jones		print("%25s %25s %25s" % (sym, off, drop_log[i]))
6163e03724SNeil Horman
6263e03724SNeil Horman
6363e03724SNeil Hormandef trace_begin():
648c42b960STony Jones	print("Starting trace (Ctrl-C to dump results)")
6563e03724SNeil Horman
6663e03724SNeil Hormandef trace_end():
678c42b960STony Jones	print("Gathering kallsyms data")
6863e03724SNeil Horman	get_kallsyms_table()
6963e03724SNeil Horman	print_drop_table()
7063e03724SNeil Horman
71*69b0e112SSriram Yagnaraman# called from perf, when it finds a corresponding event
720f5f5bcdSJoseph Schuchartdef skb__kfree_skb(name, context, cpu, sec, nsec, pid, comm, callchain,
73*69b0e112SSriram Yagnaraman		   skbaddr, location, protocol, reason):
7463e03724SNeil Horman	slocation = str(location)
7563e03724SNeil Horman	try:
7663e03724SNeil Horman		drop_log[slocation] = drop_log[slocation] + 1
7763e03724SNeil Horman	except:
7863e03724SNeil Horman		drop_log[slocation] = 1
79