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