163e03724SNeil Horman# Monitor the system for dropped packets and proudce a report of drop locations and counts
263e03724SNeil Horman
363e03724SNeil Hormanimport os
463e03724SNeil Hormanimport sys
563e03724SNeil Horman
663e03724SNeil Hormansys.path.append(os.environ['PERF_EXEC_PATH'] + \
763e03724SNeil Horman		'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
863e03724SNeil Horman
963e03724SNeil Hormanfrom perf_trace_context import *
1063e03724SNeil Hormanfrom Core import *
1163e03724SNeil Hormanfrom Util import *
1263e03724SNeil Horman
1363e03724SNeil Hormandrop_log = {}
1463e03724SNeil Hormankallsyms = []
1563e03724SNeil Horman
1663e03724SNeil Hormandef get_kallsyms_table():
1763e03724SNeil Horman	global kallsyms
1863e03724SNeil Horman	try:
1963e03724SNeil Horman		f = open("/proc/kallsyms", "r")
2063e03724SNeil Horman		linecount = 0
2163e03724SNeil Horman		for line in f:
2263e03724SNeil Horman			linecount = linecount+1
2363e03724SNeil Horman		f.seek(0)
2463e03724SNeil Horman	except:
2563e03724SNeil Horman		return
2663e03724SNeil Horman
2763e03724SNeil Horman
2863e03724SNeil Horman	j = 0
2963e03724SNeil Horman	for line in f:
3063e03724SNeil Horman		loc = int(line.split()[0], 16)
3163e03724SNeil Horman		name = line.split()[2]
3263e03724SNeil Horman		j = j +1
3363e03724SNeil Horman		if ((j % 100) == 0):
3463e03724SNeil Horman			print "\r" + str(j) + "/" + str(linecount),
35*326017c7SBen Hutchings		kallsyms.append((loc, name))
3663e03724SNeil Horman
3763e03724SNeil Horman	print "\r" + str(j) + "/" + str(linecount)
3863e03724SNeil Horman	kallsyms.sort()
3963e03724SNeil Horman	return
4063e03724SNeil Horman
4163e03724SNeil Hormandef get_sym(sloc):
4263e03724SNeil Horman	loc = int(sloc)
43*326017c7SBen Hutchings	for symloc, name in kallsyms[::-1]:
44*326017c7SBen Hutchings		if loc >= symloc:
45*326017c7SBen Hutchings			return (name, loc - symloc)
4663e03724SNeil Horman	return (None, 0)
4763e03724SNeil Horman
4863e03724SNeil Hormandef print_drop_table():
4963e03724SNeil Horman	print "%25s %25s %25s" % ("LOCATION", "OFFSET", "COUNT")
5063e03724SNeil Horman	for i in drop_log.keys():
5163e03724SNeil Horman		(sym, off) = get_sym(i)
5263e03724SNeil Horman		if sym == None:
5363e03724SNeil Horman			sym = i
5463e03724SNeil Horman		print "%25s %25s %25s" % (sym, off, drop_log[i])
5563e03724SNeil Horman
5663e03724SNeil Horman
5763e03724SNeil Hormandef trace_begin():
5863e03724SNeil Horman	print "Starting trace (Ctrl-C to dump results)"
5963e03724SNeil Horman
6063e03724SNeil Hormandef trace_end():
6163e03724SNeil Horman	print "Gathering kallsyms data"
6263e03724SNeil Horman	get_kallsyms_table()
6363e03724SNeil Horman	print_drop_table()
6463e03724SNeil Horman
6563e03724SNeil Horman# called from perf, when it finds a correspoinding event
6663e03724SNeil Hormandef skb__kfree_skb(name, context, cpu, sec, nsec, pid, comm,
67140c3c6aSBen Hutchings		   skbaddr, location, protocol):
6863e03724SNeil Horman	slocation = str(location)
6963e03724SNeil Horman	try:
7063e03724SNeil Horman		drop_log[slocation] = drop_log[slocation] + 1
7163e03724SNeil Horman	except:
7263e03724SNeil Horman		drop_log[slocation] = 1
73