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