xref: /OK3568_Linux_fs/kernel/tools/perf/scripts/perl/rw-by-file.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 files read/written to for a given program
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 $usage = "perf script -s rw-by-file.pl <comm>\n";
22*4882a593Smuzhiyun
23*4882a593Smuzhiyunmy $for_comm = shift or die $usage;
24*4882a593Smuzhiyun
25*4882a593Smuzhiyunmy %reads;
26*4882a593Smuzhiyunmy %writes;
27*4882a593Smuzhiyun
28*4882a593Smuzhiyunsub syscalls::sys_enter_read
29*4882a593Smuzhiyun{
30*4882a593Smuzhiyun    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
31*4882a593Smuzhiyun	$common_pid, $common_comm, $common_callchain, $nr, $fd, $buf, $count) = @_;
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun    if ($common_comm eq $for_comm) {
34*4882a593Smuzhiyun	$reads{$fd}{bytes_requested} += $count;
35*4882a593Smuzhiyun	$reads{$fd}{total_reads}++;
36*4882a593Smuzhiyun    }
37*4882a593Smuzhiyun}
38*4882a593Smuzhiyun
39*4882a593Smuzhiyunsub syscalls::sys_enter_write
40*4882a593Smuzhiyun{
41*4882a593Smuzhiyun    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
42*4882a593Smuzhiyun	$common_pid, $common_comm, $common_callchain, $nr, $fd, $buf, $count) = @_;
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun    if ($common_comm eq $for_comm) {
45*4882a593Smuzhiyun	$writes{$fd}{bytes_written} += $count;
46*4882a593Smuzhiyun	$writes{$fd}{total_writes}++;
47*4882a593Smuzhiyun    }
48*4882a593Smuzhiyun}
49*4882a593Smuzhiyun
50*4882a593Smuzhiyunsub trace_end
51*4882a593Smuzhiyun{
52*4882a593Smuzhiyun    printf("file read counts for $for_comm:\n\n");
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun    printf("%6s  %10s  %10s\n", "fd", "# reads", "bytes_requested");
55*4882a593Smuzhiyun    printf("%6s  %10s  %10s\n", "------", "----------", "-----------");
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun    foreach my $fd (sort {$reads{$b}{bytes_requested} <=>
58*4882a593Smuzhiyun			      $reads{$a}{bytes_requested}} keys %reads) {
59*4882a593Smuzhiyun	my $total_reads = $reads{$fd}{total_reads};
60*4882a593Smuzhiyun	my $bytes_requested = $reads{$fd}{bytes_requested};
61*4882a593Smuzhiyun	printf("%6u  %10u  %10u\n", $fd, $total_reads, $bytes_requested);
62*4882a593Smuzhiyun    }
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun    printf("\nfile write counts for $for_comm:\n\n");
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun    printf("%6s  %10s  %10s\n", "fd", "# writes", "bytes_written");
67*4882a593Smuzhiyun    printf("%6s  %10s  %10s\n", "------", "----------", "-----------");
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun    foreach my $fd (sort {$writes{$b}{bytes_written} <=>
70*4882a593Smuzhiyun			      $writes{$a}{bytes_written}} keys %writes) {
71*4882a593Smuzhiyun	my $total_writes = $writes{$fd}{total_writes};
72*4882a593Smuzhiyun	my $bytes_written = $writes{$fd}{bytes_written};
73*4882a593Smuzhiyun	printf("%6u  %10u  %10u\n", $fd, $total_writes, $bytes_written);
74*4882a593Smuzhiyun    }
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun    print_unhandled();
77*4882a593Smuzhiyun}
78*4882a593Smuzhiyun
79*4882a593Smuzhiyunmy %unhandled;
80*4882a593Smuzhiyun
81*4882a593Smuzhiyunsub print_unhandled
82*4882a593Smuzhiyun{
83*4882a593Smuzhiyun    if ((scalar keys %unhandled) == 0) {
84*4882a593Smuzhiyun	return;
85*4882a593Smuzhiyun    }
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun    print "\nunhandled events:\n\n";
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun    printf("%-40s  %10s\n", "event", "count");
90*4882a593Smuzhiyun    printf("%-40s  %10s\n", "----------------------------------------",
91*4882a593Smuzhiyun	   "-----------");
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun    foreach my $event_name (keys %unhandled) {
94*4882a593Smuzhiyun	printf("%-40s  %10d\n", $event_name, $unhandled{$event_name});
95*4882a593Smuzhiyun    }
96*4882a593Smuzhiyun}
97*4882a593Smuzhiyun
98*4882a593Smuzhiyunsub trace_unhandled
99*4882a593Smuzhiyun{
100*4882a593Smuzhiyun    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
101*4882a593Smuzhiyun	$common_pid, $common_comm, $common_callchain) = @_;
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun    $unhandled{$event_name}++;
104*4882a593Smuzhiyun}
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun
107