Skip to content

Commit

Permalink
perf trace: Add perf trace scripting support modules for Perl
Browse files Browse the repository at this point in the history
Add Perf-Trace-Util Perl module and some scripts that use it.
Core.pm contains Perl code to define and access flag and
symbolic fields. Util.pm contains general-purpose utility
functions.

Also adds some makefile bits to install them in
libexec/perf-core/scripts/perl (or wherever perfexec_instdir
points).

Signed-off-by: Tom Zanussi <tzanussi@gmail.com>
Cc: fweisbec@gmail.com
Cc: rostedt@goodmis.org
Cc: anton@samba.org
Cc: hch@infradead.org
LKML-Reference: <1259133352-23685-5-git-send-email-tzanussi@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
Tom Zanussi authored and Ingo Molnar committed Nov 28, 2009
1 parent 16c632d commit bcefe12
Show file tree
Hide file tree
Showing 9 changed files with 806 additions and 0 deletions.
7 changes: 7 additions & 0 deletions tools/perf/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -980,6 +980,13 @@ export perfexec_instdir
install: all
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
$(INSTALL) perf$X '$(DESTDIR_SQ)$(bindir_SQ)'
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/Perf-Trace-Util/lib/Perf/Trace'
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/bin'
$(INSTALL) scripts/perl/Perf-Trace-Util/lib/Perf/Trace/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/Perf-Trace-Util/lib/Perf/Trace'
$(INSTALL) scripts/perl/*.pl -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl'
$(INSTALL) scripts/perl/bin/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/bin'
$(INSTALL) scripts/perl/Perf-Trace-Util/Makefile.PL -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/Perf-Trace-Util'
$(INSTALL) scripts/perl/Perf-Trace-Util/README -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/Perf-Trace-Util'
ifdef BUILT_INS
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)'
$(INSTALL) $(BUILT_INS) '$(DESTDIR_SQ)$(perfexec_instdir_SQ)'
Expand Down
12 changes: 12 additions & 0 deletions tools/perf/scripts/perl/Perf-Trace-Util/Makefile.PL
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
use 5.010000;
use ExtUtils::MakeMaker;
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
# the contents of the Makefile that is written.
WriteMakefile(
NAME => 'Perf::Trace::Util',
VERSION_FROM => 'lib/Perf/Trace/Util.pm', # finds $VERSION
PREREQ_PM => {}, # e.g., Module::Name => 1.1
($] >= 5.005 ? ## Add these new keywords supported since 5.005
(ABSTRACT_FROM => 'lib/Perf/Trace/Util.pm', # retrieve abstract from module
AUTHOR => 'Tom Zanussi <tzanussi@gmail.com>') : ()),
);
35 changes: 35 additions & 0 deletions tools/perf/scripts/perl/Perf-Trace-Util/README
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
Perf-Trace-Util version 0.01
============================

This module contains utility functions for use with perf trace.

INSTALLATION

Building perf with perf trace Perl scripting should install this
module in the right place.

You should make sure libperl is installed first e.g. apt-get install
libperl-dev.

DEPENDENCIES

This module requires these other modules and libraries:

blah blah blah

COPYRIGHT AND LICENCE

Put the correct copyright and licence information here.

Copyright (C) 2009 by Tom Zanussi <tzanussi@gmail.com>

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.10.0 or,
at your option, any later version of Perl 5 you may have available.

Alternatively, this software may be distributed under the terms of the
GNU General Public License ("GPL") version 2 as published by the Free
Software Foundation.



157 changes: 157 additions & 0 deletions tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Core.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
package Perf::Trace::Core;

use 5.010000;
use strict;
use warnings;

require Exporter;

our @ISA = qw(Exporter);

our %EXPORT_TAGS = ( 'all' => [ qw(
) ] );

our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );

our @EXPORT = qw(
define_flag_field define_flag_value flag_str dump_flag_fields
define_symbolic_field define_symbolic_value symbol_str dump_symbolic_fields
);

our $VERSION = '0.01';

my %flag_fields;
my %symbolic_fields;

sub flag_str
{
my ($event_name, $field_name, $value) = @_;

my $string;

if ($flag_fields{$event_name}{$field_name}) {
my $print_delim = 0;
foreach my $idx (sort {$a <=> $b} keys %{$flag_fields{$event_name}{$field_name}{"values"}}) {
if (!$value && !$idx) {
$string .= "$flag_fields{$event_name}{$field_name}{'values'}{$idx}";
last;
}
if ($idx && ($value & $idx) == $idx) {
if ($print_delim && $flag_fields{$event_name}{$field_name}{'delim'}) {
$string .= " $flag_fields{$event_name}{$field_name}{'delim'} ";
}
$string .= "$flag_fields{$event_name}{$field_name}{'values'}{$idx}";
$print_delim = 1;
$value &= ~$idx;
}
}
}

return $string;
}

sub define_flag_field
{
my ($event_name, $field_name, $delim) = @_;

$flag_fields{$event_name}{$field_name}{"delim"} = $delim;
}

sub define_flag_value
{
my ($event_name, $field_name, $value, $field_str) = @_;

$flag_fields{$event_name}{$field_name}{"values"}{$value} = $field_str;
}

sub dump_flag_fields
{
for my $event (keys %flag_fields) {
print "event $event:\n";
for my $field (keys %{$flag_fields{$event}}) {
print " field: $field:\n";
print " delim: $flag_fields{$event}{$field}{'delim'}\n";
foreach my $idx (sort {$a <=> $b} keys %{$flag_fields{$event}{$field}{"values"}}) {
print " value $idx: $flag_fields{$event}{$field}{'values'}{$idx}\n";
}
}
}
}

sub symbol_str
{
my ($event_name, $field_name, $value) = @_;

if ($symbolic_fields{$event_name}{$field_name}) {
foreach my $idx (sort {$a <=> $b} keys %{$symbolic_fields{$event_name}{$field_name}{"values"}}) {
if (!$value && !$idx) {
return "$symbolic_fields{$event_name}{$field_name}{'values'}{$idx}";
last;
}
if ($value == $idx) {
return "$symbolic_fields{$event_name}{$field_name}{'values'}{$idx}";
}
}
}

return undef;
}

sub define_symbolic_field
{
my ($event_name, $field_name) = @_;

# nothing to do, really
}

sub define_symbolic_value
{
my ($event_name, $field_name, $value, $field_str) = @_;

$symbolic_fields{$event_name}{$field_name}{"values"}{$value} = $field_str;
}

sub dump_symbolic_fields
{
for my $event (keys %symbolic_fields) {
print "event $event:\n";
for my $field (keys %{$symbolic_fields{$event}}) {
print " field: $field:\n";
foreach my $idx (sort {$a <=> $b} keys %{$symbolic_fields{$event}{$field}{"values"}}) {
print " value $idx: $symbolic_fields{$event}{$field}{'values'}{$idx}\n";
}
}
}
}

1;
__END__
=head1 NAME
Perf::Trace::Core - Perl extension for perf trace
=head1 SYNOPSIS
use Perf::Trace::Core
=head1 SEE ALSO
Perf (trace) documentation
=head1 AUTHOR
Tom Zanussi, E<lt>tzanussi@gmail.com<gt>
=head1 COPYRIGHT AND LICENSE
Copyright (C) 2009 by Tom Zanussi
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.10.0 or,
at your option, any later version of Perl 5 you may have available.
Alternatively, this software may be distributed under the terms of the
GNU General Public License ("GPL") version 2 as published by the Free
Software Foundation.
=cut
88 changes: 88 additions & 0 deletions tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Util.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package Perf::Trace::Util;

use 5.010000;
use strict;
use warnings;

require Exporter;

our @ISA = qw(Exporter);

our %EXPORT_TAGS = ( 'all' => [ qw(
) ] );

our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );

our @EXPORT = qw(
avg nsecs nsecs_secs nsecs_nsecs nsecs_usecs print_nsecs
);

our $VERSION = '0.01';

sub avg
{
my ($total, $n) = @_;

return $total / $n;
}

my $NSECS_PER_SEC = 1000000000;

sub nsecs
{
my ($secs, $nsecs) = @_;

return $secs * $NSECS_PER_SEC + $nsecs;
}

sub nsecs_secs {
my ($nsecs) = @_;

return $nsecs / $NSECS_PER_SEC;
}

sub nsecs_nsecs {
my ($nsecs) = @_;

return $nsecs - nsecs_secs($nsecs);
}

sub nsecs_str {
my ($nsecs) = @_;

my $str = sprintf("%5u.%09u", nsecs_secs($nsecs), nsecs_nsecs($nsecs));

return $str;
}

1;
__END__
=head1 NAME
Perf::Trace::Util - Perl extension for perf trace
=head1 SYNOPSIS
use Perf::Trace::Util;
=head1 SEE ALSO
Perf (trace) documentation
=head1 AUTHOR
Tom Zanussi, E<lt>tzanussi@gmail.com<gt>
=head1 COPYRIGHT AND LICENSE
Copyright (C) 2009 by Tom Zanussi
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.10.0 or,
at your option, any later version of Perl 5 you may have available.
Alternatively, this software may be distributed under the terms of the
GNU General Public License ("GPL") version 2 as published by the Free
Software Foundation.
=cut
Loading

0 comments on commit bcefe12

Please sign in to comment.