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);
24 $default{"NUM_TESTS"} = 1;
25 $default{"REBOOT_TYPE"} = "grub";
26 $default{"TEST_TYPE"} = "test";
27 $default{"BUILD_TYPE"} = "randconfig";
28 $default{"MAKE_CMD"} = "make";
29 $default{"TIMEOUT"} = 120;
30 $default{"TMP_DIR"} = "/tmp/ktest/\${MACHINE}";
31 $default{"SLEEP_TIME"} = 60; # sleep time between tests
32 $default{"BUILD_NOCLEAN"} = 0;
33 $default{"REBOOT_ON_ERROR"} = 0;
34 $default{"POWEROFF_ON_ERROR"} = 0;
35 $default{"REBOOT_ON_SUCCESS"} = 1;
36 $default{"POWEROFF_ON_SUCCESS"} = 0;
37 $default{"BUILD_OPTIONS"} = "";
38 $default{"BISECT_SLEEP_TIME"} = 60; # sleep time between bisects
39 $default{"PATCHCHECK_SLEEP_TIME"} = 60; # sleep time between patch checks
40 $default{"CLEAR_LOG"} = 0;
41 $default{"BISECT_MANUAL"} = 0;
42 $default{"BISECT_SKIP"} = 1;
43 $default{"SUCCESS_LINE"} = "login:";
44 $default{"DETECT_TRIPLE_FAULT"} = 1;
45 $default{"NO_INSTALL"} = 0;
46 $default{"BOOTED_TIMEOUT"} = 1;
47 $default{"DIE_ON_FAILURE"} = 1;
48 $default{"SSH_EXEC"} = "ssh \$SSH_USER\@\$MACHINE \$SSH_COMMAND";
49 $default{"SCP_TO_TARGET"} = "scp \$SRC_FILE \$SSH_USER\@\$MACHINE:\$DST_FILE";
50 $default{"REBOOT"} = "ssh \$SSH_USER\@\$MACHINE reboot";
51 $default{"STOP_AFTER_SUCCESS"} = 10;
52 $default{"STOP_AFTER_FAILURE"} = 60;
53 $default{"STOP_TEST_AFTER"} = 600;
54 $default{"LOCALVERSION"} = "-test";
76 my $poweroff_on_error;
78 my $powercycle_after_reboot;
79 my $poweroff_after_halt;
92 my $start_minconfig_defined;
101 my $config_bisect_good;
102 my $in_patchcheck = 0;
111 my $bisect_sleep_time;
112 my $patchcheck_sleep_time;
118 my $detect_triplefault;
120 my $reboot_success_line;
122 my $stop_after_success;
123 my $stop_after_failure;
136 # do not force reboots on config problems
139 $config_help{"MACHINE"} = << "EOF"
140 The machine hostname that you will test.
143 $config_help{"SSH_USER"} = << "EOF"
144 The box is expected to have ssh on normal bootup, provide the user
145 (most likely root, since you need privileged operations)
148 $config_help{"BUILD_DIR"} = << "EOF"
149 The directory that contains the Linux source code (full path).
152 $config_help{"OUTPUT_DIR"} = << "EOF"
153 The directory that the objects will be built (full path).
154 (can not be same as BUILD_DIR)
157 $config_help{"BUILD_TARGET"} = << "EOF"
158 The location of the compiled file to copy to the target.
159 (relative to OUTPUT_DIR)
162 $config_help{"TARGET_IMAGE"} = << "EOF"
163 The place to put your image on the test machine.
166 $config_help{"POWER_CYCLE"} = << "EOF"
167 A script or command to reboot the box.
169 Here is a digital loggers power switch example
170 POWER_CYCLE = wget --no-proxy -O /dev/null -q --auth-no-challenge 'http://admin:admin\@power/outlet?5=CCL'
172 Here is an example to reboot a virtual box on the current host
173 with the name "Guest".
174 POWER_CYCLE = virsh destroy Guest; sleep 5; virsh start Guest
177 $config_help{"CONSOLE"} = << "EOF"
178 The script or command that reads the console
180 If you use ttywatch server, something like the following would work.
181 CONSOLE = nc -d localhost 3001
183 For a virtual machine with guest name "Guest".
184 CONSOLE = virsh console Guest
187 $config_help{"LOCALVERSION"} = << "EOF"
188 Required version ending to differentiate the test
189 from other linux builds on the system.
192 $config_help{"REBOOT_TYPE"} = << "EOF"
193 Way to reboot the box to the test kernel.
194 Only valid options so far are "grub" and "script".
196 If you specify grub, it will assume grub version 1
197 and will search in /boot/grub/menu.lst for the title \$GRUB_MENU
198 and select that target to reboot to the kernel. If this is not
199 your setup, then specify "script" and have a command or script
200 specified in REBOOT_SCRIPT to boot to the target.
202 The entry in /boot/grub/menu.lst must be entered in manually.
203 The test will not modify that file.
206 $config_help{"GRUB_MENU"} = << "EOF"
207 The grub title name for the test kernel to boot
208 (Only mandatory if REBOOT_TYPE = grub)
210 Note, ktest.pl will not update the grub menu.lst, you need to
211 manually add an option for the test. ktest.pl will search
212 the grub menu.lst for this option to find what kernel to
215 For example, if in the /boot/grub/menu.lst the test kernel title has:
218 GRUB_MENU = Test Kernel
221 $config_help{"REBOOT_SCRIPT"} = << "EOF"
222 A script to reboot the target into the test kernel
223 (Only mandatory if REBOOT_TYPE = script)
233 print "$prompt [Y/n] ";
236 if ($ans =~ /^\s*$/) {
239 last if ($ans =~ /^y$/i || $ans =~ /^n$/i);
240 print "Please answer either 'y' or 'n'.\n";
242 if ($ans !~ /^y$/i) {
248 sub get_ktest_config {
251 return if (defined($opt{$config}));
253 if (defined($config_help{$config})) {
255 print $config_help{$config};
260 if (defined($default{$config})) {
261 print "\[$default{$config}\] ";
263 $entered_configs{$config} = <STDIN>;
264 $entered_configs{$config} =~ s/^\s*(.*\S)\s*$/$1/;
265 if ($entered_configs{$config} =~ /^\s*$/) {
266 if ($default{$config}) {
267 $entered_configs{$config} = $default{$config};
269 print "Your answer can not be blank\n";
277 sub get_ktest_configs {
278 get_ktest_config("MACHINE");
279 get_ktest_config("SSH_USER");
280 get_ktest_config("BUILD_DIR");
281 get_ktest_config("OUTPUT_DIR");
282 get_ktest_config("BUILD_TARGET");
283 get_ktest_config("TARGET_IMAGE");
284 get_ktest_config("POWER_CYCLE");
285 get_ktest_config("CONSOLE");
286 get_ktest_config("LOCALVERSION");
288 my $rtype = $opt{"REBOOT_TYPE"};
290 if (!defined($rtype)) {
291 if (!defined($opt{"GRUB_MENU"})) {
292 get_ktest_config("REBOOT_TYPE");
293 $rtype = $entered_configs{"REBOOT_TYPE"};
299 if ($rtype eq "grub") {
300 get_ktest_config("GRUB_MENU");
302 get_ktest_config("REBOOT_SCRIPT");
306 sub process_variables {
310 # We want to check for '\', and it is just easier
311 # to check the previous characet of '$' and not need
312 # to worry if '$' is the first character. By adding
313 # a space to $value, we can just check [^\\]\$ and
314 # it will still work.
317 while ($value =~ /(.*?[^\\])\$\{(.*?)\}(.*)/) {
321 # append beginning of value to retval
322 $retval = "$retval$begin";
323 if (defined($variable{$var})) {
324 $retval = "$retval$variable{$var}";
326 # put back the origin piece.
327 $retval = "$retval\$\{$var\}";
331 $retval = "$retval$value";
333 # remove the space added in the beginning
340 my ($lvalue, $rvalue) = @_;
342 if (defined($opt{$lvalue})) {
343 die "Error: Option $lvalue defined more than once!\n";
345 if ($rvalue =~ /^\s*$/) {
346 delete $opt{$lvalue};
348 $rvalue = process_variables($rvalue);
349 $opt{$lvalue} = $rvalue;
354 my ($lvalue, $rvalue) = @_;
356 if ($rvalue =~ /^\s*$/) {
357 delete $variable{$lvalue};
359 $rvalue = process_variables($rvalue);
360 $variable{$lvalue} = $rvalue;
367 open(IN, $config) || die "can't read file $config";
370 $name =~ s,.*/(.*),$1,;
375 my $num_tests_set = 0;
382 # ignore blank lines and comments
383 next if (/^\s*$/ || /\s*\#/);
385 if (/^\s*TEST_START(.*)/) {
389 if ($num_tests_set) {
390 die "$name: $.: Can not specify both NUM_TESTS and TEST_START\n";
393 my $old_test_num = $test_num;
394 my $old_repeat = $repeat;
396 $test_num += $repeat;
400 if ($rest =~ /\s+SKIP(.*)/) {
408 if ($rest =~ /\s+ITERATE\s+(\d+)(.*)$/) {
411 $repeat_tests{"$test_num"} = $repeat;
414 if ($rest =~ /\s+SKIP(.*)/) {
419 if ($rest !~ /^\s*$/) {
420 die "$name: $.: Gargbage found after TEST_START\n$_";
424 $test_num = $old_test_num;
425 $repeat = $old_repeat;
428 } elsif (/^\s*DEFAULTS(.*)$/) {
433 if ($rest =~ /\s+SKIP(.*)/) {
440 if ($rest !~ /^\s*$/) {
441 die "$name: $.: Gargbage found after DEFAULTS\n$_";
444 } elsif (/^\s*([A-Z_\[\]\d]+)\s*=\s*(.*?)\s*$/) {
452 ($lvalue eq "NUM_TESTS" ||
453 $lvalue eq "LOG_FILE" ||
454 $lvalue eq "CLEAR_LOG")) {
455 die "$name: $.: $lvalue must be set in DEFAULTS section\n";
458 if ($lvalue eq "NUM_TESTS") {
460 die "$name: $.: Can not specify both NUM_TESTS and TEST_START\n";
463 die "$name: $.: NUM_TESTS must be set in default section\n";
468 if ($default || $lvalue =~ /\[\d+\]$/) {
469 set_value($lvalue, $rvalue);
471 my $val = "$lvalue\[$test_num\]";
472 set_value($val, $rvalue);
475 $repeats{$val} = $repeat;
478 } elsif (/^\s*([A-Z_\[\]\d]+)\s*:=\s*(.*?)\s*$/) {
484 # process config variables.
485 # Config variables are only active while reading the
486 # config and can be defined anywhere. They also ignore
487 # TEST_START and DEFAULTS, but are skipped if they are in
488 # on of these sections that have SKIP defined.
489 # The save variable can be
490 # defined multiple times and the new one simply overrides
492 set_variable($lvalue, $rvalue);
495 die "$name: $.: Garbage found in config\n$_";
502 $test_num += $repeat - 1;
503 $opt{"NUM_TESTS"} = $test_num;
506 # make sure we have all mandatory configs
509 # was a test specified?
511 print "No test case specified.\n";
512 print "What test case would you like to run?\n";
515 $default{"TEST_TYPE"} = $ans;
520 foreach my $default (keys %default) {
521 if (!defined($opt{$default})) {
522 $opt{$default} = $default{$default};
528 my ($option, $i) = @_;
530 # Add space to evaluate the character before $
531 $option = " $option";
534 while ($option =~ /(.*?[^\\])\$\{(.*?)\}(.*)/) {
539 # Append beginning of line
540 $retval = "$retval$start";
542 # If the iteration option OPT[$i] exists, then use that.
543 # otherwise see if the default OPT (without [$i]) exists.
545 my $o = "$var\[$i\]";
547 if (defined($opt{$o})) {
549 $retval = "$retval$o";
550 } elsif (defined($opt{$var})) {
552 $retval = "$retval$o";
554 $retval = "$retval\$\{$var\}";
560 $retval = "$retval$option";
568 my ($option, $i) = @_;
572 # Since an option can evaluate to another option,
573 # keep iterating until we do not evaluate any more
576 while ($prev ne $option) {
577 # Check for recursive evaluations.
578 # 100 deep should be more than enough.
580 die "Over 100 evaluations accurred with $option\n" .
581 "Check for recursive variables\n";
584 $option = __eval_option($option, $i);
591 if (defined($opt{"LOG_FILE"})) {
592 open(OUT, ">> $opt{LOG_FILE}") or die "Can't write to $opt{LOG_FILE}";
599 if (defined($opt{"LOG_FILE"})) {
614 sub wait_for_monitor;
619 if (defined($time)) {
621 # flush out current monitor
622 # May contain the reboot success line
626 # try to reboot normally
627 if (run_command $reboot) {
628 if (defined($powercycle_after_reboot)) {
629 sleep $powercycle_after_reboot;
630 run_command "$power_cycle";
633 # nope? power cycle it.
634 run_command "$power_cycle";
637 if (defined($time)) {
638 wait_for_monitor($time, $reboot_success_line);
646 return $test_type eq "build" || $no_reboot ||
647 ($test_type eq "patchcheck" && $opt{"PATCHCHECK_TYPE[$i]"} eq "build") ||
648 ($test_type eq "bisect" && $opt{"BISECT_TYPE[$i]"} eq "build");
652 doprint "CRITICAL FAILURE... ", @_, "\n";
656 if ($reboot_on_error && !do_not_reboot) {
658 doprint "REBOOTING\n";
661 } elsif ($poweroff_on_error && defined($power_off)) {
662 doprint "POWERING OFF\n";
666 if (defined($opt{"LOG_FILE"})) {
667 print " See $opt{LOG_FILE} for more info.\n";
678 my $pid = open($fp, "$console|") or
679 dodie "Can't open console $console";
681 $flags = fcntl($fp, F_GETFL, 0) or
682 dodie "Can't get flags for the socket: $!";
683 $flags = fcntl($fp, F_SETFL, $flags | O_NONBLOCK) or
684 dodie "Can't set flags for the socket: $!";
692 doprint "kill child process $pid\n";
700 if ($monitor_cnt++) {
703 $monitor_fp = \*MONFD;
704 $monitor_pid = open_console $monitor_fp;
708 open(MONFD, "Stop perl from warning about single use of MONFD");
712 if (--$monitor_cnt) {
715 close_console($monitor_fp, $monitor_pid);
718 sub wait_for_monitor {
719 my ($time, $stop) = @_;
724 doprint "** Wait for monitor to settle down **\n";
726 # read the monitor and wait for the system to calm down
728 $line = wait_for_input($monitor_fp, $time);
729 last if (!defined($line));
733 if (defined($stop) && $full_line =~ /$stop/) {
734 doprint "wait for monitor detected $stop\n";
742 print "** Monitor flushed **\n";
747 if ($die_on_failure) {
755 # no need to reboot for just building.
756 if (!do_not_reboot) {
757 doprint "REBOOTING\n";
763 if (defined($test_name)) {
764 $name = " ($test_name)";
767 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
768 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
769 doprint "KTEST RESULT: TEST $i$name Failed: ", @_, "\n";
770 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
771 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
773 return 1 if (!defined($store_failures));
776 my $date = sprintf "%04d%02d%02d%02d%02d%02d",
777 1900+$t[5],$t[4],$t[3],$t[2],$t[1],$t[0];
779 my $type = $build_type;
780 if ($type =~ /useconfig/) {
784 my $dir = "$machine-$test_type-$type-fail-$date";
785 my $faildir = "$store_failures/$dir";
789 die "can't create $faildir";
791 if (-f "$output_config") {
792 cp "$output_config", "$faildir/config" or
793 die "failed to copy .config";
796 cp $buildlog, "$faildir/buildlog" or
797 die "failed to move $buildlog";
800 cp $dmesg, "$faildir/dmesg" or
801 die "failed to move $dmesg";
804 doprint "*** Saved info to $faildir ***\n";
815 $command =~ s/\$SSH_USER/$ssh_user/g;
816 $command =~ s/\$MACHINE/$machine/g;
818 doprint("$command ... ");
820 $pid = open(CMD, "$command 2>&1 |") or
821 (fail "unable to exec $command" and return 0);
823 if (defined($opt{"LOG_FILE"})) {
824 open(LOG, ">>$opt{LOG_FILE}") or
825 dodie "failed to write to log";
829 if (defined($redirect)) {
830 open (RD, ">$redirect") or
831 dodie "failed to write to redirect $redirect";
836 print LOG if ($dolog);
844 close(LOG) if ($dolog);
845 close(RD) if ($dord);
858 my $cp_exec = $ssh_exec;
860 $cp_exec =~ s/\$SSH_COMMAND/$cmd/g;
861 return run_command "$cp_exec";
865 my ($src, $dst) = @_;
866 my $cp_scp = $scp_to_target;
868 $cp_scp =~ s/\$SRC_FILE/$src/g;
869 $cp_scp =~ s/\$DST_FILE/$dst/g;
871 return run_command "$cp_scp";
876 if ($reboot_type ne "grub") {
879 return if (defined($grub_number));
881 doprint "Find grub menu ... ";
884 my $ssh_grub = $ssh_exec;
885 $ssh_grub =~ s,\$SSH_COMMAND,cat /boot/grub/menu.lst,g;
887 open(IN, "$ssh_grub |")
888 or die "unable to get menu.lst";
893 if (/^\s*title\s+$grub_menu\s*$/) {
897 } elsif (/^\s*title\s/) {
903 die "Could not find '$grub_menu' in /boot/grub/menu on $machine"
905 doprint "$grub_number\n";
910 my ($fp, $time) = @_;
916 if (!defined($time)) {
921 vec($rin, fileno($fp), 1) = 1;
922 $ready = select($rin, undef, undef, $time);
926 # try to read one char at a time
927 while (sysread $fp, $ch, 1) {
929 last if ($ch eq "\n");
932 if (!length($line)) {
940 if ($reboot_type eq "grub") {
941 run_ssh "'(echo \"savedefault --default=$grub_number --once\" | grub --batch && reboot)'";
945 run_command "$reboot_script";
951 doprint "git rev-list --max-count=1 $commit ... ";
952 my $sha1 = `git rev-list --max-count=1 $commit`;
959 dodie "Failed to get git $commit";
972 my $skip_call_trace = 0;
980 open(DMESG, "> $dmesg") or
981 die "unable to write to $dmesg";
987 my $monitor_start = time;
989 my $version_found = 0;
993 if ($bug && defined($stop_after_failure) &&
994 $stop_after_failure >= 0) {
995 my $time = $stop_after_failure - (time - $failure_start);
996 $line = wait_for_input($monitor_fp, $time);
997 if (!defined($line)) {
998 doprint "bug timed out after $booted_timeout seconds\n";
999 doprint "Test forced to stop after $stop_after_failure seconds after failure\n";
1003 $line = wait_for_input($monitor_fp, $booted_timeout);
1004 if (!defined($line)) {
1005 my $s = $booted_timeout == 1 ? "" : "s";
1006 doprint "Successful boot found: break after $booted_timeout second$s\n";
1010 $line = wait_for_input($monitor_fp);
1011 if (!defined($line)) {
1012 my $s = $timeout == 1 ? "" : "s";
1013 doprint "Timed out after $timeout second$s\n";
1021 # we are not guaranteed to get a full line
1022 $full_line .= $line;
1024 if ($full_line =~ /$success_line/) {
1026 $success_start = time;
1029 if ($booted && defined($stop_after_success) &&
1030 $stop_after_success >= 0) {
1032 if ($now - $success_start >= $stop_after_success) {
1033 doprint "Test forced to stop after $stop_after_success seconds after success\n";
1038 if ($full_line =~ /\[ backtrace testing \]/) {
1039 $skip_call_trace = 1;
1042 if ($full_line =~ /call trace:/i) {
1043 if (!$bug && !$skip_call_trace) {
1045 $failure_start = time;
1049 if ($bug && defined($stop_after_failure) &&
1050 $stop_after_failure >= 0) {
1052 if ($now - $failure_start >= $stop_after_failure) {
1053 doprint "Test forced to stop after $stop_after_failure seconds after failure\n";
1058 if ($full_line =~ /\[ end of backtrace testing \]/) {
1059 $skip_call_trace = 0;
1062 if ($full_line =~ /Kernel panic -/) {
1063 $failure_start = time;
1067 # Detect triple faults by testing the banner
1068 if ($full_line =~ /\bLinux version (\S+).*\n/) {
1069 if ($1 eq $version) {
1071 } elsif ($version_found && $detect_triplefault) {
1072 # We already booted into the kernel we are testing,
1073 # but now we booted into another kernel?
1074 # Consider this a triple fault.
1075 doprint "Aleady booted in Linux kernel $version, but now\n";
1076 doprint "we booted into Linux kernel $1.\n";
1077 doprint "Assuming that this is a triple fault.\n";
1078 doprint "To disable this: set DETECT_TRIPLE_FAULT to 0\n";
1083 if ($line =~ /\n/) {
1087 if ($stop_test_after > 0 && !$booted && !$bug) {
1088 if (time - $monitor_start > $stop_test_after) {
1089 doprint "STOP_TEST_AFTER ($stop_test_after seconds) timed out\n";
1098 return 0 if ($in_bisect);
1099 fail "failed - got a bug report" and return 0;
1103 return 0 if ($in_bisect);
1104 fail "failed - never got a boot prompt." and return 0;
1110 sub do_post_install {
1112 return if (!defined($post_install));
1114 my $cp_post_install = $post_install;
1115 $cp_post_install =~ s/\$KERNEL_VERSION/$version/g;
1116 run_command "$cp_post_install" or
1117 dodie "Failed to run post install";
1122 return if ($no_install);
1124 run_scp "$outputdir/$build_target", "$target_image" or
1125 dodie "failed to copy image";
1127 my $install_mods = 0;
1129 # should we process modules?
1131 open(IN, "$output_config") or dodie("Can't read config file");
1133 if (/CONFIG_MODULES(=y)?/) {
1134 $install_mods = 1 if (defined($1));
1140 if (!$install_mods) {
1142 doprint "No modules needed\n";
1146 run_command "$make INSTALL_MOD_PATH=$tmpdir modules_install" or
1147 dodie "Failed to install modules";
1149 my $modlib = "/lib/modules/$version";
1150 my $modtar = "ktest-mods.tar.bz2";
1152 run_ssh "rm -rf $modlib" or
1153 dodie "failed to remove old mods: $modlib";
1155 # would be nice if scp -r did not follow symbolic links
1156 run_command "cd $tmpdir && tar -cjf $modtar lib/modules/$version" or
1157 dodie "making tarball";
1159 run_scp "$tmpdir/$modtar", "/tmp" or
1160 dodie "failed to copy modules";
1162 unlink "$tmpdir/$modtar";
1164 run_ssh "'(cd / && tar xjf /tmp/$modtar)'" or
1165 dodie "failed to tar modules";
1167 run_ssh "rm -f /tmp/$modtar";
1173 # get the release name
1174 doprint "$make kernelrelease ... ";
1175 $version = `$make kernelrelease | tail -1`;
1177 doprint "$version\n";
1180 sub start_monitor_and_boot {
1189 sub check_buildlog {
1192 my @files = `git show $patch | diffstat -l`;
1194 open(IN, "git show $patch |") or
1195 dodie "failed to show $patch";
1197 if (m,^--- a/(.*),) {
1199 $files[$#files] = $1;
1204 open(IN, $buildlog) or dodie "Can't open $buildlog";
1206 if (/^\s*(.*?):.*(warning|error)/) {
1208 foreach my $file (@files) {
1209 my $fullpath = "$builddir/$file";
1210 if ($file eq $err || $fullpath eq $err) {
1211 fail "$file built with warnings" and return 0;
1221 sub apply_min_config {
1222 my $outconfig = "$output_config.new";
1224 # Read the config file and remove anything that
1225 # is in the force_config hash (from minconfig and others)
1226 # then add the force config back.
1228 doprint "Applying minimum configurations into $output_config.new\n";
1230 open (OUT, ">$outconfig") or
1231 dodie "Can't create $outconfig";
1233 if (-f $output_config) {
1234 open (IN, $output_config) or
1235 dodie "Failed to open $output_config";
1237 if (/^(# )?(CONFIG_[^\s=]*)/) {
1238 next if (defined($force_config{$2}));
1244 foreach my $config (keys %force_config) {
1245 print OUT "$force_config{$config}\n";
1249 run_command "mv $outconfig $output_config";
1252 sub make_oldconfig {
1254 my @force_list = keys %force_config;
1256 if ($#force_list >= 0) {
1260 if (!run_command "$make oldnoconfig") {
1261 # Perhaps oldnoconfig doesn't exist in this version of the kernel
1262 # try a yes '' | oldconfig
1263 doprint "oldnoconfig failed, trying yes '' | make oldconfig\n";
1264 run_command "yes '' | $make oldconfig" or
1265 dodie "failed make config oldconfig";
1269 # read a config file and use this to force new configs.
1270 sub load_force_config {
1273 open(IN, $config) or
1274 dodie "failed to read $config";
1277 if (/^(CONFIG[^\s=]*)(\s*=.*)/) {
1278 $force_config{$1} = $_;
1279 } elsif (/^# (CONFIG_\S*) is not set/) {
1280 $force_config{$1} = $_;
1291 # Failed builds should not reboot the target
1292 my $save_no_reboot = $no_reboot;
1295 if (defined($pre_build)) {
1296 my $ret = run_command $pre_build;
1297 if (!$ret && defined($pre_build_die) &&
1299 dodie "failed to pre_build\n";
1303 if ($type =~ /^useconfig:(.*)/) {
1304 run_command "cp $1 $output_config" or
1305 dodie "could not copy $1 to .config";
1307 $type = "oldconfig";
1310 # old config can ask questions
1311 if ($type eq "oldconfig") {
1312 $type = "oldnoconfig";
1314 # allow for empty configs
1315 run_command "touch $output_config";
1318 run_command "mv $output_config $outputdir/config_temp" or
1319 dodie "moving .config";
1321 run_command "$make mrproper" or dodie "make mrproper";
1323 run_command "mv $outputdir/config_temp $output_config" or
1324 dodie "moving config_temp";
1327 } elsif (!$noclean) {
1328 unlink "$output_config";
1329 run_command "$make mrproper" or
1330 dodie "make mrproper";
1333 # add something to distinguish this build
1334 open(OUT, "> $outputdir/localversion") or dodie("Can't make localversion file");
1335 print OUT "$localversion\n";
1338 if (defined($minconfig)) {
1339 load_force_config($minconfig);
1342 if ($type ne "oldnoconfig") {
1343 run_command "$make $type" or
1344 dodie "failed make config";
1346 # Run old config regardless, to enforce min configurations
1349 $redirect = "$buildlog";
1350 my $build_ret = run_command "$make $build_options";
1353 if (defined($post_build)) {
1354 my $ret = run_command $post_build;
1355 if (!$ret && defined($post_build_die) &&
1357 dodie "failed to post_build\n";
1362 # bisect may need this to pass
1364 $no_reboot = $save_no_reboot;
1367 fail "failed build" and return 0;
1370 $no_reboot = $save_no_reboot;
1376 if (!run_ssh "halt" or defined($power_off)) {
1377 if (defined($poweroff_after_halt)) {
1378 sleep $poweroff_after_halt;
1379 run_command "$power_off";
1383 run_command "$power_off";
1394 if (defined($test_name)) {
1395 $name = " ($test_name)";
1398 doprint "\n\n*******************************************\n";
1399 doprint "*******************************************\n";
1400 doprint "KTEST RESULT: TEST $i$name SUCCESS!!!! **\n";
1401 doprint "*******************************************\n";
1402 doprint "*******************************************\n";
1404 if ($i != $opt{"NUM_TESTS"} && !do_not_reboot) {
1405 doprint "Reboot and wait $sleep_time seconds\n";
1412 doprint "Pass or fail? [p/f]";
1415 if ($ans eq "p" || $ans eq "P") {
1417 } elsif ($ans eq "f" || $ans eq "F") {
1420 print "Please answer 'P' or 'F'\n";
1425 sub child_run_test {
1428 # child should have no power
1429 $reboot_on_error = 0;
1430 $poweroff_on_error = 0;
1431 $die_on_failure = 1;
1433 run_command $run_test or $failed = 1;
1439 sub child_finished {
1452 doprint "run test $run_test\n";
1456 $SIG{CHLD} = qw(child_finished);
1460 child_run_test if (!$child_pid);
1465 $line = wait_for_input($monitor_fp, 1);
1466 if (defined($line)) {
1468 # we are not guaranteed to get a full line
1469 $full_line .= $line;
1472 if ($full_line =~ /call trace:/i) {
1476 if ($full_line =~ /Kernel panic -/) {
1480 if ($line =~ /\n/) {
1484 } while (!$child_done && !$bug);
1487 my $failure_start = time;
1490 $line = wait_for_input($monitor_fp, 1);
1491 if (defined($line)) {
1495 if ($now - $failure_start >= $stop_after_failure) {
1498 } while (defined($line));
1500 doprint "Detected kernel crash!\n";
1501 # kill the child with extreme prejudice
1505 waitpid $child_pid, 0;
1508 if ($bug || $child_exit) {
1509 return 0 if $in_bisect;
1510 fail "test failed" and return 0;
1515 sub run_git_bisect {
1518 doprint "$command ... ";
1520 my $output = `$command 2>&1`;
1527 dodie "Failed to git bisect";
1530 doprint "SUCCESS\n";
1531 if ($output =~ m/^(Bisecting: .*\(roughly \d+ steps?\))\s+\[([[:xdigit:]]+)\]/) {
1532 doprint "$1 [$2]\n";
1533 } elsif ($output =~ m/^([[:xdigit:]]+) is the first bad commit/) {
1535 doprint "Found bad commit... $1\n";
1538 # we already logged it, just print it now.
1546 doprint "Reboot and sleep $bisect_sleep_time seconds\n";
1547 reboot $bisect_sleep_time;
1550 # returns 1 on success, 0 on failure, -1 on skip
1551 sub run_bisect_test {
1552 my ($type, $buildtype) = @_;
1561 build $buildtype or $failed = 1;
1563 if ($type ne "build") {
1564 if ($failed && $bisect_skip) {
1568 dodie "Failed on build" if $failed;
1571 start_monitor_and_boot or $failed = 1;
1573 if ($type ne "boot") {
1574 if ($failed && $bisect_skip) {
1580 dodie "Failed on boot" if $failed;
1582 do_run_test or $failed = 1;
1593 # reboot the box to a kernel we can ssh to
1594 if ($type ne "build") {
1604 my $buildtype = "oldconfig";
1606 # We should have a minconfig to use?
1607 if (defined($minconfig)) {
1608 $buildtype = "useconfig:$minconfig";
1611 my $ret = run_bisect_test $type, $buildtype;
1613 if ($bisect_manual) {
1614 $ret = answer_bisect;
1617 # Are we looking for where it worked, not failed?
1618 if ($reverse_bisect) {
1624 } elsif ($ret == 0) {
1626 } elsif ($bisect_skip) {
1627 doprint "HIT A BAD COMMIT ... SKIPPING\n";
1637 die "BISECT_GOOD[$i] not defined\n" if (!defined($opt{"BISECT_GOOD[$i]"}));
1638 die "BISECT_BAD[$i] not defined\n" if (!defined($opt{"BISECT_BAD[$i]"}));
1639 die "BISECT_TYPE[$i] not defined\n" if (!defined($opt{"BISECT_TYPE[$i]"}));
1641 my $good = $opt{"BISECT_GOOD[$i]"};
1642 my $bad = $opt{"BISECT_BAD[$i]"};
1643 my $type = $opt{"BISECT_TYPE[$i]"};
1644 my $start = $opt{"BISECT_START[$i]"};
1645 my $replay = $opt{"BISECT_REPLAY[$i]"};
1646 my $start_files = $opt{"BISECT_FILES[$i]"};
1648 if (defined($start_files)) {
1649 $start_files = " -- " . $start_files;
1654 # convert to true sha1's
1655 $good = get_sha1($good);
1656 $bad = get_sha1($bad);
1658 if (defined($opt{"BISECT_REVERSE[$i]"}) &&
1659 $opt{"BISECT_REVERSE[$i]"} == 1) {
1660 doprint "Performing a reverse bisect (bad is good, good is bad!)\n";
1661 $reverse_bisect = 1;
1663 $reverse_bisect = 0;
1666 # Can't have a test without having a test to run
1667 if ($type eq "test" && !defined($run_test)) {
1671 my $check = $opt{"BISECT_CHECK[$i]"};
1672 if (defined($check) && $check ne "0") {
1675 my $head = get_sha1("HEAD");
1677 if ($check ne "good") {
1678 doprint "TESTING BISECT BAD [$bad]\n";
1679 run_command "git checkout $bad" or
1680 die "Failed to checkout $bad";
1682 $result = run_bisect $type;
1684 if ($result ne "bad") {
1685 fail "Tested BISECT_BAD [$bad] and it succeeded" and return 0;
1689 if ($check ne "bad") {
1690 doprint "TESTING BISECT GOOD [$good]\n";
1691 run_command "git checkout $good" or
1692 die "Failed to checkout $good";
1694 $result = run_bisect $type;
1696 if ($result ne "good") {
1697 fail "Tested BISECT_GOOD [$good] and it failed" and return 0;
1701 # checkout where we started
1702 run_command "git checkout $head" or
1703 die "Failed to checkout $head";
1706 run_command "git bisect start$start_files" or
1707 dodie "could not start bisect";
1709 run_command "git bisect good $good" or
1710 dodie "could not set bisect good to $good";
1712 run_git_bisect "git bisect bad $bad" or
1713 dodie "could not set bisect bad to $bad";
1715 if (defined($replay)) {
1716 run_command "git bisect replay $replay" or
1717 dodie "failed to run replay";
1720 if (defined($start)) {
1721 run_command "git checkout $start" or
1722 dodie "failed to checkout $start";
1727 $result = run_bisect $type;
1728 $test = run_git_bisect "git bisect $result";
1731 run_command "git bisect log" or
1732 dodie "could not capture git bisect log";
1734 run_command "git bisect reset" or
1735 dodie "could not reset git bisect";
1737 doprint "Bad commit was [$bisect_bad]\n";
1750 sub assign_configs {
1751 my ($hash, $config) = @_;
1754 or dodie "Failed to read $config";
1757 if (/^((CONFIG\S*)=.*)/) {
1765 sub process_config_ignore {
1768 assign_configs \%config_ignore, $config;
1771 sub read_current_config {
1772 my ($config_ref) = @_;
1774 %{$config_ref} = ();
1775 undef %{$config_ref};
1777 my @key = keys %{$config_ref};
1779 print "did not delete!\n";
1782 open (IN, "$output_config");
1785 if (/^(CONFIG\S+)=(.*)/) {
1786 ${$config_ref}{$1} = $2;
1792 sub get_dependencies {
1795 my $arr = $dependency{$config};
1796 if (!defined($arr)) {
1802 foreach my $dep (@{$arr}) {
1803 print "ADD DEP $dep\n";
1804 @deps = (@deps, get_dependencies $dep);
1813 open(OUT, ">$output_config") or dodie "Can not write to $output_config";
1815 foreach my $config (@configs) {
1816 print OUT "$config_set{$config}\n";
1817 my @deps = get_dependencies $config;
1818 foreach my $dep (@deps) {
1819 print OUT "$config_set{$dep}\n";
1823 foreach my $config (keys %config_ignore) {
1824 print OUT "$config_ignore{$config}\n";
1832 sub compare_configs {
1835 foreach my $item (keys %a) {
1836 if (!defined($b{$item})) {
1837 print "diff $item\n";
1845 print "diff2 $keys[0]\n";
1847 return -1 if ($#keys >= 0);
1852 sub run_config_bisect_test {
1855 return run_bisect_test $type, "oldconfig";
1858 sub process_passed {
1861 doprint "These configs had no failure: (Enabling them for further compiles)\n";
1862 # Passed! All these configs are part of a good compile.
1863 # Add them to the min options.
1864 foreach my $config (keys %configs) {
1865 if (defined($config_list{$config})) {
1866 doprint " removing $config\n";
1867 $config_ignore{$config} = $config_list{$config};
1868 delete $config_list{$config};
1871 doprint "config copied to $outputdir/config_good\n";
1872 run_command "cp -f $output_config $outputdir/config_good";
1875 sub process_failed {
1878 doprint "\n\n***************************************\n";
1879 doprint "Found bad config: $config\n";
1880 doprint "***************************************\n\n";
1883 sub run_config_bisect {
1885 my @start_list = keys %config_list;
1887 if ($#start_list < 0) {
1888 doprint "No more configs to test!!!\n";
1892 doprint "***** RUN TEST ***\n";
1893 my $type = $opt{"CONFIG_BISECT_TYPE[$iteration]"};
1897 my $count = $#start_list + 1;
1898 doprint " $count configs to test\n";
1900 my $half = int($#start_list / 2);
1903 my @tophalf = @start_list[0 .. $half];
1905 create_config @tophalf;
1906 read_current_config \%current_config;
1908 $count = $#tophalf + 1;
1909 doprint "Testing $count configs\n";
1911 # make sure we test something
1912 foreach my $config (@tophalf) {
1913 if (defined($current_config{$config})) {
1919 # try the other half
1920 doprint "Top half produced no set configs, trying bottom half\n";
1921 @tophalf = @start_list[$half + 1 .. $#start_list];
1922 create_config @tophalf;
1923 read_current_config \%current_config;
1924 foreach my $config (@tophalf) {
1925 if (defined($current_config{$config})) {
1931 doprint "Failed: Can't make new config with current configs\n";
1932 foreach my $config (@start_list) {
1933 doprint " CONFIG: $config\n";
1937 $count = $#tophalf + 1;
1938 doprint "Testing $count configs\n";
1941 $ret = run_config_bisect_test $type;
1942 if ($bisect_manual) {
1943 $ret = answer_bisect;
1946 process_passed %current_config;
1950 doprint "This config had a failure.\n";
1951 doprint "Removing these configs that were not set in this config:\n";
1952 doprint "config copied to $outputdir/config_bad\n";
1953 run_command "cp -f $output_config $outputdir/config_bad";
1955 # A config exists in this group that was bad.
1956 foreach my $config (keys %config_list) {
1957 if (!defined($current_config{$config})) {
1958 doprint " removing $config\n";
1959 delete $config_list{$config};
1963 @start_list = @tophalf;
1965 if ($#start_list == 0) {
1966 process_failed $start_list[0];
1970 # remove half the configs we are looking at and see if
1972 $half = int($#start_list / 2);
1973 } while ($#start_list > 0);
1975 # we found a single config, try it again unless we are running manually
1977 if ($bisect_manual) {
1978 process_failed $start_list[0];
1982 my @tophalf = @start_list[0 .. 0];
1984 $ret = run_config_bisect_test $type;
1986 process_passed %current_config;
1990 process_failed $start_list[0];
1997 my $start_config = $opt{"CONFIG_BISECT[$i]"};
1999 my $tmpconfig = "$tmpdir/use_config";
2001 if (defined($config_bisect_good)) {
2002 process_config_ignore $config_bisect_good;
2005 # Make the file with the bad config and the min config
2006 if (defined($minconfig)) {
2007 # read the min config for things to ignore
2008 run_command "cp $minconfig $tmpconfig" or
2009 dodie "failed to copy $minconfig to $tmpconfig";
2014 if (-f $tmpconfig) {
2015 load_force_config($tmpconfig);
2016 process_config_ignore $tmpconfig;
2019 # now process the start config
2020 run_command "cp $start_config $output_config" or
2021 dodie "failed to copy $start_config to $output_config";
2023 # read directly what we want to check
2025 open (IN, $output_config)
2026 or dodie "faied to open $output_config";
2029 if (/^((CONFIG\S*)=.*)/) {
2030 $config_check{$2} = $1;
2035 # Now run oldconfig with the minconfig
2038 # check to see what we lost (or gained)
2039 open (IN, $output_config)
2040 or dodie "Failed to read $start_config";
2042 my %removed_configs;
2046 if (/^((CONFIG\S*)=.*)/) {
2047 # save off all options
2048 $config_set{$2} = $1;
2049 if (defined($config_check{$2})) {
2050 if (defined($config_ignore{$2})) {
2051 $removed_configs{$2} = $1;
2053 $config_list{$2} = $1;
2055 } elsif (!defined($config_ignore{$2})) {
2056 $added_configs{$2} = $1;
2057 $config_list{$2} = $1;
2063 my @confs = keys %removed_configs;
2065 doprint "Configs overridden by default configs and removed from check:\n";
2066 foreach my $config (@confs) {
2067 doprint " $config\n";
2070 @confs = keys %added_configs;
2072 doprint "Configs appearing in make oldconfig and added:\n";
2073 foreach my $config (@confs) {
2074 doprint " $config\n";
2081 # Sometimes kconfig does weird things. We must make sure
2082 # that the config we autocreate has everything we need
2083 # to test, otherwise we may miss testing configs, or
2084 # may not be able to create a new config.
2085 # Here we create a config with everything set.
2086 create_config (keys %config_list);
2087 read_current_config \%config_test;
2088 foreach my $config (keys %config_list) {
2089 if (!defined($config_test{$config})) {
2092 doprint "Configs not produced by kconfig (will not be checked):\n";
2094 doprint " $config\n";
2095 delete $config_list{$config};
2100 $ret = run_config_bisect;
2103 return $ret if ($ret < 0);
2108 sub patchcheck_reboot {
2109 doprint "Reboot and sleep $patchcheck_sleep_time seconds\n";
2110 reboot $patchcheck_sleep_time;
2116 die "PATCHCHECK_START[$i] not defined\n"
2117 if (!defined($opt{"PATCHCHECK_START[$i]"}));
2118 die "PATCHCHECK_TYPE[$i] not defined\n"
2119 if (!defined($opt{"PATCHCHECK_TYPE[$i]"}));
2121 my $start = $opt{"PATCHCHECK_START[$i]"};
2124 if (defined($opt{"PATCHCHECK_END[$i]"})) {
2125 $end = $opt{"PATCHCHECK_END[$i]"};
2128 # Get the true sha1's since we can use things like HEAD~3
2129 $start = get_sha1($start);
2130 $end = get_sha1($end);
2132 my $type = $opt{"PATCHCHECK_TYPE[$i]"};
2134 # Can't have a test without having a test to run
2135 if ($type eq "test" && !defined($run_test)) {
2139 open (IN, "git log --pretty=oneline $end|") or
2140 dodie "could not get git list";
2146 $list[$#list+1] = $_;
2147 last if (/^$start/);
2151 if ($list[$#list] !~ /^$start/) {
2152 fail "SHA1 $start not found";
2155 # go backwards in the list
2156 @list = reverse @list;
2158 my $save_clean = $noclean;
2159 my %ignored_warnings;
2161 if (defined($ignore_warnings)) {
2162 foreach my $sha1 (split /\s+/, $ignore_warnings) {
2163 $ignored_warnings{$sha1} = 1;
2168 foreach my $item (@list) {
2170 $sha1 =~ s/^([[:xdigit:]]+).*/$1/;
2172 doprint "\nProcessing commit $item\n\n";
2174 run_command "git checkout $sha1" or
2175 die "Failed to checkout $sha1";
2177 # only clean on the first and last patch
2178 if ($item eq $list[0] ||
2179 $item eq $list[$#list]) {
2180 $noclean = $save_clean;
2185 if (defined($minconfig)) {
2186 build "useconfig:$minconfig" or return 0;
2188 # ?? no config to use?
2189 build "oldconfig" or return 0;
2193 if (!defined($ignored_warnings{$sha1})) {
2194 check_buildlog $sha1 or return 0;
2197 next if ($type eq "build");
2201 start_monitor_and_boot or $failed = 1;
2203 if (!$failed && $type ne "boot"){
2204 do_run_test or $failed = 1;
2207 return 0 if ($failed);
2225 # taken from streamline_config.pl
2237 if (! -f $kconfig) {
2238 doprint "file $kconfig does not exist, skipping\n";
2242 open(KIN, "$kconfig")
2243 or die "Can't open $kconfig";
2247 # Make sure that lines ending with \ continue
2249 $_ = $line . " " . $_;
2260 # collect any Kconfig sources
2261 if (/^source\s*"(.*)"/) {
2262 $kconfigs[$#kconfigs+1] = $1;
2266 if (/^\s*(menu)?config\s+(\S+)\s*$/) {
2270 for (my $i = 0; $i < $iflevel; $i++) {
2272 $depends{$config} .= " " . $ifdeps[$i];
2274 $depends{$config} = $ifdeps[$i];
2279 # collect the depends for the config
2280 } elsif ($state eq "NEW" && /^\s*depends\s+on\s+(.*)$/) {
2282 if (defined($depends{$1})) {
2283 $depends{$config} .= " " . $1;
2285 $depends{$config} = $1;
2288 # Get the configs that select this config
2289 } elsif ($state ne "NONE" && /^\s*select\s+(\S+)/) {
2290 if (defined($depends{$1})) {
2291 $depends{$1} .= " " . $config;
2293 $depends{$1} = $config;
2296 # Check for if statements
2297 } elsif (/^if\s+(.*\S)\s*$/) {
2299 # remove beginning and ending non text
2300 $deps =~ s/^[^a-zA-Z0-9_]*//;
2301 $deps =~ s/[^a-zA-Z0-9_]*$//;
2303 my @deps = split /[^a-zA-Z0-9_]+/, $deps;
2305 $ifdeps[$iflevel++] = join ':', @deps;
2307 } elsif (/^endif/) {
2309 $iflevel-- if ($iflevel);
2312 } elsif (/^\s*help\s*$/) {
2318 # read in any configs that were found.
2319 foreach $kconfig (@kconfigs) {
2320 if (!defined($read_kconfigs{$kconfig})) {
2321 $read_kconfigs{$kconfig} = 1;
2322 read_kconfig("$builddir/$kconfig");
2328 # find out which arch this is by the kconfig file
2329 open (IN, $output_config)
2330 or dodie "Failed to read $output_config";
2333 if (m,Linux/(\S+)\s+\S+\s+Kernel Configuration,) {
2340 if (!defined($arch)) {
2341 doprint "Could not find arch from config file\n";
2342 doprint "no dependencies used\n";
2346 # arch is really the subarch, we need to know
2347 # what directory to look at.
2348 if ($arch eq "i386" || $arch eq "x86_64") {
2350 } elsif ($arch =~ /^tile/) {
2354 my $kconfig = "$builddir/arch/$arch/Kconfig";
2356 if (! -f $kconfig && $arch =~ /\d$/) {
2358 # some subarchs have numbers, truncate them
2360 $kconfig = "$builddir/arch/$arch/Kconfig";
2361 if (! -f $kconfig) {
2362 doprint "No idea what arch dir $orig is for\n";
2363 doprint "no dependencies used\n";
2368 read_kconfig($kconfig);
2371 sub read_config_list {
2375 or dodie "Failed to read $config";
2378 if (/^((CONFIG\S*)=.*)/) {
2379 if (!defined($config_ignore{$2})) {
2380 $config_list{$2} = $1;
2388 sub read_output_config {
2391 assign_configs \%config_ignore, $config;
2394 sub make_new_config {
2397 open (OUT, ">$output_config")
2398 or dodie "Failed to write $output_config";
2400 foreach my $config (@configs) {
2401 print OUT "$config\n";
2410 $kconfig =~ s/CONFIG_//;
2412 $dep = $depends{"$kconfig"};
2414 # the dep string we have saves the dependencies as they
2415 # were found, including expressions like ! && ||. We
2416 # want to split this out into just an array of configs.
2418 my $valid = "A-Za-z_0-9";
2422 while ($dep =~ /[$valid]/) {
2424 if ($dep =~ /^[^$valid]*([$valid]+)/) {
2425 my $conf = "CONFIG_" . $1;
2427 $configs[$#configs + 1] = $conf;
2429 $dep =~ s/^[^$valid]*[$valid]+//;
2431 die "this should never happen";
2441 my %processed_configs;
2442 my %nochange_config;
2444 sub test_this_config {
2449 # if we already processed this config, skip it
2450 if (defined($processed_configs{$config})) {
2453 $processed_configs{$config} = 1;
2455 # if this config failed during this round, skip it
2456 if (defined($nochange_config{$config})) {
2460 my $kconfig = $config;
2461 $kconfig =~ s/CONFIG_//;
2463 # Test dependencies first
2464 if (defined($depends{"$kconfig"})) {
2465 my @parents = get_depends $config;
2466 foreach my $parent (@parents) {
2467 # if the parent is in the min config, check it first
2468 next if (!defined($min_configs{$parent}));
2469 $found = test_this_config($parent);
2470 if (defined($found)) {
2476 # Remove this config from the list of configs
2477 # do a make oldnoconfig and then read the resulting
2478 # .config to make sure it is missing the config that
2480 my %configs = %min_configs;
2481 delete $configs{$config};
2482 make_new_config ((values %configs), (values %keep_configs));
2485 assign_configs \%configs, $output_config;
2487 return $config if (!defined($configs{$config}));
2489 doprint "disabling config $config did not change .config\n";
2491 $nochange_config{$config} = 1;
2496 sub make_min_config {
2499 if (!defined($output_minconfig)) {
2500 fail "OUTPUT_MIN_CONFIG not defined" and return;
2503 # If output_minconfig exists, and the start_minconfig
2504 # came from min_config, than ask if we should use
2506 if (-f $output_minconfig && !$start_minconfig_defined) {
2507 print "$output_minconfig exists\n";
2508 if (read_yn " Use it as minconfig?") {
2509 $start_minconfig = $output_minconfig;
2513 if (!defined($start_minconfig)) {
2514 fail "START_MIN_CONFIG or MIN_CONFIG not defined" and return;
2517 my $temp_config = "$tmpdir/temp_config";
2519 # First things first. We build an allnoconfig to find
2520 # out what the defaults are that we can't touch.
2521 # Some are selections, but we really can't handle selections.
2523 my $save_minconfig = $minconfig;
2526 run_command "$make allnoconfig" or return 0;
2530 process_config_ignore $output_config;
2532 undef %save_configs;
2535 if (defined($ignore_config)) {
2536 # make sure the file exists
2537 `touch $ignore_config`;
2538 assign_configs \%save_configs, $ignore_config;
2541 %keep_configs = %save_configs;
2543 doprint "Load initial configs from $start_minconfig\n";
2545 # Look at the current min configs, and save off all the
2546 # ones that were set via the allnoconfig
2547 assign_configs \%min_configs, $start_minconfig;
2549 my @config_keys = keys %min_configs;
2551 # Remove anything that was set by the make allnoconfig
2552 # we shouldn't need them as they get set for us anyway.
2553 foreach my $config (@config_keys) {
2554 # Remove anything in the ignore_config
2555 if (defined($keep_configs{$config})) {
2556 my $file = $ignore_config;
2557 $file =~ s,.*/(.*?)$,$1,;
2558 doprint "$config set by $file ... ignored\n";
2559 delete $min_configs{$config};
2562 # But make sure the settings are the same. If a min config
2563 # sets a selection, we do not want to get rid of it if
2564 # it is not the same as what we have. Just move it into
2566 if (defined($config_ignore{$config})) {
2567 if ($config_ignore{$config} ne $min_configs{$config}) {
2568 doprint "$config is in allnoconfig as '$config_ignore{$config}'";
2569 doprint " but it is '$min_configs{$config}' in minconfig .. keeping\n";
2570 $keep_configs{$config} = $min_configs{$config};
2572 doprint "$config set by allnoconfig ... ignored\n";
2574 delete $min_configs{$config};
2586 # Now disable each config one by one and do a make oldconfig
2587 # till we find a config that changes our list.
2589 # Put configs that did not modify the config at the end.
2590 my @test_configs = keys %min_configs;
2592 for (my $i = 0; $i < $#test_configs; $i++) {
2593 if (!defined($nochange_config{$test_configs[0]})) {
2597 # This config didn't change the .config last time.
2598 # Place it at the end
2599 my $config = shift @test_configs;
2600 push @test_configs, $config;
2603 # if every test config has failed to modify the .config file
2604 # in the past, then reset and start over.
2606 undef %nochange_config;
2609 undef %processed_configs;
2611 foreach my $config (@test_configs) {
2613 $found = test_this_config $config;
2615 last if (defined($found));
2617 # oh well, try another config
2620 if (!defined($found)) {
2621 # we could have failed due to the nochange_config hash
2622 # reset and try again
2624 undef %nochange_config;
2628 doprint "No more configs found that we can disable\n";
2636 doprint "Test with $config disabled\n";
2638 # set in_bisect to keep build and monitor from dieing
2643 start_monitor_and_boot or $failed = 1;
2649 doprint "$min_configs{$config} is needed to boot the box... keeping\n";
2650 # this config is needed, add it to the ignore list.
2651 $keep_configs{$config} = $min_configs{$config};
2652 $save_configs{$config} = $min_configs{$config};
2653 delete $min_configs{$config};
2655 # update new ignore configs
2656 if (defined($ignore_config)) {
2657 open (OUT, ">$temp_config")
2658 or die "Can't write to $temp_config";
2659 foreach my $config (keys %save_configs) {
2660 print OUT "$save_configs{$config}\n";
2663 run_command "mv $temp_config $ignore_config" or
2664 dodie "failed to copy update to $ignore_config";
2668 # We booted without this config, remove it from the minconfigs.
2669 doprint "$config is not needed, disabling\n";
2671 delete $min_configs{$config};
2673 # Also disable anything that is not enabled in this config
2675 assign_configs \%configs, $output_config;
2676 my @config_keys = keys %min_configs;
2677 foreach my $config (@config_keys) {
2678 if (!defined($configs{$config})) {
2679 doprint "$config is not set, disabling\n";
2680 delete $min_configs{$config};
2684 # Save off all the current mandidory configs
2685 open (OUT, ">$temp_config")
2686 or die "Can't write to $temp_config";
2687 foreach my $config (keys %keep_configs) {
2688 print OUT "$keep_configs{$config}\n";
2690 foreach my $config (keys %min_configs) {
2691 print OUT "$min_configs{$config}\n";
2695 run_command "mv $temp_config $output_minconfig" or
2696 dodie "failed to copy update to $output_minconfig";
2699 doprint "Reboot and wait $sleep_time seconds\n";
2707 $#ARGV < 1 or die "ktest.pl version: $VERSION\n usage: ktest.pl config-file\n";
2710 $ktest_config = $ARGV[0];
2711 if (! -f $ktest_config) {
2712 print "$ktest_config does not exist.\n";
2713 if (!read_yn "Create it?") {
2718 $ktest_config = "ktest.conf";
2721 if (! -f $ktest_config) {
2722 open(OUT, ">$ktest_config") or die "Can not create $ktest_config";
2724 # Generated by ktest.pl
2726 # Define each test with TEST_START
2727 # The config options below it will override the defaults
2735 read_config $ktest_config;
2737 if (defined($opt{"LOG_FILE"})) {
2738 $opt{"LOG_FILE"} = eval_option($opt{"LOG_FILE"}, -1);
2741 # Append any configs entered in manually to the config file.
2742 my @new_configs = keys %entered_configs;
2743 if ($#new_configs >= 0) {
2744 print "\nAppending entered in configs to $ktest_config\n";
2745 open(OUT, ">>$ktest_config") or die "Can not append to $ktest_config";
2746 foreach my $config (@new_configs) {
2747 print OUT "$config = $entered_configs{$config}\n";
2748 $opt{$config} = $entered_configs{$config};
2752 if ($opt{"CLEAR_LOG"} && defined($opt{"LOG_FILE"})) {
2753 unlink $opt{"LOG_FILE"};
2756 doprint "\n\nSTARTING AUTOMATED TESTS\n\n";
2758 for (my $i = 0, my $repeat = 1; $i <= $opt{"NUM_TESTS"}; $i += $repeat) {
2761 doprint "DEFAULT OPTIONS:\n";
2763 doprint "\nTEST $i OPTIONS";
2764 if (defined($repeat_tests{$i})) {
2765 $repeat = $repeat_tests{$i};
2766 doprint " ITERATE $repeat";
2771 foreach my $option (sort keys %opt) {
2773 if ($option =~ /\[(\d+)\]$/) {
2779 doprint "$option = $opt{$option}\n";
2783 sub __set_test_option {
2784 my ($name, $i) = @_;
2786 my $option = "$name\[$i\]";
2788 if (defined($opt{$option})) {
2789 return $opt{$option};
2792 foreach my $test (keys %repeat_tests) {
2794 $i < $test + $repeat_tests{$test}) {
2795 $option = "$name\[$test\]";
2796 if (defined($opt{$option})) {
2797 return $opt{$option};
2802 if (defined($opt{$name})) {
2809 sub set_test_option {
2810 my ($name, $i) = @_;
2812 my $option = __set_test_option($name, $i);
2813 return $option if (!defined($option));
2815 return eval_option($option, $i);
2818 # First we need to do is the builds
2819 for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {
2821 # Do not reboot on failing test options
2826 my $makecmd = set_test_option("MAKE_CMD", $i);
2828 $machine = set_test_option("MACHINE", $i);
2829 $ssh_user = set_test_option("SSH_USER", $i);
2830 $tmpdir = set_test_option("TMP_DIR", $i);
2831 $outputdir = set_test_option("OUTPUT_DIR", $i);
2832 $builddir = set_test_option("BUILD_DIR", $i);
2833 $test_type = set_test_option("TEST_TYPE", $i);
2834 $build_type = set_test_option("BUILD_TYPE", $i);
2835 $build_options = set_test_option("BUILD_OPTIONS", $i);
2836 $pre_build = set_test_option("PRE_BUILD", $i);
2837 $post_build = set_test_option("POST_BUILD", $i);
2838 $pre_build_die = set_test_option("PRE_BUILD_DIE", $i);
2839 $post_build_die = set_test_option("POST_BUILD_DIE", $i);
2840 $power_cycle = set_test_option("POWER_CYCLE", $i);
2841 $reboot = set_test_option("REBOOT", $i);
2842 $noclean = set_test_option("BUILD_NOCLEAN", $i);
2843 $minconfig = set_test_option("MIN_CONFIG", $i);
2844 $output_minconfig = set_test_option("OUTPUT_MIN_CONFIG", $i);
2845 $start_minconfig = set_test_option("START_MIN_CONFIG", $i);
2846 $ignore_config = set_test_option("IGNORE_CONFIG", $i);
2847 $run_test = set_test_option("TEST", $i);
2848 $addconfig = set_test_option("ADD_CONFIG", $i);
2849 $reboot_type = set_test_option("REBOOT_TYPE", $i);
2850 $grub_menu = set_test_option("GRUB_MENU", $i);
2851 $post_install = set_test_option("POST_INSTALL", $i);
2852 $no_install = set_test_option("NO_INSTALL", $i);
2853 $reboot_script = set_test_option("REBOOT_SCRIPT", $i);
2854 $reboot_on_error = set_test_option("REBOOT_ON_ERROR", $i);
2855 $poweroff_on_error = set_test_option("POWEROFF_ON_ERROR", $i);
2856 $die_on_failure = set_test_option("DIE_ON_FAILURE", $i);
2857 $power_off = set_test_option("POWER_OFF", $i);
2858 $powercycle_after_reboot = set_test_option("POWERCYCLE_AFTER_REBOOT", $i);
2859 $poweroff_after_halt = set_test_option("POWEROFF_AFTER_HALT", $i);
2860 $sleep_time = set_test_option("SLEEP_TIME", $i);
2861 $bisect_sleep_time = set_test_option("BISECT_SLEEP_TIME", $i);
2862 $patchcheck_sleep_time = set_test_option("PATCHCHECK_SLEEP_TIME", $i);
2863 $ignore_warnings = set_test_option("IGNORE_WARNINGS", $i);
2864 $bisect_manual = set_test_option("BISECT_MANUAL", $i);
2865 $bisect_skip = set_test_option("BISECT_SKIP", $i);
2866 $config_bisect_good = set_test_option("CONFIG_BISECT_GOOD", $i);
2867 $store_failures = set_test_option("STORE_FAILURES", $i);
2868 $test_name = set_test_option("TEST_NAME", $i);
2869 $timeout = set_test_option("TIMEOUT", $i);
2870 $booted_timeout = set_test_option("BOOTED_TIMEOUT", $i);
2871 $console = set_test_option("CONSOLE", $i);
2872 $detect_triplefault = set_test_option("DETECT_TRIPLE_FAULT", $i);
2873 $success_line = set_test_option("SUCCESS_LINE", $i);
2874 $reboot_success_line = set_test_option("REBOOT_SUCCESS_LINE", $i);
2875 $stop_after_success = set_test_option("STOP_AFTER_SUCCESS", $i);
2876 $stop_after_failure = set_test_option("STOP_AFTER_FAILURE", $i);
2877 $stop_test_after = set_test_option("STOP_TEST_AFTER", $i);
2878 $build_target = set_test_option("BUILD_TARGET", $i);
2879 $ssh_exec = set_test_option("SSH_EXEC", $i);
2880 $scp_to_target = set_test_option("SCP_TO_TARGET", $i);
2881 $target_image = set_test_option("TARGET_IMAGE", $i);
2882 $localversion = set_test_option("LOCALVERSION", $i);
2884 $start_minconfig_defined = 1;
2886 if (!defined($start_minconfig)) {
2887 $start_minconfig_defined = 0;
2888 $start_minconfig = $minconfig;
2891 chdir $builddir || die "can't change directory to $builddir";
2893 foreach my $dir ($tmpdir, $outputdir) {
2896 die "can't create $dir";
2900 $ENV{"SSH_USER"} = $ssh_user;
2901 $ENV{"MACHINE"} = $machine;
2903 $target = "$ssh_user\@$machine";
2905 $buildlog = "$tmpdir/buildlog-$machine";
2906 $dmesg = "$tmpdir/dmesg-$machine";
2907 $make = "$makecmd O=$outputdir";
2908 $output_config = "$outputdir/.config";
2910 if ($reboot_type eq "grub") {
2911 dodie "GRUB_MENU not defined" if (!defined($grub_menu));
2912 } elsif (!defined($reboot_script)) {
2913 dodie "REBOOT_SCRIPT not defined"
2916 my $run_type = $build_type;
2917 if ($test_type eq "patchcheck") {
2918 $run_type = $opt{"PATCHCHECK_TYPE[$i]"};
2919 } elsif ($test_type eq "bisect") {
2920 $run_type = $opt{"BISECT_TYPE[$i]"};
2921 } elsif ($test_type eq "config_bisect") {
2922 $run_type = $opt{"CONFIG_BISECT_TYPE[$i]"};
2925 if ($test_type eq "make_min_config") {
2929 # mistake in config file?
2930 if (!defined($run_type)) {
2931 $run_type = "ERROR";
2935 $installme = " no_install" if ($no_install);
2938 doprint "RUNNING TEST $i of $opt{NUM_TESTS} with option $test_type $run_type$installme\n\n";
2943 if (defined($addconfig)) {
2944 my $min = $minconfig;
2945 if (!defined($minconfig)) {
2948 run_command "cat $addconfig $min > $tmpdir/add_config" or
2949 dodie "Failed to create temp config";
2950 $minconfig = "$tmpdir/add_config";
2953 my $checkout = $opt{"CHECKOUT[$i]"};
2954 if (defined($checkout)) {
2955 run_command "git checkout $checkout" or
2956 die "failed to checkout $checkout";
2962 if ($test_type eq "bisect") {
2965 } elsif ($test_type eq "config_bisect") {
2968 } elsif ($test_type eq "patchcheck") {
2971 } elsif ($test_type eq "make_min_config") {
2976 if ($build_type ne "nobuild") {
2977 build $build_type or next;
2980 if ($test_type eq "install") {
2987 if ($test_type ne "build") {
2989 start_monitor_and_boot or $failed = 1;
2991 if (!$failed && $test_type ne "boot" && defined($run_test)) {
2992 do_run_test or $failed = 1;
3001 if ($opt{"POWEROFF_ON_SUCCESS"}) {
3003 } elsif ($opt{"REBOOT_ON_SUCCESS"} && !do_not_reboot) {
3007 doprint "\n $successes of $opt{NUM_TESTS} tests were successful\n\n";