3 # Copyright 2010 - Steven Rostedt <srostedt@redhat.com>, Red Hat Inc.
4 # Licensed under the terms of the GNU GPL License version 2
9 use Fcntl qw(F_GETFL F_SETFL O_NONBLOCK);
10 use File::Path qw(mkpath);
11 use File::Copy qw(cp);
26 "TEST_TYPE" => "build",
27 "BUILD_TYPE" => "randconfig",
29 "CLOSE_CONSOLE_SIGNAL" => "INT",
31 "TMP_DIR" => "/tmp/ktest/\${MACHINE}",
32 "SLEEP_TIME" => 60, # sleep time between tests
34 "REBOOT_ON_ERROR" => 0,
35 "POWEROFF_ON_ERROR" => 0,
36 "REBOOT_ON_SUCCESS" => 1,
37 "POWEROFF_ON_SUCCESS" => 0,
38 "BUILD_OPTIONS" => "",
39 "BISECT_SLEEP_TIME" => 60, # sleep time between bisects
40 "PATCHCHECK_SLEEP_TIME" => 60, # sleep time between patch checks
45 "MIN_CONFIG_TYPE" => "boot",
46 "SUCCESS_LINE" => "login:",
47 "DETECT_TRIPLE_FAULT" => 1,
49 "BOOTED_TIMEOUT" => 1,
50 "DIE_ON_FAILURE" => 1,
51 "SSH_EXEC" => "ssh \$SSH_USER\@\$MACHINE \$SSH_COMMAND",
52 "SCP_TO_TARGET" => "scp \$SRC_FILE \$SSH_USER\@\$MACHINE:\$DST_FILE",
53 "SCP_TO_TARGET_INSTALL" => "\${SCP_TO_TARGET}",
54 "REBOOT" => "ssh \$SSH_USER\@\$MACHINE reboot",
55 "STOP_AFTER_SUCCESS" => 10,
56 "STOP_AFTER_FAILURE" => 60,
57 "STOP_TEST_AFTER" => 600,
58 "MAX_MONITOR_WAIT" => 1800,
59 "GRUB_REBOOT" => "grub2-reboot",
60 "SYSLINUX" => "extlinux",
61 "SYSLINUX_PATH" => "/boot/extlinux",
63 # required, and we will ask users if they don't have them but we keep the default
64 # value something that is common.
65 "REBOOT_TYPE" => "grub",
66 "LOCALVERSION" => "-test",
68 "BUILD_TARGET" => "arch/x86/boot/bzImage",
69 "TARGET_IMAGE" => "/boot/vmlinuz-test",
75 my $ktest_config = "ktest.conf";
104 my $poweroff_on_error;
105 my $reboot_on_success;
107 my $powercycle_after_reboot;
108 my $poweroff_after_halt;
109 my $max_monitor_wait;
112 my $scp_to_target_install;
130 my $start_minconfig_defined;
131 my $output_minconfig;
133 my $use_output_minconfig;
139 my $bisect_bad_commit = "";
144 my $config_bisect_good;
148 my $bisect_ret_abort;
149 my $bisect_ret_default;
150 my $in_patchcheck = 0;
159 my $bisect_sleep_time;
160 my $patchcheck_sleep_time;
167 my $detect_triplefault;
169 my $close_console_signal;
170 my $reboot_success_line;
172 my $stop_after_success;
173 my $stop_after_failure;
182 my $run_command_status = 0;
194 my $config_bisect_type;
195 my $config_bisect_check;
198 my $patchcheck_start;
199 my $patchcheck_cherry;
207 # set when a test is something other that just building or install
208 # which would require more options.
211 # tell build not to worry about warnings, even when WARNINGS_FILE is set
214 # set when creating a new config
221 # force_config is the list of configs that we force enabled (or disabled)
222 # in a .config file. The MIN_CONFIG and ADD_CONFIG configs.
225 # do not force reboots on config problems
229 my $reboot_success = 0;
232 "MACHINE" => \$machine,
233 "SSH_USER" => \$ssh_user,
234 "TMP_DIR" => \$tmpdir,
235 "OUTPUT_DIR" => \$outputdir,
236 "BUILD_DIR" => \$builddir,
237 "TEST_TYPE" => \$test_type,
238 "PRE_KTEST" => \$pre_ktest,
239 "POST_KTEST" => \$post_ktest,
240 "PRE_TEST" => \$pre_test,
241 "POST_TEST" => \$post_test,
242 "BUILD_TYPE" => \$build_type,
243 "BUILD_OPTIONS" => \$build_options,
244 "PRE_BUILD" => \$pre_build,
245 "POST_BUILD" => \$post_build,
246 "PRE_BUILD_DIE" => \$pre_build_die,
247 "POST_BUILD_DIE" => \$post_build_die,
248 "POWER_CYCLE" => \$power_cycle,
249 "REBOOT" => \$reboot,
250 "BUILD_NOCLEAN" => \$noclean,
251 "MIN_CONFIG" => \$minconfig,
252 "OUTPUT_MIN_CONFIG" => \$output_minconfig,
253 "START_MIN_CONFIG" => \$start_minconfig,
254 "MIN_CONFIG_TYPE" => \$minconfig_type,
255 "USE_OUTPUT_MIN_CONFIG" => \$use_output_minconfig,
256 "WARNINGS_FILE" => \$warnings_file,
257 "IGNORE_CONFIG" => \$ignore_config,
258 "TEST" => \$run_test,
259 "ADD_CONFIG" => \$addconfig,
260 "REBOOT_TYPE" => \$reboot_type,
261 "GRUB_MENU" => \$grub_menu,
262 "GRUB_FILE" => \$grub_file,
263 "GRUB_REBOOT" => \$grub_reboot,
264 "SYSLINUX" => \$syslinux,
265 "SYSLINUX_PATH" => \$syslinux_path,
266 "SYSLINUX_LABEL" => \$syslinux_label,
267 "PRE_INSTALL" => \$pre_install,
268 "POST_INSTALL" => \$post_install,
269 "NO_INSTALL" => \$no_install,
270 "REBOOT_SCRIPT" => \$reboot_script,
271 "REBOOT_ON_ERROR" => \$reboot_on_error,
272 "SWITCH_TO_GOOD" => \$switch_to_good,
273 "SWITCH_TO_TEST" => \$switch_to_test,
274 "POWEROFF_ON_ERROR" => \$poweroff_on_error,
275 "REBOOT_ON_SUCCESS" => \$reboot_on_success,
276 "DIE_ON_FAILURE" => \$die_on_failure,
277 "POWER_OFF" => \$power_off,
278 "POWERCYCLE_AFTER_REBOOT" => \$powercycle_after_reboot,
279 "POWEROFF_AFTER_HALT" => \$poweroff_after_halt,
280 "MAX_MONITOR_WAIT" => \$max_monitor_wait,
281 "SLEEP_TIME" => \$sleep_time,
282 "BISECT_SLEEP_TIME" => \$bisect_sleep_time,
283 "PATCHCHECK_SLEEP_TIME" => \$patchcheck_sleep_time,
284 "IGNORE_WARNINGS" => \$ignore_warnings,
285 "IGNORE_ERRORS" => \$ignore_errors,
286 "BISECT_MANUAL" => \$bisect_manual,
287 "BISECT_SKIP" => \$bisect_skip,
288 "BISECT_TRIES" => \$bisect_tries,
289 "CONFIG_BISECT_GOOD" => \$config_bisect_good,
290 "BISECT_RET_GOOD" => \$bisect_ret_good,
291 "BISECT_RET_BAD" => \$bisect_ret_bad,
292 "BISECT_RET_SKIP" => \$bisect_ret_skip,
293 "BISECT_RET_ABORT" => \$bisect_ret_abort,
294 "BISECT_RET_DEFAULT" => \$bisect_ret_default,
295 "STORE_FAILURES" => \$store_failures,
296 "STORE_SUCCESSES" => \$store_successes,
297 "TEST_NAME" => \$test_name,
298 "TIMEOUT" => \$timeout,
299 "BOOTED_TIMEOUT" => \$booted_timeout,
300 "CONSOLE" => \$console,
301 "CLOSE_CONSOLE_SIGNAL" => \$close_console_signal,
302 "DETECT_TRIPLE_FAULT" => \$detect_triplefault,
303 "SUCCESS_LINE" => \$success_line,
304 "REBOOT_SUCCESS_LINE" => \$reboot_success_line,
305 "STOP_AFTER_SUCCESS" => \$stop_after_success,
306 "STOP_AFTER_FAILURE" => \$stop_after_failure,
307 "STOP_TEST_AFTER" => \$stop_test_after,
308 "BUILD_TARGET" => \$build_target,
309 "SSH_EXEC" => \$ssh_exec,
310 "SCP_TO_TARGET" => \$scp_to_target,
311 "SCP_TO_TARGET_INSTALL" => \$scp_to_target_install,
312 "CHECKOUT" => \$checkout,
313 "TARGET_IMAGE" => \$target_image,
314 "LOCALVERSION" => \$localversion,
316 "BISECT_GOOD" => \$bisect_good,
317 "BISECT_BAD" => \$bisect_bad,
318 "BISECT_TYPE" => \$bisect_type,
319 "BISECT_START" => \$bisect_start,
320 "BISECT_REPLAY" => \$bisect_replay,
321 "BISECT_FILES" => \$bisect_files,
322 "BISECT_REVERSE" => \$bisect_reverse,
323 "BISECT_CHECK" => \$bisect_check,
325 "CONFIG_BISECT" => \$config_bisect,
326 "CONFIG_BISECT_TYPE" => \$config_bisect_type,
327 "CONFIG_BISECT_CHECK" => \$config_bisect_check,
329 "PATCHCHECK_TYPE" => \$patchcheck_type,
330 "PATCHCHECK_START" => \$patchcheck_start,
331 "PATCHCHECK_CHERRY" => \$patchcheck_cherry,
332 "PATCHCHECK_END" => \$patchcheck_end,
335 # Options may be used by other options, record them.
338 # default variables that can be used
339 chomp ($variable{"PWD"} = `pwd`);
341 $config_help{"MACHINE"} = << "EOF"
342 The machine hostname that you will test.
343 For build only tests, it is still needed to differentiate log files.
346 $config_help{"SSH_USER"} = << "EOF"
347 The box is expected to have ssh on normal bootup, provide the user
348 (most likely root, since you need privileged operations)
351 $config_help{"BUILD_DIR"} = << "EOF"
352 The directory that contains the Linux source code (full path).
353 You can use \${PWD} that will be the path where ktest.pl is run, or use
354 \${THIS_DIR} which is assigned \${PWD} but may be changed later.
357 $config_help{"OUTPUT_DIR"} = << "EOF"
358 The directory that the objects will be built (full path).
359 (can not be same as BUILD_DIR)
360 You can use \${PWD} that will be the path where ktest.pl is run, or use
361 \${THIS_DIR} which is assigned \${PWD} but may be changed later.
364 $config_help{"BUILD_TARGET"} = << "EOF"
365 The location of the compiled file to copy to the target.
366 (relative to OUTPUT_DIR)
369 $config_help{"BUILD_OPTIONS"} = << "EOF"
370 Options to add to \"make\" when building.
374 $config_help{"TARGET_IMAGE"} = << "EOF"
375 The place to put your image on the test machine.
378 $config_help{"POWER_CYCLE"} = << "EOF"
379 A script or command to reboot the box.
381 Here is a digital loggers power switch example
382 POWER_CYCLE = wget --no-proxy -O /dev/null -q --auth-no-challenge 'http://admin:admin\@power/outlet?5=CCL'
384 Here is an example to reboot a virtual box on the current host
385 with the name "Guest".
386 POWER_CYCLE = virsh destroy Guest; sleep 5; virsh start Guest
389 $config_help{"CONSOLE"} = << "EOF"
390 The script or command that reads the console
392 If you use ttywatch server, something like the following would work.
393 CONSOLE = nc -d localhost 3001
395 For a virtual machine with guest name "Guest".
396 CONSOLE = virsh console Guest
399 $config_help{"LOCALVERSION"} = << "EOF"
400 Required version ending to differentiate the test
401 from other linux builds on the system.
404 $config_help{"REBOOT_TYPE"} = << "EOF"
405 Way to reboot the box to the test kernel.
406 Only valid options so far are "grub", "grub2", "syslinux", and "script".
408 If you specify grub, it will assume grub version 1
409 and will search in /boot/grub/menu.lst for the title \$GRUB_MENU
410 and select that target to reboot to the kernel. If this is not
411 your setup, then specify "script" and have a command or script
412 specified in REBOOT_SCRIPT to boot to the target.
414 The entry in /boot/grub/menu.lst must be entered in manually.
415 The test will not modify that file.
417 If you specify grub2, then you also need to specify both \$GRUB_MENU
420 If you specify syslinux, then you may use SYSLINUX to define the syslinux
421 command (defaults to extlinux), and SYSLINUX_PATH to specify the path to
422 the syslinux install (defaults to /boot/extlinux). But you have to specify
423 SYSLINUX_LABEL to define the label to boot to for the test kernel.
426 $config_help{"GRUB_MENU"} = << "EOF"
427 The grub title name for the test kernel to boot
428 (Only mandatory if REBOOT_TYPE = grub or grub2)
430 Note, ktest.pl will not update the grub menu.lst, you need to
431 manually add an option for the test. ktest.pl will search
432 the grub menu.lst for this option to find what kernel to
435 For example, if in the /boot/grub/menu.lst the test kernel title has:
438 GRUB_MENU = Test Kernel
440 For grub2, a search of \$GRUB_FILE is performed for the lines
441 that begin with "menuentry". It will not detect submenus. The
442 menu must be a non-nested menu. Add the quotes used in the menu
443 to guarantee your selection, as the first menuentry with the content
444 of \$GRUB_MENU that is found will be used.
447 $config_help{"GRUB_FILE"} = << "EOF"
448 If grub2 is used, the full path for the grub.cfg file is placed
449 here. Use something like /boot/grub2/grub.cfg to search.
452 $config_help{"SYSLINUX_LABEL"} = << "EOF"
453 If syslinux is used, the label that boots the target kernel must
454 be specified with SYSLINUX_LABEL.
457 $config_help{"REBOOT_SCRIPT"} = << "EOF"
458 A script to reboot the target into the test kernel
459 (Only mandatory if REBOOT_TYPE = script)
464 if (defined($opt{"LOG_FILE"})) {
465 open(OUT, ">> $opt{LOG_FILE}") or die "Can't write to $opt{LOG_FILE}";
472 if (defined($opt{"LOG_FILE"})) {
485 my ($cancel, $prompt) = @_;
491 print "$prompt [y/n/C] ";
493 print "$prompt [Y/n] ";
497 if ($ans =~ /^\s*$/) {
504 last if ($ans =~ /^y$/i || $ans =~ /^n$/i);
506 last if ($ans =~ /^c$/i);
507 print "Please answer either 'y', 'n' or 'c'.\n";
509 print "Please answer either 'y' or 'n'.\n";
515 if ($ans !~ /^y$/i) {
524 return read_prompt 0, $prompt;
530 return read_prompt 1, $prompt;
533 sub get_mandatory_config {
537 return if (defined($opt{$config}));
539 if (defined($config_help{$config})) {
541 print $config_help{$config};
546 if (defined($default{$config}) && length($default{$config})) {
547 print "\[$default{$config}\] ";
550 $ans =~ s/^\s*(.*\S)\s*$/$1/;
551 if ($ans =~ /^\s*$/) {
552 if ($default{$config}) {
553 $ans = $default{$config};
555 print "Your answer can not be blank\n";
559 $entered_configs{$config} = ${ans};
571 $hours = int($time / 3600);
572 $time -= $hours * 3600;
575 $minutes = int($time / 60);
576 $time -= $minutes * 60;
580 doprint "$hours hour";
581 doprint "s" if ($hours > 1);
586 doprint "$minutes minute";
587 doprint "s" if ($minutes > 1);
591 doprint "$time second";
592 doprint "s" if ($time != 1);
598 doprint "Build time: ";
599 show_time($build_time);
603 doprint "Install time: ";
604 show_time($install_time);
608 doprint "Reboot time: ";
609 show_time($reboot_time);
613 doprint "Test time: ";
614 show_time($test_time);
617 # reset for iterations like bisect
624 sub get_mandatory_configs {
625 get_mandatory_config("MACHINE");
626 get_mandatory_config("BUILD_DIR");
627 get_mandatory_config("OUTPUT_DIR");
630 get_mandatory_config("BUILD_OPTIONS");
633 # options required for other than just building a kernel
635 get_mandatory_config("POWER_CYCLE");
636 get_mandatory_config("CONSOLE");
639 # options required for install and more
640 if ($buildonly != 1) {
641 get_mandatory_config("SSH_USER");
642 get_mandatory_config("BUILD_TARGET");
643 get_mandatory_config("TARGET_IMAGE");
646 get_mandatory_config("LOCALVERSION");
648 return if ($buildonly);
650 my $rtype = $opt{"REBOOT_TYPE"};
652 if (!defined($rtype)) {
653 if (!defined($opt{"GRUB_MENU"})) {
654 get_mandatory_config("REBOOT_TYPE");
655 $rtype = $entered_configs{"REBOOT_TYPE"};
661 if ($rtype eq "grub") {
662 get_mandatory_config("GRUB_MENU");
665 if ($rtype eq "grub2") {
666 get_mandatory_config("GRUB_MENU");
667 get_mandatory_config("GRUB_FILE");
670 if ($rtype eq "syslinux") {
671 get_mandatory_config("SYSLINUX_LABEL");
675 sub process_variables {
676 my ($value, $remove_undef) = @_;
679 # We want to check for '\', and it is just easier
680 # to check the previous characet of '$' and not need
681 # to worry if '$' is the first character. By adding
682 # a space to $value, we can just check [^\\]\$ and
683 # it will still work.
686 while ($value =~ /(.*?[^\\])\$\{(.*?)\}(.*)/) {
690 # append beginning of value to retval
691 $retval = "$retval$begin";
692 if (defined($variable{$var})) {
693 $retval = "$retval$variable{$var}";
694 } elsif (defined($remove_undef) && $remove_undef) {
695 # for if statements, any variable that is not defined,
696 # we simple convert to 0
697 $retval = "${retval}0";
699 # put back the origin piece.
700 $retval = "$retval\$\{$var\}";
701 # This could be an option that is used later, save
702 # it so we don't warn if this option is not one of
704 $used_options{$var} = 1;
708 $retval = "$retval$value";
710 # remove the space added in the beginning
717 my ($lvalue, $rvalue, $override, $overrides, $name) = @_;
719 my $prvalue = process_variables($rvalue);
721 if ($buildonly && $lvalue =~ /^TEST_TYPE(\[.*\])?$/ && $prvalue ne "build") {
722 # Note if a test is something other than build, then we
723 # will need other mandatory options.
724 if ($prvalue ne "install") {
725 # for bisect, we need to check BISECT_TYPE
726 if ($prvalue ne "bisect") {
730 # install still limits some mandatory options.
735 if ($buildonly && $lvalue =~ /^BISECT_TYPE(\[.*\])?$/ && $prvalue ne "build") {
736 if ($prvalue ne "install") {
739 # install still limits some mandatory options.
744 if (defined($opt{$lvalue})) {
745 if (!$override || defined(${$overrides}{$lvalue})) {
748 $extra = "In the same override section!\n";
750 die "$name: $.: Option $lvalue defined more than once!\n$extra";
752 ${$overrides}{$lvalue} = $prvalue;
755 $opt{$lvalue} = $prvalue;
759 my ($lvalue, $rvalue, $name) = @_;
761 my $prvalue = process_variables($rvalue);
764 if (defined($evals{$lvalue})) {
765 $arr = $evals{$lvalue};
768 $evals{$lvalue} = $arr;
771 push @{$arr}, $rvalue;
775 my ($lvalue, $rvalue) = @_;
777 if ($rvalue =~ /^\s*$/) {
778 delete $variable{$lvalue};
780 $rvalue = process_variables($rvalue);
781 $variable{$lvalue} = $rvalue;
785 sub process_compare {
786 my ($lval, $cmp, $rval) = @_;
797 return $lval eq $rval;
798 } elsif ($cmp eq "!=") {
799 return $lval ne $rval;
800 } elsif ($cmp eq "=~") {
801 return $lval =~ m/$rval/;
802 } elsif ($cmp eq "!~") {
803 return $lval !~ m/$rval/;
806 my $statement = "$lval $cmp $rval";
807 my $ret = eval $statement;
809 # $@ stores error of eval
820 return defined($variable{$2}) ||
825 sub process_expression {
826 my ($name, $val) = @_;
830 while ($val =~ s/\(([^\(]*?)\)/\&\&\&\&VAL\&\&\&\&/) {
833 if (process_expression($name, $express)) {
834 $val =~ s/\&\&\&\&VAL\&\&\&\&/ 1 /;
836 $val =~ s/\&\&\&\&VAL\&\&\&\&/ 0 /;
844 while ($val =~ s/^(.*?)($OR|$AND)//) {
848 if (process_expression($name, $express)) {
859 if ($val =~ /(.*)(==|\!=|>=|<=|>|<|=~|\!~)(.*)/) {
860 my $ret = process_compare($1, $2, $3);
862 die "$name: $.: Unable to process comparison\n";
867 if ($val =~ /^\s*(NOT\s*)?DEFINED\s+(\S+)\s*$/) {
869 return !value_defined($2);
871 return value_defined($2);
875 if ($val =~ /^\s*0\s*$/) {
877 } elsif ($val =~ /^\s*\d+\s*$/) {
881 die ("$name: $.: Undefined content $val in if statement\n");
885 my ($name, $value) = @_;
887 # Convert variables and replace undefined ones with 0
888 my $val = process_variables($value, 1);
889 my $ret = process_expression $name, $val;
895 my ($config, $current_test_num) = @_;
898 open($in, $config) || die "can't read file $config";
901 $name =~ s,.*/(.*),$1,;
903 my $test_num = $$current_test_num;
906 my $num_tests_set = 0;
919 # ignore blank lines and comments
920 next if (/^\s*$/ || /\s*\#/);
922 if (/^\s*(TEST_START|DEFAULTS)\b(.*)/) {
932 if ($type eq "TEST_START") {
934 if ($num_tests_set) {
935 die "$name: $.: Can not specify both NUM_TESTS and TEST_START\n";
938 $old_test_num = $test_num;
939 $old_repeat = $repeat;
941 $test_num += $repeat;
948 # If SKIP is anywhere in the line, the command will be skipped
949 if ($rest =~ s/\s+SKIP\b//) {
956 if ($rest =~ s/\sELSE\b//) {
958 die "$name: $.: ELSE found with out matching IF section\n$_";
969 if ($rest =~ s/\sIF\s+(.*)//) {
970 if (process_if($name, $1)) {
982 if ($type eq "TEST_START") {
983 if ($rest =~ s/\s+ITERATE\s+(\d+)//) {
985 $repeat_tests{"$test_num"} = $repeat;
987 } elsif ($rest =~ s/\sOVERRIDE\b//) {
990 # Clear previous overrides
995 if (!$skip && $rest !~ /^\s*$/) {
996 die "$name: $.: Gargbage found after $type\n$_";
999 if ($skip && $type eq "TEST_START") {
1000 $test_num = $old_test_num;
1001 $repeat = $old_repeat;
1004 } elsif (/^\s*ELSE\b(.*)$/) {
1006 die "$name: $.: ELSE found with out matching IF section\n$_";
1015 if ($rest =~ /\sIF\s+(.*)/) {
1016 # May be a ELSE IF section.
1017 if (process_if($name, $1)) {
1028 if ($rest !~ /^\s*$/) {
1029 die "$name: $.: Gargbage found after DEFAULTS\n$_";
1032 } elsif (/^\s*INCLUDE\s+(\S+)/) {
1037 die "$name: $.: INCLUDE can only be done in default sections\n$_";
1040 my $file = process_variables($1);
1042 if ($file !~ m,^/,) {
1043 # check the path of the config file first
1044 if ($config =~ m,(.*)/,) {
1045 if (-f "$1/$file") {
1052 die "$name: $.: Can't read file $file\n$_";
1055 if (__read_config($file, \$test_num)) {
1059 } elsif (/^\s*([A-Z_\[\]\d]+)\s*=~\s*(.*?)\s*$/) {
1066 if ($default || $lvalue =~ /\[\d+\]$/) {
1067 set_eval($lvalue, $rvalue, $name);
1069 my $val = "$lvalue\[$test_num\]";
1070 set_eval($val, $rvalue, $name);
1073 } elsif (/^\s*([A-Z_\[\]\d]+)\s*=\s*(.*?)\s*$/) {
1081 ($lvalue eq "NUM_TESTS" ||
1082 $lvalue eq "LOG_FILE" ||
1083 $lvalue eq "CLEAR_LOG")) {
1084 die "$name: $.: $lvalue must be set in DEFAULTS section\n";
1087 if ($lvalue eq "NUM_TESTS") {
1089 die "$name: $.: Can not specify both NUM_TESTS and TEST_START\n";
1092 die "$name: $.: NUM_TESTS must be set in default section\n";
1097 if ($default || $lvalue =~ /\[\d+\]$/) {
1098 set_value($lvalue, $rvalue, $override, \%overrides, $name);
1100 my $val = "$lvalue\[$test_num\]";
1101 set_value($val, $rvalue, $override, \%overrides, $name);
1104 $repeats{$val} = $repeat;
1107 } elsif (/^\s*([A-Z_\[\]\d]+)\s*:=\s*(.*?)\s*$/) {
1113 # process config variables.
1114 # Config variables are only active while reading the
1115 # config and can be defined anywhere. They also ignore
1116 # TEST_START and DEFAULTS, but are skipped if they are in
1117 # on of these sections that have SKIP defined.
1118 # The save variable can be
1119 # defined multiple times and the new one simply overrides
1121 set_variable($lvalue, $rvalue);
1124 die "$name: $.: Garbage found in config\n$_";
1129 $test_num += $repeat - 1;
1130 $opt{"NUM_TESTS"} = $test_num;
1135 $$current_test_num = $test_num;
1141 print "What test case would you like to run?\n";
1142 print " (build, install or boot)\n";
1143 print " Other tests are available but require editing the config file\n";
1146 $default{"TEST_TYPE"} = $ans;
1155 $test_case = __read_config $config, \$test_num;
1157 # make sure we have all mandatory configs
1158 get_mandatory_configs;
1160 # was a test specified?
1162 print "No test case specified.\n";
1168 foreach my $default (keys %default) {
1169 if (!defined($opt{$default})) {
1170 $opt{$default} = $default{$default};
1174 if ($opt{"IGNORE_UNUSED"} == 1) {
1180 # check if there are any stragglers (typos?)
1181 foreach my $option (keys %opt) {
1183 # remove per test labels.
1185 if (!exists($option_map{$op}) &&
1186 !exists($default{$op}) &&
1187 !exists($used_options{$op})) {
1194 $s = " is" if (keys %not_used == 1);
1195 print "The following option$s not used; could be a typo:\n";
1196 foreach my $option (keys %not_used) {
1199 print "Set IGRNORE_UNUSED = 1 to have ktest ignore unused variables\n";
1200 if (!read_yn "Do you want to continue?") {
1207 my ($name, $option, $i) = @_;
1209 # Add space to evaluate the character before $
1210 $option = " $option";
1215 foreach my $test (keys %repeat_tests) {
1217 $i < $test + $repeat_tests{$test}) {
1225 while ($option =~ /(.*?[^\\])\$\{(.*?)\}(.*)/) {
1230 # Append beginning of line
1231 $retval = "$retval$start";
1233 # If the iteration option OPT[$i] exists, then use that.
1234 # otherwise see if the default OPT (without [$i]) exists.
1236 my $o = "$var\[$i\]";
1237 my $parento = "$var\[$parent\]";
1239 # If a variable contains itself, use the default var
1240 if (($var eq $name) && defined($opt{$var})) {
1242 $retval = "$retval$o";
1243 } elsif (defined($opt{$o})) {
1245 $retval = "$retval$o";
1246 } elsif ($repeated && defined($opt{$parento})) {
1247 $o = $opt{$parento};
1248 $retval = "$retval$o";
1249 } elsif (defined($opt{$var})) {
1251 $retval = "$retval$o";
1252 } elsif ($var eq "KERNEL_VERSION" && defined($make)) {
1253 # special option KERNEL_VERSION uses kernel version
1255 $retval = "$retval$version";
1257 $retval = "$retval\$\{$var\}";
1263 $retval = "$retval$option";
1271 my ($name, $option, $i) = @_;
1273 my $option_name = "$name\[$i\]";
1276 my $old_option = $option;
1278 if (defined($evals{$option_name})) {
1279 $ev = $evals{$option_name};
1280 } elsif (defined($evals{$name})) {
1281 $ev = $evals{$name};
1286 for my $e (@{$ev}) {
1287 eval "\$option =~ $e";
1290 if ($option ne $old_option) {
1291 doprint("$name changed from '$old_option' to '$option'\n");
1298 my ($name, $option, $i) = @_;
1302 # Since an option can evaluate to another option,
1303 # keep iterating until we do not evaluate any more
1306 while ($prev ne $option) {
1307 # Check for recursive evaluations.
1308 # 100 deep should be more than enough.
1310 die "Over 100 evaluations accurred with $option\n" .
1311 "Check for recursive variables\n";
1314 $option = __eval_option($name, $option, $i);
1317 $option = process_evals($name, $option, $i);
1325 sub wait_for_monitor;
1331 # test if the machine can be connected to within 5 seconds
1332 my $stat = run_ssh("echo check machine status", 5);
1334 doprint("power cycle\n");
1339 run_command "$power_cycle";
1342 # flush out current monitor
1343 # May contain the reboot success line
1347 # Make sure everything has been written to disk
1348 run_ssh("sync", 10);
1350 if (defined($time)) {
1352 # flush out current monitor
1353 # May contain the reboot success line
1357 # try to reboot normally
1358 if (run_command $reboot) {
1359 if (defined($powercycle_after_reboot)) {
1360 sleep $powercycle_after_reboot;
1361 run_command "$power_cycle";
1364 # nope? power cycle it.
1365 run_command "$power_cycle";
1369 if (defined($time)) {
1371 # We only want to get to the new kernel, don't fail
1372 # if we stumble over a call trace.
1373 my $save_ignore_errors = $ignore_errors;
1376 # Look for the good kernel to boot
1377 if (wait_for_monitor($time, "Linux version")) {
1379 doprint "Reboot did not finish. Forcing power cycle\n";
1380 run_command "$power_cycle";
1383 $ignore_errors = $save_ignore_errors;
1385 # Still need to wait for the reboot to finish
1386 wait_for_monitor($time, $reboot_success_line);
1388 if ($powercycle || $time) {
1393 sub reboot_to_good {
1396 if (defined($switch_to_good)) {
1397 run_command $switch_to_good;
1406 return $test_type eq "build" || $no_reboot ||
1407 ($test_type eq "patchcheck" && $opt{"PATCHCHECK_TYPE[$i]"} eq "build") ||
1408 ($test_type eq "bisect" && $opt{"BISECT_TYPE[$i]"} eq "build");
1412 doprint "CRITICAL FAILURE... ", @_, "\n";
1416 if ($reboot_on_error && !do_not_reboot) {
1418 doprint "REBOOTING\n";
1421 } elsif ($poweroff_on_error && defined($power_off)) {
1422 doprint "POWERING OFF\n";
1426 if (defined($opt{"LOG_FILE"})) {
1427 print " See $opt{LOG_FILE} for more info.\n";
1431 # restore terminal settings
1432 system("stty $stty_orig");
1435 if (defined($post_test)) {
1436 run_command $post_test;
1443 my ($ptm, $pts) = @_;
1445 my $TIOCSPTLCK = 0x40045431;
1446 my $TIOCGPTN = 0x80045430;
1448 sysopen($ptm, "/dev/ptmx", O_RDWR | O_NONBLOCK) or
1449 dodie "Cant open /dev/ptmx";
1452 $tmp = pack("i", 0);
1453 ioctl($ptm, $TIOCSPTLCK, $tmp) or
1454 dodie "ioctl TIOCSPTLCK for /dev/ptmx failed";
1457 ioctl($ptm, $TIOCGPTN, $tmp) or
1458 dodie "ioctl TIOCGPTN for /dev/ptmx failed";
1459 $tmp = unpack("i", $tmp);
1461 sysopen($pts, "/dev/pts/$tmp", O_RDWR | O_NONBLOCK) or
1462 dodie "Can't open /dev/pts/$tmp";
1466 my ($ptm, $pts) = @_;
1474 open(\*STDIN, '<&', $pts);
1475 open(\*STDOUT, '>&', $pts);
1476 open(\*STDERR, '>&', $pts);
1481 die "Can't open console $console";
1489 # save terminal settings
1490 $stty_orig = `stty -g`;
1492 # place terminal in cbreak mode so that stdin can be read one character at
1493 # a time without having to wait for a newline
1494 system("stty -icanon -echo -icrnl");
1496 create_pty($ptm, $pts);
1502 exec_console($ptm, $pts)
1510 open(PTSFD, "Stop perl from warning about single use of PTSFD");
1514 my ($fp, $pid) = @_;
1516 doprint "kill child process $pid\n";
1517 kill $close_console_signal, $pid;
1522 # restore terminal settings
1523 system("stty $stty_orig");
1527 if ($monitor_cnt++) {
1530 $monitor_fp = \*MONFD;
1531 $monitor_pid = open_console $monitor_fp;
1535 open(MONFD, "Stop perl from warning about single use of MONFD");
1539 return if (!defined $console);
1540 if (--$monitor_cnt) {
1543 close_console($monitor_fp, $monitor_pid);
1546 sub wait_for_monitor {
1547 my ($time, $stop) = @_;
1551 my $start_time = time;
1552 my $skip_call_trace = 0;
1554 my $bug_ignored = 0;
1557 doprint "** Wait for monitor to settle down **\n";
1559 # read the monitor and wait for the system to calm down
1561 $line = wait_for_input($monitor_fp, $time);
1562 last if (!defined($line));
1564 $full_line .= $line;
1566 if (defined($stop) && $full_line =~ /$stop/) {
1567 doprint "wait for monitor detected $stop\n";
1571 if ($full_line =~ /\[ backtrace testing \]/) {
1572 $skip_call_trace = 1;
1575 if ($full_line =~ /call trace:/i) {
1576 if (!$bug && !$skip_call_trace) {
1577 if ($ignore_errors) {
1585 if ($full_line =~ /\[ end of backtrace testing \]/) {
1586 $skip_call_trace = 0;
1589 if ($full_line =~ /Kernel panic -/) {
1593 if ($line =~ /\n/) {
1597 if ($now - $start_time >= $max_monitor_wait) {
1598 doprint "Exiting monitor flush due to hitting MAX_MONITOR_WAIT\n";
1602 print "** Monitor flushed **\n";
1604 # if stop is defined but wasn't hit, return error
1605 # used by reboot (which wants to see a reboot)
1606 if (defined($stop) && !$booted) {
1613 my ($result, $basedir) = @_;
1615 my $date = sprintf "%04d%02d%02d%02d%02d%02d",
1616 1900+$t[5],$t[4],$t[3],$t[2],$t[1],$t[0];
1618 my $type = $build_type;
1619 if ($type =~ /useconfig/) {
1620 $type = "useconfig";
1623 my $dir = "$machine-$test_type-$type-$result-$date";
1625 $dir = "$basedir/$dir";
1629 die "can't create $dir";
1633 "config" => $output_config,
1634 "buildlog" => $buildlog,
1636 "testlog" => $testlog,
1639 while (my ($name, $source) = each(%files)) {
1641 cp "$source", "$dir/$name" or
1642 die "failed to copy $source";
1646 doprint "*** Saved info to $dir ***\n";
1651 if ($die_on_failure) {
1659 # no need to reboot for just building.
1660 if (!do_not_reboot) {
1661 doprint "REBOOTING\n";
1662 reboot_to_good $sleep_time;
1667 if (defined($test_name)) {
1668 $name = " ($test_name)";
1673 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
1674 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
1675 doprint "KTEST RESULT: TEST $i$name Failed: ", @_, "\n";
1676 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
1677 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
1679 if (defined($store_failures)) {
1680 save_logs "fail", $store_failures;
1683 if (defined($post_test)) {
1684 run_command $post_test;
1691 my ($command, $redirect, $timeout) = @_;
1698 $command =~ s/\$SSH_USER/$ssh_user/g;
1699 $command =~ s/\$MACHINE/$machine/g;
1701 doprint("$command ... ");
1704 $pid = open(CMD, "$command 2>&1 |") or
1705 (fail "unable to exec $command" and return 0);
1707 if (defined($opt{"LOG_FILE"})) {
1708 open(LOG, ">>$opt{LOG_FILE}") or
1709 dodie "failed to write to log";
1713 if (defined($redirect)) {
1714 open (RD, ">$redirect") or
1715 dodie "failed to write to redirect $redirect";
1719 my $hit_timeout = 0;
1723 if (defined($timeout)) {
1724 doprint "timeout = $timeout\n";
1726 my $line = wait_for_input($fp, $timeout);
1727 if (!defined($line)) {
1729 if (defined($timeout) && (($now - $start_time) >= $timeout)) {
1730 doprint "Hit timeout of $timeout, killing process\n";
1736 print LOG $line if ($dolog);
1737 print RD $line if ($dord);
1741 # shift 8 for real exit status
1742 $run_command_status = $? >> 8;
1745 close(LOG) if ($dolog);
1746 close(RD) if ($dord);
1749 my $delta = $end_time - $start_time;
1752 doprint "[1 second] ";
1754 doprint "[$delta seconds] ";
1758 $run_command_status = 1;
1761 if ($run_command_status) {
1762 doprint "FAILED!\n";
1764 doprint "SUCCESS\n";
1767 return !$run_command_status;
1771 my ($cmd, $timeout) = @_;
1772 my $cp_exec = $ssh_exec;
1774 $cp_exec =~ s/\$SSH_COMMAND/$cmd/g;
1775 return run_command "$cp_exec", undef , $timeout;
1779 my ($src, $dst, $cp_scp) = @_;
1781 $cp_scp =~ s/\$SRC_FILE/$src/g;
1782 $cp_scp =~ s/\$DST_FILE/$dst/g;
1784 return run_command "$cp_scp";
1787 sub run_scp_install {
1788 my ($src, $dst) = @_;
1790 my $cp_scp = $scp_to_target_install;
1792 return run_scp($src, $dst, $cp_scp);
1796 my ($src, $dst) = @_;
1798 my $cp_scp = $scp_to_target;
1800 return run_scp($src, $dst, $cp_scp);
1803 sub get_grub2_index {
1805 return if (defined($grub_number) && defined($last_grub_menu) &&
1806 $last_grub_menu eq $grub_menu && defined($last_machine) &&
1807 $last_machine eq $machine);
1809 doprint "Find grub2 menu ... ";
1812 my $ssh_grub = $ssh_exec;
1813 $ssh_grub =~ s,\$SSH_COMMAND,cat $grub_file,g;
1815 open(IN, "$ssh_grub |")
1816 or die "unable to get $grub_file";
1821 if (/^menuentry.*$grub_menu/) {
1825 } elsif (/^menuentry\s/) {
1831 die "Could not find '$grub_menu' in $grub_file on $machine"
1833 doprint "$grub_number\n";
1834 $last_grub_menu = $grub_menu;
1835 $last_machine = $machine;
1838 sub get_grub_index {
1840 if ($reboot_type eq "grub2") {
1845 if ($reboot_type ne "grub") {
1848 return if (defined($grub_number) && defined($last_grub_menu) &&
1849 $last_grub_menu eq $grub_menu && defined($last_machine) &&
1850 $last_machine eq $machine);
1852 doprint "Find grub menu ... ";
1855 my $ssh_grub = $ssh_exec;
1856 $ssh_grub =~ s,\$SSH_COMMAND,cat /boot/grub/menu.lst,g;
1858 open(IN, "$ssh_grub |")
1859 or die "unable to get menu.lst";
1864 if (/^\s*title\s+$grub_menu\s*$/) {
1868 } elsif (/^\s*title\s/) {
1874 die "Could not find '$grub_menu' in /boot/grub/menu on $machine"
1876 doprint "$grub_number\n";
1877 $last_grub_menu = $grub_menu;
1878 $last_machine = $machine;
1883 my ($fp, $time) = @_;
1892 if (!defined($time)) {
1897 vec($rin, fileno($fp), 1) = 1;
1898 vec($rin, fileno(\*STDIN), 1) = 1;
1903 $nr = select($rout=$rin, undef, undef, $time);
1907 # copy data from stdin to the console
1908 if (vec($rout, fileno(\*STDIN), 1) == 1) {
1909 $nr = sysread(\*STDIN, $buf, 1000);
1910 syswrite($fp, $buf, $nr) if ($nr > 0);
1913 # The timeout is based on time waiting for the fp data
1914 if (vec($rout, fileno($fp), 1) != 1) {
1915 last if (defined($time) && (time - $start_time > $time));
1921 # try to read one char at a time
1922 while (sysread $fp, $ch, 1) {
1924 last if ($ch eq "\n");
1927 last if (!length($line));
1935 if (defined($switch_to_test)) {
1936 run_command $switch_to_test;
1939 if ($reboot_type eq "grub") {
1940 run_ssh "'(echo \"savedefault --default=$grub_number --once\" | grub --batch)'";
1941 } elsif ($reboot_type eq "grub2") {
1942 run_ssh "$grub_reboot $grub_number";
1943 } elsif ($reboot_type eq "syslinux") {
1944 run_ssh "$syslinux --once \\\"$syslinux_label\\\" $syslinux_path";
1945 } elsif (defined $reboot_script) {
1946 run_command "$reboot_script";
1954 doprint "git rev-list --max-count=1 $commit ... ";
1955 my $sha1 = `git rev-list --max-count=1 $commit`;
1962 dodie "Failed to get git $commit";
1975 my $bug_ignored = 0;
1976 my $skip_call_trace = 0;
1979 my $start_time = time;
1986 open(DMESG, "> $dmesg") or
1987 die "unable to write to $dmesg";
1993 my $monitor_start = time;
1995 my $version_found = 0;
1999 if ($bug && defined($stop_after_failure) &&
2000 $stop_after_failure >= 0) {
2001 my $time = $stop_after_failure - (time - $failure_start);
2002 $line = wait_for_input($monitor_fp, $time);
2003 if (!defined($line)) {
2004 doprint "bug timed out after $booted_timeout seconds\n";
2005 doprint "Test forced to stop after $stop_after_failure seconds after failure\n";
2009 $line = wait_for_input($monitor_fp, $booted_timeout);
2010 if (!defined($line)) {
2011 my $s = $booted_timeout == 1 ? "" : "s";
2012 doprint "Successful boot found: break after $booted_timeout second$s\n";
2016 $line = wait_for_input($monitor_fp);
2017 if (!defined($line)) {
2018 my $s = $timeout == 1 ? "" : "s";
2019 doprint "Timed out after $timeout second$s\n";
2027 # we are not guaranteed to get a full line
2028 $full_line .= $line;
2030 if ($full_line =~ /$success_line/) {
2032 $success_start = time;
2035 if ($booted && defined($stop_after_success) &&
2036 $stop_after_success >= 0) {
2038 if ($now - $success_start >= $stop_after_success) {
2039 doprint "Test forced to stop after $stop_after_success seconds after success\n";
2044 if ($full_line =~ /\[ backtrace testing \]/) {
2045 $skip_call_trace = 1;
2048 if ($full_line =~ /call trace:/i) {
2049 if (!$bug && !$skip_call_trace) {
2050 if ($ignore_errors) {
2054 $failure_start = time;
2059 if ($bug && defined($stop_after_failure) &&
2060 $stop_after_failure >= 0) {
2062 if ($now - $failure_start >= $stop_after_failure) {
2063 doprint "Test forced to stop after $stop_after_failure seconds after failure\n";
2068 if ($full_line =~ /\[ end of backtrace testing \]/) {
2069 $skip_call_trace = 0;
2072 if ($full_line =~ /Kernel panic -/) {
2073 $failure_start = time;
2077 # Detect triple faults by testing the banner
2078 if ($full_line =~ /\bLinux version (\S+).*\n/) {
2079 if ($1 eq $version) {
2081 } elsif ($version_found && $detect_triplefault) {
2082 # We already booted into the kernel we are testing,
2083 # but now we booted into another kernel?
2084 # Consider this a triple fault.
2085 doprint "Already booted in Linux kernel $version, but now\n";
2086 doprint "we booted into Linux kernel $1.\n";
2087 doprint "Assuming that this is a triple fault.\n";
2088 doprint "To disable this: set DETECT_TRIPLE_FAULT to 0\n";
2093 if ($line =~ /\n/) {
2097 if ($stop_test_after > 0 && !$booted && !$bug) {
2098 if (time - $monitor_start > $stop_test_after) {
2099 doprint "STOP_TEST_AFTER ($stop_test_after seconds) timed out\n";
2105 my $end_time = time;
2106 $reboot_time = $end_time - $start_time;
2111 return 0 if ($in_bisect);
2112 fail "failed - got a bug report" and return 0;
2116 return 0 if ($in_bisect);
2117 fail "failed - never got a boot prompt." and return 0;
2121 doprint "WARNING: Call Trace detected but ignored due to IGNORE_ERRORS=1\n";
2127 sub eval_kernel_version {
2130 $option =~ s/\$KERNEL_VERSION/$version/g;
2135 sub do_post_install {
2137 return if (!defined($post_install));
2139 my $cp_post_install = eval_kernel_version $post_install;
2140 run_command "$cp_post_install" or
2141 dodie "Failed to run post install";
2144 # Sometimes the reboot fails, and will hang. We try to ssh to the box
2145 # and if we fail, we force another reboot, that should powercycle it.
2147 if (!run_ssh "echo testing connection") {
2154 return if ($no_install);
2156 my $start_time = time;
2158 if (defined($pre_install)) {
2159 my $cp_pre_install = eval_kernel_version $pre_install;
2160 run_command "$cp_pre_install" or
2161 dodie "Failed to run pre install";
2164 my $cp_target = eval_kernel_version $target_image;
2168 run_scp_install "$outputdir/$build_target", "$cp_target" or
2169 dodie "failed to copy image";
2171 my $install_mods = 0;
2173 # should we process modules?
2175 open(IN, "$output_config") or dodie("Can't read config file");
2177 if (/CONFIG_MODULES(=y)?/) {
2186 if (!$install_mods) {
2188 doprint "No modules needed\n";
2189 my $end_time = time;
2190 $install_time = $end_time - $start_time;
2194 run_command "$make INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH=$tmpdir modules_install" or
2195 dodie "Failed to install modules";
2197 my $modlib = "/lib/modules/$version";
2198 my $modtar = "ktest-mods.tar.bz2";
2200 run_ssh "rm -rf $modlib" or
2201 dodie "failed to remove old mods: $modlib";
2203 # would be nice if scp -r did not follow symbolic links
2204 run_command "cd $tmpdir && tar -cjf $modtar lib/modules/$version" or
2205 dodie "making tarball";
2207 run_scp_mod "$tmpdir/$modtar", "/tmp" or
2208 dodie "failed to copy modules";
2210 unlink "$tmpdir/$modtar";
2212 run_ssh "'(cd / && tar xjf /tmp/$modtar)'" or
2213 dodie "failed to tar modules";
2215 run_ssh "rm -f /tmp/$modtar";
2219 my $end_time = time;
2220 $install_time = $end_time - $start_time;
2224 # get the release name
2225 return if ($have_version);
2226 doprint "$make kernelrelease ... ";
2227 $version = `$make -s kernelrelease | tail -1`;
2229 doprint "$version\n";
2233 sub start_monitor_and_install {
2234 # Make sure the stable kernel has finished booting
2236 # Install bisects, don't need console
2237 if (defined $console) {
2247 start_monitor if (defined $console);
2251 my $check_build_re = ".*:.*(warning|error|Error):.*";
2252 my $utf8_quote = "\\x{e2}\\x{80}(\\x{98}|\\x{99})";
2254 sub process_warning_line {
2259 # for distcc heterogeneous systems, some compilers
2260 # do things differently causing warning lines
2261 # to be slightly different. This makes an attempt
2262 # to fixe those issues.
2264 # chop off the index into the line
2265 # using distcc, some compilers give different indexes
2266 # depending on white space
2267 $line =~ s/^(\s*\S+:\d+:)\d+/$1/;
2269 # Some compilers use UTF-8 extended for quotes and some don't.
2270 $line =~ s/$utf8_quote/'/g;
2275 # Read buildlog and check against warnings file for any
2280 sub check_buildlog {
2281 return 1 if (!defined $warnings_file);
2285 # Failed builds should not reboot the target
2286 my $save_no_reboot = $no_reboot;
2289 if (-f $warnings_file) {
2290 open(IN, $warnings_file) or
2291 dodie "Error opening $warnings_file";
2294 if (/$check_build_re/) {
2295 my $warning = process_warning_line $_;
2297 $warnings_list{$warning} = 1;
2303 # If warnings file didn't exist, and WARNINGS_FILE exist,
2304 # then we fail on any warning!
2306 open(IN, $buildlog) or dodie "Can't open $buildlog";
2308 if (/$check_build_re/) {
2309 my $warning = process_warning_line $_;
2311 if (!defined $warnings_list{$warning}) {
2312 fail "New warning found (not in $warnings_file)\n$_\n";
2313 $no_reboot = $save_no_reboot;
2318 $no_reboot = $save_no_reboot;
2322 sub check_patch_buildlog {
2325 my @files = `git show $patch | diffstat -l`;
2327 foreach my $file (@files) {
2331 open(IN, "git show $patch |") or
2332 dodie "failed to show $patch";
2334 if (m,^--- a/(.*),) {
2336 $files[$#files] = $1;
2341 open(IN, $buildlog) or dodie "Can't open $buildlog";
2343 if (/^\s*(.*?):.*(warning|error)/) {
2345 foreach my $file (@files) {
2346 my $fullpath = "$builddir/$file";
2347 if ($file eq $err || $fullpath eq $err) {
2348 fail "$file built with warnings" and return 0;
2358 sub apply_min_config {
2359 my $outconfig = "$output_config.new";
2361 # Read the config file and remove anything that
2362 # is in the force_config hash (from minconfig and others)
2363 # then add the force config back.
2365 doprint "Applying minimum configurations into $output_config.new\n";
2367 open (OUT, ">$outconfig") or
2368 dodie "Can't create $outconfig";
2370 if (-f $output_config) {
2371 open (IN, $output_config) or
2372 dodie "Failed to open $output_config";
2374 if (/^(# )?(CONFIG_[^\s=]*)/) {
2375 next if (defined($force_config{$2}));
2381 foreach my $config (keys %force_config) {
2382 print OUT "$force_config{$config}\n";
2386 run_command "mv $outconfig $output_config";
2389 sub make_oldconfig {
2391 my @force_list = keys %force_config;
2393 if ($#force_list >= 0) {
2397 if (!run_command "$make olddefconfig") {
2398 # Perhaps olddefconfig doesn't exist in this version of the kernel
2400 doprint "olddefconfig failed, trying make oldnoconfig\n";
2401 if (!run_command "$make oldnoconfig") {
2402 doprint "oldnoconfig failed, trying yes '' | make oldconfig\n";
2403 # try a yes '' | oldconfig
2404 run_command "yes '' | $make oldconfig" or
2405 dodie "failed make config oldconfig";
2410 # read a config file and use this to force new configs.
2411 sub load_force_config {
2414 doprint "Loading force configs from $config\n";
2415 open(IN, $config) or
2416 dodie "failed to read $config";
2419 if (/^(CONFIG[^\s=]*)(\s*=.*)/) {
2420 $force_config{$1} = $_;
2421 } elsif (/^# (CONFIG_\S*) is not set/) {
2422 $force_config{$1} = $_;
2433 my $start_time = time;
2435 # Failed builds should not reboot the target
2436 my $save_no_reboot = $no_reboot;
2439 # Calculate a new version from here.
2442 if (defined($pre_build)) {
2443 my $ret = run_command $pre_build;
2444 if (!$ret && defined($pre_build_die) &&
2446 dodie "failed to pre_build\n";
2450 if ($type =~ /^useconfig:(.*)/) {
2451 run_command "cp $1 $output_config" or
2452 dodie "could not copy $1 to .config";
2454 $type = "oldconfig";
2457 # old config can ask questions
2458 if ($type eq "oldconfig") {
2459 $type = "olddefconfig";
2461 # allow for empty configs
2462 run_command "touch $output_config";
2465 run_command "mv $output_config $outputdir/config_temp" or
2466 dodie "moving .config";
2468 run_command "$make mrproper" or dodie "make mrproper";
2470 run_command "mv $outputdir/config_temp $output_config" or
2471 dodie "moving config_temp";
2474 } elsif (!$noclean) {
2475 unlink "$output_config";
2476 run_command "$make mrproper" or
2477 dodie "make mrproper";
2480 # add something to distinguish this build
2481 open(OUT, "> $outputdir/localversion") or dodie("Can't make localversion file");
2482 print OUT "$localversion\n";
2485 if (defined($minconfig)) {
2486 load_force_config($minconfig);
2489 if ($type ne "olddefconfig") {
2490 run_command "$make $type" or
2491 dodie "failed make config";
2493 # Run old config regardless, to enforce min configurations
2496 my $build_ret = run_command "$make $build_options", $buildlog;
2498 if (defined($post_build)) {
2499 # Because a post build may change the kernel version
2502 my $ret = run_command $post_build;
2503 if (!$ret && defined($post_build_die) &&
2505 dodie "failed to post_build\n";
2510 # bisect may need this to pass
2512 $no_reboot = $save_no_reboot;
2515 fail "failed build" and return 0;
2518 $no_reboot = $save_no_reboot;
2520 my $end_time = time;
2521 $build_time = $end_time - $start_time;
2527 if (!run_ssh "halt" or defined($power_off)) {
2528 if (defined($poweroff_after_halt)) {
2529 sleep $poweroff_after_halt;
2530 run_command "$power_off";
2534 run_command "$power_off";
2545 if (defined($test_name)) {
2546 $name = " ($test_name)";
2551 doprint "\n\n*******************************************\n";
2552 doprint "*******************************************\n";
2553 doprint "KTEST RESULT: TEST $i$name SUCCESS!!!! **\n";
2554 doprint "*******************************************\n";
2555 doprint "*******************************************\n";
2557 if (defined($store_successes)) {
2558 save_logs "success", $store_successes;
2561 if ($i != $opt{"NUM_TESTS"} && !do_not_reboot) {
2562 doprint "Reboot and wait $sleep_time seconds\n";
2563 reboot_to_good $sleep_time;
2566 if (defined($post_test)) {
2567 run_command $post_test;
2573 doprint "Pass, fail, or skip? [p/f/s]";
2576 if ($ans eq "p" || $ans eq "P") {
2578 } elsif ($ans eq "f" || $ans eq "F") {
2580 } elsif ($ans eq "s" || $ans eq "S") {
2583 print "Please answer 'p', 'f', or 's'\n";
2588 sub child_run_test {
2590 # child should have no power
2591 $reboot_on_error = 0;
2592 $poweroff_on_error = 0;
2593 $die_on_failure = 1;
2595 run_command $run_test, $testlog;
2597 exit $run_command_status;
2602 sub child_finished {
2612 my $bug_ignored = 0;
2614 my $start_time = time;
2618 doprint "run test $run_test\n";
2622 $SIG{CHLD} = qw(child_finished);
2626 child_run_test if (!$child_pid);
2631 $line = wait_for_input($monitor_fp, 1);
2632 if (defined($line)) {
2634 # we are not guaranteed to get a full line
2635 $full_line .= $line;
2638 if ($full_line =~ /call trace:/i) {
2639 if ($ignore_errors) {
2646 if ($full_line =~ /Kernel panic -/) {
2650 if ($line =~ /\n/) {
2654 } while (!$child_done && !$bug);
2656 if (!$bug && $bug_ignored) {
2657 doprint "WARNING: Call Trace detected but ignored due to IGNORE_ERRORS=1\n";
2661 my $failure_start = time;
2664 $line = wait_for_input($monitor_fp, 1);
2665 if (defined($line)) {
2669 if ($now - $failure_start >= $stop_after_failure) {
2672 } while (defined($line));
2674 doprint "Detected kernel crash!\n";
2675 # kill the child with extreme prejudice
2679 waitpid $child_pid, 0;
2680 $child_exit = $? >> 8;
2682 my $end_time = time;
2683 $test_time = $end_time - $start_time;
2685 if (!$bug && $in_bisect) {
2686 if (defined($bisect_ret_good)) {
2687 if ($child_exit == $bisect_ret_good) {
2691 if (defined($bisect_ret_skip)) {
2692 if ($child_exit == $bisect_ret_skip) {
2696 if (defined($bisect_ret_abort)) {
2697 if ($child_exit == $bisect_ret_abort) {
2698 fail "test abort" and return -2;
2701 if (defined($bisect_ret_bad)) {
2702 if ($child_exit == $bisect_ret_skip) {
2706 if (defined($bisect_ret_default)) {
2707 if ($bisect_ret_default eq "good") {
2709 } elsif ($bisect_ret_default eq "bad") {
2711 } elsif ($bisect_ret_default eq "skip") {
2713 } elsif ($bisect_ret_default eq "abort") {
2716 fail "unknown default action: $bisect_ret_default"
2722 if ($bug || $child_exit) {
2723 return 0 if $in_bisect;
2724 fail "test failed" and return 0;
2729 sub run_git_bisect {
2732 doprint "$command ... ";
2734 my $output = `$command 2>&1`;
2741 dodie "Failed to git bisect";
2744 doprint "SUCCESS\n";
2745 if ($output =~ m/^(Bisecting: .*\(roughly \d+ steps?\))\s+\[([[:xdigit:]]+)\]/) {
2746 doprint "$1 [$2]\n";
2747 } elsif ($output =~ m/^([[:xdigit:]]+) is the first bad commit/) {
2748 $bisect_bad_commit = $1;
2749 doprint "Found bad commit... $1\n";
2752 # we already logged it, just print it now.
2760 doprint "Reboot and sleep $bisect_sleep_time seconds\n";
2761 reboot_to_good $bisect_sleep_time;
2764 # returns 1 on success, 0 on failure, -1 on skip
2765 sub run_bisect_test {
2766 my ($type, $buildtype) = @_;
2775 build $buildtype or $failed = 1;
2777 if ($type ne "build") {
2778 if ($failed && $bisect_skip) {
2782 dodie "Failed on build" if $failed;
2785 start_monitor_and_install or $failed = 1;
2787 if ($type ne "boot") {
2788 if ($failed && $bisect_skip) {
2794 dodie "Failed on boot" if $failed;
2796 do_run_test or $failed = 1;
2807 # reboot the box to a kernel we can ssh to
2808 if ($type ne "build") {
2818 my $buildtype = "oldconfig";
2820 # We should have a minconfig to use?
2821 if (defined($minconfig)) {
2822 $buildtype = "useconfig:$minconfig";
2825 # If the user sets bisect_tries to less than 1, then no tries
2829 # Still let the user manually decide that though.
2830 if ($bisect_tries < 1 && $bisect_manual) {
2831 $ret = answer_bisect;
2834 for (my $i = 0; $i < $bisect_tries; $i++) {
2835 if ($bisect_tries > 1) {
2837 doprint("Running bisect trial $t of $bisect_tries:\n");
2839 $ret = run_bisect_test $type, $buildtype;
2841 if ($bisect_manual) {
2842 $ret = answer_bisect;
2848 # Are we looking for where it worked, not failed?
2849 if ($reverse_bisect && $ret >= 0) {
2855 } elsif ($ret == 0) {
2857 } elsif ($bisect_skip) {
2858 doprint "HIT A BAD COMMIT ... SKIPPING\n";
2863 sub update_bisect_replay {
2864 my $tmp_log = "$tmpdir/ktest_bisect_log";
2865 run_command "git bisect log > $tmp_log" or
2866 die "can't create bisect log";
2875 die "BISECT_GOOD[$i] not defined\n" if (!defined($bisect_good));
2876 die "BISECT_BAD[$i] not defined\n" if (!defined($bisect_bad));
2877 die "BISECT_TYPE[$i] not defined\n" if (!defined($bisect_type));
2879 my $good = $bisect_good;
2880 my $bad = $bisect_bad;
2881 my $type = $bisect_type;
2882 my $start = $bisect_start;
2883 my $replay = $bisect_replay;
2884 my $start_files = $bisect_files;
2886 if (defined($start_files)) {
2887 $start_files = " -- " . $start_files;
2892 # convert to true sha1's
2893 $good = get_sha1($good);
2894 $bad = get_sha1($bad);
2896 if (defined($bisect_reverse) && $bisect_reverse == 1) {
2897 doprint "Performing a reverse bisect (bad is good, good is bad!)\n";
2898 $reverse_bisect = 1;
2900 $reverse_bisect = 0;
2903 # Can't have a test without having a test to run
2904 if ($type eq "test" && !defined($run_test)) {
2908 # Check if a bisect was running
2909 my $bisect_start_file = "$builddir/.git/BISECT_START";
2911 my $check = $bisect_check;
2912 my $do_check = defined($check) && $check ne "0";
2914 if ( -f $bisect_start_file ) {
2915 print "Bisect in progress found\n";
2917 print " If you say yes, then no checks of good or bad will be done\n";
2919 if (defined($replay)) {
2920 print "** BISECT_REPLAY is defined in config file **";
2921 print " Ignore config option and perform new git bisect log?\n";
2922 if (read_ync " (yes, no, or cancel) ") {
2923 $replay = update_bisect_replay;
2926 } elsif (read_yn "read git log and continue?") {
2927 $replay = update_bisect_replay;
2935 my $head = get_sha1("HEAD");
2937 if ($check ne "good") {
2938 doprint "TESTING BISECT BAD [$bad]\n";
2939 run_command "git checkout $bad" or
2940 die "Failed to checkout $bad";
2942 $result = run_bisect $type;
2944 if ($result ne "bad") {
2945 fail "Tested BISECT_BAD [$bad] and it succeeded" and return 0;
2949 if ($check ne "bad") {
2950 doprint "TESTING BISECT GOOD [$good]\n";
2951 run_command "git checkout $good" or
2952 die "Failed to checkout $good";
2954 $result = run_bisect $type;
2956 if ($result ne "good") {
2957 fail "Tested BISECT_GOOD [$good] and it failed" and return 0;
2961 # checkout where we started
2962 run_command "git checkout $head" or
2963 die "Failed to checkout $head";
2966 run_command "git bisect start$start_files" or
2967 dodie "could not start bisect";
2969 if (defined($replay)) {
2970 run_command "git bisect replay $replay" or
2971 dodie "failed to run replay";
2974 run_command "git bisect good $good" or
2975 dodie "could not set bisect good to $good";
2977 run_git_bisect "git bisect bad $bad" or
2978 dodie "could not set bisect bad to $bad";
2982 if (defined($start)) {
2983 run_command "git checkout $start" or
2984 dodie "failed to checkout $start";
2989 $result = run_bisect $type;
2990 $test = run_git_bisect "git bisect $result";
2994 run_command "git bisect log" or
2995 dodie "could not capture git bisect log";
2997 run_command "git bisect reset" or
2998 dodie "could not reset git bisect";
3000 doprint "Bad commit was [$bisect_bad_commit]\n";
3005 # config_ignore holds the configs that were set (or unset) for
3006 # a good config and we will ignore these configs for the rest
3007 # of a config bisect. These configs stay as they were.
3010 # config_set holds what all configs were set as.
3013 # config_off holds the set of configs that the bad config had disabled.
3014 # We need to record them and set them in the .config when running
3015 # olddefconfig, because olddefconfig keeps the defaults.
3018 # config_off_tmp holds a set of configs to turn off for now
3021 # config_list is the set of configs that are being tested
3027 sub assign_configs {
3028 my ($hash, $config) = @_;
3030 doprint "Reading configs from $config\n";
3033 or dodie "Failed to read $config";
3037 if (/^((CONFIG\S*)=.*)/) {
3039 } elsif (/^(# (CONFIG\S*) is not set)/) {
3047 sub process_config_ignore {
3050 assign_configs \%config_ignore, $config;
3053 sub get_dependencies {
3056 my $arr = $dependency{$config};
3057 if (!defined($arr)) {
3063 foreach my $dep (@{$arr}) {
3064 print "ADD DEP $dep\n";
3065 @deps = (@deps, get_dependencies $dep);
3072 my ($pc, $file) = @_;
3074 my %configs = %{$pc};
3076 doprint "Saving configs into $file\n";
3078 open(OUT, ">$file") or dodie "Can not write to $file";
3080 foreach my $config (keys %configs) {
3081 print OUT "$configs{$config}\n";
3087 my ($name, $pc) = @_;
3089 doprint "Creating old config from $name configs\n";
3091 save_config $pc, $output_config;
3096 # compare two config hashes, and return configs with different vals.
3097 # It returns B's config values, but you can use A to see what A was.
3098 sub diff_config_vals {
3101 # crappy Perl way to pass in hashes.
3107 foreach my $item (keys %a) {
3108 if (defined($b{$item}) && $b{$item} ne $a{$item}) {
3109 $ret{$item} = $b{$item};
3116 # compare two config hashes and return the configs in B but not A
3122 # crappy Perl way to pass in hashes.
3126 foreach my $item (keys %b) {
3127 if (!defined($a{$item})) {
3128 $ret{$item} = $b{$item};
3135 # return if two configs are equal or not
3136 # 0 is equal +1 b has something a does not
3137 # +1 if a and b have a different item.
3138 # -1 if a has something b does not
3139 sub compare_configs {
3144 # crappy Perl way to pass in hashes.
3148 foreach my $item (keys %b) {
3149 if (!defined($a{$item})) {
3152 if ($a{$item} ne $b{$item}) {
3157 foreach my $item (keys %a) {
3158 if (!defined($b{$item})) {
3166 sub run_config_bisect_test {
3169 my $ret = run_bisect_test $type, "oldconfig";
3171 if ($bisect_manual) {
3172 $ret = answer_bisect;
3178 sub process_failed {
3181 doprint "\n\n***************************************\n";
3182 doprint "Found bad config: $config\n";
3183 doprint "***************************************\n\n";
3186 # used for config bisecting
3190 sub process_new_config {
3191 my ($tc, $nc, $gc, $bc) = @_;
3193 my %tmp_config = %{$tc};
3194 my %good_configs = %{$gc};
3195 my %bad_configs = %{$bc};
3202 create_config "tmp_configs", \%tmp_config;
3203 assign_configs \%new_configs, $output_config;
3205 $ret = compare_configs \%new_configs, \%bad_configs;
3207 doprint "New config equals bad config, try next test\n";
3212 $ret = compare_configs \%new_configs, \%good_configs;
3214 doprint "New config equals good config, try next test\n";
3219 %{$nc} = %new_configs;
3224 sub run_config_bisect {
3225 my ($pgood, $pbad) = @_;
3227 my $type = $config_bisect_type;
3229 my %good_configs = %{$pgood};
3230 my %bad_configs = %{$pbad};
3232 my %diff_configs = diff_config_vals \%good_configs, \%bad_configs;
3233 my %b_configs = diff_configs \%good_configs, \%bad_configs;
3234 my %g_configs = diff_configs \%bad_configs, \%good_configs;
3236 my @diff_arr = keys %diff_configs;
3237 my $len_diff = $#diff_arr + 1;
3239 my @b_arr = keys %b_configs;
3240 my $len_b = $#b_arr + 1;
3242 my @g_arr = keys %g_configs;
3243 my $len_g = $#g_arr + 1;
3249 # First, lets get it down to a single subset.
3250 # Is the problem with a difference in values?
3251 # Is the problem with a missing config?
3252 # Is the problem with a config that breaks things?
3254 # Enable all of one set and see if we get a new bad
3257 # first set the good config to the bad values.
3259 doprint "d=$len_diff g=$len_g b=$len_b\n";
3261 # first lets enable things in bad config that are enabled in good config
3263 if ($len_diff > 0) {
3264 if ($len_b > 0 || $len_g > 0) {
3265 my %tmp_config = %bad_configs;
3267 doprint "Set tmp config to be bad config with good config values\n";
3268 foreach my $item (@diff_arr) {
3269 $tmp_config{$item} = $good_configs{$item};
3272 $runtest = process_new_config \%tmp_config, \%new_configs,
3273 \%good_configs, \%bad_configs;
3277 if (!$runtest && $len_diff > 0) {
3279 if ($len_diff == 1) {
3280 process_failed $diff_arr[0];
3283 my %tmp_config = %bad_configs;
3285 my $half = int($#diff_arr / 2);
3286 my @tophalf = @diff_arr[0 .. $half];
3288 doprint "Settings bisect with top half:\n";
3289 doprint "Set tmp config to be bad config with some good config values\n";
3290 foreach my $item (@tophalf) {
3291 $tmp_config{$item} = $good_configs{$item};
3294 $runtest = process_new_config \%tmp_config, \%new_configs,
3295 \%good_configs, \%bad_configs;
3298 my %tmp_config = %bad_configs;
3300 doprint "Try bottom half\n";
3302 my @bottomhalf = @diff_arr[$half+1 .. $#diff_arr];
3304 foreach my $item (@bottomhalf) {
3305 $tmp_config{$item} = $good_configs{$item};
3308 $runtest = process_new_config \%tmp_config, \%new_configs,
3309 \%good_configs, \%bad_configs;
3314 $ret = run_config_bisect_test $type;
3316 doprint "NEW GOOD CONFIG\n";
3317 %good_configs = %new_configs;
3318 run_command "mv $good_config ${good_config}.last";
3319 save_config \%good_configs, $good_config;
3320 %{$pgood} = %good_configs;
3322 doprint "NEW BAD CONFIG\n";
3323 %bad_configs = %new_configs;
3324 run_command "mv $bad_config ${bad_config}.last";
3325 save_config \%bad_configs, $bad_config;
3326 %{$pbad} = %bad_configs;
3331 fail "Hmm, need to do a mix match?\n";
3338 my $type = $config_bisect_type;
3341 $bad_config = $config_bisect;
3343 if (defined($config_bisect_good)) {
3344 $good_config = $config_bisect_good;
3345 } elsif (defined($minconfig)) {
3346 $good_config = $minconfig;
3348 doprint "No config specified, checking if defconfig works";
3349 $ret = run_bisect_test $type, "defconfig";
3351 fail "Have no good config to compare with, please set CONFIG_BISECT_GOOD";
3354 $good_config = $output_config;
3357 # we don't want min configs to cause issues here.
3358 doprint "Disabling 'MIN_CONFIG' for this test\n";
3365 doprint "Run good configs through make oldconfig\n";
3366 assign_configs \%tmp_configs, $good_config;
3367 create_config "$good_config", \%tmp_configs;
3368 assign_configs \%good_configs, $output_config;
3370 doprint "Run bad configs through make oldconfig\n";
3371 assign_configs \%tmp_configs, $bad_config;
3372 create_config "$bad_config", \%tmp_configs;
3373 assign_configs \%bad_configs, $output_config;
3375 $good_config = "$tmpdir/good_config";
3376 $bad_config = "$tmpdir/bad_config";
3378 save_config \%good_configs, $good_config;
3379 save_config \%bad_configs, $bad_config;
3381 if (defined($config_bisect_check) && $config_bisect_check ne "0") {
3382 if ($config_bisect_check ne "good") {
3383 doprint "Testing bad config\n";
3385 $ret = run_bisect_test $type, "useconfig:$bad_config";
3387 fail "Bad config succeeded when expected to fail!";
3391 if ($config_bisect_check ne "bad") {
3392 doprint "Testing good config\n";
3394 $ret = run_bisect_test $type, "useconfig:$good_config";
3396 fail "Good config failed when expected to succeed!";
3403 $ret = run_config_bisect \%good_configs, \%bad_configs;
3407 return $ret if ($ret < 0);
3412 sub patchcheck_reboot {
3413 doprint "Reboot and sleep $patchcheck_sleep_time seconds\n";
3414 reboot_to_good $patchcheck_sleep_time;
3420 die "PATCHCHECK_START[$i] not defined\n"
3421 if (!defined($patchcheck_start));
3422 die "PATCHCHECK_TYPE[$i] not defined\n"
3423 if (!defined($patchcheck_type));
3425 my $start = $patchcheck_start;
3427 my $cherry = $patchcheck_cherry;
3428 if (!defined($cherry)) {
3433 if (defined($patchcheck_end)) {
3434 $end = $patchcheck_end;
3436 die "PATCHCHECK_END must be defined with PATCHCHECK_CHERRY\n";
3439 # Get the true sha1's since we can use things like HEAD~3
3440 $start = get_sha1($start);
3441 $end = get_sha1($end);
3443 my $type = $patchcheck_type;
3445 # Can't have a test without having a test to run
3446 if ($type eq "test" && !defined($run_test)) {
3451 open (IN, "git cherry -v $start $end|") or
3452 dodie "could not get git list";
3454 open (IN, "git log --pretty=oneline $end|") or
3455 dodie "could not get git list";
3462 # git cherry adds a '+' we want to remove
3464 $list[$#list+1] = $_;
3465 last if (/^$start/);
3470 if ($list[$#list] !~ /^$start/) {
3471 fail "SHA1 $start not found";
3474 # go backwards in the list
3475 @list = reverse @list;
3478 doprint("Going to test the following commits:\n");
3479 foreach my $l (@list) {
3483 my $save_clean = $noclean;
3484 my %ignored_warnings;
3486 if (defined($ignore_warnings)) {
3487 foreach my $sha1 (split /\s+/, $ignore_warnings) {
3488 $ignored_warnings{$sha1} = 1;
3493 foreach my $item (@list) {
3495 $sha1 =~ s/^([[:xdigit:]]+).*/$1/;
3497 doprint "\nProcessing commit \"$item\"\n\n";
3499 run_command "git checkout $sha1" or
3500 die "Failed to checkout $sha1";
3502 # only clean on the first and last patch
3503 if ($item eq $list[0] ||
3504 $item eq $list[$#list]) {
3505 $noclean = $save_clean;
3510 if (defined($minconfig)) {
3511 build "useconfig:$minconfig" or return 0;
3513 # ?? no config to use?
3514 build "oldconfig" or return 0;
3517 # No need to do per patch checking if warnings file exists
3518 if (!defined($warnings_file) && !defined($ignored_warnings{$sha1})) {
3519 check_patch_buildlog $sha1 or return 0;
3522 check_buildlog or return 0;
3524 next if ($type eq "build");
3528 start_monitor_and_install or $failed = 1;
3530 if (!$failed && $type ne "boot"){
3531 do_run_test or $failed = 1;
3556 # $config depends on $dep
3557 my ($config, $dep) = @_;
3559 if (defined($depends{$config})) {
3560 $depends{$config} .= " " . $dep;
3562 $depends{$config} = $dep;
3565 # record the number of configs depending on $dep
3566 if (defined $depcount{$dep}) {
3569 $depcount{$dep} = 1;
3573 # taken from streamline_config.pl
3585 if (! -f $kconfig) {
3586 doprint "file $kconfig does not exist, skipping\n";
3590 open(KIN, "$kconfig")
3591 or die "Can't open $kconfig";
3595 # Make sure that lines ending with \ continue
3597 $_ = $line . " " . $_;
3608 # collect any Kconfig sources
3609 if (/^source\s*"(.*)"/) {
3610 $kconfigs[$#kconfigs+1] = $1;
3614 if (/^\s*(menu)?config\s+(\S+)\s*$/) {
3618 for (my $i = 0; $i < $iflevel; $i++) {
3619 add_dep $config, $ifdeps[$i];
3622 # collect the depends for the config
3623 } elsif ($state eq "NEW" && /^\s*depends\s+on\s+(.*)$/) {
3625 add_dep $config, $1;
3627 # Get the configs that select this config
3628 } elsif ($state eq "NEW" && /^\s*select\s+(\S+)/) {
3630 # selected by depends on config
3631 add_dep $1, $config;
3633 # Check for if statements
3634 } elsif (/^if\s+(.*\S)\s*$/) {
3636 # remove beginning and ending non text
3637 $deps =~ s/^[^a-zA-Z0-9_]*//;
3638 $deps =~ s/[^a-zA-Z0-9_]*$//;
3640 my @deps = split /[^a-zA-Z0-9_]+/, $deps;
3642 $ifdeps[$iflevel++] = join ':', @deps;
3644 } elsif (/^endif/) {
3646 $iflevel-- if ($iflevel);
3649 } elsif (/^\s*help\s*$/) {
3655 # read in any configs that were found.
3656 foreach $kconfig (@kconfigs) {
3657 if (!defined($read_kconfigs{$kconfig})) {
3658 $read_kconfigs{$kconfig} = 1;
3659 read_kconfig("$builddir/$kconfig");
3665 # find out which arch this is by the kconfig file
3666 open (IN, $output_config)
3667 or dodie "Failed to read $output_config";
3670 if (m,Linux/(\S+)\s+\S+\s+Kernel Configuration,) {
3677 if (!defined($arch)) {
3678 doprint "Could not find arch from config file\n";
3679 doprint "no dependencies used\n";
3683 # arch is really the subarch, we need to know
3684 # what directory to look at.
3685 if ($arch eq "i386" || $arch eq "x86_64") {
3687 } elsif ($arch =~ /^tile/) {
3691 my $kconfig = "$builddir/arch/$arch/Kconfig";
3693 if (! -f $kconfig && $arch =~ /\d$/) {
3695 # some subarchs have numbers, truncate them
3697 $kconfig = "$builddir/arch/$arch/Kconfig";
3698 if (! -f $kconfig) {
3699 doprint "No idea what arch dir $orig is for\n";
3700 doprint "no dependencies used\n";
3705 read_kconfig($kconfig);
3708 sub make_new_config {
3711 open (OUT, ">$output_config")
3712 or dodie "Failed to write $output_config";
3714 foreach my $config (@configs) {
3715 print OUT "$config\n";
3723 $config =~ s/CONFIG_//;
3731 my $kconfig = chomp_config $dep;
3733 $dep = $depends{"$kconfig"};
3735 # the dep string we have saves the dependencies as they
3736 # were found, including expressions like ! && ||. We
3737 # want to split this out into just an array of configs.
3739 my $valid = "A-Za-z_0-9";
3743 while ($dep =~ /[$valid]/) {
3745 if ($dep =~ /^[^$valid]*([$valid]+)/) {
3746 my $conf = "CONFIG_" . $1;
3748 $configs[$#configs + 1] = $conf;
3750 $dep =~ s/^[^$valid]*[$valid]+//;
3752 die "this should never happen";
3762 my %processed_configs;
3763 my %nochange_config;
3765 sub test_this_config {
3770 # if we already processed this config, skip it
3771 if (defined($processed_configs{$config})) {
3774 $processed_configs{$config} = 1;
3776 # if this config failed during this round, skip it
3777 if (defined($nochange_config{$config})) {
3781 my $kconfig = chomp_config $config;
3783 # Test dependencies first
3784 if (defined($depends{"$kconfig"})) {
3785 my @parents = get_depends $config;
3786 foreach my $parent (@parents) {
3787 # if the parent is in the min config, check it first
3788 next if (!defined($min_configs{$parent}));
3789 $found = test_this_config($parent);
3790 if (defined($found)) {
3796 # Remove this config from the list of configs
3797 # do a make olddefconfig and then read the resulting
3798 # .config to make sure it is missing the config that
3800 my %configs = %min_configs;
3801 $configs{$config} = "# $config is not set";
3802 make_new_config ((values %configs), (values %keep_configs));
3804 delete $configs{$config};
3806 assign_configs \%configs, $output_config;
3808 if (!defined($configs{$config}) || $configs{$config} =~ /^#/) {
3812 doprint "disabling config $config did not change .config\n";
3814 $nochange_config{$config} = 1;
3819 sub make_min_config {
3822 my $type = $minconfig_type;
3823 if ($type ne "boot" && $type ne "test") {
3824 fail "Invalid MIN_CONFIG_TYPE '$minconfig_type'\n" .
3825 " make_min_config works only with 'boot' and 'test'\n" and return;
3828 if (!defined($output_minconfig)) {
3829 fail "OUTPUT_MIN_CONFIG not defined" and return;
3832 # If output_minconfig exists, and the start_minconfig
3833 # came from min_config, than ask if we should use
3835 if (-f $output_minconfig && !$start_minconfig_defined) {
3836 print "$output_minconfig exists\n";
3837 if (!defined($use_output_minconfig)) {
3838 if (read_yn " Use it as minconfig?") {
3839 $start_minconfig = $output_minconfig;
3841 } elsif ($use_output_minconfig > 0) {
3842 doprint "Using $output_minconfig as MIN_CONFIG\n";
3843 $start_minconfig = $output_minconfig;
3845 doprint "Set to still use MIN_CONFIG as starting point\n";
3849 if (!defined($start_minconfig)) {
3850 fail "START_MIN_CONFIG or MIN_CONFIG not defined" and return;
3853 my $temp_config = "$tmpdir/temp_config";
3855 # First things first. We build an allnoconfig to find
3856 # out what the defaults are that we can't touch.
3857 # Some are selections, but we really can't handle selections.
3859 my $save_minconfig = $minconfig;
3862 run_command "$make allnoconfig" or return 0;
3866 process_config_ignore $output_config;
3868 undef %save_configs;
3871 if (defined($ignore_config)) {
3872 # make sure the file exists
3873 `touch $ignore_config`;
3874 assign_configs \%save_configs, $ignore_config;
3877 %keep_configs = %save_configs;
3879 doprint "Load initial configs from $start_minconfig\n";
3881 # Look at the current min configs, and save off all the
3882 # ones that were set via the allnoconfig
3883 assign_configs \%min_configs, $start_minconfig;
3885 my @config_keys = keys %min_configs;
3887 # All configs need a depcount
3888 foreach my $config (@config_keys) {
3889 my $kconfig = chomp_config $config;
3890 if (!defined $depcount{$kconfig}) {
3891 $depcount{$kconfig} = 0;
3895 # Remove anything that was set by the make allnoconfig
3896 # we shouldn't need them as they get set for us anyway.
3897 foreach my $config (@config_keys) {
3898 # Remove anything in the ignore_config
3899 if (defined($keep_configs{$config})) {
3900 my $file = $ignore_config;
3901 $file =~ s,.*/(.*?)$,$1,;
3902 doprint "$config set by $file ... ignored\n";
3903 delete $min_configs{$config};
3906 # But make sure the settings are the same. If a min config
3907 # sets a selection, we do not want to get rid of it if
3908 # it is not the same as what we have. Just move it into
3910 if (defined($config_ignore{$config})) {
3911 if ($config_ignore{$config} ne $min_configs{$config}) {
3912 doprint "$config is in allnoconfig as '$config_ignore{$config}'";
3913 doprint " but it is '$min_configs{$config}' in minconfig .. keeping\n";
3914 $keep_configs{$config} = $min_configs{$config};
3916 doprint "$config set by allnoconfig ... ignored\n";
3918 delete $min_configs{$config};
3930 # Now disable each config one by one and do a make oldconfig
3931 # till we find a config that changes our list.
3933 my @test_configs = keys %min_configs;
3935 # Sort keys by who is most dependent on
3936 @test_configs = sort { $depcount{chomp_config($b)} <=> $depcount{chomp_config($a)} }
3939 # Put configs that did not modify the config at the end.
3941 for (my $i = 0; $i < $#test_configs; $i++) {
3942 if (!defined($nochange_config{$test_configs[0]})) {
3946 # This config didn't change the .config last time.
3947 # Place it at the end
3948 my $config = shift @test_configs;
3949 push @test_configs, $config;
3952 # if every test config has failed to modify the .config file
3953 # in the past, then reset and start over.
3955 undef %nochange_config;
3958 undef %processed_configs;
3960 foreach my $config (@test_configs) {
3962 $found = test_this_config $config;
3964 last if (defined($found));
3966 # oh well, try another config
3969 if (!defined($found)) {
3970 # we could have failed due to the nochange_config hash
3971 # reset and try again
3973 undef %nochange_config;
3977 doprint "No more configs found that we can disable\n";
3985 doprint "Test with $config disabled\n";
3987 # set in_bisect to keep build and monitor from dieing
3991 build "oldconfig" or $failed = 1;
3993 start_monitor_and_install or $failed = 1;
3995 if ($type eq "test" && !$failed) {
3996 do_run_test or $failed = 1;
4005 doprint "$min_configs{$config} is needed to boot the box... keeping\n";
4006 # this config is needed, add it to the ignore list.
4007 $keep_configs{$config} = $min_configs{$config};
4008 $save_configs{$config} = $min_configs{$config};
4009 delete $min_configs{$config};
4011 # update new ignore configs
4012 if (defined($ignore_config)) {
4013 open (OUT, ">$temp_config")
4014 or die "Can't write to $temp_config";
4015 foreach my $config (keys %save_configs) {
4016 print OUT "$save_configs{$config}\n";
4019 run_command "mv $temp_config $ignore_config" or
4020 dodie "failed to copy update to $ignore_config";
4024 # We booted without this config, remove it from the minconfigs.
4025 doprint "$config is not needed, disabling\n";
4027 delete $min_configs{$config};
4029 # Also disable anything that is not enabled in this config
4031 assign_configs \%configs, $output_config;
4032 my @config_keys = keys %min_configs;
4033 foreach my $config (@config_keys) {
4034 if (!defined($configs{$config})) {
4035 doprint "$config is not set, disabling\n";
4036 delete $min_configs{$config};
4040 # Save off all the current mandatory configs
4041 open (OUT, ">$temp_config")
4042 or die "Can't write to $temp_config";
4043 foreach my $config (keys %keep_configs) {
4044 print OUT "$keep_configs{$config}\n";
4046 foreach my $config (keys %min_configs) {
4047 print OUT "$min_configs{$config}\n";
4051 run_command "mv $temp_config $output_minconfig" or
4052 dodie "failed to copy update to $output_minconfig";
4055 doprint "Reboot and wait $sleep_time seconds\n";
4056 reboot_to_good $sleep_time;
4063 sub make_warnings_file {
4066 if (!defined($warnings_file)) {
4067 dodie "Must define WARNINGS_FILE for make_warnings_file test";
4070 if ($build_type eq "nobuild") {
4071 dodie "BUILD_TYPE can not be 'nobuild' for make_warnings_file test";
4074 build $build_type or dodie "Failed to build";
4076 open(OUT, ">$warnings_file") or dodie "Can't create $warnings_file";
4078 open(IN, $buildlog) or dodie "Can't open $buildlog";
4081 # Some compilers use UTF-8 extended for quotes
4082 # for distcc heterogeneous systems, this causes issues
4085 if (/$check_build_re/) {
4096 $#ARGV < 1 or die "ktest.pl version: $VERSION\n usage: ktest.pl [config-file]\n";
4099 $ktest_config = $ARGV[0];
4100 if (! -f $ktest_config) {
4101 print "$ktest_config does not exist.\n";
4102 if (!read_yn "Create it?") {
4108 if (! -f $ktest_config) {
4111 open(OUT, ">$ktest_config") or die "Can not create $ktest_config";
4113 # Generated by ktest.pl
4116 # PWD is a ktest.pl variable that will result in the process working
4117 # directory that ktest.pl is executed in.
4119 # THIS_DIR is automatically assigned the PWD of the path that generated
4120 # the config file. It is best to use this variable when assigning other
4121 # directory paths within this directory. This allows you to easily
4122 # move the test cases to other locations or to other machines.
4124 THIS_DIR := $variable{"PWD"}
4126 # Define each test with TEST_START
4127 # The config options below it will override the defaults
4129 TEST_TYPE = $default{"TEST_TYPE"}
4136 read_config $ktest_config;
4138 if (defined($opt{"LOG_FILE"})) {
4139 $opt{"LOG_FILE"} = eval_option("LOG_FILE", $opt{"LOG_FILE"}, -1);
4142 # Append any configs entered in manually to the config file.
4143 my @new_configs = keys %entered_configs;
4144 if ($#new_configs >= 0) {
4145 print "\nAppending entered in configs to $ktest_config\n";
4146 open(OUT, ">>$ktest_config") or die "Can not append to $ktest_config";
4147 foreach my $config (@new_configs) {
4148 print OUT "$config = $entered_configs{$config}\n";
4149 $opt{$config} = process_variables($entered_configs{$config});
4153 if ($opt{"CLEAR_LOG"} && defined($opt{"LOG_FILE"})) {
4154 unlink $opt{"LOG_FILE"};
4157 doprint "\n\nSTARTING AUTOMATED TESTS\n\n";
4159 for (my $i = 0, my $repeat = 1; $i <= $opt{"NUM_TESTS"}; $i += $repeat) {
4162 doprint "DEFAULT OPTIONS:\n";
4164 doprint "\nTEST $i OPTIONS";
4165 if (defined($repeat_tests{$i})) {
4166 $repeat = $repeat_tests{$i};
4167 doprint " ITERATE $repeat";
4172 foreach my $option (sort keys %opt) {
4174 if ($option =~ /\[(\d+)\]$/) {
4180 doprint "$option = $opt{$option}\n";
4184 sub option_defined {
4187 if (defined($opt{$option}) && $opt{$option} !~ /^\s*$/) {
4194 sub __set_test_option {
4195 my ($name, $i) = @_;
4197 my $option = "$name\[$i\]";
4199 if (option_defined($option)) {
4200 return $opt{$option};
4203 foreach my $test (keys %repeat_tests) {
4205 $i < $test + $repeat_tests{$test}) {
4206 $option = "$name\[$test\]";
4207 if (option_defined($option)) {
4208 return $opt{$option};
4213 if (option_defined($name)) {
4220 sub set_test_option {
4221 my ($name, $i) = @_;
4223 my $option = __set_test_option($name, $i);
4224 return $option if (!defined($option));
4226 return eval_option($name, $option, $i);
4229 # First we need to do is the builds
4230 for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {
4232 # Do not reboot on failing test options
4234 $reboot_success = 0;
4245 undef %force_config;
4247 my $makecmd = set_test_option("MAKE_CMD", $i);
4249 $outputdir = set_test_option("OUTPUT_DIR", $i);
4250 $builddir = set_test_option("BUILD_DIR", $i);
4252 chdir $builddir || die "can't change directory to $builddir";
4254 if (!-d $outputdir) {
4255 mkpath($outputdir) or
4256 die "can't create $outputdir";
4259 $make = "$makecmd O=$outputdir";
4261 # Load all the options into their mapped variable names
4262 foreach my $opt (keys %option_map) {
4263 ${$option_map{$opt}} = set_test_option($opt, $i);
4266 $start_minconfig_defined = 1;
4268 # The first test may override the PRE_KTEST option
4269 if (defined($pre_ktest) && $i == 1) {
4271 run_command $pre_ktest;
4274 # Any test can override the POST_KTEST option
4275 # The last test takes precedence.
4276 if (defined($post_ktest)) {
4277 $final_post_ktest = $post_ktest;
4280 if (!defined($start_minconfig)) {
4281 $start_minconfig_defined = 0;
4282 $start_minconfig = $minconfig;
4287 die "can't create $tmpdir";
4290 $ENV{"SSH_USER"} = $ssh_user;
4291 $ENV{"MACHINE"} = $machine;
4293 $buildlog = "$tmpdir/buildlog-$machine";
4294 $testlog = "$tmpdir/testlog-$machine";
4295 $dmesg = "$tmpdir/dmesg-$machine";
4296 $output_config = "$outputdir/.config";
4299 $target = "$ssh_user\@$machine";
4300 if ($reboot_type eq "grub") {
4301 dodie "GRUB_MENU not defined" if (!defined($grub_menu));
4302 } elsif ($reboot_type eq "grub2") {
4303 dodie "GRUB_MENU not defined" if (!defined($grub_menu));
4304 dodie "GRUB_FILE not defined" if (!defined($grub_file));
4305 } elsif ($reboot_type eq "syslinux") {
4306 dodie "SYSLINUX_LABEL not defined" if (!defined($syslinux_label));
4310 my $run_type = $build_type;
4311 if ($test_type eq "patchcheck") {
4312 $run_type = $patchcheck_type;
4313 } elsif ($test_type eq "bisect") {
4314 $run_type = $bisect_type;
4315 } elsif ($test_type eq "config_bisect") {
4316 $run_type = $config_bisect_type;
4317 } elsif ($test_type eq "make_min_config") {
4319 } elsif ($test_type eq "make_warnings_file") {
4323 # mistake in config file?
4324 if (!defined($run_type)) {
4325 $run_type = "ERROR";
4329 $installme = " no_install" if ($no_install);
4333 if (defined($test_name)) {
4334 $name = " ($test_name)";
4338 doprint "RUNNING TEST $i of $opt{NUM_TESTS}$name with option $test_type $run_type$installme\n\n";
4340 if (defined($pre_test)) {
4341 run_command $pre_test;
4348 if (defined($addconfig)) {
4349 my $min = $minconfig;
4350 if (!defined($minconfig)) {
4353 run_command "cat $addconfig $min > $tmpdir/add_config" or
4354 dodie "Failed to create temp config";
4355 $minconfig = "$tmpdir/add_config";
4358 if (defined($checkout)) {
4359 run_command "git checkout $checkout" or
4360 die "failed to checkout $checkout";
4365 # A test may opt to not reboot the box
4366 if ($reboot_on_success) {
4367 $reboot_success = 1;
4370 if ($test_type eq "bisect") {
4373 } elsif ($test_type eq "config_bisect") {
4376 } elsif ($test_type eq "patchcheck") {
4379 } elsif ($test_type eq "make_min_config") {
4382 } elsif ($test_type eq "make_warnings_file") {
4384 make_warnings_file $i;
4388 if ($build_type ne "nobuild") {
4389 build $build_type or next;
4390 check_buildlog or next;
4393 if ($test_type eq "install") {
4400 if ($test_type ne "build") {
4402 start_monitor_and_install or $failed = 1;
4404 if (!$failed && $test_type ne "boot" && defined($run_test)) {
4405 do_run_test or $failed = 1;
4419 if (defined($final_post_ktest)) {
4420 run_command $final_post_ktest;
4423 if ($opt{"POWEROFF_ON_SUCCESS"}) {
4425 } elsif ($opt{"REBOOT_ON_SUCCESS"} && !do_not_reboot && $reboot_success) {
4427 } elsif (defined($switch_to_good)) {
4428 # still need to get to the good kernel
4429 run_command $switch_to_good;
4433 doprint "\n $successes of $opt{NUM_TESTS} tests were successful\n\n";