xref: /openbmc/linux/scripts/show_delta (revision cdd38c5f1ce4398ec58fec95904b75824daab7b5)
1*c25ce589SFinn Behrens#!/usr/bin/env python
2acf14707SThomas Gleixner# SPDX-License-Identifier: GPL-2.0-only
31da177e4SLinus Torvalds#
41da177e4SLinus Torvalds# show_deltas: Read list of printk messages instrumented with
51da177e4SLinus Torvalds# time data, and format with time deltas.
61da177e4SLinus Torvalds#
71da177e4SLinus Torvalds# Also, you can show the times relative to a fixed point.
81da177e4SLinus Torvalds#
91da177e4SLinus Torvalds# Copyright 2003 Sony Corporation
101da177e4SLinus Torvalds#
111da177e4SLinus Torvalds
121da177e4SLinus Torvaldsimport sys
131da177e4SLinus Torvaldsimport string
141da177e4SLinus Torvalds
151da177e4SLinus Torvaldsdef usage():
16f29b5f3eSMike Pagano	print ("""usage: show_delta [<options>] <filename>
171da177e4SLinus Torvalds
181da177e4SLinus TorvaldsThis program parses the output from a set of printk message lines which
191da177e4SLinus Torvaldshave time data prefixed because the CONFIG_PRINTK_TIME option is set, or
201da177e4SLinus Torvaldsthe kernel command line option "time" is specified. When run with no
211da177e4SLinus Torvaldsoptions, the time information is converted to show the time delta between
221da177e4SLinus Torvaldseach printk line and the next.  When run with the '-b' option, all times
231da177e4SLinus Torvaldsare relative to a single (base) point in time.
241da177e4SLinus Torvalds
251da177e4SLinus TorvaldsOptions:
261da177e4SLinus Torvalds  -h            Show this usage help.
271da177e4SLinus Torvalds  -b <base>	Specify a base for time references.
281da177e4SLinus Torvalds		<base> can be a number or a string.
291da177e4SLinus Torvalds		If it is a string, the first message line
301da177e4SLinus Torvalds		which matches (at the beginning of the
311da177e4SLinus Torvalds		line) is used as the time reference.
321da177e4SLinus Torvalds
331da177e4SLinus Torvaldsex: $ dmesg >timefile
341da177e4SLinus Torvalds    $ show_delta -b NET4 timefile
351da177e4SLinus Torvalds
361da177e4SLinus Torvaldswill show times relative to the line in the kernel output
371da177e4SLinus Torvaldsstarting with "NET4".
38f29b5f3eSMike Pagano""")
391da177e4SLinus Torvalds	sys.exit(1)
401da177e4SLinus Torvalds
411da177e4SLinus Torvalds# returns a tuple containing the seconds and text for each message line
421da177e4SLinus Torvalds# seconds is returned as a float
431da177e4SLinus Torvalds# raise an exception if no timing data was found
441da177e4SLinus Torvaldsdef get_time(line):
451da177e4SLinus Torvalds	if line[0]!="[":
461da177e4SLinus Torvalds		raise ValueError
471da177e4SLinus Torvalds
481da177e4SLinus Torvalds	# split on closing bracket
491da177e4SLinus Torvalds	(time_str, rest) = string.split(line[1:],']',1)
501da177e4SLinus Torvalds	time = string.atof(time_str)
511da177e4SLinus Torvalds
521da177e4SLinus Torvalds	#print "time=", time
531da177e4SLinus Torvalds	return (time, rest)
541da177e4SLinus Torvalds
551da177e4SLinus Torvalds
561da177e4SLinus Torvalds# average line looks like:
571da177e4SLinus Torvalds# [    0.084282] VFS: Mounted root (romfs filesystem) readonly
581da177e4SLinus Torvalds# time data is expressed in seconds.useconds,
591da177e4SLinus Torvalds# convert_line adds a delta for each line
601da177e4SLinus Torvaldslast_time = 0.0
611da177e4SLinus Torvaldsdef convert_line(line, base_time):
621da177e4SLinus Torvalds	global last_time
631da177e4SLinus Torvalds
641da177e4SLinus Torvalds	try:
651da177e4SLinus Torvalds		(time, rest) = get_time(line)
661da177e4SLinus Torvalds	except:
671da177e4SLinus Torvalds		# if any problem parsing time, don't convert anything
681da177e4SLinus Torvalds		return line
691da177e4SLinus Torvalds
701da177e4SLinus Torvalds	if base_time:
711da177e4SLinus Torvalds		# show time from base
721da177e4SLinus Torvalds		delta = time - base_time
731da177e4SLinus Torvalds	else:
741da177e4SLinus Torvalds		# just show time from last line
751da177e4SLinus Torvalds		delta = time - last_time
761da177e4SLinus Torvalds		last_time = time
771da177e4SLinus Torvalds
781da177e4SLinus Torvalds	return ("[%5.6f < %5.6f >]" % (time, delta)) + rest
791da177e4SLinus Torvalds
801da177e4SLinus Torvaldsdef main():
811da177e4SLinus Torvalds	base_str = ""
821da177e4SLinus Torvalds	filein = ""
831da177e4SLinus Torvalds	for arg in sys.argv[1:]:
841da177e4SLinus Torvalds		if arg=="-b":
851da177e4SLinus Torvalds			base_str = sys.argv[sys.argv.index("-b")+1]
861da177e4SLinus Torvalds		elif arg=="-h":
871da177e4SLinus Torvalds			usage()
881da177e4SLinus Torvalds		else:
891da177e4SLinus Torvalds			filein = arg
901da177e4SLinus Torvalds
911da177e4SLinus Torvalds	if not filein:
921da177e4SLinus Torvalds		usage()
931da177e4SLinus Torvalds
941da177e4SLinus Torvalds	try:
951da177e4SLinus Torvalds		lines = open(filein,"r").readlines()
961da177e4SLinus Torvalds	except:
97f29b5f3eSMike Pagano		print ("Problem opening file: %s" % filein)
981da177e4SLinus Torvalds		sys.exit(1)
991da177e4SLinus Torvalds
1001da177e4SLinus Torvalds	if base_str:
101f29b5f3eSMike Pagano		print ('base= "%s"' % base_str)
1021da177e4SLinus Torvalds		# assume a numeric base.  If that fails, try searching
1031da177e4SLinus Torvalds		# for a matching line.
1041da177e4SLinus Torvalds		try:
1051da177e4SLinus Torvalds			base_time = float(base_str)
1061da177e4SLinus Torvalds		except:
1071da177e4SLinus Torvalds			# search for line matching <base> string
1081da177e4SLinus Torvalds			found = 0
1091da177e4SLinus Torvalds			for line in lines:
1101da177e4SLinus Torvalds				try:
1111da177e4SLinus Torvalds					(time, rest) = get_time(line)
1121da177e4SLinus Torvalds				except:
1131da177e4SLinus Torvalds					continue
1141da177e4SLinus Torvalds				if string.find(rest, base_str)==1:
1151da177e4SLinus Torvalds					base_time = time
1161da177e4SLinus Torvalds					found = 1
1171da177e4SLinus Torvalds					# stop at first match
1181da177e4SLinus Torvalds					break
1191da177e4SLinus Torvalds			if not found:
120f29b5f3eSMike Pagano				print ('Couldn\'t find line matching base pattern "%s"' % base_str)
1211da177e4SLinus Torvalds				sys.exit(1)
1221da177e4SLinus Torvalds	else:
1231da177e4SLinus Torvalds		base_time = 0.0
1241da177e4SLinus Torvalds
1251da177e4SLinus Torvalds	for line in lines:
126f29b5f3eSMike Pagano		print (convert_line(line, base_time),)
1271da177e4SLinus Torvalds
1281da177e4SLinus Torvaldsmain()
129