2 # SPDX-License-Identifier: GPL-2.0-only
9 use Fcntl qw(F_GETFL F_SETFL O_NONBLOCK);
10 use File::Path qw(mkpath);
11 use File::Copy qw(cp);
27 "MAILER" => "sendmail", # default mailer
28 "EMAIL_ON_ERROR" => 1,
29 "EMAIL_WHEN_FINISHED" => 1,
30 "EMAIL_WHEN_CANCELED" => 0,
31 "EMAIL_WHEN_STARTED" => 0,
33 "TEST_TYPE" => "build",
34 "BUILD_TYPE" => "oldconfig",
36 "CLOSE_CONSOLE_SIGNAL" => "INT",
38 "TMP_DIR" => "/tmp/ktest/\${MACHINE}",
39 "SLEEP_TIME" => 60, # sleep time between tests
41 "REBOOT_ON_ERROR" => 0,
42 "POWEROFF_ON_ERROR" => 0,
43 "REBOOT_ON_SUCCESS" => 1,
44 "POWEROFF_ON_SUCCESS" => 0,
45 "BUILD_OPTIONS" => "",
46 "BISECT_SLEEP_TIME" => 60, # sleep time between bisects
47 "PATCHCHECK_SLEEP_TIME" => 60, # sleep time between patch checks
52 "MIN_CONFIG_TYPE" => "boot",
53 "SUCCESS_LINE" => "login:",
54 "DETECT_TRIPLE_FAULT" => 1,
56 "BOOTED_TIMEOUT" => 1,
57 "DIE_ON_FAILURE" => 1,
58 "SSH_EXEC" => "ssh \$SSH_USER\@\$MACHINE \$SSH_COMMAND",
59 "SCP_TO_TARGET" => "scp \$SRC_FILE \$SSH_USER\@\$MACHINE:\$DST_FILE",
60 "SCP_TO_TARGET_INSTALL" => "\${SCP_TO_TARGET}",
61 "REBOOT" => "ssh \$SSH_USER\@\$MACHINE reboot",
62 "REBOOT_RETURN_CODE" => 255,
63 "STOP_AFTER_SUCCESS" => 10,
64 "STOP_AFTER_FAILURE" => 60,
65 "STOP_TEST_AFTER" => 600,
66 "MAX_MONITOR_WAIT" => 1800,
67 "GRUB_REBOOT" => "grub2-reboot",
68 "GRUB_BLS_GET" => "grubby --info=ALL",
69 "SYSLINUX" => "extlinux",
70 "SYSLINUX_PATH" => "/boot/extlinux",
71 "CONNECT_TIMEOUT" => 25,
73 # required, and we will ask users if they don't have them but we keep the default
74 # value something that is common.
75 "REBOOT_TYPE" => "grub",
76 "LOCALVERSION" => "-test",
78 "BUILD_TARGET" => "arch/x86/boot/bzImage",
79 "TARGET_IMAGE" => "/boot/vmlinuz-test",
85 my $test_log_start = 0;
87 my $ktest_config = "ktest.conf";
100 my $final_post_ktest;
114 my $reboot_return_code;
118 my $poweroff_on_error;
119 my $reboot_on_success;
121 my $powercycle_after_reboot;
122 my $poweroff_after_halt;
123 my $max_monitor_wait;
126 my $scp_to_target_install;
145 my $start_minconfig_defined;
146 my $output_minconfig;
148 my $use_output_minconfig;
154 my $bisect_bad_commit = "";
159 my $config_bisect_good;
163 my $bisect_ret_abort;
164 my $bisect_ret_default;
165 my $in_patchcheck = 0;
174 my $bisect_sleep_time;
175 my $patchcheck_sleep_time;
182 my $config_bisect_exec;
184 my $detect_triplefault;
186 my $close_console_signal;
187 my $reboot_success_line;
189 my $stop_after_success;
190 my $stop_after_failure;
199 my $run_command_status = 0;
211 my $config_bisect_type;
212 my $config_bisect_check;
215 my $patchcheck_start;
216 my $patchcheck_cherry;
225 my $dirname = $FindBin::Bin;
233 my $email_when_finished;
234 my $email_when_started;
235 my $email_when_canceled;
237 my $script_start_time = localtime();
239 # set when a test is something other that just building or install
240 # which would require more options.
243 # tell build not to worry about warnings, even when WARNINGS_FILE is set
246 # set when creating a new config
253 # force_config is the list of configs that we force enabled (or disabled)
254 # in a .config file. The MIN_CONFIG and ADD_CONFIG configs.
257 # do not force reboots on config problems
261 my $reboot_success = 0;
264 "MAILTO" => \$mailto,
265 "MAILER" => \$mailer,
266 "MAIL_PATH" => \$mail_path,
267 "MAIL_MAX_SIZE" => \$mail_max_size,
268 "MAIL_COMMAND" => \$mail_command,
269 "EMAIL_ON_ERROR" => \$email_on_error,
270 "EMAIL_WHEN_FINISHED" => \$email_when_finished,
271 "EMAIL_WHEN_STARTED" => \$email_when_started,
272 "EMAIL_WHEN_CANCELED" => \$email_when_canceled,
273 "MACHINE" => \$machine,
274 "SSH_USER" => \$ssh_user,
275 "TMP_DIR" => \$tmpdir,
276 "OUTPUT_DIR" => \$outputdir,
277 "BUILD_DIR" => \$builddir,
278 "TEST_TYPE" => \$test_type,
279 "PRE_KTEST" => \$pre_ktest,
280 "POST_KTEST" => \$post_ktest,
281 "PRE_TEST" => \$pre_test,
282 "PRE_TEST_DIE" => \$pre_test_die,
283 "POST_TEST" => \$post_test,
284 "BUILD_TYPE" => \$build_type,
285 "BUILD_OPTIONS" => \$build_options,
286 "PRE_BUILD" => \$pre_build,
287 "POST_BUILD" => \$post_build,
288 "PRE_BUILD_DIE" => \$pre_build_die,
289 "POST_BUILD_DIE" => \$post_build_die,
290 "POWER_CYCLE" => \$power_cycle,
291 "REBOOT" => \$reboot,
292 "REBOOT_RETURN_CODE" => \$reboot_return_code,
293 "BUILD_NOCLEAN" => \$noclean,
294 "MIN_CONFIG" => \$minconfig,
295 "OUTPUT_MIN_CONFIG" => \$output_minconfig,
296 "START_MIN_CONFIG" => \$start_minconfig,
297 "MIN_CONFIG_TYPE" => \$minconfig_type,
298 "USE_OUTPUT_MIN_CONFIG" => \$use_output_minconfig,
299 "WARNINGS_FILE" => \$warnings_file,
300 "IGNORE_CONFIG" => \$ignore_config,
301 "TEST" => \$run_test,
302 "ADD_CONFIG" => \$addconfig,
303 "REBOOT_TYPE" => \$reboot_type,
304 "GRUB_MENU" => \$grub_menu,
305 "GRUB_FILE" => \$grub_file,
306 "GRUB_REBOOT" => \$grub_reboot,
307 "GRUB_BLS_GET" => \$grub_bls_get,
308 "SYSLINUX" => \$syslinux,
309 "SYSLINUX_PATH" => \$syslinux_path,
310 "SYSLINUX_LABEL" => \$syslinux_label,
311 "PRE_INSTALL" => \$pre_install,
312 "POST_INSTALL" => \$post_install,
313 "NO_INSTALL" => \$no_install,
314 "REBOOT_SCRIPT" => \$reboot_script,
315 "REBOOT_ON_ERROR" => \$reboot_on_error,
316 "SWITCH_TO_GOOD" => \$switch_to_good,
317 "SWITCH_TO_TEST" => \$switch_to_test,
318 "POWEROFF_ON_ERROR" => \$poweroff_on_error,
319 "REBOOT_ON_SUCCESS" => \$reboot_on_success,
320 "DIE_ON_FAILURE" => \$die_on_failure,
321 "POWER_OFF" => \$power_off,
322 "POWERCYCLE_AFTER_REBOOT" => \$powercycle_after_reboot,
323 "POWEROFF_AFTER_HALT" => \$poweroff_after_halt,
324 "MAX_MONITOR_WAIT" => \$max_monitor_wait,
325 "SLEEP_TIME" => \$sleep_time,
326 "BISECT_SLEEP_TIME" => \$bisect_sleep_time,
327 "PATCHCHECK_SLEEP_TIME" => \$patchcheck_sleep_time,
328 "IGNORE_WARNINGS" => \$ignore_warnings,
329 "IGNORE_ERRORS" => \$ignore_errors,
330 "BISECT_MANUAL" => \$bisect_manual,
331 "BISECT_SKIP" => \$bisect_skip,
332 "BISECT_TRIES" => \$bisect_tries,
333 "CONFIG_BISECT_GOOD" => \$config_bisect_good,
334 "BISECT_RET_GOOD" => \$bisect_ret_good,
335 "BISECT_RET_BAD" => \$bisect_ret_bad,
336 "BISECT_RET_SKIP" => \$bisect_ret_skip,
337 "BISECT_RET_ABORT" => \$bisect_ret_abort,
338 "BISECT_RET_DEFAULT" => \$bisect_ret_default,
339 "STORE_FAILURES" => \$store_failures,
340 "STORE_SUCCESSES" => \$store_successes,
341 "TEST_NAME" => \$test_name,
342 "TIMEOUT" => \$timeout,
343 "CONNECT_TIMEOUT" => \$connect_timeout,
344 "CONFIG_BISECT_EXEC" => \$config_bisect_exec,
345 "BOOTED_TIMEOUT" => \$booted_timeout,
346 "CONSOLE" => \$console,
347 "CLOSE_CONSOLE_SIGNAL" => \$close_console_signal,
348 "DETECT_TRIPLE_FAULT" => \$detect_triplefault,
349 "SUCCESS_LINE" => \$success_line,
350 "REBOOT_SUCCESS_LINE" => \$reboot_success_line,
351 "STOP_AFTER_SUCCESS" => \$stop_after_success,
352 "STOP_AFTER_FAILURE" => \$stop_after_failure,
353 "STOP_TEST_AFTER" => \$stop_test_after,
354 "BUILD_TARGET" => \$build_target,
355 "SSH_EXEC" => \$ssh_exec,
356 "SCP_TO_TARGET" => \$scp_to_target,
357 "SCP_TO_TARGET_INSTALL" => \$scp_to_target_install,
358 "CHECKOUT" => \$checkout,
359 "TARGET_IMAGE" => \$target_image,
360 "LOCALVERSION" => \$localversion,
362 "BISECT_GOOD" => \$bisect_good,
363 "BISECT_BAD" => \$bisect_bad,
364 "BISECT_TYPE" => \$bisect_type,
365 "BISECT_START" => \$bisect_start,
366 "BISECT_REPLAY" => \$bisect_replay,
367 "BISECT_FILES" => \$bisect_files,
368 "BISECT_REVERSE" => \$bisect_reverse,
369 "BISECT_CHECK" => \$bisect_check,
371 "CONFIG_BISECT" => \$config_bisect,
372 "CONFIG_BISECT_TYPE" => \$config_bisect_type,
373 "CONFIG_BISECT_CHECK" => \$config_bisect_check,
375 "PATCHCHECK_TYPE" => \$patchcheck_type,
376 "PATCHCHECK_START" => \$patchcheck_start,
377 "PATCHCHECK_CHERRY" => \$patchcheck_cherry,
378 "PATCHCHECK_END" => \$patchcheck_end,
381 # Options may be used by other options, record them.
384 # default variables that can be used
385 chomp ($variable{"PWD"} = `pwd`);
386 $pwd = $variable{"PWD"};
388 $config_help{"MACHINE"} = << "EOF"
389 The machine hostname that you will test.
390 For build only tests, it is still needed to differentiate log files.
393 $config_help{"SSH_USER"} = << "EOF"
394 The box is expected to have ssh on normal bootup, provide the user
395 (most likely root, since you need privileged operations)
398 $config_help{"BUILD_DIR"} = << "EOF"
399 The directory that contains the Linux source code (full path).
400 You can use \${PWD} that will be the path where ktest.pl is run, or use
401 \${THIS_DIR} which is assigned \${PWD} but may be changed later.
404 $config_help{"OUTPUT_DIR"} = << "EOF"
405 The directory that the objects will be built (full path).
406 (can not be same as BUILD_DIR)
407 You can use \${PWD} that will be the path where ktest.pl is run, or use
408 \${THIS_DIR} which is assigned \${PWD} but may be changed later.
411 $config_help{"BUILD_TARGET"} = << "EOF"
412 The location of the compiled file to copy to the target.
413 (relative to OUTPUT_DIR)
416 $config_help{"BUILD_OPTIONS"} = << "EOF"
417 Options to add to \"make\" when building.
421 $config_help{"TARGET_IMAGE"} = << "EOF"
422 The place to put your image on the test machine.
425 $config_help{"POWER_CYCLE"} = << "EOF"
426 A script or command to reboot the box.
428 Here is a digital loggers power switch example
429 POWER_CYCLE = wget --no-proxy -O /dev/null -q --auth-no-challenge 'http://admin:admin\@power/outlet?5=CCL'
431 Here is an example to reboot a virtual box on the current host
432 with the name "Guest".
433 POWER_CYCLE = virsh destroy Guest; sleep 5; virsh start Guest
436 $config_help{"CONSOLE"} = << "EOF"
437 The script or command that reads the console
439 If you use ttywatch server, something like the following would work.
440 CONSOLE = nc -d localhost 3001
442 For a virtual machine with guest name "Guest".
443 CONSOLE = virsh console Guest
446 $config_help{"LOCALVERSION"} = << "EOF"
447 Required version ending to differentiate the test
448 from other linux builds on the system.
451 $config_help{"REBOOT_TYPE"} = << "EOF"
452 Way to reboot the box to the test kernel.
453 Only valid options so far are "grub", "grub2", "grub2bls", "syslinux", and "script".
455 If you specify grub, it will assume grub version 1
456 and will search in /boot/grub/menu.lst for the title \$GRUB_MENU
457 and select that target to reboot to the kernel. If this is not
458 your setup, then specify "script" and have a command or script
459 specified in REBOOT_SCRIPT to boot to the target.
461 The entry in /boot/grub/menu.lst must be entered in manually.
462 The test will not modify that file.
464 If you specify grub2, then you also need to specify both \$GRUB_MENU
467 If you specify grub2bls, then you also need to specify \$GRUB_MENU.
469 If you specify syslinux, then you may use SYSLINUX to define the syslinux
470 command (defaults to extlinux), and SYSLINUX_PATH to specify the path to
471 the syslinux install (defaults to /boot/extlinux). But you have to specify
472 SYSLINUX_LABEL to define the label to boot to for the test kernel.
475 $config_help{"GRUB_MENU"} = << "EOF"
476 The grub title name for the test kernel to boot
477 (Only mandatory if REBOOT_TYPE = grub or grub2)
479 Note, ktest.pl will not update the grub menu.lst, you need to
480 manually add an option for the test. ktest.pl will search
481 the grub menu.lst for this option to find what kernel to
484 For example, if in the /boot/grub/menu.lst the test kernel title has:
487 GRUB_MENU = Test Kernel
489 For grub2, a search of \$GRUB_FILE is performed for the lines
490 that begin with "menuentry". It will not detect submenus. The
491 menu must be a non-nested menu. Add the quotes used in the menu
492 to guarantee your selection, as the first menuentry with the content
493 of \$GRUB_MENU that is found will be used.
495 For grub2bls, \$GRUB_MENU is searched on the result of \$GRUB_BLS_GET
496 command for the lines that begin with "title".
499 $config_help{"GRUB_FILE"} = << "EOF"
500 If grub2 is used, the full path for the grub.cfg file is placed
501 here. Use something like /boot/grub2/grub.cfg to search.
504 $config_help{"SYSLINUX_LABEL"} = << "EOF"
505 If syslinux is used, the label that boots the target kernel must
506 be specified with SYSLINUX_LABEL.
509 $config_help{"REBOOT_SCRIPT"} = << "EOF"
510 A script to reboot the target into the test kernel
511 (Only mandatory if REBOOT_TYPE = script)
516 if (defined($opt{"LOG_FILE"})) {
522 if (defined($opt{"LOG_FILE"})) {
535 my ($cancel, $prompt) = @_;
541 print "$prompt [y/n/C] ";
543 print "$prompt [Y/n] ";
547 if ($ans =~ /^\s*$/) {
554 last if ($ans =~ /^y$/i || $ans =~ /^n$/i);
556 last if ($ans =~ /^c$/i);
557 print "Please answer either 'y', 'n' or 'c'.\n";
559 print "Please answer either 'y' or 'n'.\n";
565 if ($ans !~ /^y$/i) {
574 return read_prompt 0, $prompt;
580 return read_prompt 1, $prompt;
583 sub get_mandatory_config {
587 return if (defined($opt{$config}));
589 if (defined($config_help{$config})) {
591 print $config_help{$config};
596 if (defined($default{$config}) && length($default{$config})) {
597 print "\[$default{$config}\] ";
600 $ans =~ s/^\s*(.*\S)\s*$/$1/;
601 if ($ans =~ /^\s*$/) {
602 if ($default{$config}) {
603 $ans = $default{$config};
605 print "Your answer can not be blank\n";
609 $entered_configs{$config} = ${ans};
621 $hours = int($time / 3600);
622 $time -= $hours * 3600;
625 $minutes = int($time / 60);
626 $time -= $minutes * 60;
630 doprint "$hours hour";
631 doprint "s" if ($hours > 1);
636 doprint "$minutes minute";
637 doprint "s" if ($minutes > 1);
641 doprint "$time second";
642 doprint "s" if ($time != 1);
648 doprint "Build time: ";
649 show_time($build_time);
653 doprint "Install time: ";
654 show_time($install_time);
658 doprint "Reboot time: ";
659 show_time($reboot_time);
663 doprint "Test time: ";
664 show_time($test_time);
667 # reset for iterations like bisect
674 sub get_mandatory_configs {
675 get_mandatory_config("MACHINE");
676 get_mandatory_config("BUILD_DIR");
677 get_mandatory_config("OUTPUT_DIR");
680 get_mandatory_config("BUILD_OPTIONS");
683 # options required for other than just building a kernel
685 get_mandatory_config("POWER_CYCLE");
686 get_mandatory_config("CONSOLE");
689 # options required for install and more
690 if ($buildonly != 1) {
691 get_mandatory_config("SSH_USER");
692 get_mandatory_config("BUILD_TARGET");
693 get_mandatory_config("TARGET_IMAGE");
696 get_mandatory_config("LOCALVERSION");
698 return if ($buildonly);
700 my $rtype = $opt{"REBOOT_TYPE"};
702 if (!defined($rtype)) {
703 if (!defined($opt{"GRUB_MENU"})) {
704 get_mandatory_config("REBOOT_TYPE");
705 $rtype = $entered_configs{"REBOOT_TYPE"};
711 if (($rtype eq "grub") or ($rtype eq "grub2bls")) {
712 get_mandatory_config("GRUB_MENU");
715 if ($rtype eq "grub2") {
716 get_mandatory_config("GRUB_MENU");
717 get_mandatory_config("GRUB_FILE");
720 if ($rtype eq "syslinux") {
721 get_mandatory_config("SYSLINUX_LABEL");
725 sub process_variables {
726 my ($value, $remove_undef) = @_;
729 # We want to check for '\', and it is just easier
730 # to check the previous characet of '$' and not need
731 # to worry if '$' is the first character. By adding
732 # a space to $value, we can just check [^\\]\$ and
733 # it will still work.
736 while ($value =~ /(.*?[^\\])\$\{(.*?)\}(.*)/) {
740 # append beginning of value to retval
741 $retval = "$retval$begin";
742 if (defined($variable{$var})) {
743 $retval = "$retval$variable{$var}";
744 } elsif (defined($remove_undef) && $remove_undef) {
745 # for if statements, any variable that is not defined,
746 # we simple convert to 0
747 $retval = "${retval}0";
749 # put back the origin piece.
750 $retval = "$retval\$\{$var\}";
751 # This could be an option that is used later, save
752 # it so we don't warn if this option is not one of
754 $used_options{$var} = 1;
758 $retval = "$retval$value";
760 # remove the space added in the beginning
767 my ($lvalue, $rvalue, $override, $overrides, $name) = @_;
769 my $prvalue = process_variables($rvalue);
771 if ($lvalue =~ /^(TEST|BISECT|CONFIG_BISECT)_TYPE(\[.*\])?$/ &&
772 $prvalue !~ /^(config_|)bisect$/ &&
773 $prvalue !~ /^build$/ &&
776 # Note if a test is something other than build, then we
777 # will need other mandatory options.
778 if ($prvalue ne "install") {
781 # install still limits some mandatory options.
786 if (defined($opt{$lvalue})) {
787 if (!$override || defined(${$overrides}{$lvalue})) {
790 $extra = "In the same override section!\n";
792 die "$name: $.: Option $lvalue defined more than once!\n$extra";
794 ${$overrides}{$lvalue} = $prvalue;
797 $opt{$lvalue} = $prvalue;
801 my ($lvalue, $rvalue, $name) = @_;
803 my $prvalue = process_variables($rvalue);
806 if (defined($evals{$lvalue})) {
807 $arr = $evals{$lvalue};
810 $evals{$lvalue} = $arr;
813 push @{$arr}, $rvalue;
817 my ($lvalue, $rvalue) = @_;
819 if ($rvalue =~ /^\s*$/) {
820 delete $variable{$lvalue};
822 $rvalue = process_variables($rvalue);
823 $variable{$lvalue} = $rvalue;
827 sub process_compare {
828 my ($lval, $cmp, $rval) = @_;
839 return $lval eq $rval;
840 } elsif ($cmp eq "!=") {
841 return $lval ne $rval;
842 } elsif ($cmp eq "=~") {
843 return $lval =~ m/$rval/;
844 } elsif ($cmp eq "!~") {
845 return $lval !~ m/$rval/;
848 my $statement = "$lval $cmp $rval";
849 my $ret = eval $statement;
851 # $@ stores error of eval
862 return defined($variable{$2}) ||
867 sub process_expression {
868 my ($name, $val) = @_;
872 while ($val =~ s/\(([^\(]*?)\)/\&\&\&\&VAL\&\&\&\&/) {
875 if (process_expression($name, $express)) {
876 $val =~ s/\&\&\&\&VAL\&\&\&\&/ 1 /;
878 $val =~ s/\&\&\&\&VAL\&\&\&\&/ 0 /;
886 while ($val =~ s/^(.*?)($OR|$AND)//) {
890 if (process_expression($name, $express)) {
901 if ($val =~ /(.*)(==|\!=|>=|<=|>|<|=~|\!~)(.*)/) {
902 my $ret = process_compare($1, $2, $3);
904 die "$name: $.: Unable to process comparison\n";
909 if ($val =~ /^\s*(NOT\s*)?DEFINED\s+(\S+)\s*$/) {
911 return !value_defined($2);
913 return value_defined($2);
917 if ($val =~ s/^\s*NOT\s+(.*)//) {
919 my $ret = process_expression($name, $express);
923 if ($val =~ /^\s*0\s*$/) {
925 } elsif ($val =~ /^\s*\d+\s*$/) {
929 die ("$name: $.: Undefined content $val in if statement\n");
933 my ($name, $value) = @_;
935 # Convert variables and replace undefined ones with 0
936 my $val = process_variables($value, 1);
937 my $ret = process_expression $name, $val;
943 my ($config, $current_test_num) = @_;
946 open($in, $config) || die "can't read file $config";
949 $name =~ s,.*/(.*),$1,;
951 my $test_num = $$current_test_num;
954 my $num_tests_set = 0;
967 # ignore blank lines and comments
968 next if (/^\s*$/ || /\s*\#/);
970 if (/^\s*(TEST_START|DEFAULTS)\b(.*)/) {
980 if ($type eq "TEST_START") {
982 if ($num_tests_set) {
983 die "$name: $.: Can not specify both NUM_TESTS and TEST_START\n";
986 $old_test_num = $test_num;
987 $old_repeat = $repeat;
989 $test_num += $repeat;
996 # If SKIP is anywhere in the line, the command will be skipped
997 if ($rest =~ s/\s+SKIP\b//) {
1004 if ($rest =~ s/\sELSE\b//) {
1006 die "$name: $.: ELSE found with out matching IF section\n$_";
1017 if ($rest =~ s/\sIF\s+(.*)//) {
1018 if (process_if($name, $1)) {
1030 if ($type eq "TEST_START") {
1031 if ($rest =~ s/\s+ITERATE\s+(\d+)//) {
1033 $repeat_tests{"$test_num"} = $repeat;
1035 } elsif ($rest =~ s/\sOVERRIDE\b//) {
1038 # Clear previous overrides
1043 if (!$skip && $rest !~ /^\s*$/) {
1044 die "$name: $.: Garbage found after $type\n$_";
1047 if ($skip && $type eq "TEST_START") {
1048 $test_num = $old_test_num;
1049 $repeat = $old_repeat;
1052 } elsif (/^\s*ELSE\b(.*)$/) {
1054 die "$name: $.: ELSE found with out matching IF section\n$_";
1063 if ($rest =~ /\sIF\s+(.*)/) {
1064 # May be a ELSE IF section.
1065 if (process_if($name, $1)) {
1076 if ($rest !~ /^\s*$/) {
1077 die "$name: $.: Garbage found after DEFAULTS\n$_";
1080 } elsif (/^\s*INCLUDE\s+(\S+)/) {
1085 die "$name: $.: INCLUDE can only be done in default sections\n$_";
1088 my $file = process_variables($1);
1090 if ($file !~ m,^/,) {
1091 # check the path of the config file first
1092 if ($config =~ m,(.*)/,) {
1093 if (-f "$1/$file") {
1100 die "$name: $.: Can't read file $file\n$_";
1103 if (__read_config($file, \$test_num)) {
1107 } elsif (/^\s*([A-Z_\[\]\d]+)\s*=~\s*(.*?)\s*$/) {
1114 if ($default || $lvalue =~ /\[\d+\]$/) {
1115 set_eval($lvalue, $rvalue, $name);
1117 my $val = "$lvalue\[$test_num\]";
1118 set_eval($val, $rvalue, $name);
1121 } elsif (/^\s*([A-Z_\[\]\d]+)\s*=\s*(.*?)\s*$/) {
1129 ($lvalue eq "NUM_TESTS" ||
1130 $lvalue eq "LOG_FILE" ||
1131 $lvalue eq "CLEAR_LOG")) {
1132 die "$name: $.: $lvalue must be set in DEFAULTS section\n";
1135 if ($lvalue eq "NUM_TESTS") {
1137 die "$name: $.: Can not specify both NUM_TESTS and TEST_START\n";
1140 die "$name: $.: NUM_TESTS must be set in default section\n";
1145 if ($default || $lvalue =~ /\[\d+\]$/) {
1146 set_value($lvalue, $rvalue, $override, \%overrides, $name);
1148 my $val = "$lvalue\[$test_num\]";
1149 set_value($val, $rvalue, $override, \%overrides, $name);
1152 $repeats{$val} = $repeat;
1155 } elsif (/^\s*([A-Z_\[\]\d]+)\s*:=\s*(.*?)\s*$/) {
1161 # process config variables.
1162 # Config variables are only active while reading the
1163 # config and can be defined anywhere. They also ignore
1164 # TEST_START and DEFAULTS, but are skipped if they are in
1165 # on of these sections that have SKIP defined.
1166 # The save variable can be
1167 # defined multiple times and the new one simply overrides
1169 set_variable($lvalue, $rvalue);
1172 die "$name: $.: Garbage found in config\n$_";
1177 $test_num += $repeat - 1;
1178 $opt{"NUM_TESTS"} = $test_num;
1183 $$current_test_num = $test_num;
1189 print "What test case would you like to run?\n";
1190 print " (build, install or boot)\n";
1191 print " Other tests are available but require editing ktest.conf\n";
1192 print " (see tools/testing/ktest/sample.conf)\n";
1195 $default{"TEST_TYPE"} = $ans;
1204 $test_case = __read_config $config, \$test_num;
1206 # make sure we have all mandatory configs
1207 get_mandatory_configs;
1209 # was a test specified?
1211 print "No test case specified.\n";
1217 foreach my $default (keys %default) {
1218 if (!defined($opt{$default})) {
1219 $opt{$default} = $default{$default};
1223 if ($opt{"IGNORE_UNUSED"} == 1) {
1229 # check if there are any stragglers (typos?)
1230 foreach my $option (keys %opt) {
1232 # remove per test labels.
1234 if (!exists($option_map{$op}) &&
1235 !exists($default{$op}) &&
1236 !exists($used_options{$op})) {
1243 $s = " is" if (keys %not_used == 1);
1244 print "The following option$s not used; could be a typo:\n";
1245 foreach my $option (keys %not_used) {
1248 print "Set IGNORE_UNUSED = 1 to have ktest ignore unused variables\n";
1249 if (!read_yn "Do you want to continue?") {
1256 my ($name, $option, $i) = @_;
1258 # Add space to evaluate the character before $
1259 $option = " $option";
1264 foreach my $test (keys %repeat_tests) {
1266 $i < $test + $repeat_tests{$test}) {
1274 while ($option =~ /(.*?[^\\])\$\{(.*?)\}(.*)/) {
1279 # Append beginning of line
1280 $retval = "$retval$start";
1282 # If the iteration option OPT[$i] exists, then use that.
1283 # otherwise see if the default OPT (without [$i]) exists.
1285 my $o = "$var\[$i\]";
1286 my $parento = "$var\[$parent\]";
1288 # If a variable contains itself, use the default var
1289 if (($var eq $name) && defined($opt{$var})) {
1291 $retval = "$retval$o";
1292 } elsif (defined($opt{$o})) {
1294 $retval = "$retval$o";
1295 } elsif ($repeated && defined($opt{$parento})) {
1296 $o = $opt{$parento};
1297 $retval = "$retval$o";
1298 } elsif (defined($opt{$var})) {
1300 $retval = "$retval$o";
1301 } elsif ($var eq "KERNEL_VERSION" && defined($make)) {
1302 # special option KERNEL_VERSION uses kernel version
1304 $retval = "$retval$version";
1306 $retval = "$retval\$\{$var\}";
1312 $retval = "$retval$option";
1320 my ($name, $option, $i) = @_;
1322 my $option_name = "$name\[$i\]";
1325 my $old_option = $option;
1327 if (defined($evals{$option_name})) {
1328 $ev = $evals{$option_name};
1329 } elsif (defined($evals{$name})) {
1330 $ev = $evals{$name};
1335 for my $e (@{$ev}) {
1336 eval "\$option =~ $e";
1339 if ($option ne $old_option) {
1340 doprint("$name changed from '$old_option' to '$option'\n");
1347 my ($name, $option, $i) = @_;
1351 # Since an option can evaluate to another option,
1352 # keep iterating until we do not evaluate any more
1355 while ($prev ne $option) {
1356 # Check for recursive evaluations.
1357 # 100 deep should be more than enough.
1359 die "Over 100 evaluations occurred with $option\n" .
1360 "Check for recursive variables\n";
1363 $option = __eval_option($name, $option, $i);
1366 $option = process_evals($name, $option, $i);
1374 sub wait_for_monitor;
1380 # test if the machine can be connected to within a few seconds
1381 my $stat = run_ssh("echo check machine status", $connect_timeout);
1383 doprint("power cycle\n");
1388 run_command "$power_cycle";
1391 # flush out current monitor
1392 # May contain the reboot success line
1396 # Make sure everything has been written to disk
1397 run_ssh("sync", 10);
1399 if (defined($time)) {
1401 # flush out current monitor
1402 # May contain the reboot success line
1406 # try to reboot normally
1407 if (run_command $reboot) {
1408 if (defined($powercycle_after_reboot)) {
1409 sleep $powercycle_after_reboot;
1410 run_command "$power_cycle";
1413 # nope? power cycle it.
1414 run_command "$power_cycle";
1418 if (defined($time)) {
1420 # We only want to get to the new kernel, don't fail
1421 # if we stumble over a call trace.
1422 my $save_ignore_errors = $ignore_errors;
1425 # Look for the good kernel to boot
1426 if (wait_for_monitor($time, "Linux version")) {
1428 doprint "Reboot did not finish. Forcing power cycle\n";
1429 run_command "$power_cycle";
1432 $ignore_errors = $save_ignore_errors;
1434 # Still need to wait for the reboot to finish
1435 wait_for_monitor($time, $reboot_success_line);
1441 sub reboot_to_good {
1444 if (defined($switch_to_good)) {
1445 run_command $switch_to_good;
1454 return $test_type eq "build" || $no_reboot ||
1455 ($test_type eq "patchcheck" && $opt{"PATCHCHECK_TYPE[$i]"} eq "build") ||
1456 ($test_type eq "bisect" && $opt{"BISECT_TYPE[$i]"} eq "build") ||
1457 ($test_type eq "config_bisect" && $opt{"CONFIG_BISECT_TYPE[$i]"} eq "build");
1462 sub get_test_name() {
1465 if (defined($test_name)) {
1466 $name = "$test_name:$test_type";
1476 return if ($in_die);
1481 doprint "CRITICAL FAILURE... [TEST $i] ", @_, "\n";
1483 if ($reboot_on_error && !do_not_reboot) {
1485 doprint "REBOOTING\n";
1488 } elsif ($poweroff_on_error && defined($power_off)) {
1489 doprint "POWERING OFF\n";
1493 if (defined($opt{"LOG_FILE"})) {
1494 print " See $opt{LOG_FILE} for more info.\n";
1497 if ($email_on_error) {
1498 my $name = get_test_name;
1501 if (defined($opt{"LOG_FILE"})) {
1502 my $whence = 0; # beginning of file
1503 my $pos = $test_log_start;
1505 if (defined($mail_max_size)) {
1506 my $log_size = tell LOG;
1507 $log_size -= $test_log_start;
1508 if ($log_size > $mail_max_size) {
1509 $whence = 2; # end of file
1510 $pos = - $mail_max_size;
1513 $log_file = "$tmpdir/log";
1514 open (L, "$opt{LOG_FILE}") or die "Can't open $opt{LOG_FILE} to read)";
1515 open (O, "> $tmpdir/log") or die "Can't open $tmpdir/log\n";
1516 seek(L, $pos, $whence);
1523 send_email("KTEST: critical failure for test $i [$name]",
1524 "Your test started at $script_start_time has failed with:\n@_\n", $log_file);
1528 # restore terminal settings
1529 system("stty $stty_orig");
1532 if (defined($post_test)) {
1533 run_command $post_test;
1540 my ($ptm, $pts) = @_;
1542 my $TIOCSPTLCK = 0x40045431;
1543 my $TIOCGPTN = 0x80045430;
1545 sysopen($ptm, "/dev/ptmx", O_RDWR | O_NONBLOCK) or
1546 dodie "Can't open /dev/ptmx";
1549 $tmp = pack("i", 0);
1550 ioctl($ptm, $TIOCSPTLCK, $tmp) or
1551 dodie "ioctl TIOCSPTLCK for /dev/ptmx failed";
1554 ioctl($ptm, $TIOCGPTN, $tmp) or
1555 dodie "ioctl TIOCGPTN for /dev/ptmx failed";
1556 $tmp = unpack("i", $tmp);
1558 sysopen($pts, "/dev/pts/$tmp", O_RDWR | O_NONBLOCK) or
1559 dodie "Can't open /dev/pts/$tmp";
1563 my ($ptm, $pts) = @_;
1571 open(\*STDIN, '<&', $pts);
1572 open(\*STDOUT, '>&', $pts);
1573 open(\*STDERR, '>&', $pts);
1578 dodie "Can't open console $console";
1586 # save terminal settings
1587 $stty_orig = `stty -g`;
1589 # place terminal in cbreak mode so that stdin can be read one character at
1590 # a time without having to wait for a newline
1591 system("stty -icanon -echo -icrnl");
1593 create_pty($ptm, $pts);
1599 exec_console($ptm, $pts)
1607 open(PTSFD, "Stop perl from warning about single use of PTSFD");
1611 my ($fp, $pid) = @_;
1613 doprint "kill child process $pid\n";
1614 kill $close_console_signal, $pid;
1616 doprint "wait for child process $pid to exit\n";
1622 # restore terminal settings
1623 system("stty $stty_orig");
1627 if ($monitor_cnt++) {
1630 $monitor_fp = \*MONFD;
1631 $monitor_pid = open_console $monitor_fp;
1635 open(MONFD, "Stop perl from warning about single use of MONFD");
1639 return if (!defined $console);
1640 if (--$monitor_cnt) {
1643 close_console($monitor_fp, $monitor_pid);
1646 sub wait_for_monitor {
1647 my ($time, $stop) = @_;
1651 my $start_time = time;
1652 my $skip_call_trace = 0;
1654 my $bug_ignored = 0;
1657 doprint "** Wait for monitor to settle down **\n";
1659 # read the monitor and wait for the system to calm down
1661 $line = wait_for_input($monitor_fp, $time);
1662 last if (!defined($line));
1664 $full_line .= $line;
1666 if (defined($stop) && $full_line =~ /$stop/) {
1667 doprint "wait for monitor detected $stop\n";
1671 if ($full_line =~ /\[ backtrace testing \]/) {
1672 $skip_call_trace = 1;
1675 if ($full_line =~ /call trace:/i) {
1676 if (!$bug && !$skip_call_trace) {
1677 if ($ignore_errors) {
1685 if ($full_line =~ /\[ end of backtrace testing \]/) {
1686 $skip_call_trace = 0;
1689 if ($full_line =~ /Kernel panic -/) {
1693 if ($line =~ /\n/) {
1697 if ($now - $start_time >= $max_monitor_wait) {
1698 doprint "Exiting monitor flush due to hitting MAX_MONITOR_WAIT\n";
1702 print "** Monitor flushed **\n";
1704 # if stop is defined but wasn't hit, return error
1705 # used by reboot (which wants to see a reboot)
1706 if (defined($stop) && !$booted) {
1713 my ($result, $basedir) = @_;
1715 my $date = sprintf "%04d%02d%02d%02d%02d%02d",
1716 1900+$t[5],$t[4],$t[3],$t[2],$t[1],$t[0];
1718 my $type = $build_type;
1719 if ($type =~ /useconfig/) {
1720 $type = "useconfig";
1723 my $dir = "$machine-$test_type-$type-$result-$date";
1725 $dir = "$basedir/$dir";
1729 dodie "can't create $dir";
1733 "config" => $output_config,
1734 "buildlog" => $buildlog,
1736 "testlog" => $testlog,
1739 while (my ($name, $source) = each(%files)) {
1741 cp "$source", "$dir/$name" or
1742 dodie "failed to copy $source";
1746 doprint "*** Saved info to $dir ***\n";
1751 if ($die_on_failure) {
1759 # no need to reboot for just building.
1760 if (!do_not_reboot) {
1761 doprint "REBOOTING\n";
1762 reboot_to_good $sleep_time;
1767 if (defined($test_name)) {
1768 $name = " ($test_name)";
1773 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
1774 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
1775 doprint "KTEST RESULT: TEST $i$name Failed: ", @_, "\n";
1776 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
1777 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
1779 if (defined($store_failures)) {
1780 save_logs "fail", $store_failures;
1783 if (defined($post_test)) {
1784 run_command $post_test;
1791 my ($command, $redirect, $timeout) = @_;
1798 my $command_orig = $command;
1800 $command =~ s/\$SSH_USER/$ssh_user/g;
1801 $command =~ s/\$MACHINE/$machine/g;
1803 doprint("$command ... ");
1806 $pid = open(CMD, "$command 2>&1 |") or
1807 (fail "unable to exec $command" and return 0);
1809 if (defined($opt{"LOG_FILE"})) {
1813 if (defined($redirect)) {
1814 if ($redirect eq 1) {
1816 # Have the output of the command on its own line
1819 open (RD, ">$redirect") or
1820 dodie "failed to write to redirect $redirect";
1825 my $hit_timeout = 0;
1829 if (defined($timeout)) {
1830 doprint "timeout = $timeout\n";
1832 my $line = wait_for_input($fp, $timeout);
1833 if (!defined($line)) {
1835 if (defined($timeout) && (($now - $start_time) >= $timeout)) {
1836 doprint "Hit timeout of $timeout, killing process\n";
1842 print LOG $line if ($dolog);
1843 print RD $line if ($dord);
1844 print $line if ($dostdout);
1848 # shift 8 for real exit status
1849 $run_command_status = $? >> 8;
1851 if ($command_orig eq $default{REBOOT} &&
1852 $run_command_status == $reboot_return_code) {
1853 $run_command_status = 0;
1857 close(RD) if ($dord);
1860 my $delta = $end_time - $start_time;
1863 doprint "[1 second] ";
1865 doprint "[$delta seconds] ";
1869 $run_command_status = 1;
1872 if ($run_command_status) {
1873 doprint "FAILED!\n";
1875 doprint "SUCCESS\n";
1878 return !$run_command_status;
1882 my ($cmd, $timeout) = @_;
1883 my $cp_exec = $ssh_exec;
1885 $cp_exec =~ s/\$SSH_COMMAND/$cmd/g;
1886 return run_command "$cp_exec", undef , $timeout;
1890 my ($src, $dst, $cp_scp) = @_;
1892 $cp_scp =~ s/\$SRC_FILE/$src/g;
1893 $cp_scp =~ s/\$DST_FILE/$dst/g;
1895 return run_command "$cp_scp";
1898 sub run_scp_install {
1899 my ($src, $dst) = @_;
1901 my $cp_scp = $scp_to_target_install;
1903 return run_scp($src, $dst, $cp_scp);
1907 my ($src, $dst) = @_;
1909 my $cp_scp = $scp_to_target;
1911 return run_scp($src, $dst, $cp_scp);
1914 sub _get_grub_index {
1916 my ($command, $target, $skip) = @_;
1918 return if (defined($grub_number) && defined($last_grub_menu) &&
1919 $last_grub_menu eq $grub_menu && defined($last_machine) &&
1920 $last_machine eq $machine);
1922 doprint "Find $reboot_type menu ... ";
1925 my $ssh_grub = $ssh_exec;
1926 $ssh_grub =~ s,\$SSH_COMMAND,$command,g;
1928 open(IN, "$ssh_grub |")
1929 or dodie "unable to execute $command";
1944 dodie "Could not find '$grub_menu' through $command on $machine"
1946 doprint "$grub_number\n";
1947 $last_grub_menu = $grub_menu;
1948 $last_machine = $machine;
1951 sub get_grub_index {
1958 if ($reboot_type !~ /^grub/) {
1962 $grub_menu_qt = quotemeta($grub_menu);
1964 if ($reboot_type eq "grub") {
1965 $command = "cat /boot/grub/menu.lst";
1966 $target = '^\s*title\s+' . $grub_menu_qt . '\s*$';
1967 $skip = '^\s*title\s';
1968 } elsif ($reboot_type eq "grub2") {
1969 $command = "cat $grub_file";
1970 $target = '^menuentry.*' . $grub_menu_qt;
1971 $skip = '^menuentry\s|^submenu\s';
1972 } elsif ($reboot_type eq "grub2bls") {
1973 $command = $grub_bls_get;
1974 $target = '^title=.*' . $grub_menu_qt;
1980 _get_grub_index($command, $target, $skip);
1985 my ($fp, $time) = @_;
1994 if (!defined($time)) {
1999 vec($rin, fileno($fp), 1) = 1;
2000 vec($rin, fileno(\*STDIN), 1) = 1;
2005 $nr = select($rout=$rin, undef, undef, $time);
2009 # copy data from stdin to the console
2010 if (vec($rout, fileno(\*STDIN), 1) == 1) {
2011 $nr = sysread(\*STDIN, $buf, 1000);
2012 syswrite($fp, $buf, $nr) if ($nr > 0);
2015 # The timeout is based on time waiting for the fp data
2016 if (vec($rout, fileno($fp), 1) != 1) {
2017 last if (defined($time) && (time - $start_time > $time));
2023 # try to read one char at a time
2024 while (sysread $fp, $ch, 1) {
2026 last if ($ch eq "\n");
2029 last if (!length($line));
2037 if (defined($switch_to_test)) {
2038 run_command $switch_to_test;
2041 if ($reboot_type eq "grub") {
2042 run_ssh "'(echo \"savedefault --default=$grub_number --once\" | grub --batch)'";
2043 } elsif ($reboot_type eq "grub2") {
2044 run_ssh "$grub_reboot $grub_number";
2045 } elsif ($reboot_type eq "syslinux") {
2046 run_ssh "$syslinux --once \\\"$syslinux_label\\\" $syslinux_path";
2047 } elsif (defined $reboot_script) {
2048 run_command "$reboot_script";
2056 doprint "git rev-list --max-count=1 $commit ... ";
2057 my $sha1 = `git rev-list --max-count=1 $commit`;
2064 dodie "Failed to get git $commit";
2077 my $bug_ignored = 0;
2078 my $skip_call_trace = 0;
2081 my $start_time = time;
2088 open(DMESG, "> $dmesg") or
2089 dodie "unable to write to $dmesg";
2095 my $monitor_start = time;
2097 my $version_found = 0;
2101 if ($bug && defined($stop_after_failure) &&
2102 $stop_after_failure >= 0) {
2103 my $time = $stop_after_failure - (time - $failure_start);
2104 $line = wait_for_input($monitor_fp, $time);
2105 if (!defined($line)) {
2106 doprint "bug timed out after $booted_timeout seconds\n";
2107 doprint "Test forced to stop after $stop_after_failure seconds after failure\n";
2111 $line = wait_for_input($monitor_fp, $booted_timeout);
2112 if (!defined($line)) {
2113 my $s = $booted_timeout == 1 ? "" : "s";
2114 doprint "Successful boot found: break after $booted_timeout second$s\n";
2118 $line = wait_for_input($monitor_fp);
2119 if (!defined($line)) {
2120 my $s = $timeout == 1 ? "" : "s";
2121 doprint "Timed out after $timeout second$s\n";
2129 # we are not guaranteed to get a full line
2130 $full_line .= $line;
2132 if ($full_line =~ /$success_line/) {
2134 $success_start = time;
2137 if ($booted && defined($stop_after_success) &&
2138 $stop_after_success >= 0) {
2140 if ($now - $success_start >= $stop_after_success) {
2141 doprint "Test forced to stop after $stop_after_success seconds after success\n";
2146 if ($full_line =~ /\[ backtrace testing \]/) {
2147 $skip_call_trace = 1;
2150 if ($full_line =~ /call trace:/i) {
2151 if (!$bug && !$skip_call_trace) {
2152 if ($ignore_errors) {
2156 $failure_start = time;
2161 if ($bug && defined($stop_after_failure) &&
2162 $stop_after_failure >= 0) {
2164 if ($now - $failure_start >= $stop_after_failure) {
2165 doprint "Test forced to stop after $stop_after_failure seconds after failure\n";
2170 if ($full_line =~ /\[ end of backtrace testing \]/) {
2171 $skip_call_trace = 0;
2174 if ($full_line =~ /Kernel panic -/) {
2175 $failure_start = time;
2179 # Detect triple faults by testing the banner
2180 if ($full_line =~ /\bLinux version (\S+).*\n/) {
2181 if ($1 eq $version) {
2183 } elsif ($version_found && $detect_triplefault) {
2184 # We already booted into the kernel we are testing,
2185 # but now we booted into another kernel?
2186 # Consider this a triple fault.
2187 doprint "Already booted in Linux kernel $version, but now\n";
2188 doprint "we booted into Linux kernel $1.\n";
2189 doprint "Assuming that this is a triple fault.\n";
2190 doprint "To disable this: set DETECT_TRIPLE_FAULT to 0\n";
2195 if ($line =~ /\n/) {
2199 if ($stop_test_after > 0 && !$booted && !$bug) {
2200 if (time - $monitor_start > $stop_test_after) {
2201 doprint "STOP_TEST_AFTER ($stop_test_after seconds) timed out\n";
2207 my $end_time = time;
2208 $reboot_time = $end_time - $start_time;
2213 return 0 if ($in_bisect);
2214 fail "failed - got a bug report" and return 0;
2218 return 0 if ($in_bisect);
2219 fail "failed - never got a boot prompt." and return 0;
2223 doprint "WARNING: Call Trace detected but ignored due to IGNORE_ERRORS=1\n";
2229 sub eval_kernel_version {
2232 $option =~ s/\$KERNEL_VERSION/$version/g;
2237 sub do_post_install {
2239 return if (!defined($post_install));
2241 my $cp_post_install = eval_kernel_version $post_install;
2242 run_command "$cp_post_install" or
2243 dodie "Failed to run post install";
2246 # Sometimes the reboot fails, and will hang. We try to ssh to the box
2247 # and if we fail, we force another reboot, that should powercycle it.
2249 if (!run_ssh "echo testing connection") {
2256 return if ($no_install);
2258 my $start_time = time;
2260 if (defined($pre_install)) {
2261 my $cp_pre_install = eval_kernel_version $pre_install;
2262 run_command "$cp_pre_install" or
2263 dodie "Failed to run pre install";
2266 my $cp_target = eval_kernel_version $target_image;
2270 run_scp_install "$outputdir/$build_target", "$cp_target" or
2271 dodie "failed to copy image";
2273 my $install_mods = 0;
2275 # should we process modules?
2277 open(IN, "$output_config") or dodie("Can't read config file");
2279 if (/CONFIG_MODULES(=y)?/) {
2288 if (!$install_mods) {
2290 doprint "No modules needed\n";
2291 my $end_time = time;
2292 $install_time = $end_time - $start_time;
2296 run_command "$make INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH=$tmpdir modules_install" or
2297 dodie "Failed to install modules";
2299 my $modlib = "/lib/modules/$version";
2300 my $modtar = "ktest-mods.tar.bz2";
2302 run_ssh "rm -rf $modlib" or
2303 dodie "failed to remove old mods: $modlib";
2305 # would be nice if scp -r did not follow symbolic links
2306 run_command "cd $tmpdir && tar -cjf $modtar lib/modules/$version" or
2307 dodie "making tarball";
2309 run_scp_mod "$tmpdir/$modtar", "/tmp" or
2310 dodie "failed to copy modules";
2312 unlink "$tmpdir/$modtar";
2314 run_ssh "'(cd / && tar xjf /tmp/$modtar)'" or
2315 dodie "failed to tar modules";
2317 run_ssh "rm -f /tmp/$modtar";
2321 my $end_time = time;
2322 $install_time = $end_time - $start_time;
2326 # get the release name
2327 return if ($have_version);
2328 doprint "$make kernelrelease ... ";
2329 $version = `$make -s kernelrelease | tail -1`;
2331 doprint "$version\n";
2335 sub start_monitor_and_install {
2336 # Make sure the stable kernel has finished booting
2338 # Install bisects, don't need console
2339 if (defined $console) {
2349 start_monitor if (defined $console);
2353 my $check_build_re = ".*:.*(warning|error|Error):.*";
2354 my $utf8_quote = "\\x{e2}\\x{80}(\\x{98}|\\x{99})";
2356 sub process_warning_line {
2361 # for distcc heterogeneous systems, some compilers
2362 # do things differently causing warning lines
2363 # to be slightly different. This makes an attempt
2364 # to fixe those issues.
2366 # chop off the index into the line
2367 # using distcc, some compilers give different indexes
2368 # depending on white space
2369 $line =~ s/^(\s*\S+:\d+:)\d+/$1/;
2371 # Some compilers use UTF-8 extended for quotes and some don't.
2372 $line =~ s/$utf8_quote/'/g;
2377 # Read buildlog and check against warnings file for any
2382 sub check_buildlog {
2383 return 1 if (!defined $warnings_file);
2387 # Failed builds should not reboot the target
2388 my $save_no_reboot = $no_reboot;
2391 if (-f $warnings_file) {
2392 open(IN, $warnings_file) or
2393 dodie "Error opening $warnings_file";
2396 if (/$check_build_re/) {
2397 my $warning = process_warning_line $_;
2399 $warnings_list{$warning} = 1;
2405 # If warnings file didn't exist, and WARNINGS_FILE exist,
2406 # then we fail on any warning!
2408 open(IN, $buildlog) or dodie "Can't open $buildlog";
2410 if (/$check_build_re/) {
2411 my $warning = process_warning_line $_;
2413 if (!defined $warnings_list{$warning}) {
2414 fail "New warning found (not in $warnings_file)\n$_\n";
2415 $no_reboot = $save_no_reboot;
2420 $no_reboot = $save_no_reboot;
2424 sub check_patch_buildlog {
2427 my @files = `git show $patch | diffstat -l`;
2429 foreach my $file (@files) {
2433 open(IN, "git show $patch |") or
2434 dodie "failed to show $patch";
2436 if (m,^--- a/(.*),) {
2438 $files[$#files] = $1;
2443 open(IN, $buildlog) or dodie "Can't open $buildlog";
2445 if (/^\s*(.*?):.*(warning|error)/) {
2447 foreach my $file (@files) {
2448 my $fullpath = "$builddir/$file";
2449 if ($file eq $err || $fullpath eq $err) {
2450 fail "$file built with warnings" and return 0;
2460 sub apply_min_config {
2461 my $outconfig = "$output_config.new";
2463 # Read the config file and remove anything that
2464 # is in the force_config hash (from minconfig and others)
2465 # then add the force config back.
2467 doprint "Applying minimum configurations into $output_config.new\n";
2469 open (OUT, ">$outconfig") or
2470 dodie "Can't create $outconfig";
2472 if (-f $output_config) {
2473 open (IN, $output_config) or
2474 dodie "Failed to open $output_config";
2476 if (/^(# )?(CONFIG_[^\s=]*)/) {
2477 next if (defined($force_config{$2}));
2483 foreach my $config (keys %force_config) {
2484 print OUT "$force_config{$config}\n";
2488 run_command "mv $outconfig $output_config";
2491 sub make_oldconfig {
2493 my @force_list = keys %force_config;
2495 if ($#force_list >= 0) {
2499 if (!run_command "$make olddefconfig") {
2500 # Perhaps olddefconfig doesn't exist in this version of the kernel
2502 doprint "olddefconfig failed, trying make oldnoconfig\n";
2503 if (!run_command "$make oldnoconfig") {
2504 doprint "oldnoconfig failed, trying yes '' | make oldconfig\n";
2505 # try a yes '' | oldconfig
2506 run_command "yes '' | $make oldconfig" or
2507 dodie "failed make config oldconfig";
2512 # read a config file and use this to force new configs.
2513 sub load_force_config {
2516 doprint "Loading force configs from $config\n";
2517 open(IN, $config) or
2518 dodie "failed to read $config";
2521 if (/^(CONFIG[^\s=]*)(\s*=.*)/) {
2522 $force_config{$1} = $_;
2523 } elsif (/^# (CONFIG_\S*) is not set/) {
2524 $force_config{$1} = $_;
2535 my $start_time = time;
2537 # Failed builds should not reboot the target
2538 my $save_no_reboot = $no_reboot;
2541 # Calculate a new version from here.
2544 if (defined($pre_build)) {
2545 my $ret = run_command $pre_build;
2546 if (!$ret && defined($pre_build_die) &&
2548 dodie "failed to pre_build\n";
2552 if ($type =~ /^useconfig:(.*)/) {
2553 run_command "cp $1 $output_config" or
2554 dodie "could not copy $1 to .config";
2556 $type = "oldconfig";
2559 # old config can ask questions
2560 if ($type eq "oldconfig") {
2561 $type = "olddefconfig";
2563 # allow for empty configs
2564 run_command "touch $output_config";
2567 run_command "mv $output_config $outputdir/config_temp" or
2568 dodie "moving .config";
2570 run_command "$make mrproper" or dodie "make mrproper";
2572 run_command "mv $outputdir/config_temp $output_config" or
2573 dodie "moving config_temp";
2576 } elsif (!$noclean) {
2577 unlink "$output_config";
2578 run_command "$make mrproper" or
2579 dodie "make mrproper";
2582 # add something to distinguish this build
2583 open(OUT, "> $outputdir/localversion") or dodie("Can't make localversion file");
2584 print OUT "$localversion\n";
2587 if (defined($minconfig)) {
2588 load_force_config($minconfig);
2591 if ($type ne "olddefconfig") {
2592 run_command "$make $type" or
2593 dodie "failed make config";
2595 # Run old config regardless, to enforce min configurations
2598 my $build_ret = run_command "$make $build_options", $buildlog;
2600 if (defined($post_build)) {
2601 # Because a post build may change the kernel version
2604 my $ret = run_command $post_build;
2605 if (!$ret && defined($post_build_die) &&
2607 dodie "failed to post_build\n";
2612 # bisect may need this to pass
2614 $no_reboot = $save_no_reboot;
2617 fail "failed build" and return 0;
2620 $no_reboot = $save_no_reboot;
2622 my $end_time = time;
2623 $build_time = $end_time - $start_time;
2629 if (!run_ssh "halt" or defined($power_off)) {
2630 if (defined($poweroff_after_halt)) {
2631 sleep $poweroff_after_halt;
2632 run_command "$power_off";
2636 run_command "$power_off";
2647 if (defined($test_name)) {
2648 $name = " ($test_name)";
2653 doprint "\n\n*******************************************\n";
2654 doprint "*******************************************\n";
2655 doprint "KTEST RESULT: TEST $i$name SUCCESS!!!! **\n";
2656 doprint "*******************************************\n";
2657 doprint "*******************************************\n";
2659 if (defined($store_successes)) {
2660 save_logs "success", $store_successes;
2663 if ($i != $opt{"NUM_TESTS"} && !do_not_reboot) {
2664 doprint "Reboot and wait $sleep_time seconds\n";
2665 reboot_to_good $sleep_time;
2668 if (defined($post_test)) {
2669 run_command $post_test;
2675 doprint "Pass, fail, or skip? [p/f/s]";
2678 if ($ans eq "p" || $ans eq "P") {
2680 } elsif ($ans eq "f" || $ans eq "F") {
2682 } elsif ($ans eq "s" || $ans eq "S") {
2685 print "Please answer 'p', 'f', or 's'\n";
2690 sub child_run_test {
2692 # child should have no power
2693 $reboot_on_error = 0;
2694 $poweroff_on_error = 0;
2695 $die_on_failure = 1;
2697 run_command $run_test, $testlog;
2699 exit $run_command_status;
2704 sub child_finished {
2714 my $bug_ignored = 0;
2716 my $start_time = time;
2720 doprint "run test $run_test\n";
2724 $SIG{CHLD} = qw(child_finished);
2728 child_run_test if (!$child_pid);
2733 $line = wait_for_input($monitor_fp, 1);
2734 if (defined($line)) {
2736 # we are not guaranteed to get a full line
2737 $full_line .= $line;
2740 if ($full_line =~ /call trace:/i) {
2741 if ($ignore_errors) {
2748 if ($full_line =~ /Kernel panic -/) {
2752 if ($line =~ /\n/) {
2756 } while (!$child_done && !$bug);
2758 if (!$bug && $bug_ignored) {
2759 doprint "WARNING: Call Trace detected but ignored due to IGNORE_ERRORS=1\n";
2763 my $failure_start = time;
2766 $line = wait_for_input($monitor_fp, 1);
2767 if (defined($line)) {
2771 if ($now - $failure_start >= $stop_after_failure) {
2774 } while (defined($line));
2776 doprint "Detected kernel crash!\n";
2777 # kill the child with extreme prejudice
2781 waitpid $child_pid, 0;
2782 $child_exit = $? >> 8;
2784 my $end_time = time;
2785 $test_time = $end_time - $start_time;
2787 if (!$bug && $in_bisect) {
2788 if (defined($bisect_ret_good)) {
2789 if ($child_exit == $bisect_ret_good) {
2793 if (defined($bisect_ret_skip)) {
2794 if ($child_exit == $bisect_ret_skip) {
2798 if (defined($bisect_ret_abort)) {
2799 if ($child_exit == $bisect_ret_abort) {
2800 fail "test abort" and return -2;
2803 if (defined($bisect_ret_bad)) {
2804 if ($child_exit == $bisect_ret_skip) {
2808 if (defined($bisect_ret_default)) {
2809 if ($bisect_ret_default eq "good") {
2811 } elsif ($bisect_ret_default eq "bad") {
2813 } elsif ($bisect_ret_default eq "skip") {
2815 } elsif ($bisect_ret_default eq "abort") {
2818 fail "unknown default action: $bisect_ret_default"
2824 if ($bug || $child_exit) {
2825 return 0 if $in_bisect;
2826 fail "test failed" and return 0;
2831 sub run_git_bisect {
2834 doprint "$command ... ";
2836 my $output = `$command 2>&1`;
2843 dodie "Failed to git bisect";
2846 doprint "SUCCESS\n";
2847 if ($output =~ m/^(Bisecting: .*\(roughly \d+ steps?\))\s+\[([[:xdigit:]]+)\]/) {
2848 doprint "$1 [$2]\n";
2849 } elsif ($output =~ m/^([[:xdigit:]]+) is the first bad commit/) {
2850 $bisect_bad_commit = $1;
2851 doprint "Found bad commit... $1\n";
2854 # we already logged it, just print it now.
2862 doprint "Reboot and sleep $bisect_sleep_time seconds\n";
2863 reboot_to_good $bisect_sleep_time;
2866 # returns 1 on success, 0 on failure, -1 on skip
2867 sub run_bisect_test {
2868 my ($type, $buildtype) = @_;
2877 build $buildtype or $failed = 1;
2879 if ($type ne "build") {
2880 if ($failed && $bisect_skip) {
2884 dodie "Failed on build" if $failed;
2887 start_monitor_and_install or $failed = 1;
2889 if ($type ne "boot") {
2890 if ($failed && $bisect_skip) {
2896 dodie "Failed on boot" if $failed;
2898 do_run_test or $failed = 1;
2909 # reboot the box to a kernel we can ssh to
2910 if ($type ne "build") {
2920 my $buildtype = "oldconfig";
2922 # We should have a minconfig to use?
2923 if (defined($minconfig)) {
2924 $buildtype = "useconfig:$minconfig";
2927 # If the user sets bisect_tries to less than 1, then no tries
2931 # Still let the user manually decide that though.
2932 if ($bisect_tries < 1 && $bisect_manual) {
2933 $ret = answer_bisect;
2936 for (my $i = 0; $i < $bisect_tries; $i++) {
2937 if ($bisect_tries > 1) {
2939 doprint("Running bisect trial $t of $bisect_tries:\n");
2941 $ret = run_bisect_test $type, $buildtype;
2943 if ($bisect_manual) {
2944 $ret = answer_bisect;
2950 # Are we looking for where it worked, not failed?
2951 if ($reverse_bisect && $ret >= 0) {
2957 } elsif ($ret == 0) {
2959 } elsif ($bisect_skip) {
2960 doprint "HIT A BAD COMMIT ... SKIPPING\n";
2965 sub update_bisect_replay {
2966 my $tmp_log = "$tmpdir/ktest_bisect_log";
2967 run_command "git bisect log > $tmp_log" or
2968 dodie "can't create bisect log";
2977 dodie "BISECT_GOOD[$i] not defined\n" if (!defined($bisect_good));
2978 dodie "BISECT_BAD[$i] not defined\n" if (!defined($bisect_bad));
2979 dodie "BISECT_TYPE[$i] not defined\n" if (!defined($bisect_type));
2981 my $good = $bisect_good;
2982 my $bad = $bisect_bad;
2983 my $type = $bisect_type;
2984 my $start = $bisect_start;
2985 my $replay = $bisect_replay;
2986 my $start_files = $bisect_files;
2988 if (defined($start_files)) {
2989 $start_files = " -- " . $start_files;
2994 # convert to true sha1's
2995 $good = get_sha1($good);
2996 $bad = get_sha1($bad);
2998 if (defined($bisect_reverse) && $bisect_reverse == 1) {
2999 doprint "Performing a reverse bisect (bad is good, good is bad!)\n";
3000 $reverse_bisect = 1;
3002 $reverse_bisect = 0;
3005 # Can't have a test without having a test to run
3006 if ($type eq "test" && !defined($run_test)) {
3010 # Check if a bisect was running
3011 my $bisect_start_file = "$builddir/.git/BISECT_START";
3013 my $check = $bisect_check;
3014 my $do_check = defined($check) && $check ne "0";
3016 if ( -f $bisect_start_file ) {
3017 print "Bisect in progress found\n";
3019 print " If you say yes, then no checks of good or bad will be done\n";
3021 if (defined($replay)) {
3022 print "** BISECT_REPLAY is defined in config file **";
3023 print " Ignore config option and perform new git bisect log?\n";
3024 if (read_ync " (yes, no, or cancel) ") {
3025 $replay = update_bisect_replay;
3028 } elsif (read_yn "read git log and continue?") {
3029 $replay = update_bisect_replay;
3037 my $head = get_sha1("HEAD");
3039 if ($check ne "good") {
3040 doprint "TESTING BISECT BAD [$bad]\n";
3041 run_command "git checkout $bad" or
3042 dodie "Failed to checkout $bad";
3044 $result = run_bisect $type;
3046 if ($result ne "bad") {
3047 fail "Tested BISECT_BAD [$bad] and it succeeded" and return 0;
3051 if ($check ne "bad") {
3052 doprint "TESTING BISECT GOOD [$good]\n";
3053 run_command "git checkout $good" or
3054 dodie "Failed to checkout $good";
3056 $result = run_bisect $type;
3058 if ($result ne "good") {
3059 fail "Tested BISECT_GOOD [$good] and it failed" and return 0;
3063 # checkout where we started
3064 run_command "git checkout $head" or
3065 dodie "Failed to checkout $head";
3068 run_command "git bisect start$start_files" or
3069 dodie "could not start bisect";
3071 if (defined($replay)) {
3072 run_command "git bisect replay $replay" or
3073 dodie "failed to run replay";
3076 run_command "git bisect good $good" or
3077 dodie "could not set bisect good to $good";
3079 run_git_bisect "git bisect bad $bad" or
3080 dodie "could not set bisect bad to $bad";
3084 if (defined($start)) {
3085 run_command "git checkout $start" or
3086 dodie "failed to checkout $start";
3091 $result = run_bisect $type;
3092 $test = run_git_bisect "git bisect $result";
3096 run_command "git bisect log" or
3097 dodie "could not capture git bisect log";
3099 run_command "git bisect reset" or
3100 dodie "could not reset git bisect";
3102 doprint "Bad commit was [$bisect_bad_commit]\n";
3107 # config_ignore holds the configs that were set (or unset) for
3108 # a good config and we will ignore these configs for the rest
3109 # of a config bisect. These configs stay as they were.
3112 # config_set holds what all configs were set as.
3115 # config_off holds the set of configs that the bad config had disabled.
3116 # We need to record them and set them in the .config when running
3117 # olddefconfig, because olddefconfig keeps the defaults.
3120 # config_off_tmp holds a set of configs to turn off for now
3123 # config_list is the set of configs that are being tested
3129 sub assign_configs {
3130 my ($hash, $config) = @_;
3132 doprint "Reading configs from $config\n";
3135 or dodie "Failed to read $config";
3139 if (/^((CONFIG\S*)=.*)/) {
3141 } elsif (/^(# (CONFIG\S*) is not set)/) {
3149 sub process_config_ignore {
3152 assign_configs \%config_ignore, $config;
3155 sub get_dependencies {
3158 my $arr = $dependency{$config};
3159 if (!defined($arr)) {
3165 foreach my $dep (@{$arr}) {
3166 print "ADD DEP $dep\n";
3167 @deps = (@deps, get_dependencies $dep);
3174 my ($pc, $file) = @_;
3176 my %configs = %{$pc};
3178 doprint "Saving configs into $file\n";
3180 open(OUT, ">$file") or dodie "Can not write to $file";
3182 foreach my $config (keys %configs) {
3183 print OUT "$configs{$config}\n";
3189 my ($name, $pc) = @_;
3191 doprint "Creating old config from $name configs\n";
3193 save_config $pc, $output_config;
3198 sub run_config_bisect_test {
3201 my $ret = run_bisect_test $type, "oldconfig";
3203 if ($bisect_manual) {
3204 $ret = answer_bisect;
3210 sub config_bisect_end {
3211 my ($good, $bad) = @_;
3212 my $diffexec = "diff -u";
3214 if (-f "$builddir/scripts/diffconfig") {
3215 $diffexec = "$builddir/scripts/diffconfig";
3217 doprint "\n\n***************************************\n";
3218 doprint "No more config bisecting possible.\n";
3219 run_command "$diffexec $good $bad", 1;
3220 doprint "***************************************\n\n";
3225 sub run_config_bisect {
3226 my ($good, $bad, $last_result) = @_;
3231 if (!length($last_result)) {
3234 run_command "$config_bisect_exec $reset -b $outputdir $good $bad $last_result", 1;
3236 # config-bisect returns:
3237 # 0 if there is more to bisect
3238 # 1 for finding a good config
3239 # 2 if it can not find any more configs
3241 if ($run_command_status) {
3242 return $run_command_status;
3245 $ret = run_config_bisect_test $config_bisect_type;
3247 doprint "NEW GOOD CONFIG ($pass)\n";
3248 system("cp $output_config $tmpdir/good_config.tmp.$pass");
3250 # Return 3 for good config
3253 doprint "NEW BAD CONFIG ($pass)\n";
3254 system("cp $output_config $tmpdir/bad_config.tmp.$pass");
3256 # Return 4 for bad config
3267 my $type = $config_bisect_type;
3270 $bad_config = $config_bisect;
3272 if (defined($config_bisect_good)) {
3273 $good_config = $config_bisect_good;
3274 } elsif (defined($minconfig)) {
3275 $good_config = $minconfig;
3277 doprint "No config specified, checking if defconfig works";
3278 $ret = run_bisect_test $type, "defconfig";
3280 fail "Have no good config to compare with, please set CONFIG_BISECT_GOOD";
3283 $good_config = $output_config;
3286 if (!defined($config_bisect_exec)) {
3287 # First check the location that ktest.pl ran
3288 my @locations = ( "$pwd/config-bisect.pl",
3289 "$dirname/config-bisect.pl",
3290 "$builddir/tools/testing/ktest/config-bisect.pl",
3292 foreach my $loc (@locations) {
3293 doprint "loc = $loc\n";
3294 $config_bisect_exec = $loc;
3295 last if (defined($config_bisect_exec && -x $config_bisect_exec));
3297 if (!defined($config_bisect_exec)) {
3298 fail "Could not find an executable config-bisect.pl\n",
3299 " Set CONFIG_BISECT_EXEC to point to config-bisect.pl";
3304 # we don't want min configs to cause issues here.
3305 doprint "Disabling 'MIN_CONFIG' for this test\n";
3312 if (-f "$tmpdir/good_config.tmp" || -f "$tmpdir/bad_config.tmp") {
3313 if (read_yn "Interrupted config-bisect. Continue (n - will start new)?") {
3314 if (-f "$tmpdir/good_config.tmp") {
3315 $good_config = "$tmpdir/good_config.tmp";
3317 $good_config = "$tmpdir/good_config";
3319 if (-f "$tmpdir/bad_config.tmp") {
3320 $bad_config = "$tmpdir/bad_config.tmp";
3322 $bad_config = "$tmpdir/bad_config";
3326 doprint "Run good configs through make oldconfig\n";
3327 assign_configs \%tmp_configs, $good_config;
3328 create_config "$good_config", \%tmp_configs;
3329 $good_config = "$tmpdir/good_config";
3330 system("cp $output_config $good_config") == 0 or dodie "cp good config";
3332 doprint "Run bad configs through make oldconfig\n";
3333 assign_configs \%tmp_configs, $bad_config;
3334 create_config "$bad_config", \%tmp_configs;
3335 $bad_config = "$tmpdir/bad_config";
3336 system("cp $output_config $bad_config") == 0 or dodie "cp bad config";
3338 if (defined($config_bisect_check) && $config_bisect_check ne "0") {
3339 if ($config_bisect_check ne "good") {
3340 doprint "Testing bad config\n";
3342 $ret = run_bisect_test $type, "useconfig:$bad_config";
3344 fail "Bad config succeeded when expected to fail!";
3348 if ($config_bisect_check ne "bad") {
3349 doprint "Testing good config\n";
3351 $ret = run_bisect_test $type, "useconfig:$good_config";
3353 fail "Good config failed when expected to succeed!";
3362 $ret = run_config_bisect $good_config, $bad_config, $last_run;
3365 } elsif ($ret == 4) {
3369 } while ($ret == 3 || $ret == 4);
3372 config_bisect_end "$good_config.tmp", "$bad_config.tmp";
3375 return $ret if ($ret < 0);
3380 sub patchcheck_reboot {
3381 doprint "Reboot and sleep $patchcheck_sleep_time seconds\n";
3382 reboot_to_good $patchcheck_sleep_time;
3388 dodie "PATCHCHECK_START[$i] not defined\n"
3389 if (!defined($patchcheck_start));
3390 dodie "PATCHCHECK_TYPE[$i] not defined\n"
3391 if (!defined($patchcheck_type));
3393 my $start = $patchcheck_start;
3395 my $cherry = $patchcheck_cherry;
3396 if (!defined($cherry)) {
3401 if (defined($patchcheck_end)) {
3402 $end = $patchcheck_end;
3404 dodie "PATCHCHECK_END must be defined with PATCHCHECK_CHERRY\n";
3407 # Get the true sha1's since we can use things like HEAD~3
3408 $start = get_sha1($start);
3409 $end = get_sha1($end);
3411 my $type = $patchcheck_type;
3413 # Can't have a test without having a test to run
3414 if ($type eq "test" && !defined($run_test)) {
3419 open (IN, "git cherry -v $start $end|") or
3420 dodie "could not get git list";
3422 open (IN, "git log --pretty=oneline $end|") or
3423 dodie "could not get git list";
3430 # git cherry adds a '+' we want to remove
3432 $list[$#list+1] = $_;
3433 last if (/^$start/);
3438 if ($list[$#list] !~ /^$start/) {
3439 fail "SHA1 $start not found";
3442 # go backwards in the list
3443 @list = reverse @list;
3446 doprint("Going to test the following commits:\n");
3447 foreach my $l (@list) {
3451 my $save_clean = $noclean;
3452 my %ignored_warnings;
3454 if (defined($ignore_warnings)) {
3455 foreach my $sha1 (split /\s+/, $ignore_warnings) {
3456 $ignored_warnings{$sha1} = 1;
3461 foreach my $item (@list) {
3463 $sha1 =~ s/^([[:xdigit:]]+).*/$1/;
3465 doprint "\nProcessing commit \"$item\"\n\n";
3467 run_command "git checkout $sha1" or
3468 dodie "Failed to checkout $sha1";
3470 # only clean on the first and last patch
3471 if ($item eq $list[0] ||
3472 $item eq $list[$#list]) {
3473 $noclean = $save_clean;
3478 if (defined($minconfig)) {
3479 build "useconfig:$minconfig" or return 0;
3481 # ?? no config to use?
3482 build "oldconfig" or return 0;
3485 # No need to do per patch checking if warnings file exists
3486 if (!defined($warnings_file) && !defined($ignored_warnings{$sha1})) {
3487 check_patch_buildlog $sha1 or return 0;
3490 check_buildlog or return 0;
3492 next if ($type eq "build");
3496 start_monitor_and_install or $failed = 1;
3498 if (!$failed && $type ne "boot"){
3499 do_run_test or $failed = 1;
3524 # $config depends on $dep
3525 my ($config, $dep) = @_;
3527 if (defined($depends{$config})) {
3528 $depends{$config} .= " " . $dep;
3530 $depends{$config} = $dep;
3533 # record the number of configs depending on $dep
3534 if (defined $depcount{$dep}) {
3537 $depcount{$dep} = 1;
3541 # taken from streamline_config.pl
3553 if (! -f $kconfig) {
3554 doprint "file $kconfig does not exist, skipping\n";
3558 open(KIN, "$kconfig")
3559 or dodie "Can't open $kconfig";
3563 # Make sure that lines ending with \ continue
3565 $_ = $line . " " . $_;
3576 # collect any Kconfig sources
3577 if (/^source\s*"(.*)"/) {
3578 $kconfigs[$#kconfigs+1] = $1;
3582 if (/^\s*(menu)?config\s+(\S+)\s*$/) {
3586 for (my $i = 0; $i < $iflevel; $i++) {
3587 add_dep $config, $ifdeps[$i];
3590 # collect the depends for the config
3591 } elsif ($state eq "NEW" && /^\s*depends\s+on\s+(.*)$/) {
3593 add_dep $config, $1;
3595 # Get the configs that select this config
3596 } elsif ($state eq "NEW" && /^\s*select\s+(\S+)/) {
3598 # selected by depends on config
3599 add_dep $1, $config;
3601 # Check for if statements
3602 } elsif (/^if\s+(.*\S)\s*$/) {
3604 # remove beginning and ending non text
3605 $deps =~ s/^[^a-zA-Z0-9_]*//;
3606 $deps =~ s/[^a-zA-Z0-9_]*$//;
3608 my @deps = split /[^a-zA-Z0-9_]+/, $deps;
3610 $ifdeps[$iflevel++] = join ':', @deps;
3612 } elsif (/^endif/) {
3614 $iflevel-- if ($iflevel);
3617 } elsif (/^\s*help\s*$/) {
3623 # read in any configs that were found.
3624 foreach $kconfig (@kconfigs) {
3625 if (!defined($read_kconfigs{$kconfig})) {
3626 $read_kconfigs{$kconfig} = 1;
3627 read_kconfig("$builddir/$kconfig");
3633 # find out which arch this is by the kconfig file
3634 open (IN, $output_config)
3635 or dodie "Failed to read $output_config";
3638 if (m,Linux/(\S+)\s+\S+\s+Kernel Configuration,) {
3645 if (!defined($arch)) {
3646 doprint "Could not find arch from config file\n";
3647 doprint "no dependencies used\n";
3651 # arch is really the subarch, we need to know
3652 # what directory to look at.
3653 if ($arch eq "i386" || $arch eq "x86_64") {
3657 my $kconfig = "$builddir/arch/$arch/Kconfig";
3659 if (! -f $kconfig && $arch =~ /\d$/) {
3661 # some subarchs have numbers, truncate them
3663 $kconfig = "$builddir/arch/$arch/Kconfig";
3664 if (! -f $kconfig) {
3665 doprint "No idea what arch dir $orig is for\n";
3666 doprint "no dependencies used\n";
3671 read_kconfig($kconfig);
3674 sub make_new_config {
3677 open (OUT, ">$output_config")
3678 or dodie "Failed to write $output_config";
3680 foreach my $config (@configs) {
3681 print OUT "$config\n";
3689 $config =~ s/CONFIG_//;
3697 my $kconfig = chomp_config $dep;
3699 $dep = $depends{"$kconfig"};
3701 # the dep string we have saves the dependencies as they
3702 # were found, including expressions like ! && ||. We
3703 # want to split this out into just an array of configs.
3705 my $valid = "A-Za-z_0-9";
3709 while ($dep =~ /[$valid]/) {
3711 if ($dep =~ /^[^$valid]*([$valid]+)/) {
3712 my $conf = "CONFIG_" . $1;
3714 $configs[$#configs + 1] = $conf;
3716 $dep =~ s/^[^$valid]*[$valid]+//;
3718 dodie "this should never happen";
3728 my %processed_configs;
3729 my %nochange_config;
3731 sub test_this_config {
3736 # if we already processed this config, skip it
3737 if (defined($processed_configs{$config})) {
3740 $processed_configs{$config} = 1;
3742 # if this config failed during this round, skip it
3743 if (defined($nochange_config{$config})) {
3747 my $kconfig = chomp_config $config;
3749 # Test dependencies first
3750 if (defined($depends{"$kconfig"})) {
3751 my @parents = get_depends $config;
3752 foreach my $parent (@parents) {
3753 # if the parent is in the min config, check it first
3754 next if (!defined($min_configs{$parent}));
3755 $found = test_this_config($parent);
3756 if (defined($found)) {
3762 # Remove this config from the list of configs
3763 # do a make olddefconfig and then read the resulting
3764 # .config to make sure it is missing the config that
3766 my %configs = %min_configs;
3767 delete $configs{$config};
3768 make_new_config ((values %configs), (values %keep_configs));
3771 assign_configs \%configs, $output_config;
3773 if (!defined($configs{$config}) || $configs{$config} =~ /^#/) {
3777 doprint "disabling config $config did not change .config\n";
3779 $nochange_config{$config} = 1;
3784 sub make_min_config {
3787 my $type = $minconfig_type;
3788 if ($type ne "boot" && $type ne "test") {
3789 fail "Invalid MIN_CONFIG_TYPE '$minconfig_type'\n" .
3790 " make_min_config works only with 'boot' and 'test'\n" and return;
3793 if (!defined($output_minconfig)) {
3794 fail "OUTPUT_MIN_CONFIG not defined" and return;
3797 # If output_minconfig exists, and the start_minconfig
3798 # came from min_config, than ask if we should use
3800 if (-f $output_minconfig && !$start_minconfig_defined) {
3801 print "$output_minconfig exists\n";
3802 if (!defined($use_output_minconfig)) {
3803 if (read_yn " Use it as minconfig?") {
3804 $start_minconfig = $output_minconfig;
3806 } elsif ($use_output_minconfig > 0) {
3807 doprint "Using $output_minconfig as MIN_CONFIG\n";
3808 $start_minconfig = $output_minconfig;
3810 doprint "Set to still use MIN_CONFIG as starting point\n";
3814 if (!defined($start_minconfig)) {
3815 fail "START_MIN_CONFIG or MIN_CONFIG not defined" and return;
3818 my $temp_config = "$tmpdir/temp_config";
3820 # First things first. We build an allnoconfig to find
3821 # out what the defaults are that we can't touch.
3822 # Some are selections, but we really can't handle selections.
3824 my $save_minconfig = $minconfig;
3827 run_command "$make allnoconfig" or return 0;
3831 process_config_ignore $output_config;
3833 undef %save_configs;
3836 if (defined($ignore_config)) {
3837 # make sure the file exists
3838 `touch $ignore_config`;
3839 assign_configs \%save_configs, $ignore_config;
3842 %keep_configs = %save_configs;
3844 doprint "Load initial configs from $start_minconfig\n";
3846 # Look at the current min configs, and save off all the
3847 # ones that were set via the allnoconfig
3848 assign_configs \%min_configs, $start_minconfig;
3850 my @config_keys = keys %min_configs;
3852 # All configs need a depcount
3853 foreach my $config (@config_keys) {
3854 my $kconfig = chomp_config $config;
3855 if (!defined $depcount{$kconfig}) {
3856 $depcount{$kconfig} = 0;
3860 # Remove anything that was set by the make allnoconfig
3861 # we shouldn't need them as they get set for us anyway.
3862 foreach my $config (@config_keys) {
3863 # Remove anything in the ignore_config
3864 if (defined($keep_configs{$config})) {
3865 my $file = $ignore_config;
3866 $file =~ s,.*/(.*?)$,$1,;
3867 doprint "$config set by $file ... ignored\n";
3868 delete $min_configs{$config};
3871 # But make sure the settings are the same. If a min config
3872 # sets a selection, we do not want to get rid of it if
3873 # it is not the same as what we have. Just move it into
3875 if (defined($config_ignore{$config})) {
3876 if ($config_ignore{$config} ne $min_configs{$config}) {
3877 doprint "$config is in allnoconfig as '$config_ignore{$config}'";
3878 doprint " but it is '$min_configs{$config}' in minconfig .. keeping\n";
3879 $keep_configs{$config} = $min_configs{$config};
3881 doprint "$config set by allnoconfig ... ignored\n";
3883 delete $min_configs{$config};
3895 # Now disable each config one by one and do a make oldconfig
3896 # till we find a config that changes our list.
3898 my @test_configs = keys %min_configs;
3900 # Sort keys by who is most dependent on
3901 @test_configs = sort { $depcount{chomp_config($b)} <=> $depcount{chomp_config($a)} }
3904 # Put configs that did not modify the config at the end.
3906 for (my $i = 0; $i < $#test_configs; $i++) {
3907 if (!defined($nochange_config{$test_configs[0]})) {
3911 # This config didn't change the .config last time.
3912 # Place it at the end
3913 my $config = shift @test_configs;
3914 push @test_configs, $config;
3917 # if every test config has failed to modify the .config file
3918 # in the past, then reset and start over.
3920 undef %nochange_config;
3923 undef %processed_configs;
3925 foreach my $config (@test_configs) {
3927 $found = test_this_config $config;
3929 last if (defined($found));
3931 # oh well, try another config
3934 if (!defined($found)) {
3935 # we could have failed due to the nochange_config hash
3936 # reset and try again
3938 undef %nochange_config;
3942 doprint "No more configs found that we can disable\n";
3950 doprint "Test with $config disabled\n";
3952 # set in_bisect to keep build and monitor from dieing
3956 build "oldconfig" or $failed = 1;
3958 start_monitor_and_install or $failed = 1;
3960 if ($type eq "test" && !$failed) {
3961 do_run_test or $failed = 1;
3970 doprint "$min_configs{$config} is needed to boot the box... keeping\n";
3971 # this config is needed, add it to the ignore list.
3972 $keep_configs{$config} = $min_configs{$config};
3973 $save_configs{$config} = $min_configs{$config};
3974 delete $min_configs{$config};
3976 # update new ignore configs
3977 if (defined($ignore_config)) {
3978 open (OUT, ">$temp_config")
3979 or dodie "Can't write to $temp_config";
3980 foreach my $config (keys %save_configs) {
3981 print OUT "$save_configs{$config}\n";
3984 run_command "mv $temp_config $ignore_config" or
3985 dodie "failed to copy update to $ignore_config";
3989 # We booted without this config, remove it from the minconfigs.
3990 doprint "$config is not needed, disabling\n";
3992 delete $min_configs{$config};
3994 # Also disable anything that is not enabled in this config
3996 assign_configs \%configs, $output_config;
3997 my @config_keys = keys %min_configs;
3998 foreach my $config (@config_keys) {
3999 if (!defined($configs{$config})) {
4000 doprint "$config is not set, disabling\n";
4001 delete $min_configs{$config};
4005 # Save off all the current mandatory configs
4006 open (OUT, ">$temp_config")
4007 or dodie "Can't write to $temp_config";
4008 foreach my $config (keys %keep_configs) {
4009 print OUT "$keep_configs{$config}\n";
4011 foreach my $config (keys %min_configs) {
4012 print OUT "$min_configs{$config}\n";
4016 run_command "mv $temp_config $output_minconfig" or
4017 dodie "failed to copy update to $output_minconfig";
4020 doprint "Reboot and wait $sleep_time seconds\n";
4021 reboot_to_good $sleep_time;
4028 sub make_warnings_file {
4031 if (!defined($warnings_file)) {
4032 dodie "Must define WARNINGS_FILE for make_warnings_file test";
4035 if ($build_type eq "nobuild") {
4036 dodie "BUILD_TYPE can not be 'nobuild' for make_warnings_file test";
4039 build $build_type or dodie "Failed to build";
4041 open(OUT, ">$warnings_file") or dodie "Can't create $warnings_file";
4043 open(IN, $buildlog) or dodie "Can't open $buildlog";
4046 # Some compilers use UTF-8 extended for quotes
4047 # for distcc heterogeneous systems, this causes issues
4050 if (/$check_build_re/) {
4061 $#ARGV < 1 or die "ktest.pl version: $VERSION\n usage: ktest.pl [config-file]\n";
4064 $ktest_config = $ARGV[0];
4065 if (! -f $ktest_config) {
4066 print "$ktest_config does not exist.\n";
4067 if (!read_yn "Create it?") {
4073 if (! -f $ktest_config) {
4076 open(OUT, ">$ktest_config") or die "Can not create $ktest_config";
4078 # Generated by ktest.pl
4081 # PWD is a ktest.pl variable that will result in the process working
4082 # directory that ktest.pl is executed in.
4084 # THIS_DIR is automatically assigned the PWD of the path that generated
4085 # the config file. It is best to use this variable when assigning other
4086 # directory paths within this directory. This allows you to easily
4087 # move the test cases to other locations or to other machines.
4089 THIS_DIR := $variable{"PWD"}
4091 # Define each test with TEST_START
4092 # The config options below it will override the defaults
4094 TEST_TYPE = $default{"TEST_TYPE"}
4101 read_config $ktest_config;
4103 if (defined($opt{"LOG_FILE"})) {
4104 $opt{"LOG_FILE"} = eval_option("LOG_FILE", $opt{"LOG_FILE"}, -1);
4107 # Append any configs entered in manually to the config file.
4108 my @new_configs = keys %entered_configs;
4109 if ($#new_configs >= 0) {
4110 print "\nAppending entered in configs to $ktest_config\n";
4111 open(OUT, ">>$ktest_config") or die "Can not append to $ktest_config";
4112 foreach my $config (@new_configs) {
4113 print OUT "$config = $entered_configs{$config}\n";
4114 $opt{$config} = process_variables($entered_configs{$config});
4118 if (defined($opt{"LOG_FILE"})) {
4119 if ($opt{"CLEAR_LOG"}) {
4120 unlink $opt{"LOG_FILE"};
4122 open(LOG, ">> $opt{LOG_FILE}") or die "Can't write to $opt{LOG_FILE}";
4126 doprint "\n\nSTARTING AUTOMATED TESTS\n\n";
4128 for (my $i = 0, my $repeat = 1; $i <= $opt{"NUM_TESTS"}; $i += $repeat) {
4131 doprint "DEFAULT OPTIONS:\n";
4133 doprint "\nTEST $i OPTIONS";
4134 if (defined($repeat_tests{$i})) {
4135 $repeat = $repeat_tests{$i};
4136 doprint " ITERATE $repeat";
4141 foreach my $option (sort keys %opt) {
4143 if ($option =~ /\[(\d+)\]$/) {
4149 doprint "$option = $opt{$option}\n";
4153 sub option_defined {
4156 if (defined($opt{$option}) && $opt{$option} !~ /^\s*$/) {
4163 sub __set_test_option {
4164 my ($name, $i) = @_;
4166 my $option = "$name\[$i\]";
4168 if (option_defined($option)) {
4169 return $opt{$option};
4172 foreach my $test (keys %repeat_tests) {
4174 $i < $test + $repeat_tests{$test}) {
4175 $option = "$name\[$test\]";
4176 if (option_defined($option)) {
4177 return $opt{$option};
4182 if (option_defined($name)) {
4189 sub set_test_option {
4190 my ($name, $i) = @_;
4192 my $option = __set_test_option($name, $i);
4193 return $option if (!defined($option));
4195 return eval_option($name, $option, $i);
4201 my @paths = split /:/, $ENV{PATH};
4203 # sendmail is usually in /usr/sbin
4204 $paths[$#paths + 1] = "/usr/sbin";
4206 foreach my $path (@paths) {
4207 if (-x "$path/$mailer") {
4216 my ($subject, $message, $file) = @_;
4218 if (!defined($mail_path)) {
4220 $mail_path = find_mailer $mailer;
4221 if (!defined($mail_path)) {
4222 die "\nCan not find $mailer in PATH\n";
4226 my $header_file = "$tmpdir/header";
4227 open (HEAD, ">$header_file") or die "Can not create $header_file\n";
4228 print HEAD "To: $mailto\n";
4229 print HEAD "Subject: $subject\n\n";
4230 print HEAD "$message\n";
4233 if (!defined($mail_command)) {
4234 if ($mailer eq "mail" || $mailer eq "mailx") {
4235 $mail_command = "cat \$HEADER_FILE \$BODY_FILE | \$MAIL_PATH/\$MAILER -s \'\$SUBJECT\' \$MAILTO";
4236 } elsif ($mailer eq "sendmail" ) {
4237 $mail_command = "cat \$HEADER_FILE \$BODY_FILE | \$MAIL_PATH/\$MAILER -t \$MAILTO";
4239 die "\nYour mailer: $mailer is not supported.\n";
4243 if (defined($file)) {
4244 $mail_command =~ s/\$BODY_FILE/$file/g;
4246 $mail_command =~ s/\$BODY_FILE//g;
4249 $mail_command =~ s/\$HEADER_FILE/$header_file/g;
4250 $mail_command =~ s/\$MAILER/$mailer/g;
4251 $mail_command =~ s/\$MAIL_PATH/$mail_path/g;
4252 $mail_command =~ s/\$MAILTO/$mailto/g;
4253 $mail_command =~ s/\$SUBJECT/$subject/g;
4254 $mail_command =~ s/\$MESSAGE/$message/g;
4256 run_command $mail_command;
4261 if (defined($mailto)) {
4262 if (!defined($mailer)) {
4263 doprint "No email sent: email or mailer not specified in config.\n";
4271 if ($email_when_canceled) {
4272 my $name = get_test_name;
4273 send_email("KTEST: Your [$name] test was cancelled",
4274 "Your test started at $script_start_time was cancelled: sig int");
4276 die "\nCaught Sig Int, test interrupted: $!\n"
4279 $SIG{INT} = qw(cancel_test);
4281 # First we need to do is the builds
4282 for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {
4284 # Do not reboot on failing test options
4286 $reboot_success = 0;
4297 undef %force_config;
4299 my $makecmd = set_test_option("MAKE_CMD", $i);
4301 $outputdir = set_test_option("OUTPUT_DIR", $i);
4302 $builddir = set_test_option("BUILD_DIR", $i);
4304 chdir $builddir || dodie "can't change directory to $builddir";
4306 if (!-d $outputdir) {
4307 mkpath($outputdir) or
4308 dodie "can't create $outputdir";
4311 $make = "$makecmd O=$outputdir";
4313 # Load all the options into their mapped variable names
4314 foreach my $opt (keys %option_map) {
4315 ${$option_map{$opt}} = set_test_option($opt, $i);
4318 $start_minconfig_defined = 1;
4320 # The first test may override the PRE_KTEST option
4322 if (defined($pre_ktest)) {
4324 run_command $pre_ktest;
4326 if ($email_when_started) {
4327 my $name = get_test_name;
4328 send_email("KTEST: Your [$name] test was started",
4329 "Your test was started on $script_start_time");
4333 # Any test can override the POST_KTEST option
4334 # The last test takes precedence.
4335 if (defined($post_ktest)) {
4336 $final_post_ktest = $post_ktest;
4339 if (!defined($start_minconfig)) {
4340 $start_minconfig_defined = 0;
4341 $start_minconfig = $minconfig;
4346 dodie "can't create $tmpdir";
4349 $ENV{"SSH_USER"} = $ssh_user;
4350 $ENV{"MACHINE"} = $machine;
4352 $buildlog = "$tmpdir/buildlog-$machine";
4353 $testlog = "$tmpdir/testlog-$machine";
4354 $dmesg = "$tmpdir/dmesg-$machine";
4355 $output_config = "$outputdir/.config";
4358 $target = "$ssh_user\@$machine";
4359 if (($reboot_type eq "grub") or ($reboot_type eq "grub2bls")) {
4360 dodie "GRUB_MENU not defined" if (!defined($grub_menu));
4361 } elsif ($reboot_type eq "grub2") {
4362 dodie "GRUB_MENU not defined" if (!defined($grub_menu));
4363 dodie "GRUB_FILE not defined" if (!defined($grub_file));
4364 } elsif ($reboot_type eq "syslinux") {
4365 dodie "SYSLINUX_LABEL not defined" if (!defined($syslinux_label));
4369 my $run_type = $build_type;
4370 if ($test_type eq "patchcheck") {
4371 $run_type = $patchcheck_type;
4372 } elsif ($test_type eq "bisect") {
4373 $run_type = $bisect_type;
4374 } elsif ($test_type eq "config_bisect") {
4375 $run_type = $config_bisect_type;
4376 } elsif ($test_type eq "make_min_config") {
4378 } elsif ($test_type eq "make_warnings_file") {
4382 # mistake in config file?
4383 if (!defined($run_type)) {
4384 $run_type = "ERROR";
4388 $installme = " no_install" if ($no_install);
4392 if (defined($test_name)) {
4393 $name = " ($test_name)";
4398 if (defined($opt{"LOG_FILE"})) {
4399 $test_log_start = tell(LOG);
4402 doprint "RUNNING TEST $i of $opt{NUM_TESTS}$name with option $test_type $run_type$installme\n\n";
4404 if (defined($pre_test)) {
4405 my $ret = run_command $pre_test;
4406 if (!$ret && defined($pre_test_die) &&
4408 dodie "failed to pre_test\n";
4416 if (defined($addconfig)) {
4417 my $min = $minconfig;
4418 if (!defined($minconfig)) {
4421 run_command "cat $addconfig $min > $tmpdir/add_config" or
4422 dodie "Failed to create temp config";
4423 $minconfig = "$tmpdir/add_config";
4426 if (defined($checkout)) {
4427 run_command "git checkout $checkout" or
4428 dodie "failed to checkout $checkout";
4433 # A test may opt to not reboot the box
4434 if ($reboot_on_success) {
4435 $reboot_success = 1;
4438 if ($test_type eq "bisect") {
4441 } elsif ($test_type eq "config_bisect") {
4444 } elsif ($test_type eq "patchcheck") {
4447 } elsif ($test_type eq "make_min_config") {
4450 } elsif ($test_type eq "make_warnings_file") {
4452 make_warnings_file $i;
4456 if ($build_type ne "nobuild") {
4457 build $build_type or next;
4458 check_buildlog or next;
4461 if ($test_type eq "install") {
4468 if ($test_type ne "build") {
4470 start_monitor_and_install or $failed = 1;
4472 if (!$failed && $test_type ne "boot" && defined($run_test)) {
4473 do_run_test or $failed = 1;
4487 if (defined($final_post_ktest)) {
4489 my $cp_final_post_ktest = eval_kernel_version $final_post_ktest;
4490 run_command $cp_final_post_ktest;
4493 if ($opt{"POWEROFF_ON_SUCCESS"}) {
4495 } elsif ($opt{"REBOOT_ON_SUCCESS"} && !do_not_reboot && $reboot_success) {
4497 } elsif (defined($switch_to_good)) {
4498 # still need to get to the good kernel
4499 run_command $switch_to_good;
4503 doprint "\n $successes of $opt{NUM_TESTS} tests were successful\n\n";
4505 if ($email_when_finished) {
4506 send_email("KTEST: Your test has finished!",
4507 "$successes of $opt{NUM_TESTS} tests started at $script_start_time were successful!");
4510 if (defined($opt{"LOG_FILE"})) {
4511 print "\n See $opt{LOG_FILE} for the record of results.\n\n";