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 r/w activity for all processes
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 %reads;
22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengmy %writes;
23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengsub syscalls::sys_exit_read
25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	$common_pid, $common_comm,
28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	$nr, $ret) = @_;
29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    if ($ret > 0) {
31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	$reads{$common_pid}{bytes_read} += $ret;
32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    } else {
33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (!defined ($reads{$common_pid}{bytes_read})) {
34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	    $reads{$common_pid}{bytes_read} = 0;
35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	$reads{$common_pid}{errors}{$ret}++;
37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    }
38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengsub syscalls::sys_enter_read
41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	$common_pid, $common_comm,
44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	$nr, $fd, $buf, $count) = @_;
45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    $reads{$common_pid}{bytes_requested} += $count;
47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    $reads{$common_pid}{total_reads}++;
48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    $reads{$common_pid}{comm} = $common_comm;
49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengsub syscalls::sys_exit_write
52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	$common_pid, $common_comm,
55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	$nr, $ret) = @_;
56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    if ($ret <= 0) {
58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	$writes{$common_pid}{errors}{$ret}++;
59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    }
60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengsub syscalls::sys_enter_write
63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	$common_pid, $common_comm,
66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	$nr, $fd, $buf, $count) = @_;
67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    $writes{$common_pid}{bytes_written} += $count;
69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    $writes{$common_pid}{total_writes}++;
70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    $writes{$common_pid}{comm} = $common_comm;
71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengsub trace_end
74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    printf("read counts by pid:\n\n");
76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    printf("%6s  %20s  %10s  %10s  %10s\n", "pid", "comm",
78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	   "# reads", "bytes_requested", "bytes_read");
79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    printf("%6s  %-20s  %10s  %10s  %10s\n", "------", "--------------------",
80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	   "-----------", "----------", "----------");
81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    foreach my $pid (sort { ($reads{$b}{bytes_read} || 0) <=>
83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				($reads{$a}{bytes_read} || 0) } keys %reads) {
84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	my $comm = $reads{$pid}{comm} || "";
85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	my $total_reads = $reads{$pid}{total_reads} || 0;
86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	my $bytes_requested = $reads{$pid}{bytes_requested} || 0;
87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	my $bytes_read = $reads{$pid}{bytes_read} || 0;
88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	printf("%6s  %-20s  %10s  %10s  %10s\n", $pid, $comm,
90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	       $total_reads, $bytes_requested, $bytes_read);
91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    }
92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    printf("\nfailed reads by pid:\n\n");
94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    printf("%6s  %20s  %6s  %10s\n", "pid", "comm", "error #", "# errors");
96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    printf("%6s  %20s  %6s  %10s\n", "------", "--------------------",
97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	   "------", "----------");
98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    my @errcounts = ();
100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    foreach my $pid (keys %reads) {
102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	foreach my $error (keys %{$reads{$pid}{errors}}) {
103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	    my $comm = $reads{$pid}{comm} || "";
104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	    my $errcount = $reads{$pid}{errors}{$error} || 0;
105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	    push @errcounts, [$pid, $comm, $error, $errcount];
106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    }
108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    @errcounts = sort { $b->[3] <=> $a->[3] } @errcounts;
110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    for my $i (0 .. $#errcounts) {
112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	printf("%6d  %-20s  %6d  %10s\n", $errcounts[$i][0],
113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	       $errcounts[$i][1], $errcounts[$i][2], $errcounts[$i][3]);
114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    }
115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    printf("\nwrite counts by pid:\n\n");
117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    printf("%6s  %20s  %10s  %10s\n", "pid", "comm",
119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	   "# writes", "bytes_written");
120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    printf("%6s  %-20s  %10s  %10s\n", "------", "--------------------",
121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	   "-----------", "----------");
122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    foreach my $pid (sort { ($writes{$b}{bytes_written} || 0) <=>
124e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			($writes{$a}{bytes_written} || 0)} keys %writes) {
125e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	my $comm = $writes{$pid}{comm} || "";
126e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	my $total_writes = $writes{$pid}{total_writes} || 0;
127e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	my $bytes_written = $writes{$pid}{bytes_written} || 0;
128e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
129e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	printf("%6s  %-20s  %10s  %10s\n", $pid, $comm,
130e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	       $total_writes, $bytes_written);
131e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    }
132e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
133e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    printf("\nfailed writes by pid:\n\n");
134e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
135e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    printf("%6s  %20s  %6s  %10s\n", "pid", "comm", "error #", "# errors");
136e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    printf("%6s  %20s  %6s  %10s\n", "------", "--------------------",
137e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	   "------", "----------");
138e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
139e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    @errcounts = ();
140e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
141e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    foreach my $pid (keys %writes) {
142e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	foreach my $error (keys %{$writes{$pid}{errors}}) {
143e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	    my $comm = $writes{$pid}{comm} || "";
144e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	    my $errcount = $writes{$pid}{errors}{$error} || 0;
145e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	    push @errcounts, [$pid, $comm, $error, $errcount];
146e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
147e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    }
148e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
149e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    @errcounts = sort { $b->[3] <=> $a->[3] } @errcounts;
150e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
151e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    for my $i (0 .. $#errcounts) {
152e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	printf("%6d  %-20s  %6d  %10s\n", $errcounts[$i][0],
153e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	       $errcounts[$i][1], $errcounts[$i][2], $errcounts[$i][3]);
154e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    }
155e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
156e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    print_unhandled();
157e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
158e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
159e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengmy %unhandled;
160e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
161e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengsub print_unhandled
162e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
163e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    if ((scalar keys %unhandled) == 0) {
164e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return;
165e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    }
166e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
167e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    print "\nunhandled events:\n\n";
168e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
169e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    printf("%-40s  %10s\n", "event", "count");
170e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    printf("%-40s  %10s\n", "----------------------------------------",
171e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	   "-----------");
172e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
173e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    foreach my $event_name (keys %unhandled) {
174e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	printf("%-40s  %10d\n", $event_name, $unhandled{$event_name});
175e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    }
176e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
177e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
178e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengsub trace_unhandled
179e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
180e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
181e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	$common_pid, $common_comm) = @_;
182e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
183e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng    $unhandled{$event_name}++;
184e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
185