1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#!/usr/bin/perl -w
2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng# (c) 2009, Tom Zanussi <tzanussi@gmail.com>
3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng# Licensed under the terms of the GNU GPL License version 2
4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng# Display avg/min/max wakeup latency
6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng# The common_* event handler fields are the most useful fields common to
8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng# all events.  They don't necessarily correspond to the 'common_*' fields
9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng# in the status files.  Those fields not available as handler params can
10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng# be retrieved via script functions of the form get_common_*().
11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chenguse 5.010000;
13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chenguse strict;
14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chenguse warnings;
15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chenguse lib "$ENV{'PERF_EXEC_PATH'}/scripts/perl/Perf-Trace-Util/lib";
17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chenguse lib "./Perf-Trace-Util/lib";
18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chenguse Perf::Trace::Core;
19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chenguse Perf::Trace::Util;
20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengmy %last_wakeup;
22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengmy $max_wakeup_latency;
24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengmy $min_wakeup_latency;
25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengmy $total_wakeup_latency = 0;
26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengmy $total_wakeups = 0;
27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengsub sched::sched_switch
29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	$common_pid, $common_comm,
32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	$prev_comm, $prev_pid, $prev_prio, $prev_state, $next_comm, $next_pid,
33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	$next_prio) = @_;
34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    my $wakeup_ts = $last_wakeup{$common_cpu}{ts};
36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    if ($wakeup_ts) {
37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	my $switch_ts = nsecs($common_secs, $common_nsecs);
38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	my $wakeup_latency = $switch_ts - $wakeup_ts;
39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if ($wakeup_latency > $max_wakeup_latency) {
40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	    $max_wakeup_latency = $wakeup_latency;
41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if ($wakeup_latency < $min_wakeup_latency) {
43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	    $min_wakeup_latency = $wakeup_latency;
44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	$total_wakeup_latency += $wakeup_latency;
46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	$total_wakeups++;
47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    }
48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    $last_wakeup{$common_cpu}{ts} = 0;
49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengsub sched::sched_wakeup
52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	$common_pid, $common_comm,
55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	$comm, $pid, $prio, $success, $target_cpu) = @_;
56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    $last_wakeup{$target_cpu}{ts} = nsecs($common_secs, $common_nsecs);
58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengsub trace_begin
61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    $min_wakeup_latency = 1000000000;
63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    $max_wakeup_latency = 0;
64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengsub trace_end
67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    printf("wakeup_latency stats:\n\n");
69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    print "total_wakeups: $total_wakeups\n";
70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    if ($total_wakeups) {
71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	printf("avg_wakeup_latency (ns): %u\n",
72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	       avg($total_wakeup_latency, $total_wakeups));
73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    } else {
74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	printf("avg_wakeup_latency (ns): N/A\n");
75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    }
76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    printf("min_wakeup_latency (ns): %u\n", $min_wakeup_latency);
77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    printf("max_wakeup_latency (ns): %u\n", $max_wakeup_latency);
78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    print_unhandled();
80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengmy %unhandled;
83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengsub print_unhandled
85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    if ((scalar keys %unhandled) == 0) {
87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return;
88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    }
89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    print "\nunhandled events:\n\n";
91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    printf("%-40s  %10s\n", "event", "count");
93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    printf("%-40s  %10s\n", "----------------------------------------",
94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	   "-----------");
95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    foreach my $event_name (keys %unhandled) {
97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	printf("%-40s  %10d\n", $event_name, $unhandled{$event_name});
98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    }
99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengsub trace_unhandled
102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	$common_pid, $common_comm) = @_;
105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    $unhandled{$event_name}++;
107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
108