1aa5d9151SArjan van de Ven#!/usr/bin/perl 2aa5d9151SArjan van de Ven 3aa5d9151SArjan van de Ven# Copyright 2008, Intel Corporation 4aa5d9151SArjan van de Ven# 5aa5d9151SArjan van de Ven# This file is part of the Linux kernel 6aa5d9151SArjan van de Ven# 7aa5d9151SArjan van de Ven# This program file is free software; you can redistribute it and/or modify it 8aa5d9151SArjan van de Ven# under the terms of the GNU General Public License as published by the 9aa5d9151SArjan van de Ven# Free Software Foundation; version 2 of the License. 10aa5d9151SArjan van de Ven# 11aa5d9151SArjan van de Ven# This program is distributed in the hope that it will be useful, but WITHOUT 12aa5d9151SArjan van de Ven# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13aa5d9151SArjan van de Ven# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14aa5d9151SArjan van de Ven# for more details. 15aa5d9151SArjan van de Ven# 16aa5d9151SArjan van de Ven# You should have received a copy of the GNU General Public License 17aa5d9151SArjan van de Ven# along with this program in a file named COPYING; if not, write to the 18aa5d9151SArjan van de Ven# Free Software Foundation, Inc., 19aa5d9151SArjan van de Ven# 51 Franklin Street, Fifth Floor, 20aa5d9151SArjan van de Ven# Boston, MA 02110-1301 USA 21aa5d9151SArjan van de Ven# 22aa5d9151SArjan van de Ven# Authors: 23aa5d9151SArjan van de Ven# Arjan van de Ven <arjan@linux.intel.com> 24aa5d9151SArjan van de Ven 25aa5d9151SArjan van de Ven 26aa5d9151SArjan van de Ven# 27aa5d9151SArjan van de Ven# This script turns a dmesg output into a SVG graphic that shows which 28aa5d9151SArjan van de Ven# functions take how much time. You can view SVG graphics with various 29aa5d9151SArjan van de Ven# programs, including Inkscape, The Gimp and Firefox. 30aa5d9151SArjan van de Ven# 31aa5d9151SArjan van de Ven# 32aa5d9151SArjan van de Ven# For this script to work, the kernel needs to be compiled with the 33aa5d9151SArjan van de Ven# CONFIG_PRINTK_TIME configuration option enabled, and with 34aa5d9151SArjan van de Ven# "initcall_debug" passed on the kernel command line. 35aa5d9151SArjan van de Ven# 36aa5d9151SArjan van de Ven# usage: 37aa5d9151SArjan van de Ven# dmesg | perl scripts/bootgraph.pl > output.svg 38aa5d9151SArjan van de Ven# 39aa5d9151SArjan van de Ven 40*2a813f8cSAlan Jenkinsuse strict; 41*2a813f8cSAlan Jenkins 42*2a813f8cSAlan Jenkinsmy %start; 43*2a813f8cSAlan Jenkinsmy %end; 44aa5d9151SArjan van de Venmy $done = 0; 45aa5d9151SArjan van de Venmy $maxtime = 0; 4680a398a5SArjan van de Venmy $firsttime = 100; 47aa5d9151SArjan van de Venmy $count = 0; 48ddc7a01aSFrederic Weisbeckermy %pids; 49ddc7a01aSFrederic Weisbecker 50aa5d9151SArjan van de Venwhile (<>) { 51aa5d9151SArjan van de Ven my $line = $_; 525c542368SArnaud Patard if ($line =~ /([0-9\.]+)\] calling ([a-zA-Z0-9\_]+)\+/) { 53aa5d9151SArjan van de Ven my $func = $2; 54aa5d9151SArjan van de Ven if ($done == 0) { 55aa5d9151SArjan van de Ven $start{$func} = $1; 5680a398a5SArjan van de Ven if ($1 < $firsttime) { 5780a398a5SArjan van de Ven $firsttime = $1; 5880a398a5SArjan van de Ven } 59aa5d9151SArjan van de Ven } 60aa5d9151SArjan van de Ven if ($line =~ /\@ ([0-9]+)/) { 61ddc7a01aSFrederic Weisbecker $pids{$func} = $1; 62aa5d9151SArjan van de Ven } 63aa5d9151SArjan van de Ven $count = $count + 1; 64aa5d9151SArjan van de Ven } 65aa5d9151SArjan van de Ven 665c542368SArnaud Patard if ($line =~ /([0-9\.]+)\] initcall ([a-zA-Z0-9\_]+)\+.*returned/) { 67aa5d9151SArjan van de Ven if ($done == 0) { 68aa5d9151SArjan van de Ven $end{$2} = $1; 69aa5d9151SArjan van de Ven $maxtime = $1; 70aa5d9151SArjan van de Ven } 71aa5d9151SArjan van de Ven } 72aa5d9151SArjan van de Ven if ($line =~ /Write protecting the/) { 73aa5d9151SArjan van de Ven $done = 1; 74aa5d9151SArjan van de Ven } 7580a398a5SArjan van de Ven if ($line =~ /Freeing unused kernel memory/) { 7680a398a5SArjan van de Ven $done = 1; 7780a398a5SArjan van de Ven } 78aa5d9151SArjan van de Ven} 79aa5d9151SArjan van de Ven 80aa5d9151SArjan van de Venif ($count == 0) { 815c542368SArnaud Patard print "No data found in the dmesg. Make sure that 'printk.time=1' and\n"; 825c542368SArnaud Patard print "'initcall_debug' are passed on the kernel command line.\n\n"; 83aa5d9151SArjan van de Ven print "Usage: \n"; 84aa5d9151SArjan van de Ven print " dmesg | perl scripts/bootgraph.pl > output.svg\n\n"; 85aa5d9151SArjan van de Ven exit; 86aa5d9151SArjan van de Ven} 87aa5d9151SArjan van de Ven 88aa5d9151SArjan van de Venprint "<?xml version=\"1.0\" standalone=\"no\"?> \n"; 89aa5d9151SArjan van de Venprint "<svg width=\"1000\" height=\"100%\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n"; 90aa5d9151SArjan van de Ven 91aa5d9151SArjan van de Venmy @styles; 92aa5d9151SArjan van de Ven 93aa5d9151SArjan van de Ven$styles[0] = "fill:rgb(0,0,255);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 94aa5d9151SArjan van de Ven$styles[1] = "fill:rgb(0,255,0);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 95aa5d9151SArjan van de Ven$styles[2] = "fill:rgb(255,0,20);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 96aa5d9151SArjan van de Ven$styles[3] = "fill:rgb(255,255,20);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 97aa5d9151SArjan van de Ven$styles[4] = "fill:rgb(255,0,255);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 98aa5d9151SArjan van de Ven$styles[5] = "fill:rgb(0,255,255);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 99aa5d9151SArjan van de Ven$styles[6] = "fill:rgb(0,128,255);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 100aa5d9151SArjan van de Ven$styles[7] = "fill:rgb(0,255,128);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 101aa5d9151SArjan van de Ven$styles[8] = "fill:rgb(255,0,128);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 102aa5d9151SArjan van de Ven$styles[9] = "fill:rgb(255,255,128);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 103aa5d9151SArjan van de Ven$styles[10] = "fill:rgb(255,128,255);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 104aa5d9151SArjan van de Ven$styles[11] = "fill:rgb(128,255,255);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 105aa5d9151SArjan van de Ven 10680a398a5SArjan van de Venmy $mult = 950.0 / ($maxtime - $firsttime); 10780a398a5SArjan van de Venmy $threshold = ($maxtime - $firsttime) / 60.0; 108aa5d9151SArjan van de Venmy $stylecounter = 0; 109ddc7a01aSFrederic Weisbeckermy %rows; 110ddc7a01aSFrederic Weisbeckermy $rowscount = 1; 111*2a813f8cSAlan Jenkinsmy $key; 112*2a813f8cSAlan Jenkinsmy $value; 113aa5d9151SArjan van de Venwhile (($key,$value) = each %start) { 114aa5d9151SArjan van de Ven my $duration = $end{$key} - $start{$key}; 115aa5d9151SArjan van de Ven 116aa5d9151SArjan van de Ven if ($duration >= $threshold) { 117*2a813f8cSAlan Jenkins my ($s, $s2, $e, $w, $y, $y2, $style); 118*2a813f8cSAlan Jenkins my $pid = $pids{$key}; 11907d18904SFrederic Weisbecker 12007d18904SFrederic Weisbecker if (!defined($rows{$pid})) { 12107d18904SFrederic Weisbecker $rows{$pid} = $rowscount; 12207d18904SFrederic Weisbecker $rowscount = $rowscount + 1; 12307d18904SFrederic Weisbecker } 124ddc7a01aSFrederic Weisbecker $s = ($value - $firsttime) * $mult; 125aa5d9151SArjan van de Ven $s2 = $s + 6; 12680a398a5SArjan van de Ven $e = ($end{$key} - $firsttime) * $mult; 127aa5d9151SArjan van de Ven $w = $e - $s; 128aa5d9151SArjan van de Ven 129ddc7a01aSFrederic Weisbecker $y = $rows{$pid} * 150; 130aa5d9151SArjan van de Ven $y2 = $y + 4; 131aa5d9151SArjan van de Ven 132aa5d9151SArjan van de Ven $style = $styles[$stylecounter]; 133aa5d9151SArjan van de Ven $stylecounter = $stylecounter + 1; 134aa5d9151SArjan van de Ven if ($stylecounter > 11) { 135aa5d9151SArjan van de Ven $stylecounter = 0; 136aa5d9151SArjan van de Ven }; 137aa5d9151SArjan van de Ven 138aa5d9151SArjan van de Ven print "<rect x=\"$s\" width=\"$w\" y=\"$y\" height=\"145\" style=\"$style\"/>\n"; 139aa5d9151SArjan van de Ven print "<text transform=\"translate($s2,$y2) rotate(90)\">$key</text>\n"; 140aa5d9151SArjan van de Ven } 141aa5d9151SArjan van de Ven} 142aa5d9151SArjan van de Ven 143aa5d9151SArjan van de Ven 144aa5d9151SArjan van de Ven# print the time line on top 14580a398a5SArjan van de Venmy $time = $firsttime; 14680a398a5SArjan van de Venmy $step = ($maxtime - $firsttime) / 15; 147aa5d9151SArjan van de Venwhile ($time < $maxtime) { 148*2a813f8cSAlan Jenkins my $s3 = ($time - $firsttime) * $mult; 14980a398a5SArjan van de Ven my $tm = int($time * 100) / 100.0; 150*2a813f8cSAlan Jenkins print "<text transform=\"translate($s3,89) rotate(90)\">$tm</text>\n"; 15180a398a5SArjan van de Ven $time = $time + $step; 152aa5d9151SArjan van de Ven} 153aa5d9151SArjan van de Ven 154aa5d9151SArjan van de Venprint "</svg>\n"; 155