1*63e03724SNeil Horman# Monitor the system for dropped packets and proudce a report of drop locations and counts 2*63e03724SNeil Horman 3*63e03724SNeil Hormanimport os 4*63e03724SNeil Hormanimport sys 5*63e03724SNeil Horman 6*63e03724SNeil Hormansys.path.append(os.environ['PERF_EXEC_PATH'] + \ 7*63e03724SNeil Horman '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') 8*63e03724SNeil Horman 9*63e03724SNeil Hormanfrom perf_trace_context import * 10*63e03724SNeil Hormanfrom Core import * 11*63e03724SNeil Hormanfrom Util import * 12*63e03724SNeil Horman 13*63e03724SNeil Hormandrop_log = {} 14*63e03724SNeil Hormankallsyms = [] 15*63e03724SNeil Horman 16*63e03724SNeil Hormandef get_kallsyms_table(): 17*63e03724SNeil Horman global kallsyms 18*63e03724SNeil Horman try: 19*63e03724SNeil Horman f = open("/proc/kallsyms", "r") 20*63e03724SNeil Horman linecount = 0 21*63e03724SNeil Horman for line in f: 22*63e03724SNeil Horman linecount = linecount+1 23*63e03724SNeil Horman f.seek(0) 24*63e03724SNeil Horman except: 25*63e03724SNeil Horman return 26*63e03724SNeil Horman 27*63e03724SNeil Horman 28*63e03724SNeil Horman j = 0 29*63e03724SNeil Horman for line in f: 30*63e03724SNeil Horman loc = int(line.split()[0], 16) 31*63e03724SNeil Horman name = line.split()[2] 32*63e03724SNeil Horman j = j +1 33*63e03724SNeil Horman if ((j % 100) == 0): 34*63e03724SNeil Horman print "\r" + str(j) + "/" + str(linecount), 35*63e03724SNeil Horman kallsyms.append({ 'loc': loc, 'name' : name}) 36*63e03724SNeil Horman 37*63e03724SNeil Horman print "\r" + str(j) + "/" + str(linecount) 38*63e03724SNeil Horman kallsyms.sort() 39*63e03724SNeil Horman return 40*63e03724SNeil Horman 41*63e03724SNeil Hormandef get_sym(sloc): 42*63e03724SNeil Horman loc = int(sloc) 43*63e03724SNeil Horman for i in kallsyms: 44*63e03724SNeil Horman if (i['loc'] >= loc): 45*63e03724SNeil Horman return (i['name'], i['loc']-loc) 46*63e03724SNeil Horman return (None, 0) 47*63e03724SNeil Horman 48*63e03724SNeil Hormandef print_drop_table(): 49*63e03724SNeil Horman print "%25s %25s %25s" % ("LOCATION", "OFFSET", "COUNT") 50*63e03724SNeil Horman for i in drop_log.keys(): 51*63e03724SNeil Horman (sym, off) = get_sym(i) 52*63e03724SNeil Horman if sym == None: 53*63e03724SNeil Horman sym = i 54*63e03724SNeil Horman print "%25s %25s %25s" % (sym, off, drop_log[i]) 55*63e03724SNeil Horman 56*63e03724SNeil Horman 57*63e03724SNeil Hormandef trace_begin(): 58*63e03724SNeil Horman print "Starting trace (Ctrl-C to dump results)" 59*63e03724SNeil Horman 60*63e03724SNeil Hormandef trace_end(): 61*63e03724SNeil Horman print "Gathering kallsyms data" 62*63e03724SNeil Horman get_kallsyms_table() 63*63e03724SNeil Horman print_drop_table() 64*63e03724SNeil Horman 65*63e03724SNeil Horman# called from perf, when it finds a correspoinding event 66*63e03724SNeil Hormandef skb__kfree_skb(name, context, cpu, sec, nsec, pid, comm, 67*63e03724SNeil Horman skbaddr, protocol, location): 68*63e03724SNeil Horman slocation = str(location) 69*63e03724SNeil Horman try: 70*63e03724SNeil Horman drop_log[slocation] = drop_log[slocation] + 1 71*63e03724SNeil Horman except: 72*63e03724SNeil Horman drop_log[slocation] = 1 73