diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-01-20 12:39:18 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-01-20 12:39:18 -0500 |
| commit | 9451ee2d17e6b4bfbc5871f3c86ea744581b0413 (patch) | |
| tree | e8ad2d396858e1b4a51d5570bf83aeae7150c34d /tools/testing | |
| parent | edde1fb8c41d0db7c8ce17fb32886da2e389b0cc (diff) | |
| parent | 961d9caceea2d5350a15c17b7d3ffc24c08c9b09 (diff) | |
Merge tag 'ktest-v3.14' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-ktest
Pull ktest updates from Steven Rostedt:
"Here's some basic updates to ktest.pl. They include:
- add config to modify the signal to terminate console
- update to documentation (missing some config options)
- add KERNEL_VERSION variable to use for other configs
- add '=~' to let configs eval other configs
- add BISECT_TRIES to run multiple tests per git bisect good"
* tag 'ktest-v3.14' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-ktest:
ktest: Add BISECT_TRIES to bisect test
ktest: Add eval '=~' command to modify variables in config file
ktest: Add special variable ${KERNEL_VERSION}
ktest: Add documentation of CLOSE_CONSOLE_SIGNAL
ktest: Make the signal to terminate the console configurable
Diffstat (limited to 'tools/testing')
| -rwxr-xr-x | tools/testing/ktest/ktest.pl | 158 | ||||
| -rw-r--r-- | tools/testing/ktest/sample.conf | 21 |
2 files changed, 147 insertions, 32 deletions
diff --git a/tools/testing/ktest/ktest.pl b/tools/testing/ktest/ktest.pl index 999eab1bc64f..40631569a0fd 100755 --- a/tools/testing/ktest/ktest.pl +++ b/tools/testing/ktest/ktest.pl | |||
| @@ -18,6 +18,7 @@ $| = 1; | |||
| 18 | my %opt; | 18 | my %opt; |
| 19 | my %repeat_tests; | 19 | my %repeat_tests; |
| 20 | my %repeats; | 20 | my %repeats; |
| 21 | my %evals; | ||
| 21 | 22 | ||
| 22 | #default opts | 23 | #default opts |
| 23 | my %default = ( | 24 | my %default = ( |
| @@ -25,6 +26,7 @@ my %default = ( | |||
| 25 | "TEST_TYPE" => "build", | 26 | "TEST_TYPE" => "build", |
| 26 | "BUILD_TYPE" => "randconfig", | 27 | "BUILD_TYPE" => "randconfig", |
| 27 | "MAKE_CMD" => "make", | 28 | "MAKE_CMD" => "make", |
| 29 | "CLOSE_CONSOLE_SIGNAL" => "INT", | ||
| 28 | "TIMEOUT" => 120, | 30 | "TIMEOUT" => 120, |
| 29 | "TMP_DIR" => "/tmp/ktest/\${MACHINE}", | 31 | "TMP_DIR" => "/tmp/ktest/\${MACHINE}", |
| 30 | "SLEEP_TIME" => 60, # sleep time between tests | 32 | "SLEEP_TIME" => 60, # sleep time between tests |
| @@ -39,6 +41,7 @@ my %default = ( | |||
| 39 | "CLEAR_LOG" => 0, | 41 | "CLEAR_LOG" => 0, |
| 40 | "BISECT_MANUAL" => 0, | 42 | "BISECT_MANUAL" => 0, |
| 41 | "BISECT_SKIP" => 1, | 43 | "BISECT_SKIP" => 1, |
| 44 | "BISECT_TRIES" => 1, | ||
| 42 | "MIN_CONFIG_TYPE" => "boot", | 45 | "MIN_CONFIG_TYPE" => "boot", |
| 43 | "SUCCESS_LINE" => "login:", | 46 | "SUCCESS_LINE" => "login:", |
| 44 | "DETECT_TRIPLE_FAULT" => 1, | 47 | "DETECT_TRIPLE_FAULT" => 1, |
| @@ -137,6 +140,7 @@ my $bisect_bad_commit = ""; | |||
| 137 | my $reverse_bisect; | 140 | my $reverse_bisect; |
| 138 | my $bisect_manual; | 141 | my $bisect_manual; |
| 139 | my $bisect_skip; | 142 | my $bisect_skip; |
| 143 | my $bisect_tries; | ||
| 140 | my $config_bisect_good; | 144 | my $config_bisect_good; |
| 141 | my $bisect_ret_good; | 145 | my $bisect_ret_good; |
| 142 | my $bisect_ret_bad; | 146 | my $bisect_ret_bad; |
| @@ -163,6 +167,7 @@ my $timeout; | |||
| 163 | my $booted_timeout; | 167 | my $booted_timeout; |
| 164 | my $detect_triplefault; | 168 | my $detect_triplefault; |
| 165 | my $console; | 169 | my $console; |
| 170 | my $close_console_signal; | ||
| 166 | my $reboot_success_line; | 171 | my $reboot_success_line; |
| 167 | my $success_line; | 172 | my $success_line; |
| 168 | my $stop_after_success; | 173 | my $stop_after_success; |
| @@ -273,6 +278,7 @@ my %option_map = ( | |||
| 273 | "IGNORE_ERRORS" => \$ignore_errors, | 278 | "IGNORE_ERRORS" => \$ignore_errors, |
| 274 | "BISECT_MANUAL" => \$bisect_manual, | 279 | "BISECT_MANUAL" => \$bisect_manual, |
| 275 | "BISECT_SKIP" => \$bisect_skip, | 280 | "BISECT_SKIP" => \$bisect_skip, |
| 281 | "BISECT_TRIES" => \$bisect_tries, | ||
| 276 | "CONFIG_BISECT_GOOD" => \$config_bisect_good, | 282 | "CONFIG_BISECT_GOOD" => \$config_bisect_good, |
| 277 | "BISECT_RET_GOOD" => \$bisect_ret_good, | 283 | "BISECT_RET_GOOD" => \$bisect_ret_good, |
| 278 | "BISECT_RET_BAD" => \$bisect_ret_bad, | 284 | "BISECT_RET_BAD" => \$bisect_ret_bad, |
| @@ -285,6 +291,7 @@ my %option_map = ( | |||
| 285 | "TIMEOUT" => \$timeout, | 291 | "TIMEOUT" => \$timeout, |
| 286 | "BOOTED_TIMEOUT" => \$booted_timeout, | 292 | "BOOTED_TIMEOUT" => \$booted_timeout, |
| 287 | "CONSOLE" => \$console, | 293 | "CONSOLE" => \$console, |
| 294 | "CLOSE_CONSOLE_SIGNAL" => \$close_console_signal, | ||
| 288 | "DETECT_TRIPLE_FAULT" => \$detect_triplefault, | 295 | "DETECT_TRIPLE_FAULT" => \$detect_triplefault, |
| 289 | "SUCCESS_LINE" => \$success_line, | 296 | "SUCCESS_LINE" => \$success_line, |
| 290 | "REBOOT_SUCCESS_LINE" => \$reboot_success_line, | 297 | "REBOOT_SUCCESS_LINE" => \$reboot_success_line, |
| @@ -445,6 +452,27 @@ $config_help{"REBOOT_SCRIPT"} = << "EOF" | |||
| 445 | EOF | 452 | EOF |
| 446 | ; | 453 | ; |
| 447 | 454 | ||
| 455 | sub _logit { | ||
| 456 | if (defined($opt{"LOG_FILE"})) { | ||
| 457 | open(OUT, ">> $opt{LOG_FILE}") or die "Can't write to $opt{LOG_FILE}"; | ||
| 458 | print OUT @_; | ||
| 459 | close(OUT); | ||
| 460 | } | ||
| 461 | } | ||
| 462 | |||
| 463 | sub logit { | ||
| 464 | if (defined($opt{"LOG_FILE"})) { | ||
| 465 | _logit @_; | ||
| 466 | } else { | ||
| 467 | print @_; | ||
| 468 | } | ||
| 469 | } | ||
| 470 | |||
| 471 | sub doprint { | ||
| 472 | print @_; | ||
| 473 | _logit @_; | ||
| 474 | } | ||
| 475 | |||
| 448 | sub read_prompt { | 476 | sub read_prompt { |
| 449 | my ($cancel, $prompt) = @_; | 477 | my ($cancel, $prompt) = @_; |
| 450 | 478 | ||
| @@ -662,6 +690,22 @@ sub set_value { | |||
| 662 | } | 690 | } |
| 663 | } | 691 | } |
| 664 | 692 | ||
| 693 | sub set_eval { | ||
| 694 | my ($lvalue, $rvalue, $name) = @_; | ||
| 695 | |||
| 696 | my $prvalue = process_variables($rvalue); | ||
| 697 | my $arr; | ||
| 698 | |||
| 699 | if (defined($evals{$lvalue})) { | ||
| 700 | $arr = $evals{$lvalue}; | ||
| 701 | } else { | ||
| 702 | $arr = []; | ||
| 703 | $evals{$lvalue} = $arr; | ||
| 704 | } | ||
| 705 | |||
| 706 | push @{$arr}, $rvalue; | ||
| 707 | } | ||
| 708 | |||
| 665 | sub set_variable { | 709 | sub set_variable { |
| 666 | my ($lvalue, $rvalue) = @_; | 710 | my ($lvalue, $rvalue) = @_; |
| 667 | 711 | ||
| @@ -947,6 +991,20 @@ sub __read_config { | |||
| 947 | $test_case = 1; | 991 | $test_case = 1; |
| 948 | } | 992 | } |
| 949 | 993 | ||
| 994 | } elsif (/^\s*([A-Z_\[\]\d]+)\s*=~\s*(.*?)\s*$/) { | ||
| 995 | |||
| 996 | next if ($skip); | ||
| 997 | |||
| 998 | my $lvalue = $1; | ||
| 999 | my $rvalue = $2; | ||
| 1000 | |||
| 1001 | if ($default || $lvalue =~ /\[\d+\]$/) { | ||
| 1002 | set_eval($lvalue, $rvalue, $name); | ||
| 1003 | } else { | ||
| 1004 | my $val = "$lvalue\[$test_num\]"; | ||
| 1005 | set_eval($val, $rvalue, $name); | ||
| 1006 | } | ||
| 1007 | |||
| 950 | } elsif (/^\s*([A-Z_\[\]\d]+)\s*=\s*(.*?)\s*$/) { | 1008 | } elsif (/^\s*([A-Z_\[\]\d]+)\s*=\s*(.*?)\s*$/) { |
| 951 | 1009 | ||
| 952 | next if ($skip); | 1010 | next if ($skip); |
| @@ -1126,6 +1184,10 @@ sub __eval_option { | |||
| 1126 | } elsif (defined($opt{$var})) { | 1184 | } elsif (defined($opt{$var})) { |
| 1127 | $o = $opt{$var}; | 1185 | $o = $opt{$var}; |
| 1128 | $retval = "$retval$o"; | 1186 | $retval = "$retval$o"; |
| 1187 | } elsif ($var eq "KERNEL_VERSION" && defined($make)) { | ||
| 1188 | # special option KERNEL_VERSION uses kernel version | ||
| 1189 | get_version(); | ||
| 1190 | $retval = "$retval$version"; | ||
| 1129 | } else { | 1191 | } else { |
| 1130 | $retval = "$retval\$\{$var\}"; | 1192 | $retval = "$retval\$\{$var\}"; |
| 1131 | } | 1193 | } |
| @@ -1140,6 +1202,33 @@ sub __eval_option { | |||
| 1140 | return $retval; | 1202 | return $retval; |
| 1141 | } | 1203 | } |
| 1142 | 1204 | ||
| 1205 | sub process_evals { | ||
| 1206 | my ($name, $option, $i) = @_; | ||
| 1207 | |||
| 1208 | my $option_name = "$name\[$i\]"; | ||
| 1209 | my $ev; | ||
| 1210 | |||
| 1211 | my $old_option = $option; | ||
| 1212 | |||
| 1213 | if (defined($evals{$option_name})) { | ||
| 1214 | $ev = $evals{$option_name}; | ||
| 1215 | } elsif (defined($evals{$name})) { | ||
| 1216 | $ev = $evals{$name}; | ||
| 1217 | } else { | ||
| 1218 | return $option; | ||
| 1219 | } | ||
| 1220 | |||
| 1221 | for my $e (@{$ev}) { | ||
| 1222 | eval "\$option =~ $e"; | ||
| 1223 | } | ||
| 1224 | |||
| 1225 | if ($option ne $old_option) { | ||
| 1226 | doprint("$name changed from '$old_option' to '$option'\n"); | ||
| 1227 | } | ||
| 1228 | |||
| 1229 | return $option; | ||
| 1230 | } | ||
| 1231 | |||
| 1143 | sub eval_option { | 1232 | sub eval_option { |
| 1144 | my ($name, $option, $i) = @_; | 1233 | my ($name, $option, $i) = @_; |
| 1145 | 1234 | ||
| @@ -1160,28 +1249,9 @@ sub eval_option { | |||
| 1160 | $option = __eval_option($name, $option, $i); | 1249 | $option = __eval_option($name, $option, $i); |
| 1161 | } | 1250 | } |
| 1162 | 1251 | ||
| 1163 | return $option; | 1252 | $option = process_evals($name, $option, $i); |
| 1164 | } | ||
| 1165 | 1253 | ||
| 1166 | sub _logit { | 1254 | return $option; |
| 1167 | if (defined($opt{"LOG_FILE"})) { | ||
| 1168 | open(OUT, ">> $opt{LOG_FILE}") or die "Can't write to $opt{LOG_FILE}"; | ||
| 1169 | print OUT @_; | ||
| 1170 | close(OUT); | ||
| 1171 | } | ||
| 1172 | } | ||
| 1173 | |||
| 1174 | sub logit { | ||
| 1175 | if (defined($opt{"LOG_FILE"})) { | ||
| 1176 | _logit @_; | ||
| 1177 | } else { | ||
| 1178 | print @_; | ||
| 1179 | } | ||
| 1180 | } | ||
| 1181 | |||
| 1182 | sub doprint { | ||
| 1183 | print @_; | ||
| 1184 | _logit @_; | ||
| 1185 | } | 1255 | } |
| 1186 | 1256 | ||
| 1187 | sub run_command; | 1257 | sub run_command; |
| @@ -1296,7 +1366,7 @@ sub close_console { | |||
| 1296 | my ($fp, $pid) = @_; | 1366 | my ($fp, $pid) = @_; |
| 1297 | 1367 | ||
| 1298 | doprint "kill child process $pid\n"; | 1368 | doprint "kill child process $pid\n"; |
| 1299 | kill 2, $pid; | 1369 | kill $close_console_signal, $pid; |
| 1300 | 1370 | ||
| 1301 | print "closing!\n"; | 1371 | print "closing!\n"; |
| 1302 | close($fp); | 1372 | close($fp); |
| @@ -2517,12 +2587,29 @@ sub run_bisect { | |||
| 2517 | $buildtype = "useconfig:$minconfig"; | 2587 | $buildtype = "useconfig:$minconfig"; |
| 2518 | } | 2588 | } |
| 2519 | 2589 | ||
| 2520 | my $ret = run_bisect_test $type, $buildtype; | 2590 | # If the user sets bisect_tries to less than 1, then no tries |
| 2591 | # is a success. | ||
| 2592 | my $ret = 1; | ||
| 2521 | 2593 | ||
| 2522 | if ($bisect_manual) { | 2594 | # Still let the user manually decide that though. |
| 2595 | if ($bisect_tries < 1 && $bisect_manual) { | ||
| 2523 | $ret = answer_bisect; | 2596 | $ret = answer_bisect; |
| 2524 | } | 2597 | } |
| 2525 | 2598 | ||
| 2599 | for (my $i = 0; $i < $bisect_tries; $i++) { | ||
| 2600 | if ($bisect_tries > 1) { | ||
| 2601 | my $t = $i + 1; | ||
| 2602 | doprint("Running bisect trial $t of $bisect_tries:\n"); | ||
| 2603 | } | ||
| 2604 | $ret = run_bisect_test $type, $buildtype; | ||
| 2605 | |||
| 2606 | if ($bisect_manual) { | ||
| 2607 | $ret = answer_bisect; | ||
| 2608 | } | ||
| 2609 | |||
| 2610 | last if (!$ret); | ||
| 2611 | } | ||
| 2612 | |||
| 2526 | # Are we looking for where it worked, not failed? | 2613 | # Are we looking for where it worked, not failed? |
| 2527 | if ($reverse_bisect && $ret >= 0) { | 2614 | if ($reverse_bisect && $ret >= 0) { |
| 2528 | $ret = !$ret; | 2615 | $ret = !$ret; |
| @@ -3916,6 +4003,18 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) { | |||
| 3916 | 4003 | ||
| 3917 | my $makecmd = set_test_option("MAKE_CMD", $i); | 4004 | my $makecmd = set_test_option("MAKE_CMD", $i); |
| 3918 | 4005 | ||
| 4006 | $outputdir = set_test_option("OUTPUT_DIR", $i); | ||
| 4007 | $builddir = set_test_option("BUILD_DIR", $i); | ||
| 4008 | |||
| 4009 | chdir $builddir || die "can't change directory to $builddir"; | ||
| 4010 | |||
| 4011 | if (!-d $outputdir) { | ||
| 4012 | mkpath($outputdir) or | ||
| 4013 | die "can't create $outputdir"; | ||
| 4014 | } | ||
| 4015 | |||
| 4016 | $make = "$makecmd O=$outputdir"; | ||
| 4017 | |||
| 3919 | # Load all the options into their mapped variable names | 4018 | # Load all the options into their mapped variable names |
| 3920 | foreach my $opt (keys %option_map) { | 4019 | foreach my $opt (keys %option_map) { |
| 3921 | ${$option_map{$opt}} = set_test_option($opt, $i); | 4020 | ${$option_map{$opt}} = set_test_option($opt, $i); |
| @@ -3940,13 +4039,9 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) { | |||
| 3940 | $start_minconfig = $minconfig; | 4039 | $start_minconfig = $minconfig; |
| 3941 | } | 4040 | } |
| 3942 | 4041 | ||
| 3943 | chdir $builddir || die "can't change directory to $builddir"; | 4042 | if (!-d $tmpdir) { |
| 3944 | 4043 | mkpath($tmpdir) or | |
| 3945 | foreach my $dir ($tmpdir, $outputdir) { | 4044 | die "can't create $tmpdir"; |
| 3946 | if (!-d $dir) { | ||
| 3947 | mkpath($dir) or | ||
| 3948 | die "can't create $dir"; | ||
| 3949 | } | ||
| 3950 | } | 4045 | } |
| 3951 | 4046 | ||
| 3952 | $ENV{"SSH_USER"} = $ssh_user; | 4047 | $ENV{"SSH_USER"} = $ssh_user; |
| @@ -3955,7 +4050,6 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) { | |||
| 3955 | $buildlog = "$tmpdir/buildlog-$machine"; | 4050 | $buildlog = "$tmpdir/buildlog-$machine"; |
| 3956 | $testlog = "$tmpdir/testlog-$machine"; | 4051 | $testlog = "$tmpdir/testlog-$machine"; |
| 3957 | $dmesg = "$tmpdir/dmesg-$machine"; | 4052 | $dmesg = "$tmpdir/dmesg-$machine"; |
| 3958 | $make = "$makecmd O=$outputdir"; | ||
| 3959 | $output_config = "$outputdir/.config"; | 4053 | $output_config = "$outputdir/.config"; |
| 3960 | 4054 | ||
| 3961 | if (!$buildonly) { | 4055 | if (!$buildonly) { |
diff --git a/tools/testing/ktest/sample.conf b/tools/testing/ktest/sample.conf index 0a290fb4cd5e..172eec4517fb 100644 --- a/tools/testing/ktest/sample.conf +++ b/tools/testing/ktest/sample.conf | |||
| @@ -328,6 +328,13 @@ | |||
| 328 | # For a virtual machine with guest name "Guest". | 328 | # For a virtual machine with guest name "Guest". |
| 329 | #CONSOLE = virsh console Guest | 329 | #CONSOLE = virsh console Guest |
| 330 | 330 | ||
| 331 | # Signal to send to kill console. | ||
| 332 | # ktest.pl will create a child process to monitor the console. | ||
| 333 | # When the console is finished, ktest will kill the child process | ||
| 334 | # with this signal. | ||
| 335 | # (default INT) | ||
| 336 | #CLOSE_CONSOLE_SIGNAL = HUP | ||
| 337 | |||
| 331 | # Required version ending to differentiate the test | 338 | # Required version ending to differentiate the test |
| 332 | # from other linux builds on the system. | 339 | # from other linux builds on the system. |
| 333 | #LOCALVERSION = -test | 340 | #LOCALVERSION = -test |
| @@ -1021,6 +1028,20 @@ | |||
| 1021 | # BISECT_BAD with BISECT_CHECK = good or | 1028 | # BISECT_BAD with BISECT_CHECK = good or |
| 1022 | # BISECT_CHECK = bad, respectively. | 1029 | # BISECT_CHECK = bad, respectively. |
| 1023 | # | 1030 | # |
| 1031 | # BISECT_TRIES = 5 (optional, default 1) | ||
| 1032 | # | ||
| 1033 | # For those cases that it takes several tries to hit a bug, | ||
| 1034 | # the BISECT_TRIES is useful. It is the number of times the | ||
| 1035 | # test is ran before it says the kernel is good. The first failure | ||
| 1036 | # will stop trying and mark the current SHA1 as bad. | ||
| 1037 | # | ||
| 1038 | # Note, as with all race bugs, there's no guarantee that if | ||
| 1039 | # it succeeds, it is really a good bisect. But it helps in case | ||
| 1040 | # the bug is some what reliable. | ||
| 1041 | # | ||
| 1042 | # You can set BISECT_TRIES to zero, and all tests will be considered | ||
| 1043 | # good, unless you also set BISECT_MANUAL. | ||
| 1044 | # | ||
| 1024 | # BISECT_RET_GOOD = 0 (optional, default undefined) | 1045 | # BISECT_RET_GOOD = 0 (optional, default undefined) |
| 1025 | # | 1046 | # |
| 1026 | # In case the specificed test returns something other than just | 1047 | # In case the specificed test returns something other than just |
