xref: /OK3568_Linux_fs/kernel/tools/perf/scripts/perl/rw-by-pid.pl (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/usr/bin/perl -w
2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0-only
3*4882a593Smuzhiyun# (c) 2009, Tom Zanussi <tzanussi@gmail.com>
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun# Display r/w activity for all processes
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun# The common_* event handler fields are the most useful fields common to
8*4882a593Smuzhiyun# all events.  They don't necessarily correspond to the 'common_*' fields
9*4882a593Smuzhiyun# in the status files.  Those fields not available as handler params can
10*4882a593Smuzhiyun# be retrieved via script functions of the form get_common_*().
11*4882a593Smuzhiyun
12*4882a593Smuzhiyunuse 5.010000;
13*4882a593Smuzhiyunuse strict;
14*4882a593Smuzhiyunuse warnings;
15*4882a593Smuzhiyun
16*4882a593Smuzhiyunuse lib "$ENV{'PERF_EXEC_PATH'}/scripts/perl/Perf-Trace-Util/lib";
17*4882a593Smuzhiyunuse lib "./Perf-Trace-Util/lib";
18*4882a593Smuzhiyunuse Perf::Trace::Core;
19*4882a593Smuzhiyunuse Perf::Trace::Util;
20*4882a593Smuzhiyun
21*4882a593Smuzhiyunmy %reads;
22*4882a593Smuzhiyunmy %writes;
23*4882a593Smuzhiyun
24*4882a593Smuzhiyunsub syscalls::sys_exit_read
25*4882a593Smuzhiyun{
26*4882a593Smuzhiyun    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
27*4882a593Smuzhiyun	$common_pid, $common_comm, $common_callchain,
28*4882a593Smuzhiyun	$nr, $ret) = @_;
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun    if ($ret > 0) {
31*4882a593Smuzhiyun	$reads{$common_pid}{bytes_read} += $ret;
32*4882a593Smuzhiyun    } else {
33*4882a593Smuzhiyun	if (!defined ($reads{$common_pid}{bytes_read})) {
34*4882a593Smuzhiyun	    $reads{$common_pid}{bytes_read} = 0;
35*4882a593Smuzhiyun	}
36*4882a593Smuzhiyun	$reads{$common_pid}{errors}{$ret}++;
37*4882a593Smuzhiyun    }
38*4882a593Smuzhiyun}
39*4882a593Smuzhiyun
40*4882a593Smuzhiyunsub syscalls::sys_enter_read
41*4882a593Smuzhiyun{
42*4882a593Smuzhiyun    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
43*4882a593Smuzhiyun	$common_pid, $common_comm, $common_callchain,
44*4882a593Smuzhiyun	$nr, $fd, $buf, $count) = @_;
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun    $reads{$common_pid}{bytes_requested} += $count;
47*4882a593Smuzhiyun    $reads{$common_pid}{total_reads}++;
48*4882a593Smuzhiyun    $reads{$common_pid}{comm} = $common_comm;
49*4882a593Smuzhiyun}
50*4882a593Smuzhiyun
51*4882a593Smuzhiyunsub syscalls::sys_exit_write
52*4882a593Smuzhiyun{
53*4882a593Smuzhiyun    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
54*4882a593Smuzhiyun	$common_pid, $common_comm, $common_callchain,
55*4882a593Smuzhiyun	$nr, $ret) = @_;
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun    if ($ret <= 0) {
58*4882a593Smuzhiyun	$writes{$common_pid}{errors}{$ret}++;
59*4882a593Smuzhiyun    }
60*4882a593Smuzhiyun}
61*4882a593Smuzhiyun
62*4882a593Smuzhiyunsub syscalls::sys_enter_write
63*4882a593Smuzhiyun{
64*4882a593Smuzhiyun    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
65*4882a593Smuzhiyun	$common_pid, $common_comm, $common_callchain,
66*4882a593Smuzhiyun	$nr, $fd, $buf, $count) = @_;
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun    $writes{$common_pid}{bytes_written} += $count;
69*4882a593Smuzhiyun    $writes{$common_pid}{total_writes}++;
70*4882a593Smuzhiyun    $writes{$common_pid}{comm} = $common_comm;
71*4882a593Smuzhiyun}
72*4882a593Smuzhiyun
73*4882a593Smuzhiyunsub trace_end
74*4882a593Smuzhiyun{
75*4882a593Smuzhiyun    printf("read counts by pid:\n\n");
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun    printf("%6s  %20s  %10s  %10s  %10s\n", "pid", "comm",
78*4882a593Smuzhiyun	   "# reads", "bytes_requested", "bytes_read");
79*4882a593Smuzhiyun    printf("%6s  %-20s  %10s  %10s  %10s\n", "------", "--------------------",
80*4882a593Smuzhiyun	   "-----------", "----------", "----------");
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun    foreach my $pid (sort { ($reads{$b}{bytes_read} || 0) <=>
83*4882a593Smuzhiyun				($reads{$a}{bytes_read} || 0) } keys %reads) {
84*4882a593Smuzhiyun	my $comm = $reads{$pid}{comm} || "";
85*4882a593Smuzhiyun	my $total_reads = $reads{$pid}{total_reads} || 0;
86*4882a593Smuzhiyun	my $bytes_requested = $reads{$pid}{bytes_requested} || 0;
87*4882a593Smuzhiyun	my $bytes_read = $reads{$pid}{bytes_read} || 0;
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun	printf("%6s  %-20s  %10s  %10s  %10s\n", $pid, $comm,
90*4882a593Smuzhiyun	       $total_reads, $bytes_requested, $bytes_read);
91*4882a593Smuzhiyun    }
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun    printf("\nfailed reads by pid:\n\n");
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun    printf("%6s  %20s  %6s  %10s\n", "pid", "comm", "error #", "# errors");
96*4882a593Smuzhiyun    printf("%6s  %20s  %6s  %10s\n", "------", "--------------------",
97*4882a593Smuzhiyun	   "------", "----------");
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun    my @errcounts = ();
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun    foreach my $pid (keys %reads) {
102*4882a593Smuzhiyun	foreach my $error (keys %{$reads{$pid}{errors}}) {
103*4882a593Smuzhiyun	    my $comm = $reads{$pid}{comm} || "";
104*4882a593Smuzhiyun	    my $errcount = $reads{$pid}{errors}{$error} || 0;
105*4882a593Smuzhiyun	    push @errcounts, [$pid, $comm, $error, $errcount];
106*4882a593Smuzhiyun	}
107*4882a593Smuzhiyun    }
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun    @errcounts = sort { $b->[3] <=> $a->[3] } @errcounts;
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun    for my $i (0 .. $#errcounts) {
112*4882a593Smuzhiyun	printf("%6d  %-20s  %6d  %10s\n", $errcounts[$i][0],
113*4882a593Smuzhiyun	       $errcounts[$i][1], $errcounts[$i][2], $errcounts[$i][3]);
114*4882a593Smuzhiyun    }
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun    printf("\nwrite counts by pid:\n\n");
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun    printf("%6s  %20s  %10s  %10s\n", "pid", "comm",
119*4882a593Smuzhiyun	   "# writes", "bytes_written");
120*4882a593Smuzhiyun    printf("%6s  %-20s  %10s  %10s\n", "------", "--------------------",
121*4882a593Smuzhiyun	   "-----------", "----------");
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun    foreach my $pid (sort { ($writes{$b}{bytes_written} || 0) <=>
124*4882a593Smuzhiyun			($writes{$a}{bytes_written} || 0)} keys %writes) {
125*4882a593Smuzhiyun	my $comm = $writes{$pid}{comm} || "";
126*4882a593Smuzhiyun	my $total_writes = $writes{$pid}{total_writes} || 0;
127*4882a593Smuzhiyun	my $bytes_written = $writes{$pid}{bytes_written} || 0;
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun	printf("%6s  %-20s  %10s  %10s\n", $pid, $comm,
130*4882a593Smuzhiyun	       $total_writes, $bytes_written);
131*4882a593Smuzhiyun    }
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun    printf("\nfailed writes by pid:\n\n");
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun    printf("%6s  %20s  %6s  %10s\n", "pid", "comm", "error #", "# errors");
136*4882a593Smuzhiyun    printf("%6s  %20s  %6s  %10s\n", "------", "--------------------",
137*4882a593Smuzhiyun	   "------", "----------");
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun    @errcounts = ();
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun    foreach my $pid (keys %writes) {
142*4882a593Smuzhiyun	foreach my $error (keys %{$writes{$pid}{errors}}) {
143*4882a593Smuzhiyun	    my $comm = $writes{$pid}{comm} || "";
144*4882a593Smuzhiyun	    my $errcount = $writes{$pid}{errors}{$error} || 0;
145*4882a593Smuzhiyun	    push @errcounts, [$pid, $comm, $error, $errcount];
146*4882a593Smuzhiyun	}
147*4882a593Smuzhiyun    }
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun    @errcounts = sort { $b->[3] <=> $a->[3] } @errcounts;
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun    for my $i (0 .. $#errcounts) {
152*4882a593Smuzhiyun	printf("%6d  %-20s  %6d  %10s\n", $errcounts[$i][0],
153*4882a593Smuzhiyun	       $errcounts[$i][1], $errcounts[$i][2], $errcounts[$i][3]);
154*4882a593Smuzhiyun    }
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun    print_unhandled();
157*4882a593Smuzhiyun}
158*4882a593Smuzhiyun
159*4882a593Smuzhiyunmy %unhandled;
160*4882a593Smuzhiyun
161*4882a593Smuzhiyunsub print_unhandled
162*4882a593Smuzhiyun{
163*4882a593Smuzhiyun    if ((scalar keys %unhandled) == 0) {
164*4882a593Smuzhiyun	return;
165*4882a593Smuzhiyun    }
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun    print "\nunhandled events:\n\n";
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun    printf("%-40s  %10s\n", "event", "count");
170*4882a593Smuzhiyun    printf("%-40s  %10s\n", "----------------------------------------",
171*4882a593Smuzhiyun	   "-----------");
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun    foreach my $event_name (keys %unhandled) {
174*4882a593Smuzhiyun	printf("%-40s  %10d\n", $event_name, $unhandled{$event_name});
175*4882a593Smuzhiyun    }
176*4882a593Smuzhiyun}
177*4882a593Smuzhiyun
178*4882a593Smuzhiyunsub trace_unhandled
179*4882a593Smuzhiyun{
180*4882a593Smuzhiyun    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
181*4882a593Smuzhiyun	$common_pid, $common_comm, $common_callchain) = @_;
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun    $unhandled{$event_name}++;
184*4882a593Smuzhiyun}
185