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