1*4d161f03STom Zanussi# system call counts
2*4d161f03STom Zanussi# (c) 2010, Tom Zanussi <[email protected]>
3*4d161f03STom Zanussi# Licensed under the terms of the GNU GPL License version 2
4*4d161f03STom Zanussi#
5*4d161f03STom Zanussi# Displays system-wide system call totals, broken down by syscall.
6*4d161f03STom Zanussi# If a [comm] arg is specified, only syscalls called by [comm] are displayed.
7*4d161f03STom Zanussi
8*4d161f03STom Zanussiimport os
9*4d161f03STom Zanussiimport sys
10*4d161f03STom Zanussi
11*4d161f03STom Zanussisys.path.append(os.environ['PERF_EXEC_PATH'] + \
12*4d161f03STom Zanussi	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
13*4d161f03STom Zanussi
14*4d161f03STom Zanussifrom perf_trace_context import *
15*4d161f03STom Zanussifrom Core import *
16*4d161f03STom Zanussi
17*4d161f03STom Zanussiusage = "perf trace -s syscall-counts.py [comm]\n";
18*4d161f03STom Zanussi
19*4d161f03STom Zanussifor_comm = None
20*4d161f03STom Zanussi
21*4d161f03STom Zanussiif len(sys.argv) > 2:
22*4d161f03STom Zanussi	sys.exit(usage)
23*4d161f03STom Zanussi
24*4d161f03STom Zanussiif len(sys.argv) > 1:
25*4d161f03STom Zanussi	for_comm = sys.argv[1]
26*4d161f03STom Zanussi
27*4d161f03STom Zanussisyscalls = autodict()
28*4d161f03STom Zanussi
29*4d161f03STom Zanussidef trace_begin():
30*4d161f03STom Zanussi	pass
31*4d161f03STom Zanussi
32*4d161f03STom Zanussidef trace_end():
33*4d161f03STom Zanussi	print_syscall_totals()
34*4d161f03STom Zanussi
35*4d161f03STom Zanussidef raw_syscalls__sys_enter(event_name, context, common_cpu,
36*4d161f03STom Zanussi	common_secs, common_nsecs, common_pid, common_comm,
37*4d161f03STom Zanussi	id, args):
38*4d161f03STom Zanussi	if for_comm is not None:
39*4d161f03STom Zanussi		if common_comm != for_comm:
40*4d161f03STom Zanussi			return
41*4d161f03STom Zanussi	try:
42*4d161f03STom Zanussi		syscalls[id] += 1
43*4d161f03STom Zanussi	except TypeError:
44*4d161f03STom Zanussi		syscalls[id] = 1
45*4d161f03STom Zanussi
46*4d161f03STom Zanussidef print_syscall_totals():
47*4d161f03STom Zanussi    if for_comm is not None:
48*4d161f03STom Zanussi	    print "\nsyscall events for %s:\n\n" % (for_comm),
49*4d161f03STom Zanussi    else:
50*4d161f03STom Zanussi	    print "\nsyscall events:\n\n",
51*4d161f03STom Zanussi
52*4d161f03STom Zanussi    print "%-40s  %10s\n" % ("event", "count"),
53*4d161f03STom Zanussi    print "%-40s  %10s\n" % ("----------------------------------------", \
54*4d161f03STom Zanussi                                 "-----------"),
55*4d161f03STom Zanussi
56*4d161f03STom Zanussi    for id, val in sorted(syscalls.iteritems(), key = lambda(k, v): (v, k), \
57*4d161f03STom Zanussi				  reverse = True):
58*4d161f03STom Zanussi	    print "%-40d  %10d\n" % (id, val),
59