162306a36Sopenharmony_ci# failed system call counts
262306a36Sopenharmony_ci# (c) 2010, Tom Zanussi <tzanussi@gmail.com>
362306a36Sopenharmony_ci# Licensed under the terms of the GNU GPL License version 2
462306a36Sopenharmony_ci#
562306a36Sopenharmony_ci# Displays system-wide failed system call totals
662306a36Sopenharmony_ci# If a [comm] arg is specified, only syscalls called by [comm] are displayed.
762306a36Sopenharmony_ci
862306a36Sopenharmony_ciuse lib "$ENV{'PERF_EXEC_PATH'}/scripts/perl/Perf-Trace-Util/lib";
962306a36Sopenharmony_ciuse lib "./Perf-Trace-Util/lib";
1062306a36Sopenharmony_ciuse Perf::Trace::Core;
1162306a36Sopenharmony_ciuse Perf::Trace::Context;
1262306a36Sopenharmony_ciuse Perf::Trace::Util;
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_cimy $for_comm = shift;
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_cimy %failed_syscalls;
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cisub raw_syscalls::sys_exit
1962306a36Sopenharmony_ci{
2062306a36Sopenharmony_ci	my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
2162306a36Sopenharmony_ci	    $common_pid, $common_comm, $common_callchain,
2262306a36Sopenharmony_ci	    $id, $ret) = @_;
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci	if ($ret < 0) {
2562306a36Sopenharmony_ci	    $failed_syscalls{$common_comm}++;
2662306a36Sopenharmony_ci	}
2762306a36Sopenharmony_ci}
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cisub syscalls::sys_exit
3062306a36Sopenharmony_ci{
3162306a36Sopenharmony_ci	raw_syscalls::sys_exit(@_)
3262306a36Sopenharmony_ci}
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cisub trace_end
3562306a36Sopenharmony_ci{
3662306a36Sopenharmony_ci    printf("\nfailed syscalls by comm:\n\n");
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci    printf("%-20s  %10s\n", "comm", "# errors");
3962306a36Sopenharmony_ci    printf("%-20s  %6s  %10s\n", "--------------------", "----------");
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci    foreach my $comm (sort {$failed_syscalls{$b} <=> $failed_syscalls{$a}}
4262306a36Sopenharmony_ci		      keys %failed_syscalls) {
4362306a36Sopenharmony_ci	next if ($for_comm && $comm ne $for_comm);
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	printf("%-20s  %10s\n", $comm, $failed_syscalls{$comm});
4662306a36Sopenharmony_ci    }
4762306a36Sopenharmony_ci}
48