forked from mirrors/linux
		
	Include reason parameter that was added in commit c504e5c2f9
("net: skb: introduce kfree_skb_reason()")
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Sriram Yagnaraman <sriram.yagnaraman@est.tech>
Link: https://lore.kernel.org/r/20230426104149.14089-1-sriram.yagnaraman@est.tech
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
		
	
			
		
			
				
	
	
		
			78 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
# Monitor the system for dropped packets and proudce a report of drop locations and counts
 | 
						|
# SPDX-License-Identifier: GPL-2.0
 | 
						|
 | 
						|
from __future__ import print_function
 | 
						|
 | 
						|
import os
 | 
						|
import sys
 | 
						|
 | 
						|
sys.path.append(os.environ['PERF_EXEC_PATH'] + \
 | 
						|
	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
 | 
						|
 | 
						|
from perf_trace_context import *
 | 
						|
from Core import *
 | 
						|
from Util import *
 | 
						|
 | 
						|
drop_log = {}
 | 
						|
kallsyms = []
 | 
						|
 | 
						|
def get_kallsyms_table():
 | 
						|
	global kallsyms
 | 
						|
 | 
						|
	try:
 | 
						|
		f = open("/proc/kallsyms", "r")
 | 
						|
	except:
 | 
						|
		return
 | 
						|
 | 
						|
	for line in f:
 | 
						|
		loc = int(line.split()[0], 16)
 | 
						|
		name = line.split()[2]
 | 
						|
		kallsyms.append((loc, name))
 | 
						|
	kallsyms.sort()
 | 
						|
 | 
						|
def get_sym(sloc):
 | 
						|
	loc = int(sloc)
 | 
						|
 | 
						|
	# Invariant: kallsyms[i][0] <= loc for all 0 <= i <= start
 | 
						|
	#            kallsyms[i][0] > loc for all end <= i < len(kallsyms)
 | 
						|
	start, end = -1, len(kallsyms)
 | 
						|
	while end != start + 1:
 | 
						|
		pivot = (start + end) // 2
 | 
						|
		if loc < kallsyms[pivot][0]:
 | 
						|
			end = pivot
 | 
						|
		else:
 | 
						|
			start = pivot
 | 
						|
 | 
						|
	# Now (start == -1 or kallsyms[start][0] <= loc)
 | 
						|
	# and (start == len(kallsyms) - 1 or loc < kallsyms[start + 1][0])
 | 
						|
	if start >= 0:
 | 
						|
		symloc, name = kallsyms[start]
 | 
						|
		return (name, loc - symloc)
 | 
						|
	else:
 | 
						|
		return (None, 0)
 | 
						|
 | 
						|
def print_drop_table():
 | 
						|
	print("%25s %25s %25s" % ("LOCATION", "OFFSET", "COUNT"))
 | 
						|
	for i in drop_log.keys():
 | 
						|
		(sym, off) = get_sym(i)
 | 
						|
		if sym == None:
 | 
						|
			sym = i
 | 
						|
		print("%25s %25s %25s" % (sym, off, drop_log[i]))
 | 
						|
 | 
						|
 | 
						|
def trace_begin():
 | 
						|
	print("Starting trace (Ctrl-C to dump results)")
 | 
						|
 | 
						|
def trace_end():
 | 
						|
	print("Gathering kallsyms data")
 | 
						|
	get_kallsyms_table()
 | 
						|
	print_drop_table()
 | 
						|
 | 
						|
# called from perf, when it finds a corresponding event
 | 
						|
def skb__kfree_skb(name, context, cpu, sec, nsec, pid, comm, callchain,
 | 
						|
		   skbaddr, location, protocol, reason):
 | 
						|
	slocation = str(location)
 | 
						|
	try:
 | 
						|
		drop_log[slocation] = drop_log[slocation] + 1
 | 
						|
	except:
 | 
						|
		drop_log[slocation] = 1
 |