mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	perf script: Add drop monitor script
A while back I created the dropmonitor protocol, which allowed users to get reports of dropped frames communicated to them via a netlink socket. While useful, several people have now asked that I integrate the ability to do drop monitoring with perf, so they don't have to run additional tools. This patch adds a drop monitor script to the perf suite, and provides the same output that the netlink socket does. Cc: Ingo Molnar <mingo@elte.hu> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/r/1309801217-22450-1-git-send-email-nhorman@tuxdriver.com Signed-off-by: Neil Horman <nhorman@tuxdriver.com> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
		
							parent
							
								
									98dfd55d80
								
							
						
					
					
						commit
						63e03724b5
					
				
					 3 changed files with 78 additions and 0 deletions
				
			
		
							
								
								
									
										2
									
								
								tools/perf/scripts/python/bin/net_dropmonitor-record
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										2
									
								
								tools/perf/scripts/python/bin/net_dropmonitor-record
									
									
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,2 @@
 | 
				
			||||||
 | 
					#!/bin/bash
 | 
				
			||||||
 | 
					perf record -e skb:kfree_skb $@
 | 
				
			||||||
							
								
								
									
										4
									
								
								tools/perf/scripts/python/bin/net_dropmonitor-report
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										4
									
								
								tools/perf/scripts/python/bin/net_dropmonitor-report
									
									
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,4 @@
 | 
				
			||||||
 | 
					#!/bin/bash
 | 
				
			||||||
 | 
					# description: display a table of dropped frames
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					perf script -s "$PERF_EXEC_PATH"/scripts/python/net_dropmonitor.py $@
 | 
				
			||||||
							
								
								
									
										72
									
								
								tools/perf/scripts/python/net_dropmonitor.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										72
									
								
								tools/perf/scripts/python/net_dropmonitor.py
									
									
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,72 @@
 | 
				
			||||||
 | 
					# Monitor the system for dropped packets and proudce a report of drop locations and counts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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")
 | 
				
			||||||
 | 
							linecount = 0
 | 
				
			||||||
 | 
							for line in f:
 | 
				
			||||||
 | 
								linecount = linecount+1
 | 
				
			||||||
 | 
							f.seek(0)
 | 
				
			||||||
 | 
						except:
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						j = 0
 | 
				
			||||||
 | 
						for line in f:
 | 
				
			||||||
 | 
							loc = int(line.split()[0], 16)
 | 
				
			||||||
 | 
							name = line.split()[2]
 | 
				
			||||||
 | 
							j = j +1
 | 
				
			||||||
 | 
							if ((j % 100) == 0):
 | 
				
			||||||
 | 
								print "\r" + str(j) + "/" + str(linecount),
 | 
				
			||||||
 | 
							kallsyms.append({ 'loc': loc, 'name' : name})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						print "\r" + str(j) + "/" + str(linecount)
 | 
				
			||||||
 | 
						kallsyms.sort()
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def get_sym(sloc):
 | 
				
			||||||
 | 
						loc = int(sloc)
 | 
				
			||||||
 | 
						for i in kallsyms:
 | 
				
			||||||
 | 
							if (i['loc'] >= loc):
 | 
				
			||||||
 | 
								return (i['name'], i['loc']-loc)
 | 
				
			||||||
 | 
						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 correspoinding event
 | 
				
			||||||
 | 
					def skb__kfree_skb(name, context, cpu, sec, nsec, pid, comm,
 | 
				
			||||||
 | 
								skbaddr, protocol, location):
 | 
				
			||||||
 | 
						slocation = str(location)
 | 
				
			||||||
 | 
						try:
 | 
				
			||||||
 | 
							drop_log[slocation] = drop_log[slocation] + 1
 | 
				
			||||||
 | 
						except:
 | 
				
			||||||
 | 
							drop_log[slocation] = 1
 | 
				
			||||||
		Loading…
	
		Reference in a new issue