xref: /openbmc/linux/tools/perf/scripts/python/sctop.py (revision b504d7f6)
147902f36STom Zanussi# system call top
247902f36STom Zanussi# (c) 2010, Tom Zanussi <tzanussi@gmail.com>
347902f36STom Zanussi# Licensed under the terms of the GNU GPL License version 2
447902f36STom Zanussi#
547902f36STom Zanussi# Periodically displays system-wide system call totals, broken down by
647902f36STom Zanussi# syscall.  If a [comm] arg is specified, only syscalls called by
747902f36STom Zanussi# [comm] are displayed. If an [interval] arg is specified, the display
847902f36STom Zanussi# will be refreshed every [interval] seconds.  The default interval is
947902f36STom Zanussi# 3 seconds.
1047902f36STom Zanussi
11ee75a896STony Jonesfrom __future__ import print_function
12ee75a896STony Jones
13ee75a896STony Jonesimport os, sys, time
14ee75a896STony Jones
15ee75a896STony Jonestry:
16ee75a896STony Jones	import thread
17ee75a896STony Jonesexcept ImportError:
18ee75a896STony Jones	import _thread as thread
1947902f36STom Zanussi
2047902f36STom Zanussisys.path.append(os.environ['PERF_EXEC_PATH'] + \
2147902f36STom Zanussi	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
2247902f36STom Zanussi
2347902f36STom Zanussifrom perf_trace_context import *
2447902f36STom Zanussifrom Core import *
2547902f36STom Zanussifrom Util import *
2647902f36STom Zanussi
27765532c8SArnaldo Carvalho de Melousage = "perf script -s sctop.py [comm] [interval]\n";
2847902f36STom Zanussi
2947902f36STom Zanussifor_comm = None
3047902f36STom Zanussidefault_interval = 3
3147902f36STom Zanussiinterval = default_interval
3247902f36STom Zanussi
3347902f36STom Zanussiif len(sys.argv) > 3:
3447902f36STom Zanussi	sys.exit(usage)
3547902f36STom Zanussi
3647902f36STom Zanussiif len(sys.argv) > 2:
3747902f36STom Zanussi	for_comm = sys.argv[1]
3847902f36STom Zanussi	interval = int(sys.argv[2])
3947902f36STom Zanussielif len(sys.argv) > 1:
4047902f36STom Zanussi	try:
4147902f36STom Zanussi		interval = int(sys.argv[1])
4247902f36STom Zanussi	except ValueError:
4347902f36STom Zanussi		for_comm = sys.argv[1]
4447902f36STom Zanussi		interval = default_interval
4547902f36STom Zanussi
4647902f36STom Zanussisyscalls = autodict()
4747902f36STom Zanussi
4847902f36STom Zanussidef trace_begin():
4947902f36STom Zanussi	thread.start_new_thread(print_syscall_totals, (interval,))
5047902f36STom Zanussi	pass
5147902f36STom Zanussi
5247902f36STom Zanussidef raw_syscalls__sys_enter(event_name, context, common_cpu,
5347902f36STom Zanussi	common_secs, common_nsecs, common_pid, common_comm,
540f5f5bcdSJoseph Schuchart	common_callchain, id, args):
5547902f36STom Zanussi	if for_comm is not None:
5647902f36STom Zanussi		if common_comm != for_comm:
5747902f36STom Zanussi			return
5847902f36STom Zanussi	try:
5947902f36STom Zanussi		syscalls[id] += 1
6047902f36STom Zanussi	except TypeError:
6147902f36STom Zanussi		syscalls[id] = 1
6247902f36STom Zanussi
6307100877SDaniel Bristot de Oliveiradef syscalls__sys_enter(event_name, context, common_cpu,
6407100877SDaniel Bristot de Oliveira	common_secs, common_nsecs, common_pid, common_comm,
6507100877SDaniel Bristot de Oliveira	id, args):
6607100877SDaniel Bristot de Oliveira	raw_syscalls__sys_enter(**locals())
6707100877SDaniel Bristot de Oliveira
6847902f36STom Zanussidef print_syscall_totals(interval):
6947902f36STom Zanussi	while 1:
7047902f36STom Zanussi		clear_term()
7147902f36STom Zanussi		if for_comm is not None:
72ee75a896STony Jones			print("\nsyscall events for %s:\n" % (for_comm))
7347902f36STom Zanussi		else:
74ee75a896STony Jones			print("\nsyscall events:\n")
7547902f36STom Zanussi
76ee75a896STony Jones		print("%-40s  %10s" % ("event", "count"))
77ee75a896STony Jones		print("%-40s  %10s" %
78ee75a896STony Jones			("----------------------------------------",
79ee75a896STony Jones			"----------"))
8047902f36STom Zanussi
81b504d7f6STony Jones		for id, val in sorted(syscalls.items(),
82b504d7f6STony Jones				key = lambda kv: (kv[1], kv[0]),
8347902f36STom Zanussi				reverse = True):
8447902f36STom Zanussi			try:
85ee75a896STony Jones				print("%-40s  %10d" % (syscall_name(id), val))
8647902f36STom Zanussi			except TypeError:
8747902f36STom Zanussi				pass
8847902f36STom Zanussi		syscalls.clear()
8947902f36STom Zanussi		time.sleep(interval)
90