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 402a813f8cSAlan Jenkinsuse strict; 412a813f8cSAlan Jenkins 422a813f8cSAlan Jenkinsmy %start; 432a813f8cSAlan 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) { 81*d1aaf8cfSStephen Hemminger print STDERR <<END; 82*d1aaf8cfSStephen HemmingerNo data found in the dmesg. Make sure that 'printk.time=1' and 83*d1aaf8cfSStephen Hemminger'initcall_debug' are passed on the kernel command line. 84*d1aaf8cfSStephen HemmingerUsage: 85*d1aaf8cfSStephen Hemminger dmesg | perl scripts/bootgraph.pl > output.svg 86*d1aaf8cfSStephen HemmingerEND 87*d1aaf8cfSStephen Hemminger exit 1; 88aa5d9151SArjan van de Ven} 89aa5d9151SArjan van de Ven 90aa5d9151SArjan van de Venprint "<?xml version=\"1.0\" standalone=\"no\"?> \n"; 91aa5d9151SArjan van de Venprint "<svg width=\"1000\" height=\"100%\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n"; 92aa5d9151SArjan van de Ven 93aa5d9151SArjan van de Venmy @styles; 94aa5d9151SArjan van de Ven 95aa5d9151SArjan van de Ven$styles[0] = "fill:rgb(0,0,255);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 96aa5d9151SArjan van de Ven$styles[1] = "fill:rgb(0,255,0);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 97aa5d9151SArjan van de Ven$styles[2] = "fill:rgb(255,0,20);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 98aa5d9151SArjan van de Ven$styles[3] = "fill:rgb(255,255,20);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 99aa5d9151SArjan van de Ven$styles[4] = "fill:rgb(255,0,255);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 100aa5d9151SArjan van de Ven$styles[5] = "fill:rgb(0,255,255);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 101aa5d9151SArjan van de Ven$styles[6] = "fill:rgb(0,128,255);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 102aa5d9151SArjan van de Ven$styles[7] = "fill:rgb(0,255,128);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 103aa5d9151SArjan van de Ven$styles[8] = "fill:rgb(255,0,128);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 104aa5d9151SArjan van de Ven$styles[9] = "fill:rgb(255,255,128);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 105aa5d9151SArjan van de Ven$styles[10] = "fill:rgb(255,128,255);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 106aa5d9151SArjan van de Ven$styles[11] = "fill:rgb(128,255,255);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 107aa5d9151SArjan van de Ven 10880a398a5SArjan van de Venmy $mult = 950.0 / ($maxtime - $firsttime); 10980a398a5SArjan van de Venmy $threshold = ($maxtime - $firsttime) / 60.0; 110aa5d9151SArjan van de Venmy $stylecounter = 0; 111ddc7a01aSFrederic Weisbeckermy %rows; 112ddc7a01aSFrederic Weisbeckermy $rowscount = 1; 11306d1cd26SAlan Jenkinsmy @initcalls = sort { $start{$a} <=> $start{$b} } keys(%start); 11468f96c0cSStephen Hemminger 11568f96c0cSStephen Hemmingerforeach my $key (@initcalls) { 116aa5d9151SArjan van de Ven my $duration = $end{$key} - $start{$key}; 117aa5d9151SArjan van de Ven 118aa5d9151SArjan van de Ven if ($duration >= $threshold) { 1192a813f8cSAlan Jenkins my ($s, $s2, $e, $w, $y, $y2, $style); 1202a813f8cSAlan Jenkins my $pid = $pids{$key}; 12107d18904SFrederic Weisbecker 12207d18904SFrederic Weisbecker if (!defined($rows{$pid})) { 12307d18904SFrederic Weisbecker $rows{$pid} = $rowscount; 12407d18904SFrederic Weisbecker $rowscount = $rowscount + 1; 12507d18904SFrederic Weisbecker } 12606d1cd26SAlan Jenkins $s = ($start{$key} - $firsttime) * $mult; 127aa5d9151SArjan van de Ven $s2 = $s + 6; 12880a398a5SArjan van de Ven $e = ($end{$key} - $firsttime) * $mult; 129aa5d9151SArjan van de Ven $w = $e - $s; 130aa5d9151SArjan van de Ven 131ddc7a01aSFrederic Weisbecker $y = $rows{$pid} * 150; 132aa5d9151SArjan van de Ven $y2 = $y + 4; 133aa5d9151SArjan van de Ven 134aa5d9151SArjan van de Ven $style = $styles[$stylecounter]; 135aa5d9151SArjan van de Ven $stylecounter = $stylecounter + 1; 136aa5d9151SArjan van de Ven if ($stylecounter > 11) { 137aa5d9151SArjan van de Ven $stylecounter = 0; 138aa5d9151SArjan van de Ven }; 139aa5d9151SArjan van de Ven 140aa5d9151SArjan van de Ven print "<rect x=\"$s\" width=\"$w\" y=\"$y\" height=\"145\" style=\"$style\"/>\n"; 141aa5d9151SArjan van de Ven print "<text transform=\"translate($s2,$y2) rotate(90)\">$key</text>\n"; 142aa5d9151SArjan van de Ven } 143aa5d9151SArjan van de Ven} 144aa5d9151SArjan van de Ven 145aa5d9151SArjan van de Ven 146aa5d9151SArjan van de Ven# print the time line on top 14780a398a5SArjan van de Venmy $time = $firsttime; 14880a398a5SArjan van de Venmy $step = ($maxtime - $firsttime) / 15; 149aa5d9151SArjan van de Venwhile ($time < $maxtime) { 1502a813f8cSAlan Jenkins my $s3 = ($time - $firsttime) * $mult; 15180a398a5SArjan van de Ven my $tm = int($time * 100) / 100.0; 1522a813f8cSAlan Jenkins print "<text transform=\"translate($s3,89) rotate(90)\">$tm</text>\n"; 15380a398a5SArjan van de Ven $time = $time + $step; 154aa5d9151SArjan van de Ven} 155aa5d9151SArjan van de Ven 156aa5d9151SArjan van de Venprint "</svg>\n"; 157