diff --git a/scripts/Modules/Filters.pm b/scripts/Modules/Filters.pm new file mode 100644 index 0000000..56e072c --- /dev/null +++ b/scripts/Modules/Filters.pm @@ -0,0 +1,71 @@ +package Modules::Filters; + +use strict; +use warnings; +use diagnostics; + +use FindBin; +use lib $FindBin::Bin; +use Util; + +my %CONFIGS = ( + no_aot => { + label => "Exclude WAMR AOT array", + regions => [ [ '_wamr_aot_start', '_wamr_aot_end' ] ], + }, + no_mmap => { + label => "Exclude WAMR mmap", + regions => [ [ '_wamr_mmap_start', '_wamr_mmap_end' ] ], + }, + no_runtime_pool => { + label => "Exclude WAMR runtime pool", + regions => [ [ '_wamr_runtime_pool_start', '_wamr_runtime_pool_end' ] ], + }, + no_linear_pool => { + label => "Exclude WAMR linear pool", + regions => [ [ '_wamr_linear_pool_start', '_wamr_linear_pool_end' ] ], + }, + no_global_heap => { + label => "Exclude WAMR global heap", + regions => [ [ '_wamr_global_heap_start', '_wamr_global_heap_end' ] ], + }, +); + +# Those will be executed automatically by runner.pl (+ no filter at all) +my @DEFAULT_CONFIGS = ('no_aot'); + +sub get_configs { + return \%CONFIGS; +} + +sub get_default_configs { + return @DEFAULT_CONFIGS; +} + +sub build_filter_clause { + my ( $experiment_dir, $config_name ) = @_; + + return "" unless defined $config_name && length($config_name) > 0; + + my $regions = $CONFIGS{$config_name}{regions}; + return "" unless defined $regions; + + return "" + unless defined $experiment_dir && -f "$experiment_dir/system.elf"; + + my @filters; + for my $pair (@$regions) { + my ( $start_sym, $end_sym ) = @$pair; + my $start = + Util::elf_sym_addr( "$experiment_dir/system.elf", $start_sym ); + my $end = Util::elf_sym_addr( "$experiment_dir/system.elf", $end_sym ); + next unless defined $start && defined $end && $end > $start; + push @filters, + "p.injection_instr_absolute NOT BETWEEN $start AND @{[$end - 1]}"; + } + + return "" unless @filters; + return "\nAND " . join( "\nAND ", @filters ); +} + +1; diff --git a/scripts/Modules/Util.pm b/scripts/Modules/Util.pm index 500246e..9a93d48 100644 --- a/scripts/Modules/Util.pm +++ b/scripts/Modules/Util.pm @@ -126,7 +126,9 @@ sub find_subdirs { } sub execute_query { - my ( $experiment, $queryname, $db_conf, $builds_dir, $do_notify_file ) = @_; + my ( $experiment, $queryname, $db_conf, $builds_dir, $do_notify_file, + $filter_config_name ) + = @_; my $module = "Queries::$queryname"; my $file = "$module.pm"; @@ -140,9 +142,10 @@ sub execute_query { my $postprocess = $module->can('postprocess') or die "$module can't postprocess()"; - my $querystring = $query->($experiment, "$builds_dir/$experiment"); + my $querystring = + $query->( $experiment, "$builds_dir/$experiment", $filter_config_name ); my $argsstring = $args->(); - my $filenamestring = $filename->(); + my $filenamestring = $filename->($filter_config_name); # TODO: Pass the values instead of rewriting db.conf. # Can also use DBI's database handle directly. diff --git a/scripts/Queries/Faults.pm b/scripts/Queries/Faults.pm index b95ba65..9b3ceb8 100644 --- a/scripts/Queries/Faults.pm +++ b/scripts/Queries/Faults.pm @@ -4,10 +4,19 @@ use strict; use warnings; use diagnostics; +use FindBin; +use lib "$FindBin::Bin/.."; +use lib "$FindBin::Bin/../Modules"; +use Modules::Filters; + use feature 'say'; sub query { - my ($experiment) = @_; + my ( $experiment, $experiment_dir, $filter_config_name ) = @_; + $filter_config_name //= ''; + + my $filters = Modules::Filters::build_filter_clause( $experiment_dir, + $filter_config_name ); my $querystring = "SELECT benchmark, resulttype, SUM(t.time2 - t.time1 + 1) AS faults, @@ -17,7 +26,7 @@ JOIN trace t ON v.id = t.variant_id JOIN fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_physical_address = t.data_physical_address JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id JOIN fsppilot p ON r.pilot_id = p.id -WHERE v.variant = '$experiment' +WHERE v.variant = '$experiment'$filters GROUP BY benchmark, resulttype, p.injection_instr_absolute ORDER BY benchmark, resulttype, SUM(t.time2 - t.time1 + 1) DESC;"; @@ -28,7 +37,12 @@ ORDER BY benchmark, resulttype, SUM(t.time2 - t.time1 + 1) DESC;"; sub args { return "--batch --raw"; } -sub filename { return "faults.csv"; } +sub filename { + my ($filter_config_name) = @_; + $filter_config_name //= ''; + my $suffix = length($filter_config_name) ? "_$filter_config_name" : ""; + return "faults${suffix}.csv"; +} sub postprocess { $_[0] =~ s/\t/,/g; } diff --git a/scripts/Queries/FaultsFiltered.pm b/scripts/Queries/FaultsFiltered.pm deleted file mode 100644 index e9c75b0..0000000 --- a/scripts/Queries/FaultsFiltered.pm +++ /dev/null @@ -1,64 +0,0 @@ -package Queries::FaultsFiltered; - -use strict; -use warnings; -use diagnostics; - -use FindBin; -use lib "$FindBin::Bin/../Modules"; -use Util; - -use feature 'say'; - -# Those regions from linker.ld will be excluded -my @EXCLUDE_REGIONS = ( - [ '_wamr_aot_start', '_wamr_aot_end' ], - # [ '_wamr_mmap_start', '_wamr_mmap_end' ], - # [ '_wamr_global_heap_start', '_wamr_global_heap_end' ], - # [ '_wamr_runtime_pool_start', '_wamr_runtime_pool_end' ], - # [ '_wamr_linear_pool_start', '_wamr_linear_pool_end' ], -); - -sub query { - my ( $experiment, $experiment_dir ) = @_; - - my @filters; - if ( defined $experiment_dir && -f "$experiment_dir/system.elf" ) { - for my $pair (@EXCLUDE_REGIONS) { - my ( $start_sym, $end_sym ) = @$pair; - my $start = - Util::elf_sym_addr( "$experiment_dir/system.elf", $start_sym ); - my $end = - Util::elf_sym_addr( "$experiment_dir/system.elf", $end_sym ); - next unless defined $start && defined $end && $end > $start; - push @filters, - "p.injection_instr_absolute NOT BETWEEN $start AND @{[$end - 1]}"; - } - } - - my $extra = @filters ? "\nAND " . join( "\nAND ", @filters ) : ""; - - my $querystring = "SELECT -benchmark, resulttype, SUM(t.time2 - t.time1 + 1) AS faults, -CONCAT('0x', HEX(p.injection_instr_absolute)) AS fault_address -FROM variant v -JOIN trace t ON v.id = t.variant_id -JOIN fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_physical_address = t.data_physical_address -JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id -JOIN fsppilot p ON r.pilot_id = p.id -WHERE v.variant = '$experiment'$extra -GROUP BY benchmark, resulttype, p.injection_instr_absolute -ORDER BY benchmark, resulttype, SUM(t.time2 - t.time1 + 1) DESC;"; - - say $querystring; - - return $querystring; -} - -sub args { return "--batch --raw"; } - -sub filename { return "faults_filtered.csv"; } - -sub postprocess { $_[0] =~ s/\t/,/g; } - -1; diff --git a/scripts/Queries/Results.pm b/scripts/Queries/Results.pm index 2b2be3c..af9822c 100644 --- a/scripts/Queries/Results.pm +++ b/scripts/Queries/Results.pm @@ -4,10 +4,19 @@ use strict; use warnings; use diagnostics; +use FindBin; +use lib "$FindBin::Bin/.."; +use lib "$FindBin::Bin/../Modules"; +use Modules::Filters; + use feature 'say'; sub query { - my ($experiment) = @_; + my ( $experiment, $experiment_dir, $filter_config_name ) = @_; + $filter_config_name //= ''; + + my $extra = Modules::Filters::build_filter_clause( $experiment_dir, + $filter_config_name ); my $querystring = "SELECT benchmark, resulttype, sum(t.time2 - t.time1 + 1) AS faults @@ -16,7 +25,7 @@ JOIN trace t ON v.id = t.variant_id JOIN fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_physical_address = t.data_physical_address JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id JOIN fsppilot p ON r.pilot_id = p.id -WHERE v.variant = '$experiment' +WHERE v.variant = '$experiment'$extra GROUP BY v.id, resulttype ORDER BY variant, benchmark, resulttype;"; @@ -27,7 +36,12 @@ ORDER BY variant, benchmark, resulttype;"; sub args { return "-t"; } -sub filename { return "results.txt"; } +sub filename { + my ($filter_config_name) = @_; + $filter_config_name //= ''; + my $suffix = length($filter_config_name) ? "_filtered_$filter_config_name" : ""; + return "results${suffix}.txt"; +} sub postprocess { } diff --git a/scripts/Queries/ResultsData.pm b/scripts/Queries/ResultsData.pm index 496efed..a634d68 100644 --- a/scripts/Queries/ResultsData.pm +++ b/scripts/Queries/ResultsData.pm @@ -4,10 +4,19 @@ use strict; use warnings; use diagnostics; +use FindBin; +use lib "$FindBin::Bin/.."; +use lib "$FindBin::Bin/../Modules"; +use Modules::Filters; + use feature 'say'; sub query { - my ($experiment) = @_; + my ( $experiment, $experiment_dir, $filter_config_name ) = @_; + $filter_config_name //= ''; + + my $extra = Modules::Filters::build_filter_clause( $experiment_dir, + $filter_config_name ); my $querystring = "SELECT benchmark, resulttype, sum(t.time2 - t.time1 + 1) AS faults @@ -16,7 +25,7 @@ JOIN trace t ON v.id = t.variant_id JOIN fspgroup g ON g.variant_id = t.variant_id AND g.instr2 = t.instr2 AND g.data_physical_address = t.data_physical_address JOIN result_GenericExperimentMessage r ON r.pilot_id = g.pilot_id JOIN fsppilot p ON r.pilot_id = p.id -WHERE v.variant = '$experiment' +WHERE v.variant = '$experiment'$extra GROUP BY v.id, resulttype ORDER BY variant, benchmark, resulttype;"; @@ -27,7 +36,12 @@ ORDER BY variant, benchmark, resulttype;"; sub args { return "--batch --raw"; } -sub filename { return "resultsdata.csv"; } +sub filename { + my ($filter_config_name) = @_; + $filter_config_name //= ''; + my $suffix = length($filter_config_name) ? "_filtered_$filter_config_name" : ""; + return "resultsdata${suffix}.csv"; +} sub postprocess { $_[0] =~ s/\t/,/g; } diff --git a/scripts/menu.pl b/scripts/menu.pl index 81c39fe..afd08e9 100644 --- a/scripts/menu.pl +++ b/scripts/menu.pl @@ -11,6 +11,7 @@ use lib "$FindBin::Bin/Modules"; use Util; use Mars; use TUI; +use Modules::Filters; use Text::CSV_XS; use feature 'say'; @@ -85,15 +86,43 @@ my %handlers = ( TUI::select_from_list( "Select Queries to Run", 1, @queries ); die "No query selected" unless @selected_queries; + # Select filter configs + my @filter_choices = ("None"); + my %filter_label_name; + my @filter_configs; + my $configs = Modules::Filters::get_configs(); + foreach my $name ( sort keys %$configs ) { + my $label = $configs->{$name}{label}; + push @filter_choices, $label; + $filter_label_name{$label} = $name; + } + my @selected_filter_labels = + TUI::select_from_list( "Select Filters to Apply", 1, + @filter_choices ); + die "No filter selected" unless @selected_filter_labels; + @filter_configs = (); + foreach my $label (@selected_filter_labels) { + if ( $label eq "None" ) { + push @filter_configs, ''; + } + else { + push @filter_configs, $filter_label_name{$label}; + } + } + # Run queries on databases foreach my $db (@selected_dbs) { foreach my $query (@selected_queries) { - Util::rewrite_file( $local_db_conf, "database=", - "database=$db\n" ); + foreach my $config (@filter_configs) { + Util::rewrite_file( $local_db_conf, "database=", + "database=$db\n" ); - say "Running $query on $db..."; - Util::execute_query( $db =~ s/smchurla_//r, - $query, $local_db_conf, $local_archive_dir, 0 ); + my $config_label = length($config) ? " ($config)" : ""; + say "Running $query$config_label on $db..."; + Util::execute_query( $db =~ s/smchurla_//r, + $query, $local_db_conf, $local_archive_dir, 0, + $config ); + } } } }, diff --git a/scripts/runner.pl b/scripts/runner.pl index 75ad65b..20bede9 100644 --- a/scripts/runner.pl +++ b/scripts/runner.pl @@ -6,10 +6,10 @@ use diagnostics; use FindBin; use lib $FindBin::Bin; -use lib "$FindBin::Bin/../../scripts"; -use lib "$FindBin::Bin/../../scripts/Modules"; +use lib "$FindBin::Bin/Modules"; -use Util; +use Modules::Filters; +use Modules::Util; use feature 'say'; @@ -209,9 +209,10 @@ sub inject { # Read catch flags written by build.pl into the experiment directory my $runner_flags_file = "$remote_builds_dir/$experiment/runner_flags"; - my @catch_flags = (); + my @catch_flags = (); if ( -e $runner_flags_file ) { - open( my $rfh, '<', $runner_flags_file ) or die "Cannot open $runner_flags_file: $!"; + open( my $rfh, '<', $runner_flags_file ) + or die "Cannot open $runner_flags_file: $!"; @catch_flags = map { chomp; "-Wf,$_" } grep { /\S/ } <$rfh>; close($rfh); } @@ -272,16 +273,15 @@ sub inject { sub results { my ($experiment) = @_; - my @queries = Util::find_files("$remote_root/scripts/Queries"); + my @queries = + map { s/\.pm//gr } Util::find_files("$remote_root/scripts/Queries"); + my @configs = ( '', Modules::Filters::get_default_configs() ); - foreach (@queries) { - my $query = $_; - $query =~ s/\.pm//g; - - # Util::notify("Running query $query for $experiment..."); - - Util::execute_query( $experiment, $query, - $remote_db_conf, $remote_builds_dir, 1 ); + for my $query (@queries) { + for my $config (@configs) { + Util::execute_query( $experiment, $query, + $remote_db_conf, $remote_builds_dir, 1, $config ); + } } }