0001
0002
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
0037
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
0047
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
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