14d161f03STom Zanussi# system call counts 24d161f03STom Zanussi# (c) 2010, Tom Zanussi <[email protected]> 34d161f03STom Zanussi# Licensed under the terms of the GNU GPL License version 2 44d161f03STom Zanussi# 54d161f03STom Zanussi# Displays system-wide system call totals, broken down by syscall. 64d161f03STom Zanussi# If a [comm] arg is specified, only syscalls called by [comm] are displayed. 74d161f03STom Zanussi 8*1d1b0dbbSTony Jonesfrom __future__ import print_function 9*1d1b0dbbSTony Jones 104d161f03STom Zanussiimport os 114d161f03STom Zanussiimport sys 124d161f03STom Zanussi 134d161f03STom Zanussisys.path.append(os.environ['PERF_EXEC_PATH'] + \ 144d161f03STom Zanussi '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') 154d161f03STom Zanussi 164d161f03STom Zanussifrom perf_trace_context import * 174d161f03STom Zanussifrom Core import * 186545aaa5SArnaldo Carvalho de Melofrom Util import syscall_name 194d161f03STom Zanussi 20765532c8SArnaldo Carvalho de Melousage = "perf script -s syscall-counts.py [comm]\n"; 214d161f03STom Zanussi 224d161f03STom Zanussifor_comm = None 234d161f03STom Zanussi 244d161f03STom Zanussiif len(sys.argv) > 2: 254d161f03STom Zanussi sys.exit(usage) 264d161f03STom Zanussi 274d161f03STom Zanussiif len(sys.argv) > 1: 284d161f03STom Zanussi for_comm = sys.argv[1] 294d161f03STom Zanussi 304d161f03STom Zanussisyscalls = autodict() 314d161f03STom Zanussi 324d161f03STom Zanussidef trace_begin(): 33*1d1b0dbbSTony Jones print("Press control+C to stop and show the summary") 344d161f03STom Zanussi 354d161f03STom Zanussidef trace_end(): 364d161f03STom Zanussi print_syscall_totals() 374d161f03STom Zanussi 384d161f03STom Zanussidef raw_syscalls__sys_enter(event_name, context, common_cpu, 394d161f03STom Zanussi common_secs, common_nsecs, common_pid, common_comm, 400f5f5bcdSJoseph Schuchart common_callchain, id, args): 414d161f03STom Zanussi if for_comm is not None: 424d161f03STom Zanussi if common_comm != for_comm: 434d161f03STom Zanussi return 444d161f03STom Zanussi try: 454d161f03STom Zanussi syscalls[id] += 1 464d161f03STom Zanussi except TypeError: 474d161f03STom Zanussi syscalls[id] = 1 484d161f03STom Zanussi 4907100877SDaniel Bristot de Oliveiradef syscalls__sys_enter(event_name, context, common_cpu, 5007100877SDaniel Bristot de Oliveira common_secs, common_nsecs, common_pid, common_comm, 5107100877SDaniel Bristot de Oliveira id, args): 5207100877SDaniel Bristot de Oliveira raw_syscalls__sys_enter(**locals()) 5307100877SDaniel Bristot de Oliveira 544d161f03STom Zanussidef print_syscall_totals(): 554d161f03STom Zanussi if for_comm is not None: 56*1d1b0dbbSTony Jones print("\nsyscall events for %s:\n" % (for_comm)) 574d161f03STom Zanussi else: 58*1d1b0dbbSTony Jones print("\nsyscall events:\n") 594d161f03STom Zanussi 60*1d1b0dbbSTony Jones print("%-40s %10s" % ("event", "count")) 61*1d1b0dbbSTony Jones print("%-40s %10s" % ("----------------------------------------", 62*1d1b0dbbSTony Jones "-----------")) 634d161f03STom Zanussi 64*1d1b0dbbSTony Jones for id, val in sorted(syscalls.items(), key = lambda kv: (kv[1], kv[0]), \ 654d161f03STom Zanussi reverse = True): 66*1d1b0dbbSTony Jones print("%-40s %10d" % (syscall_name(id), val)) 67