162306a36Sopenharmony_ci#!/usr/bin/perl -w 262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0-only 362306a36Sopenharmony_ci# (c) 2009, Tom Zanussi <tzanussi@gmail.com> 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci# Display r/w activity for all processes 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci# The common_* event handler fields are the most useful fields common to 862306a36Sopenharmony_ci# all events. They don't necessarily correspond to the 'common_*' fields 962306a36Sopenharmony_ci# in the status files. Those fields not available as handler params can 1062306a36Sopenharmony_ci# be retrieved via script functions of the form get_common_*(). 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ciuse 5.010000; 1362306a36Sopenharmony_ciuse strict; 1462306a36Sopenharmony_ciuse warnings; 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ciuse lib "$ENV{'PERF_EXEC_PATH'}/scripts/perl/Perf-Trace-Util/lib"; 1762306a36Sopenharmony_ciuse lib "./Perf-Trace-Util/lib"; 1862306a36Sopenharmony_ciuse Perf::Trace::Core; 1962306a36Sopenharmony_ciuse Perf::Trace::Util; 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_cimy %reads; 2262306a36Sopenharmony_cimy %writes; 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_cisub syscalls::sys_exit_read 2562306a36Sopenharmony_ci{ 2662306a36Sopenharmony_ci my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs, 2762306a36Sopenharmony_ci $common_pid, $common_comm, $common_callchain, 2862306a36Sopenharmony_ci $nr, $ret) = @_; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci if ($ret > 0) { 3162306a36Sopenharmony_ci $reads{$common_pid}{bytes_read} += $ret; 3262306a36Sopenharmony_ci } else { 3362306a36Sopenharmony_ci if (!defined ($reads{$common_pid}{bytes_read})) { 3462306a36Sopenharmony_ci $reads{$common_pid}{bytes_read} = 0; 3562306a36Sopenharmony_ci } 3662306a36Sopenharmony_ci $reads{$common_pid}{errors}{$ret}++; 3762306a36Sopenharmony_ci } 3862306a36Sopenharmony_ci} 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cisub syscalls::sys_enter_read 4162306a36Sopenharmony_ci{ 4262306a36Sopenharmony_ci my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs, 4362306a36Sopenharmony_ci $common_pid, $common_comm, $common_callchain, 4462306a36Sopenharmony_ci $nr, $fd, $buf, $count) = @_; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci $reads{$common_pid}{bytes_requested} += $count; 4762306a36Sopenharmony_ci $reads{$common_pid}{total_reads}++; 4862306a36Sopenharmony_ci $reads{$common_pid}{comm} = $common_comm; 4962306a36Sopenharmony_ci} 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cisub syscalls::sys_exit_write 5262306a36Sopenharmony_ci{ 5362306a36Sopenharmony_ci my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs, 5462306a36Sopenharmony_ci $common_pid, $common_comm, $common_callchain, 5562306a36Sopenharmony_ci $nr, $ret) = @_; 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci if ($ret <= 0) { 5862306a36Sopenharmony_ci $writes{$common_pid}{errors}{$ret}++; 5962306a36Sopenharmony_ci } 6062306a36Sopenharmony_ci} 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_cisub syscalls::sys_enter_write 6362306a36Sopenharmony_ci{ 6462306a36Sopenharmony_ci my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs, 6562306a36Sopenharmony_ci $common_pid, $common_comm, $common_callchain, 6662306a36Sopenharmony_ci $nr, $fd, $buf, $count) = @_; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci $writes{$common_pid}{bytes_written} += $count; 6962306a36Sopenharmony_ci $writes{$common_pid}{total_writes}++; 7062306a36Sopenharmony_ci $writes{$common_pid}{comm} = $common_comm; 7162306a36Sopenharmony_ci} 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_cisub trace_end 7462306a36Sopenharmony_ci{ 7562306a36Sopenharmony_ci printf("read counts by pid:\n\n"); 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci printf("%6s %20s %10s %10s %10s\n", "pid", "comm", 7862306a36Sopenharmony_ci "# reads", "bytes_requested", "bytes_read"); 7962306a36Sopenharmony_ci printf("%6s %-20s %10s %10s %10s\n", "------", "--------------------", 8062306a36Sopenharmony_ci "-----------", "----------", "----------"); 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci foreach my $pid (sort { ($reads{$b}{bytes_read} || 0) <=> 8362306a36Sopenharmony_ci ($reads{$a}{bytes_read} || 0) } keys %reads) { 8462306a36Sopenharmony_ci my $comm = $reads{$pid}{comm} || ""; 8562306a36Sopenharmony_ci my $total_reads = $reads{$pid}{total_reads} || 0; 8662306a36Sopenharmony_ci my $bytes_requested = $reads{$pid}{bytes_requested} || 0; 8762306a36Sopenharmony_ci my $bytes_read = $reads{$pid}{bytes_read} || 0; 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci printf("%6s %-20s %10s %10s %10s\n", $pid, $comm, 9062306a36Sopenharmony_ci $total_reads, $bytes_requested, $bytes_read); 9162306a36Sopenharmony_ci } 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci printf("\nfailed reads by pid:\n\n"); 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci printf("%6s %20s %6s %10s\n", "pid", "comm", "error #", "# errors"); 9662306a36Sopenharmony_ci printf("%6s %20s %6s %10s\n", "------", "--------------------", 9762306a36Sopenharmony_ci "------", "----------"); 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci my @errcounts = (); 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci foreach my $pid (keys %reads) { 10262306a36Sopenharmony_ci foreach my $error (keys %{$reads{$pid}{errors}}) { 10362306a36Sopenharmony_ci my $comm = $reads{$pid}{comm} || ""; 10462306a36Sopenharmony_ci my $errcount = $reads{$pid}{errors}{$error} || 0; 10562306a36Sopenharmony_ci push @errcounts, [$pid, $comm, $error, $errcount]; 10662306a36Sopenharmony_ci } 10762306a36Sopenharmony_ci } 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci @errcounts = sort { $b->[3] <=> $a->[3] } @errcounts; 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci for my $i (0 .. $#errcounts) { 11262306a36Sopenharmony_ci printf("%6d %-20s %6d %10s\n", $errcounts[$i][0], 11362306a36Sopenharmony_ci $errcounts[$i][1], $errcounts[$i][2], $errcounts[$i][3]); 11462306a36Sopenharmony_ci } 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci printf("\nwrite counts by pid:\n\n"); 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci printf("%6s %20s %10s %10s\n", "pid", "comm", 11962306a36Sopenharmony_ci "# writes", "bytes_written"); 12062306a36Sopenharmony_ci printf("%6s %-20s %10s %10s\n", "------", "--------------------", 12162306a36Sopenharmony_ci "-----------", "----------"); 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci foreach my $pid (sort { ($writes{$b}{bytes_written} || 0) <=> 12462306a36Sopenharmony_ci ($writes{$a}{bytes_written} || 0)} keys %writes) { 12562306a36Sopenharmony_ci my $comm = $writes{$pid}{comm} || ""; 12662306a36Sopenharmony_ci my $total_writes = $writes{$pid}{total_writes} || 0; 12762306a36Sopenharmony_ci my $bytes_written = $writes{$pid}{bytes_written} || 0; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci printf("%6s %-20s %10s %10s\n", $pid, $comm, 13062306a36Sopenharmony_ci $total_writes, $bytes_written); 13162306a36Sopenharmony_ci } 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci printf("\nfailed writes by pid:\n\n"); 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci printf("%6s %20s %6s %10s\n", "pid", "comm", "error #", "# errors"); 13662306a36Sopenharmony_ci printf("%6s %20s %6s %10s\n", "------", "--------------------", 13762306a36Sopenharmony_ci "------", "----------"); 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci @errcounts = (); 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci foreach my $pid (keys %writes) { 14262306a36Sopenharmony_ci foreach my $error (keys %{$writes{$pid}{errors}}) { 14362306a36Sopenharmony_ci my $comm = $writes{$pid}{comm} || ""; 14462306a36Sopenharmony_ci my $errcount = $writes{$pid}{errors}{$error} || 0; 14562306a36Sopenharmony_ci push @errcounts, [$pid, $comm, $error, $errcount]; 14662306a36Sopenharmony_ci } 14762306a36Sopenharmony_ci } 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci @errcounts = sort { $b->[3] <=> $a->[3] } @errcounts; 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci for my $i (0 .. $#errcounts) { 15262306a36Sopenharmony_ci printf("%6d %-20s %6d %10s\n", $errcounts[$i][0], 15362306a36Sopenharmony_ci $errcounts[$i][1], $errcounts[$i][2], $errcounts[$i][3]); 15462306a36Sopenharmony_ci } 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci print_unhandled(); 15762306a36Sopenharmony_ci} 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_cimy %unhandled; 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_cisub print_unhandled 16262306a36Sopenharmony_ci{ 16362306a36Sopenharmony_ci if ((scalar keys %unhandled) == 0) { 16462306a36Sopenharmony_ci return; 16562306a36Sopenharmony_ci } 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci print "\nunhandled events:\n\n"; 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci printf("%-40s %10s\n", "event", "count"); 17062306a36Sopenharmony_ci printf("%-40s %10s\n", "----------------------------------------", 17162306a36Sopenharmony_ci "-----------"); 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci foreach my $event_name (keys %unhandled) { 17462306a36Sopenharmony_ci printf("%-40s %10d\n", $event_name, $unhandled{$event_name}); 17562306a36Sopenharmony_ci } 17662306a36Sopenharmony_ci} 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_cisub trace_unhandled 17962306a36Sopenharmony_ci{ 18062306a36Sopenharmony_ci my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs, 18162306a36Sopenharmony_ci $common_pid, $common_comm, $common_callchain) = @_; 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci $unhandled{$event_name}++; 18462306a36Sopenharmony_ci} 185