1*4882a593Smuzhiyun# Monitor the system for dropped packets and proudce a report of drop locations and counts 2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0 3*4882a593Smuzhiyun 4*4882a593Smuzhiyunfrom __future__ import print_function 5*4882a593Smuzhiyun 6*4882a593Smuzhiyunimport os 7*4882a593Smuzhiyunimport sys 8*4882a593Smuzhiyun 9*4882a593Smuzhiyunsys.path.append(os.environ['PERF_EXEC_PATH'] + \ 10*4882a593Smuzhiyun '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') 11*4882a593Smuzhiyun 12*4882a593Smuzhiyunfrom perf_trace_context import * 13*4882a593Smuzhiyunfrom Core import * 14*4882a593Smuzhiyunfrom Util import * 15*4882a593Smuzhiyun 16*4882a593Smuzhiyundrop_log = {} 17*4882a593Smuzhiyunkallsyms = [] 18*4882a593Smuzhiyun 19*4882a593Smuzhiyundef get_kallsyms_table(): 20*4882a593Smuzhiyun global kallsyms 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun try: 23*4882a593Smuzhiyun f = open("/proc/kallsyms", "r") 24*4882a593Smuzhiyun except: 25*4882a593Smuzhiyun return 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun for line in f: 28*4882a593Smuzhiyun loc = int(line.split()[0], 16) 29*4882a593Smuzhiyun name = line.split()[2] 30*4882a593Smuzhiyun kallsyms.append((loc, name)) 31*4882a593Smuzhiyun kallsyms.sort() 32*4882a593Smuzhiyun 33*4882a593Smuzhiyundef get_sym(sloc): 34*4882a593Smuzhiyun loc = int(sloc) 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun # Invariant: kallsyms[i][0] <= loc for all 0 <= i <= start 37*4882a593Smuzhiyun # kallsyms[i][0] > loc for all end <= i < len(kallsyms) 38*4882a593Smuzhiyun start, end = -1, len(kallsyms) 39*4882a593Smuzhiyun while end != start + 1: 40*4882a593Smuzhiyun pivot = (start + end) // 2 41*4882a593Smuzhiyun if loc < kallsyms[pivot][0]: 42*4882a593Smuzhiyun end = pivot 43*4882a593Smuzhiyun else: 44*4882a593Smuzhiyun start = pivot 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun # Now (start == -1 or kallsyms[start][0] <= loc) 47*4882a593Smuzhiyun # and (start == len(kallsyms) - 1 or loc < kallsyms[start + 1][0]) 48*4882a593Smuzhiyun if start >= 0: 49*4882a593Smuzhiyun symloc, name = kallsyms[start] 50*4882a593Smuzhiyun return (name, loc - symloc) 51*4882a593Smuzhiyun else: 52*4882a593Smuzhiyun return (None, 0) 53*4882a593Smuzhiyun 54*4882a593Smuzhiyundef print_drop_table(): 55*4882a593Smuzhiyun print("%25s %25s %25s" % ("LOCATION", "OFFSET", "COUNT")) 56*4882a593Smuzhiyun for i in drop_log.keys(): 57*4882a593Smuzhiyun (sym, off) = get_sym(i) 58*4882a593Smuzhiyun if sym == None: 59*4882a593Smuzhiyun sym = i 60*4882a593Smuzhiyun print("%25s %25s %25s" % (sym, off, drop_log[i])) 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun 63*4882a593Smuzhiyundef trace_begin(): 64*4882a593Smuzhiyun print("Starting trace (Ctrl-C to dump results)") 65*4882a593Smuzhiyun 66*4882a593Smuzhiyundef trace_end(): 67*4882a593Smuzhiyun print("Gathering kallsyms data") 68*4882a593Smuzhiyun get_kallsyms_table() 69*4882a593Smuzhiyun print_drop_table() 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun# called from perf, when it finds a correspoinding event 72*4882a593Smuzhiyundef skb__kfree_skb(name, context, cpu, sec, nsec, pid, comm, callchain, 73*4882a593Smuzhiyun skbaddr, location, protocol): 74*4882a593Smuzhiyun slocation = str(location) 75*4882a593Smuzhiyun try: 76*4882a593Smuzhiyun drop_log[slocation] = drop_log[slocation] + 1 77*4882a593Smuzhiyun except: 78*4882a593Smuzhiyun drop_log[slocation] = 1 79