73 lines
		
	
	
	
		
			1.5 KiB
			
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			73 lines
		
	
	
	
		
			1.5 KiB
			
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | # Monitor the system for dropped packets and proudce a report of drop locations and counts | ||
|  | 
 | ||
|  | import os | ||
|  | import sys | ||
|  | 
 | ||
|  | sys.path.append(os.environ['PERF_EXEC_PATH'] + \ | ||
|  | 		'/scripts/python/Perf-Trace-Util/lib/Perf/Trace') | ||
|  | 
 | ||
|  | from perf_trace_context import * | ||
|  | from Core import * | ||
|  | from Util import * | ||
|  | 
 | ||
|  | drop_log = {} | ||
|  | kallsyms = [] | ||
|  | 
 | ||
|  | def get_kallsyms_table(): | ||
|  | 	global kallsyms | ||
|  | 	try: | ||
|  | 		f = open("/proc/kallsyms", "r") | ||
|  | 		linecount = 0 | ||
|  | 		for line in f: | ||
|  | 			linecount = linecount+1 | ||
|  | 		f.seek(0) | ||
|  | 	except: | ||
|  | 		return | ||
|  | 
 | ||
|  | 
 | ||
|  | 	j = 0 | ||
|  | 	for line in f: | ||
|  | 		loc = int(line.split()[0], 16) | ||
|  | 		name = line.split()[2] | ||
|  | 		j = j +1 | ||
|  | 		if ((j % 100) == 0): | ||
|  | 			print "\r" + str(j) + "/" + str(linecount), | ||
|  | 		kallsyms.append({ 'loc': loc, 'name' : name}) | ||
|  | 
 | ||
|  | 	print "\r" + str(j) + "/" + str(linecount) | ||
|  | 	kallsyms.sort() | ||
|  | 	return | ||
|  | 
 | ||
|  | def get_sym(sloc): | ||
|  | 	loc = int(sloc) | ||
|  | 	for i in kallsyms: | ||
|  | 		if (i['loc'] >= loc): | ||
|  | 			return (i['name'], i['loc']-loc) | ||
|  | 	return (None, 0) | ||
|  | 
 | ||
|  | def print_drop_table(): | ||
|  | 	print "%25s %25s %25s" % ("LOCATION", "OFFSET", "COUNT") | ||
|  | 	for i in drop_log.keys(): | ||
|  | 		(sym, off) = get_sym(i) | ||
|  | 		if sym == None: | ||
|  | 			sym = i | ||
|  | 		print "%25s %25s %25s" % (sym, off, drop_log[i]) | ||
|  | 
 | ||
|  | 
 | ||
|  | def trace_begin(): | ||
|  | 	print "Starting trace (Ctrl-C to dump results)" | ||
|  | 
 | ||
|  | def trace_end(): | ||
|  | 	print "Gathering kallsyms data" | ||
|  | 	get_kallsyms_table() | ||
|  | 	print_drop_table() | ||
|  | 
 | ||
|  | # called from perf, when it finds a correspoinding event | ||
|  | def skb__kfree_skb(name, context, cpu, sec, nsec, pid, comm, | ||
|  | 			skbaddr, protocol, location): | ||
|  | 	slocation = str(location) | ||
|  | 	try: | ||
|  | 		drop_log[slocation] = drop_log[slocation] + 1 | ||
|  | 	except: | ||
|  | 		drop_log[slocation] = 1 |