Back to home page

OSCL-LXR

 
 

    


0001 # Monitor the system for dropped packets and proudce a report of drop locations and counts
0002 # SPDX-License-Identifier: GPL-2.0
0003 
0004 from __future__ import print_function
0005 
0006 import os
0007 import sys
0008 
0009 sys.path.append(os.environ['PERF_EXEC_PATH'] + \
0010     '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
0011 
0012 from perf_trace_context import *
0013 from Core import *
0014 from Util import *
0015 
0016 drop_log = {}
0017 kallsyms = []
0018 
0019 def get_kallsyms_table():
0020     global kallsyms
0021 
0022     try:
0023         f = open("/proc/kallsyms", "r")
0024     except:
0025         return
0026 
0027     for line in f:
0028         loc = int(line.split()[0], 16)
0029         name = line.split()[2]
0030         kallsyms.append((loc, name))
0031     kallsyms.sort()
0032 
0033 def get_sym(sloc):
0034     loc = int(sloc)
0035 
0036     # Invariant: kallsyms[i][0] <= loc for all 0 <= i <= start
0037     #            kallsyms[i][0] > loc for all end <= i < len(kallsyms)
0038     start, end = -1, len(kallsyms)
0039     while end != start + 1:
0040         pivot = (start + end) // 2
0041         if loc < kallsyms[pivot][0]:
0042             end = pivot
0043         else:
0044             start = pivot
0045 
0046     # Now (start == -1 or kallsyms[start][0] <= loc)
0047     # and (start == len(kallsyms) - 1 or loc < kallsyms[start + 1][0])
0048     if start >= 0:
0049         symloc, name = kallsyms[start]
0050         return (name, loc - symloc)
0051     else:
0052         return (None, 0)
0053 
0054 def print_drop_table():
0055     print("%25s %25s %25s" % ("LOCATION", "OFFSET", "COUNT"))
0056     for i in drop_log.keys():
0057         (sym, off) = get_sym(i)
0058         if sym == None:
0059             sym = i
0060         print("%25s %25s %25s" % (sym, off, drop_log[i]))
0061 
0062 
0063 def trace_begin():
0064     print("Starting trace (Ctrl-C to dump results)")
0065 
0066 def trace_end():
0067     print("Gathering kallsyms data")
0068     get_kallsyms_table()
0069     print_drop_table()
0070 
0071 # called from perf, when it finds a correspoinding event
0072 def skb__kfree_skb(name, context, cpu, sec, nsec, pid, comm, callchain,
0073            skbaddr, location, protocol):
0074     slocation = str(location)
0075     try:
0076         drop_log[slocation] = drop_log[slocation] + 1
0077     except:
0078         drop_log[slocation] = 1