ktest: Reset saved min (force) configs for each test
[deliverable/linux.git] / tools / testing / ktest / ktest.pl
CommitLineData
2545eb61 1#!/usr/bin/perl -w
d6ce2a0b 2#
cce1dac8 3# Copyright 2010 - Steven Rostedt <srostedt@redhat.com>, Red Hat Inc.
d6ce2a0b
SR
4# Licensed under the terms of the GNU GPL License version 2
5#
2545eb61
SR
6
7use strict;
8use IPC::Open2;
9use Fcntl qw(F_GETFL F_SETFL O_NONBLOCK);
7faafbd6
SR
10use File::Path qw(mkpath);
11use File::Copy qw(cp);
2545eb61
SR
12use FileHandle;
13
e48c5293
SR
14my $VERSION = "0.2";
15
2545eb61
SR
16$| = 1;
17
18my %opt;
a57419b3
SR
19my %repeat_tests;
20my %repeats;
2545eb61
SR
21
22#default opts
4f43e0dc
SR
23my %default = (
24 "NUM_TESTS" => 1,
25 "TEST_TYPE" => "build",
26 "BUILD_TYPE" => "randconfig",
27 "MAKE_CMD" => "make",
28 "TIMEOUT" => 120,
29 "TMP_DIR" => "/tmp/ktest/\${MACHINE}",
30 "SLEEP_TIME" => 60, # sleep time between tests
31 "BUILD_NOCLEAN" => 0,
32 "REBOOT_ON_ERROR" => 0,
33 "POWEROFF_ON_ERROR" => 0,
34 "REBOOT_ON_SUCCESS" => 1,
35 "POWEROFF_ON_SUCCESS" => 0,
36 "BUILD_OPTIONS" => "",
37 "BISECT_SLEEP_TIME" => 60, # sleep time between bisects
38 "PATCHCHECK_SLEEP_TIME" => 60, # sleep time between patch checks
39 "CLEAR_LOG" => 0,
40 "BISECT_MANUAL" => 0,
41 "BISECT_SKIP" => 1,
ccc513b6 42 "MIN_CONFIG_TYPE" => "boot",
4f43e0dc
SR
43 "SUCCESS_LINE" => "login:",
44 "DETECT_TRIPLE_FAULT" => 1,
45 "NO_INSTALL" => 0,
46 "BOOTED_TIMEOUT" => 1,
47 "DIE_ON_FAILURE" => 1,
48 "SSH_EXEC" => "ssh \$SSH_USER\@\$MACHINE \$SSH_COMMAND",
49 "SCP_TO_TARGET" => "scp \$SRC_FILE \$SSH_USER\@\$MACHINE:\$DST_FILE",
02ad2617 50 "SCP_TO_TARGET_INSTALL" => "\${SCP_TO_TARGET}",
4f43e0dc
SR
51 "REBOOT" => "ssh \$SSH_USER\@\$MACHINE reboot",
52 "STOP_AFTER_SUCCESS" => 10,
53 "STOP_AFTER_FAILURE" => 60,
54 "STOP_TEST_AFTER" => 600,
407b95b7 55 "MAX_MONITOR_WAIT" => 1800,
600bbf0a
SR
56
57# required, and we will ask users if they don't have them but we keep the default
58# value something that is common.
4f43e0dc
SR
59 "REBOOT_TYPE" => "grub",
60 "LOCALVERSION" => "-test",
61 "SSH_USER" => "root",
62 "BUILD_TARGET" => "arch/x86/boot/bzImage",
63 "TARGET_IMAGE" => "/boot/vmlinuz-test",
9cc9e091
SR
64
65 "LOG_FILE" => undef,
66 "IGNORE_UNUSED" => 0,
4f43e0dc 67);
2545eb61 68
8d1491ba 69my $ktest_config;
2545eb61 70my $version;
683a3e64 71my $have_version = 0;
a75fecec 72my $machine;
e48c5293 73my $ssh_user;
a75fecec
SR
74my $tmpdir;
75my $builddir;
76my $outputdir;
51ad1dd1 77my $output_config;
a75fecec 78my $test_type;
7faafbd6 79my $build_type;
a75fecec 80my $build_options;
921ed4c7
SR
81my $final_post_ktest;
82my $pre_ktest;
83my $post_ktest;
84my $pre_test;
85my $post_test;
0bd6c1a3
SR
86my $pre_build;
87my $post_build;
88my $pre_build_die;
89my $post_build_die;
a75fecec
SR
90my $reboot_type;
91my $reboot_script;
92my $power_cycle;
e48c5293 93my $reboot;
a75fecec 94my $reboot_on_error;
bc7c5803
SR
95my $switch_to_good;
96my $switch_to_test;
a75fecec 97my $poweroff_on_error;
648a182c 98my $reboot_on_success;
a75fecec 99my $die_on_failure;
576f627c
SR
100my $powercycle_after_reboot;
101my $poweroff_after_halt;
407b95b7 102my $max_monitor_wait;
e48c5293
SR
103my $ssh_exec;
104my $scp_to_target;
02ad2617 105my $scp_to_target_install;
a75fecec
SR
106my $power_off;
107my $grub_menu;
2545eb61
SR
108my $grub_number;
109my $target;
110my $make;
e5c2ec11 111my $pre_install;
8b37ca8c 112my $post_install;
e0a8742e 113my $no_install;
5c42fc5b 114my $noclean;
5f9b6ced 115my $minconfig;
4c4ab120 116my $start_minconfig;
35ce5952 117my $start_minconfig_defined;
4c4ab120 118my $output_minconfig;
ccc513b6 119my $minconfig_type;
43de3316 120my $use_output_minconfig;
4c4ab120 121my $ignore_config;
be405f95 122my $ignore_errors;
2b7d9b21 123my $addconfig;
5f9b6ced 124my $in_bisect = 0;
b5f4aea6 125my $bisect_bad_commit = "";
d6ce2a0b 126my $reverse_bisect;
c960bb9f 127my $bisect_manual;
c23dca7c 128my $bisect_skip;
30f75da5 129my $config_bisect_good;
c5dacb88
SR
130my $bisect_ret_good;
131my $bisect_ret_bad;
132my $bisect_ret_skip;
133my $bisect_ret_abort;
134my $bisect_ret_default;
6c5ee0be 135my $in_patchcheck = 0;
5a391fbf 136my $run_test;
6c5ee0be 137my $redirect;
7faafbd6 138my $buildlog;
a9dd5d63 139my $testlog;
7faafbd6
SR
140my $dmesg;
141my $monitor_fp;
142my $monitor_pid;
143my $monitor_cnt = 0;
a75fecec
SR
144my $sleep_time;
145my $bisect_sleep_time;
27d934b2 146my $patchcheck_sleep_time;
1990207d 147my $ignore_warnings;
a75fecec 148my $store_failures;
de5b6e3b 149my $store_successes;
9064af52 150my $test_name;
a75fecec
SR
151my $timeout;
152my $booted_timeout;
f1a5b962 153my $detect_triplefault;
a75fecec 154my $console;
2b803365 155my $reboot_success_line;
a75fecec 156my $success_line;
1c8a617a
SR
157my $stop_after_success;
158my $stop_after_failure;
2d01b26a 159my $stop_test_after;
a75fecec
SR
160my $build_target;
161my $target_image;
b5f4aea6 162my $checkout;
a75fecec 163my $localversion;
576f627c 164my $iteration = 0;
e48c5293 165my $successes = 0;
2545eb61 166
b5f4aea6
SR
167my $bisect_good;
168my $bisect_bad;
169my $bisect_type;
170my $bisect_start;
171my $bisect_replay;
172my $bisect_files;
173my $bisect_reverse;
174my $bisect_check;
175
176my $config_bisect;
177my $config_bisect_type;
b0918612 178my $config_bisect_check;
b5f4aea6
SR
179
180my $patchcheck_type;
181my $patchcheck_start;
182my $patchcheck_end;
183
165708b2 184# set when a test is something other that just building or install
bb8474b1
SR
185# which would require more options.
186my $buildonly = 1;
187
dbd3783b
SR
188# set when creating a new config
189my $newconfig = 0;
190
8d1491ba
SR
191my %entered_configs;
192my %config_help;
77d942ce 193my %variable;
cf79fab6
SR
194
195# force_config is the list of configs that we force enabled (or disabled)
196# in a .config file. The MIN_CONFIG and ADD_CONFIG configs.
fcb3f16a 197my %force_config;
8d1491ba 198
4ab1cce5
SR
199# do not force reboots on config problems
200my $no_reboot = 1;
201
759a3cc6
SR
202# reboot on success
203my $reboot_success = 0;
204
9cc9e091
SR
205my %option_map = (
206 "MACHINE" => \$machine,
207 "SSH_USER" => \$ssh_user,
208 "TMP_DIR" => \$tmpdir,
209 "OUTPUT_DIR" => \$outputdir,
210 "BUILD_DIR" => \$builddir,
211 "TEST_TYPE" => \$test_type,
921ed4c7
SR
212 "PRE_KTEST" => \$pre_ktest,
213 "POST_KTEST" => \$post_ktest,
214 "PRE_TEST" => \$pre_test,
215 "POST_TEST" => \$post_test,
9cc9e091
SR
216 "BUILD_TYPE" => \$build_type,
217 "BUILD_OPTIONS" => \$build_options,
218 "PRE_BUILD" => \$pre_build,
219 "POST_BUILD" => \$post_build,
220 "PRE_BUILD_DIE" => \$pre_build_die,
221 "POST_BUILD_DIE" => \$post_build_die,
222 "POWER_CYCLE" => \$power_cycle,
223 "REBOOT" => \$reboot,
224 "BUILD_NOCLEAN" => \$noclean,
225 "MIN_CONFIG" => \$minconfig,
226 "OUTPUT_MIN_CONFIG" => \$output_minconfig,
227 "START_MIN_CONFIG" => \$start_minconfig,
ccc513b6 228 "MIN_CONFIG_TYPE" => \$minconfig_type,
43de3316 229 "USE_OUTPUT_MIN_CONFIG" => \$use_output_minconfig,
9cc9e091
SR
230 "IGNORE_CONFIG" => \$ignore_config,
231 "TEST" => \$run_test,
232 "ADD_CONFIG" => \$addconfig,
233 "REBOOT_TYPE" => \$reboot_type,
234 "GRUB_MENU" => \$grub_menu,
e5c2ec11 235 "PRE_INSTALL" => \$pre_install,
9cc9e091
SR
236 "POST_INSTALL" => \$post_install,
237 "NO_INSTALL" => \$no_install,
238 "REBOOT_SCRIPT" => \$reboot_script,
239 "REBOOT_ON_ERROR" => \$reboot_on_error,
240 "SWITCH_TO_GOOD" => \$switch_to_good,
241 "SWITCH_TO_TEST" => \$switch_to_test,
242 "POWEROFF_ON_ERROR" => \$poweroff_on_error,
648a182c 243 "REBOOT_ON_SUCCESS" => \$reboot_on_success,
9cc9e091
SR
244 "DIE_ON_FAILURE" => \$die_on_failure,
245 "POWER_OFF" => \$power_off,
246 "POWERCYCLE_AFTER_REBOOT" => \$powercycle_after_reboot,
247 "POWEROFF_AFTER_HALT" => \$poweroff_after_halt,
407b95b7 248 "MAX_MONITOR_WAIT" => \$max_monitor_wait,
9cc9e091
SR
249 "SLEEP_TIME" => \$sleep_time,
250 "BISECT_SLEEP_TIME" => \$bisect_sleep_time,
251 "PATCHCHECK_SLEEP_TIME" => \$patchcheck_sleep_time,
252 "IGNORE_WARNINGS" => \$ignore_warnings,
be405f95 253 "IGNORE_ERRORS" => \$ignore_errors,
9cc9e091
SR
254 "BISECT_MANUAL" => \$bisect_manual,
255 "BISECT_SKIP" => \$bisect_skip,
256 "CONFIG_BISECT_GOOD" => \$config_bisect_good,
257 "BISECT_RET_GOOD" => \$bisect_ret_good,
258 "BISECT_RET_BAD" => \$bisect_ret_bad,
259 "BISECT_RET_SKIP" => \$bisect_ret_skip,
260 "BISECT_RET_ABORT" => \$bisect_ret_abort,
261 "BISECT_RET_DEFAULT" => \$bisect_ret_default,
262 "STORE_FAILURES" => \$store_failures,
263 "STORE_SUCCESSES" => \$store_successes,
264 "TEST_NAME" => \$test_name,
265 "TIMEOUT" => \$timeout,
266 "BOOTED_TIMEOUT" => \$booted_timeout,
267 "CONSOLE" => \$console,
268 "DETECT_TRIPLE_FAULT" => \$detect_triplefault,
269 "SUCCESS_LINE" => \$success_line,
270 "REBOOT_SUCCESS_LINE" => \$reboot_success_line,
271 "STOP_AFTER_SUCCESS" => \$stop_after_success,
272 "STOP_AFTER_FAILURE" => \$stop_after_failure,
273 "STOP_TEST_AFTER" => \$stop_test_after,
274 "BUILD_TARGET" => \$build_target,
275 "SSH_EXEC" => \$ssh_exec,
276 "SCP_TO_TARGET" => \$scp_to_target,
02ad2617 277 "SCP_TO_TARGET_INSTALL" => \$scp_to_target_install,
9cc9e091
SR
278 "CHECKOUT" => \$checkout,
279 "TARGET_IMAGE" => \$target_image,
280 "LOCALVERSION" => \$localversion,
281
282 "BISECT_GOOD" => \$bisect_good,
283 "BISECT_BAD" => \$bisect_bad,
284 "BISECT_TYPE" => \$bisect_type,
285 "BISECT_START" => \$bisect_start,
286 "BISECT_REPLAY" => \$bisect_replay,
287 "BISECT_FILES" => \$bisect_files,
288 "BISECT_REVERSE" => \$bisect_reverse,
289 "BISECT_CHECK" => \$bisect_check,
290
291 "CONFIG_BISECT" => \$config_bisect,
292 "CONFIG_BISECT_TYPE" => \$config_bisect_type,
b0918612 293 "CONFIG_BISECT_CHECK" => \$config_bisect_check,
9cc9e091
SR
294
295 "PATCHCHECK_TYPE" => \$patchcheck_type,
296 "PATCHCHECK_START" => \$patchcheck_start,
297 "PATCHCHECK_END" => \$patchcheck_end,
298);
299
300# Options may be used by other options, record them.
301my %used_options;
302
7bf51073
SR
303# default variables that can be used
304chomp ($variable{"PWD"} = `pwd`);
305
8d1491ba
SR
306$config_help{"MACHINE"} = << "EOF"
307 The machine hostname that you will test.
bb8474b1 308 For build only tests, it is still needed to differentiate log files.
8d1491ba
SR
309EOF
310 ;
311$config_help{"SSH_USER"} = << "EOF"
312 The box is expected to have ssh on normal bootup, provide the user
313 (most likely root, since you need privileged operations)
314EOF
315 ;
316$config_help{"BUILD_DIR"} = << "EOF"
317 The directory that contains the Linux source code (full path).
0e7a22de
SR
318 You can use \${PWD} that will be the path where ktest.pl is run, or use
319 \${THIS_DIR} which is assigned \${PWD} but may be changed later.
8d1491ba
SR
320EOF
321 ;
322$config_help{"OUTPUT_DIR"} = << "EOF"
323 The directory that the objects will be built (full path).
324 (can not be same as BUILD_DIR)
0e7a22de
SR
325 You can use \${PWD} that will be the path where ktest.pl is run, or use
326 \${THIS_DIR} which is assigned \${PWD} but may be changed later.
8d1491ba
SR
327EOF
328 ;
329$config_help{"BUILD_TARGET"} = << "EOF"
330 The location of the compiled file to copy to the target.
331 (relative to OUTPUT_DIR)
332EOF
333 ;
dbd3783b
SR
334$config_help{"BUILD_OPTIONS"} = << "EOF"
335 Options to add to \"make\" when building.
336 i.e. -j20
337EOF
338 ;
8d1491ba
SR
339$config_help{"TARGET_IMAGE"} = << "EOF"
340 The place to put your image on the test machine.
341EOF
342 ;
343$config_help{"POWER_CYCLE"} = << "EOF"
344 A script or command to reboot the box.
345
346 Here is a digital loggers power switch example
347 POWER_CYCLE = wget --no-proxy -O /dev/null -q --auth-no-challenge 'http://admin:admin\@power/outlet?5=CCL'
348
349 Here is an example to reboot a virtual box on the current host
350 with the name "Guest".
351 POWER_CYCLE = virsh destroy Guest; sleep 5; virsh start Guest
352EOF
353 ;
354$config_help{"CONSOLE"} = << "EOF"
355 The script or command that reads the console
356
357 If you use ttywatch server, something like the following would work.
358CONSOLE = nc -d localhost 3001
359
360 For a virtual machine with guest name "Guest".
361CONSOLE = virsh console Guest
362EOF
363 ;
364$config_help{"LOCALVERSION"} = << "EOF"
365 Required version ending to differentiate the test
366 from other linux builds on the system.
367EOF
368 ;
369$config_help{"REBOOT_TYPE"} = << "EOF"
370 Way to reboot the box to the test kernel.
371 Only valid options so far are "grub" and "script".
372
373 If you specify grub, it will assume grub version 1
374 and will search in /boot/grub/menu.lst for the title \$GRUB_MENU
375 and select that target to reboot to the kernel. If this is not
376 your setup, then specify "script" and have a command or script
377 specified in REBOOT_SCRIPT to boot to the target.
378
379 The entry in /boot/grub/menu.lst must be entered in manually.
380 The test will not modify that file.
381EOF
382 ;
383$config_help{"GRUB_MENU"} = << "EOF"
384 The grub title name for the test kernel to boot
385 (Only mandatory if REBOOT_TYPE = grub)
386
387 Note, ktest.pl will not update the grub menu.lst, you need to
388 manually add an option for the test. ktest.pl will search
389 the grub menu.lst for this option to find what kernel to
390 reboot into.
391
392 For example, if in the /boot/grub/menu.lst the test kernel title has:
393 title Test Kernel
394 kernel vmlinuz-test
395 GRUB_MENU = Test Kernel
396EOF
397 ;
398$config_help{"REBOOT_SCRIPT"} = << "EOF"
399 A script to reboot the target into the test kernel
400 (Only mandatory if REBOOT_TYPE = script)
401EOF
402 ;
403
dad98754
SR
404sub read_prompt {
405 my ($cancel, $prompt) = @_;
35ce5952
SR
406
407 my $ans;
408
409 for (;;) {
dad98754
SR
410 if ($cancel) {
411 print "$prompt [y/n/C] ";
412 } else {
413 print "$prompt [Y/n] ";
414 }
35ce5952
SR
415 $ans = <STDIN>;
416 chomp $ans;
417 if ($ans =~ /^\s*$/) {
dad98754
SR
418 if ($cancel) {
419 $ans = "c";
420 } else {
421 $ans = "y";
422 }
35ce5952
SR
423 }
424 last if ($ans =~ /^y$/i || $ans =~ /^n$/i);
dad98754
SR
425 if ($cancel) {
426 last if ($ans =~ /^c$/i);
427 print "Please answer either 'y', 'n' or 'c'.\n";
428 } else {
429 print "Please answer either 'y' or 'n'.\n";
430 }
431 }
432 if ($ans =~ /^c/i) {
433 exit;
35ce5952
SR
434 }
435 if ($ans !~ /^y$/i) {
436 return 0;
437 }
438 return 1;
439}
8d1491ba 440
dad98754
SR
441sub read_yn {
442 my ($prompt) = @_;
443
444 return read_prompt 0, $prompt;
445}
446
447sub read_ync {
448 my ($prompt) = @_;
449
450 return read_prompt 1, $prompt;
451}
452
8d1491ba
SR
453sub get_ktest_config {
454 my ($config) = @_;
815e2bd7 455 my $ans;
8d1491ba
SR
456
457 return if (defined($opt{$config}));
458
459 if (defined($config_help{$config})) {
460 print "\n";
461 print $config_help{$config};
462 }
463
464 for (;;) {
465 print "$config = ";
dbd3783b 466 if (defined($default{$config}) && length($default{$config})) {
8d1491ba
SR
467 print "\[$default{$config}\] ";
468 }
815e2bd7
SR
469 $ans = <STDIN>;
470 $ans =~ s/^\s*(.*\S)\s*$/$1/;
471 if ($ans =~ /^\s*$/) {
8d1491ba 472 if ($default{$config}) {
815e2bd7 473 $ans = $default{$config};
8d1491ba
SR
474 } else {
475 print "Your answer can not be blank\n";
476 next;
477 }
478 }
0e7a22de 479 $entered_configs{$config} = ${ans};
8d1491ba
SR
480 last;
481 }
482}
483
484sub get_ktest_configs {
485 get_ktest_config("MACHINE");
8d1491ba
SR
486 get_ktest_config("BUILD_DIR");
487 get_ktest_config("OUTPUT_DIR");
bb8474b1 488
dbd3783b
SR
489 if ($newconfig) {
490 get_ktest_config("BUILD_OPTIONS");
491 }
492
bb8474b1
SR
493 # options required for other than just building a kernel
494 if (!$buildonly) {
165708b2
SR
495 get_ktest_config("POWER_CYCLE");
496 get_ktest_config("CONSOLE");
497 }
498
499 # options required for install and more
500 if ($buildonly != 1) {
bb8474b1
SR
501 get_ktest_config("SSH_USER");
502 get_ktest_config("BUILD_TARGET");
503 get_ktest_config("TARGET_IMAGE");
bb8474b1
SR
504 }
505
8d1491ba
SR
506 get_ktest_config("LOCALVERSION");
507
bb8474b1
SR
508 return if ($buildonly);
509
8d1491ba
SR
510 my $rtype = $opt{"REBOOT_TYPE"};
511
512 if (!defined($rtype)) {
513 if (!defined($opt{"GRUB_MENU"})) {
514 get_ktest_config("REBOOT_TYPE");
515 $rtype = $entered_configs{"REBOOT_TYPE"};
516 } else {
517 $rtype = "grub";
518 }
519 }
520
521 if ($rtype eq "grub") {
522 get_ktest_config("GRUB_MENU");
8d1491ba
SR
523 }
524}
525
77d942ce 526sub process_variables {
8d735212 527 my ($value, $remove_undef) = @_;
77d942ce
SR
528 my $retval = "";
529
530 # We want to check for '\', and it is just easier
531 # to check the previous characet of '$' and not need
532 # to worry if '$' is the first character. By adding
533 # a space to $value, we can just check [^\\]\$ and
534 # it will still work.
535 $value = " $value";
536
537 while ($value =~ /(.*?[^\\])\$\{(.*?)\}(.*)/) {
538 my $begin = $1;
539 my $var = $2;
540 my $end = $3;
541 # append beginning of value to retval
542 $retval = "$retval$begin";
543 if (defined($variable{$var})) {
544 $retval = "$retval$variable{$var}";
8d735212
SR
545 } elsif (defined($remove_undef) && $remove_undef) {
546 # for if statements, any variable that is not defined,
547 # we simple convert to 0
548 $retval = "${retval}0";
77d942ce
SR
549 } else {
550 # put back the origin piece.
551 $retval = "$retval\$\{$var\}";
9cc9e091
SR
552 # This could be an option that is used later, save
553 # it so we don't warn if this option is not one of
554 # ktests options.
555 $used_options{$var} = 1;
77d942ce
SR
556 }
557 $value = $end;
558 }
559 $retval = "$retval$value";
560
561 # remove the space added in the beginning
562 $retval =~ s/ //;
563
564 return "$retval"
565}
566
a57419b3 567sub set_value {
3d1cc414 568 my ($lvalue, $rvalue, $override, $overrides, $name) = @_;
a57419b3 569
cad96669
SR
570 my $prvalue = process_variables($rvalue);
571
572 if ($buildonly && $lvalue =~ /^TEST_TYPE(\[.*\])?$/ && $prvalue ne "build") {
bb8474b1
SR
573 # Note if a test is something other than build, then we
574 # will need other manditory options.
cad96669 575 if ($prvalue ne "install") {
165708b2
SR
576 $buildonly = 0;
577 } else {
578 # install still limits some manditory options.
579 $buildonly = 2;
580 }
bb8474b1
SR
581 }
582
a57419b3 583 if (defined($opt{$lvalue})) {
3d1cc414
SR
584 if (!$override || defined(${$overrides}{$lvalue})) {
585 my $extra = "";
586 if ($override) {
587 $extra = "In the same override section!\n";
588 }
589 die "$name: $.: Option $lvalue defined more than once!\n$extra";
590 }
cad96669 591 ${$overrides}{$lvalue} = $prvalue;
a57419b3 592 }
21a9679f
SR
593 if ($rvalue =~ /^\s*$/) {
594 delete $opt{$lvalue};
595 } else {
cad96669 596 $opt{$lvalue} = $prvalue;
21a9679f 597 }
a57419b3
SR
598}
599
77d942ce
SR
600sub set_variable {
601 my ($lvalue, $rvalue) = @_;
602
603 if ($rvalue =~ /^\s*$/) {
604 delete $variable{$lvalue};
605 } else {
606 $rvalue = process_variables($rvalue);
607 $variable{$lvalue} = $rvalue;
608 }
609}
610
ab7a3f52
SR
611sub process_compare {
612 my ($lval, $cmp, $rval) = @_;
613
614 # remove whitespace
615
616 $lval =~ s/^\s*//;
617 $lval =~ s/\s*$//;
618
619 $rval =~ s/^\s*//;
620 $rval =~ s/\s*$//;
621
622 if ($cmp eq "==") {
623 return $lval eq $rval;
624 } elsif ($cmp eq "!=") {
625 return $lval ne $rval;
626 }
627
628 my $statement = "$lval $cmp $rval";
629 my $ret = eval $statement;
630
631 # $@ stores error of eval
632 if ($@) {
633 return -1;
634 }
635
636 return $ret;
637}
638
9900b5dc
SR
639sub value_defined {
640 my ($val) = @_;
641
642 return defined($variable{$2}) ||
643 defined($opt{$2});
644}
645
8d735212
SR
646my $d = 0;
647sub process_expression {
648 my ($name, $val) = @_;
649
650 my $c = $d++;
651
652 while ($val =~ s/\(([^\(]*?)\)/\&\&\&\&VAL\&\&\&\&/) {
653 my $express = $1;
654
655 if (process_expression($name, $express)) {
656 $val =~ s/\&\&\&\&VAL\&\&\&\&/ 1 /;
657 } else {
658 $val =~ s/\&\&\&\&VAL\&\&\&\&/ 0 /;
659 }
660 }
661
662 $d--;
663 my $OR = "\\|\\|";
664 my $AND = "\\&\\&";
45d73a5d 665
8d735212
SR
666 while ($val =~ s/^(.*?)($OR|$AND)//) {
667 my $express = $1;
668 my $op = $2;
669
670 if (process_expression($name, $express)) {
671 if ($op eq "||") {
672 return 1;
673 }
674 } else {
675 if ($op eq "&&") {
676 return 0;
677 }
678 }
679 }
45d73a5d 680
ab7a3f52
SR
681 if ($val =~ /(.*)(==|\!=|>=|<=|>|<)(.*)/) {
682 my $ret = process_compare($1, $2, $3);
683 if ($ret < 0) {
684 die "$name: $.: Unable to process comparison\n";
685 }
686 return $ret;
687 }
688
9900b5dc
SR
689 if ($val =~ /^\s*(NOT\s*)?DEFINED\s+(\S+)\s*$/) {
690 if (defined $1) {
691 return !value_defined($2);
692 } else {
693 return value_defined($2);
694 }
695 }
696
45d73a5d
SR
697 if ($val =~ /^\s*0\s*$/) {
698 return 0;
699 } elsif ($val =~ /^\s*\d+\s*$/) {
700 return 1;
701 }
702
9900b5dc 703 die ("$name: $.: Undefined content $val in if statement\n");
8d735212
SR
704}
705
706sub process_if {
707 my ($name, $value) = @_;
708
709 # Convert variables and replace undefined ones with 0
710 my $val = process_variables($value, 1);
711 my $ret = process_expression $name, $val;
712
713 return $ret;
45d73a5d
SR
714}
715
2ed3b161
SR
716sub __read_config {
717 my ($config, $current_test_num) = @_;
2545eb61 718
2ed3b161
SR
719 my $in;
720 open($in, $config) || die "can't read file $config";
2545eb61 721
a57419b3
SR
722 my $name = $config;
723 $name =~ s,.*/(.*),$1,;
724
2ed3b161 725 my $test_num = $$current_test_num;
a57419b3
SR
726 my $default = 1;
727 my $repeat = 1;
728 my $num_tests_set = 0;
729 my $skip = 0;
730 my $rest;
a9f84424 731 my $line;
0df213ca 732 my $test_case = 0;
45d73a5d
SR
733 my $if = 0;
734 my $if_set = 0;
3d1cc414
SR
735 my $override = 0;
736
737 my %overrides;
a57419b3 738
2ed3b161 739 while (<$in>) {
2545eb61
SR
740
741 # ignore blank lines and comments
742 next if (/^\s*$/ || /\s*\#/);
743
0050b6bb 744 if (/^\s*(TEST_START|DEFAULTS)\b(.*)/) {
a57419b3 745
0050b6bb
SR
746 my $type = $1;
747 $rest = $2;
a9f84424 748 $line = $2;
a57419b3 749
0050b6bb
SR
750 my $old_test_num;
751 my $old_repeat;
3d1cc414 752 $override = 0;
0050b6bb
SR
753
754 if ($type eq "TEST_START") {
755
756 if ($num_tests_set) {
757 die "$name: $.: Can not specify both NUM_TESTS and TEST_START\n";
758 }
a57419b3 759
0050b6bb
SR
760 $old_test_num = $test_num;
761 $old_repeat = $repeat;
a57419b3 762
0050b6bb
SR
763 $test_num += $repeat;
764 $default = 0;
765 $repeat = 1;
766 } else {
767 $default = 1;
768 }
a57419b3 769
a9f84424
SR
770 # If SKIP is anywhere in the line, the command will be skipped
771 if ($rest =~ s/\s+SKIP\b//) {
a57419b3
SR
772 $skip = 1;
773 } else {
0df213ca 774 $test_case = 1;
a57419b3
SR
775 $skip = 0;
776 }
777
a9f84424
SR
778 if ($rest =~ s/\sELSE\b//) {
779 if (!$if) {
780 die "$name: $.: ELSE found with out matching IF section\n$_";
781 }
782 $if = 0;
783
784 if ($if_set) {
785 $skip = 1;
786 } else {
787 $skip = 0;
3d1cc414 788 }
a57419b3
SR
789 }
790
a9f84424 791 if ($rest =~ s/\sIF\s+(.*)//) {
45d73a5d
SR
792 if (process_if($name, $1)) {
793 $if_set = 1;
794 } else {
795 $skip = 1;
796 }
797 $if = 1;
798 } else {
799 $if = 0;
a9f84424
SR
800 $if_set = 0;
801 }
802
803 if (!$skip) {
804 if ($type eq "TEST_START") {
805 if ($rest =~ s/\s+ITERATE\s+(\d+)//) {
806 $repeat = $1;
807 $repeat_tests{"$test_num"} = $repeat;
808 }
809 } elsif ($rest =~ s/\sOVERRIDE\b//) {
810 # DEFAULT only
811 $override = 1;
812 # Clear previous overrides
813 %overrides = ();
814 }
a57419b3
SR
815 }
816
a9f84424 817 if (!$skip && $rest !~ /^\s*$/) {
0050b6bb 818 die "$name: $.: Gargbage found after $type\n$_";
a57419b3
SR
819 }
820
0050b6bb 821 if ($skip && $type eq "TEST_START") {
a57419b3 822 $test_num = $old_test_num;
e48c5293 823 $repeat = $old_repeat;
a57419b3
SR
824 }
825
ab7a3f52 826 } elsif (/^\s*ELSE\b(.*)$/) {
45d73a5d
SR
827 if (!$if) {
828 die "$name: $.: ELSE found with out matching IF section\n$_";
829 }
830 $rest = $1;
831 if ($if_set) {
832 $skip = 1;
ab7a3f52 833 $rest = "";
45d73a5d
SR
834 } else {
835 $skip = 0;
836
ab7a3f52 837 if ($rest =~ /\sIF\s+(.*)/) {
45d73a5d
SR
838 # May be a ELSE IF section.
839 if (!process_if($name, $1)) {
840 $skip = 1;
841 }
ab7a3f52 842 $rest = "";
45d73a5d
SR
843 } else {
844 $if = 0;
845 }
846 }
847
ab7a3f52
SR
848 if ($rest !~ /^\s*$/) {
849 die "$name: $.: Gargbage found after DEFAULTS\n$_";
850 }
851
2ed3b161
SR
852 } elsif (/^\s*INCLUDE\s+(\S+)/) {
853
854 next if ($skip);
855
856 if (!$default) {
857 die "$name: $.: INCLUDE can only be done in default sections\n$_";
858 }
859
860 my $file = process_variables($1);
861
862 if ($file !~ m,^/,) {
863 # check the path of the config file first
864 if ($config =~ m,(.*)/,) {
865 if (-f "$1/$file") {
866 $file = "$1/$file";
867 }
868 }
869 }
870
871 if ( ! -r $file ) {
872 die "$name: $.: Can't read file $file\n$_";
873 }
874
875 if (__read_config($file, \$test_num)) {
876 $test_case = 1;
877 }
878
a57419b3
SR
879 } elsif (/^\s*([A-Z_\[\]\d]+)\s*=\s*(.*?)\s*$/) {
880
881 next if ($skip);
882
2545eb61
SR
883 my $lvalue = $1;
884 my $rvalue = $2;
885
a57419b3
SR
886 if (!$default &&
887 ($lvalue eq "NUM_TESTS" ||
888 $lvalue eq "LOG_FILE" ||
889 $lvalue eq "CLEAR_LOG")) {
890 die "$name: $.: $lvalue must be set in DEFAULTS section\n";
891 }
892
893 if ($lvalue eq "NUM_TESTS") {
894 if ($test_num) {
895 die "$name: $.: Can not specify both NUM_TESTS and TEST_START\n";
896 }
897 if (!$default) {
898 die "$name: $.: NUM_TESTS must be set in default section\n";
899 }
900 $num_tests_set = 1;
901 }
902
903 if ($default || $lvalue =~ /\[\d+\]$/) {
3d1cc414 904 set_value($lvalue, $rvalue, $override, \%overrides, $name);
a57419b3
SR
905 } else {
906 my $val = "$lvalue\[$test_num\]";
3d1cc414 907 set_value($val, $rvalue, $override, \%overrides, $name);
a57419b3
SR
908
909 if ($repeat > 1) {
910 $repeats{$val} = $repeat;
911 }
a75fecec 912 }
77d942ce
SR
913 } elsif (/^\s*([A-Z_\[\]\d]+)\s*:=\s*(.*?)\s*$/) {
914 next if ($skip);
915
916 my $lvalue = $1;
917 my $rvalue = $2;
918
919 # process config variables.
920 # Config variables are only active while reading the
921 # config and can be defined anywhere. They also ignore
922 # TEST_START and DEFAULTS, but are skipped if they are in
923 # on of these sections that have SKIP defined.
924 # The save variable can be
925 # defined multiple times and the new one simply overrides
926 # the prevous one.
927 set_variable($lvalue, $rvalue);
928
a57419b3
SR
929 } else {
930 die "$name: $.: Garbage found in config\n$_";
2545eb61
SR
931 }
932 }
933
a57419b3
SR
934 if ($test_num) {
935 $test_num += $repeat - 1;
936 $opt{"NUM_TESTS"} = $test_num;
937 }
938
2ed3b161
SR
939 close($in);
940
941 $$current_test_num = $test_num;
942
943 return $test_case;
944}
945
c4261d0f
SR
946sub get_test_case {
947 print "What test case would you like to run?\n";
948 print " (build, install or boot)\n";
949 print " Other tests are available but require editing the config file\n";
950 my $ans = <STDIN>;
951 chomp $ans;
952 $default{"TEST_TYPE"} = $ans;
953}
954
2ed3b161
SR
955sub read_config {
956 my ($config) = @_;
957
958 my $test_case;
959 my $test_num = 0;
960
961 $test_case = __read_config $config, \$test_num;
962
8d1491ba
SR
963 # make sure we have all mandatory configs
964 get_ktest_configs;
965
0df213ca
SR
966 # was a test specified?
967 if (!$test_case) {
968 print "No test case specified.\n";
c4261d0f 969 get_test_case;
0df213ca
SR
970 }
971
a75fecec
SR
972 # set any defaults
973
974 foreach my $default (keys %default) {
975 if (!defined($opt{$default})) {
976 $opt{$default} = $default{$default};
977 }
978 }
9cc9e091
SR
979
980 if ($opt{"IGNORE_UNUSED"} == 1) {
981 return;
982 }
983
984 my %not_used;
985
986 # check if there are any stragglers (typos?)
987 foreach my $option (keys %opt) {
988 my $op = $option;
989 # remove per test labels.
990 $op =~ s/\[.*\]//;
991 if (!exists($option_map{$op}) &&
992 !exists($default{$op}) &&
993 !exists($used_options{$op})) {
994 $not_used{$op} = 1;
995 }
996 }
997
998 if (%not_used) {
999 my $s = "s are";
1000 $s = " is" if (keys %not_used == 1);
1001 print "The following option$s not used; could be a typo:\n";
1002 foreach my $option (keys %not_used) {
1003 print "$option\n";
1004 }
1005 print "Set IGRNORE_UNUSED = 1 to have ktest ignore unused variables\n";
1006 if (!read_yn "Do you want to continue?") {
1007 exit -1;
1008 }
1009 }
2545eb61
SR
1010}
1011
23715c3c
SR
1012sub __eval_option {
1013 my ($option, $i) = @_;
1014
1015 # Add space to evaluate the character before $
1016 $option = " $option";
1017 my $retval = "";
f9dfb65b
RV
1018 my $repeated = 0;
1019 my $parent = 0;
1020
1021 foreach my $test (keys %repeat_tests) {
1022 if ($i >= $test &&
1023 $i < $test + $repeat_tests{$test}) {
1024
1025 $repeated = 1;
1026 $parent = $test;
1027 last;
1028 }
1029 }
23715c3c
SR
1030
1031 while ($option =~ /(.*?[^\\])\$\{(.*?)\}(.*)/) {
1032 my $start = $1;
1033 my $var = $2;
1034 my $end = $3;
1035
1036 # Append beginning of line
1037 $retval = "$retval$start";
1038
1039 # If the iteration option OPT[$i] exists, then use that.
1040 # otherwise see if the default OPT (without [$i]) exists.
1041
1042 my $o = "$var\[$i\]";
f9dfb65b 1043 my $parento = "$var\[$parent\]";
23715c3c
SR
1044
1045 if (defined($opt{$o})) {
1046 $o = $opt{$o};
1047 $retval = "$retval$o";
f9dfb65b
RV
1048 } elsif ($repeated && defined($opt{$parento})) {
1049 $o = $opt{$parento};
1050 $retval = "$retval$o";
23715c3c
SR
1051 } elsif (defined($opt{$var})) {
1052 $o = $opt{$var};
1053 $retval = "$retval$o";
1054 } else {
1055 $retval = "$retval\$\{$var\}";
1056 }
1057
1058 $option = $end;
1059 }
1060
1061 $retval = "$retval$option";
1062
1063 $retval =~ s/^ //;
1064
1065 return $retval;
1066}
1067
1068sub eval_option {
1069 my ($option, $i) = @_;
1070
1071 my $prev = "";
1072
1073 # Since an option can evaluate to another option,
1074 # keep iterating until we do not evaluate any more
1075 # options.
1076 my $r = 0;
1077 while ($prev ne $option) {
1078 # Check for recursive evaluations.
1079 # 100 deep should be more than enough.
1080 if ($r++ > 100) {
1081 die "Over 100 evaluations accurred with $option\n" .
1082 "Check for recursive variables\n";
1083 }
1084 $prev = $option;
1085 $option = __eval_option($option, $i);
1086 }
1087
1088 return $option;
1089}
1090
d1e2f22a 1091sub _logit {
2545eb61
SR
1092 if (defined($opt{"LOG_FILE"})) {
1093 open(OUT, ">> $opt{LOG_FILE}") or die "Can't write to $opt{LOG_FILE}";
1094 print OUT @_;
1095 close(OUT);
1096 }
1097}
1098
d1e2f22a
SR
1099sub logit {
1100 if (defined($opt{"LOG_FILE"})) {
1101 _logit @_;
1102 } else {
1103 print @_;
1104 }
1105}
1106
5f9b6ced
SR
1107sub doprint {
1108 print @_;
d1e2f22a 1109 _logit @_;
5f9b6ced
SR
1110}
1111
7faafbd6 1112sub run_command;
2728be41
AJ
1113sub start_monitor;
1114sub end_monitor;
1115sub wait_for_monitor;
7faafbd6
SR
1116
1117sub reboot {
2728be41
AJ
1118 my ($time) = @_;
1119
2b803365
SR
1120 if (defined($time)) {
1121 start_monitor;
1122 # flush out current monitor
1123 # May contain the reboot success line
1124 wait_for_monitor 1;
1125 }
1126
7faafbd6 1127 # try to reboot normally
e48c5293 1128 if (run_command $reboot) {
576f627c
SR
1129 if (defined($powercycle_after_reboot)) {
1130 sleep $powercycle_after_reboot;
1131 run_command "$power_cycle";
1132 }
1133 } else {
7faafbd6 1134 # nope? power cycle it.
a75fecec 1135 run_command "$power_cycle";
7faafbd6 1136 }
2728be41
AJ
1137
1138 if (defined($time)) {
407b95b7
SR
1139 if (wait_for_monitor($time, $reboot_success_line)) {
1140 # reboot got stuck?
8a80c727 1141 doprint "Reboot did not finish. Forcing power cycle\n";
407b95b7
SR
1142 run_command "$power_cycle";
1143 }
2728be41
AJ
1144 end_monitor;
1145 }
7faafbd6
SR
1146}
1147
bc7c5803
SR
1148sub reboot_to_good {
1149 my ($time) = @_;
1150
1151 if (defined($switch_to_good)) {
1152 run_command $switch_to_good;
bc7c5803
SR
1153 }
1154
1155 reboot $time;
1156}
1157
576f627c
SR
1158sub do_not_reboot {
1159 my $i = $iteration;
1160
4ab1cce5 1161 return $test_type eq "build" || $no_reboot ||
576f627c
SR
1162 ($test_type eq "patchcheck" && $opt{"PATCHCHECK_TYPE[$i]"} eq "build") ||
1163 ($test_type eq "bisect" && $opt{"BISECT_TYPE[$i]"} eq "build");
1164}
1165
5c42fc5b 1166sub dodie {
5a391fbf 1167 doprint "CRITICAL FAILURE... ", @_, "\n";
5c42fc5b 1168
576f627c
SR
1169 my $i = $iteration;
1170
1171 if ($reboot_on_error && !do_not_reboot) {
1172
75c3fda7 1173 doprint "REBOOTING\n";
bc7c5803 1174 reboot_to_good;
75c3fda7 1175
a75fecec 1176 } elsif ($poweroff_on_error && defined($power_off)) {
5c42fc5b 1177 doprint "POWERING OFF\n";
a75fecec 1178 `$power_off`;
5c42fc5b 1179 }
75c3fda7 1180
f80802cb
SR
1181 if (defined($opt{"LOG_FILE"})) {
1182 print " See $opt{LOG_FILE} for more info.\n";
1183 }
1184
576f627c 1185 die @_, "\n";
5c42fc5b
SR
1186}
1187
7faafbd6
SR
1188sub open_console {
1189 my ($fp) = @_;
1190
1191 my $flags;
1192
a75fecec
SR
1193 my $pid = open($fp, "$console|") or
1194 dodie "Can't open console $console";
7faafbd6
SR
1195
1196 $flags = fcntl($fp, F_GETFL, 0) or
576f627c 1197 dodie "Can't get flags for the socket: $!";
7faafbd6 1198 $flags = fcntl($fp, F_SETFL, $flags | O_NONBLOCK) or
576f627c 1199 dodie "Can't set flags for the socket: $!";
7faafbd6
SR
1200
1201 return $pid;
1202}
1203
1204sub close_console {
1205 my ($fp, $pid) = @_;
1206
1207 doprint "kill child process $pid\n";
1208 kill 2, $pid;
1209
1210 print "closing!\n";
1211 close($fp);
1212}
1213
1214sub start_monitor {
1215 if ($monitor_cnt++) {
1216 return;
1217 }
1218 $monitor_fp = \*MONFD;
1219 $monitor_pid = open_console $monitor_fp;
a75fecec
SR
1220
1221 return;
1222
1223 open(MONFD, "Stop perl from warning about single use of MONFD");
7faafbd6
SR
1224}
1225
1226sub end_monitor {
1227 if (--$monitor_cnt) {
1228 return;
1229 }
1230 close_console($monitor_fp, $monitor_pid);
1231}
1232
1233sub wait_for_monitor {
2b803365
SR
1234 my ($time, $stop) = @_;
1235 my $full_line = "";
7faafbd6 1236 my $line;
2b803365 1237 my $booted = 0;
407b95b7 1238 my $start_time = time;
8a80c727
SR
1239 my $skip_call_trace = 0;
1240 my $bug = 0;
1241 my $bug_ignored = 0;
407b95b7 1242 my $now;
7faafbd6 1243
a75fecec 1244 doprint "** Wait for monitor to settle down **\n";
7faafbd6
SR
1245
1246 # read the monitor and wait for the system to calm down
2b803365 1247 while (!$booted) {
7faafbd6 1248 $line = wait_for_input($monitor_fp, $time);
2b803365
SR
1249 last if (!defined($line));
1250 print "$line";
1251 $full_line .= $line;
1252
1253 if (defined($stop) && $full_line =~ /$stop/) {
1254 doprint "wait for monitor detected $stop\n";
1255 $booted = 1;
1256 }
1257
8a80c727
SR
1258 if ($full_line =~ /\[ backtrace testing \]/) {
1259 $skip_call_trace = 1;
1260 }
1261
1262 if ($full_line =~ /call trace:/i) {
1263 if (!$bug && !$skip_call_trace) {
1264 if ($ignore_errors) {
1265 $bug_ignored = 1;
1266 } else {
1267 $bug = 1;
1268 }
1269 }
1270 }
1271
1272 if ($full_line =~ /\[ end of backtrace testing \]/) {
1273 $skip_call_trace = 0;
1274 }
1275
1276 if ($full_line =~ /Kernel panic -/) {
1277 $bug = 1;
1278 }
1279
2b803365
SR
1280 if ($line =~ /\n/) {
1281 $full_line = "";
1282 }
407b95b7
SR
1283 $now = time;
1284 if ($now - $start_time >= $max_monitor_wait) {
1285 doprint "Exiting monitor flush due to hitting MAX_MONITOR_WAIT\n";
1286 return 1;
1287 }
2b803365 1288 }
a75fecec 1289 print "** Monitor flushed **\n";
8a80c727 1290 return $bug;
7faafbd6
SR
1291}
1292
de5b6e3b
RV
1293sub save_logs {
1294 my ($result, $basedir) = @_;
1295 my @t = localtime;
1296 my $date = sprintf "%04d%02d%02d%02d%02d%02d",
1297 1900+$t[5],$t[4],$t[3],$t[2],$t[1],$t[0];
1298
1299 my $type = $build_type;
1300 if ($type =~ /useconfig/) {
1301 $type = "useconfig";
1302 }
1303
1304 my $dir = "$machine-$test_type-$type-$result-$date";
1305
1306 $dir = "$basedir/$dir";
1307
1308 if (!-d $dir) {
1309 mkpath($dir) or
1310 die "can't create $dir";
1311 }
1312
1313 my %files = (
1314 "config" => $output_config,
1315 "buildlog" => $buildlog,
1316 "dmesg" => $dmesg,
1317 "testlog" => $testlog,
1318 );
1319
1320 while (my ($name, $source) = each(%files)) {
1321 if (-f "$source") {
1322 cp "$source", "$dir/$name" or
1323 die "failed to copy $source";
1324 }
1325 }
1326
1327 doprint "*** Saved info to $dir ***\n";
1328}
1329
2b7d9b21
SR
1330sub fail {
1331
921ed4c7
SR
1332 if (defined($post_test)) {
1333 run_command $post_test;
1334 }
1335
a75fecec 1336 if ($die_on_failure) {
2b7d9b21
SR
1337 dodie @_;
1338 }
1339
a75fecec 1340 doprint "FAILED\n";
7faafbd6 1341
576f627c
SR
1342 my $i = $iteration;
1343
a75fecec 1344 # no need to reboot for just building.
576f627c 1345 if (!do_not_reboot) {
a75fecec 1346 doprint "REBOOTING\n";
bc7c5803 1347 reboot_to_good $sleep_time;
a75fecec 1348 }
7faafbd6 1349
9064af52
SR
1350 my $name = "";
1351
1352 if (defined($test_name)) {
1353 $name = " ($test_name)";
1354 }
1355
576f627c
SR
1356 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
1357 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
9064af52 1358 doprint "KTEST RESULT: TEST $i$name Failed: ", @_, "\n";
576f627c
SR
1359 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
1360 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
a75fecec 1361
de5b6e3b
RV
1362 if (defined($store_failures)) {
1363 save_logs "fail", $store_failures;
1364 }
7faafbd6 1365
2b7d9b21
SR
1366 return 1;
1367}
1368
2545eb61
SR
1369sub run_command {
1370 my ($command) = @_;
d6ce2a0b
SR
1371 my $dolog = 0;
1372 my $dord = 0;
1373 my $pid;
1374
e48c5293
SR
1375 $command =~ s/\$SSH_USER/$ssh_user/g;
1376 $command =~ s/\$MACHINE/$machine/g;
1377
d6ce2a0b
SR
1378 doprint("$command ... ");
1379
1380 $pid = open(CMD, "$command 2>&1 |") or
2b7d9b21 1381 (fail "unable to exec $command" and return 0);
2545eb61
SR
1382
1383 if (defined($opt{"LOG_FILE"})) {
d6ce2a0b
SR
1384 open(LOG, ">>$opt{LOG_FILE}") or
1385 dodie "failed to write to log";
1386 $dolog = 1;
6c5ee0be
SR
1387 }
1388
1389 if (defined($redirect)) {
d6ce2a0b
SR
1390 open (RD, ">$redirect") or
1391 dodie "failed to write to redirect $redirect";
1392 $dord = 1;
2545eb61
SR
1393 }
1394
d6ce2a0b
SR
1395 while (<CMD>) {
1396 print LOG if ($dolog);
1397 print RD if ($dord);
1398 }
2545eb61 1399
d6ce2a0b 1400 waitpid($pid, 0);
2545eb61
SR
1401 my $failed = $?;
1402
d6ce2a0b
SR
1403 close(CMD);
1404 close(LOG) if ($dolog);
1405 close(RD) if ($dord);
1406
2545eb61
SR
1407 if ($failed) {
1408 doprint "FAILED!\n";
1409 } else {
1410 doprint "SUCCESS\n";
1411 }
1412
5f9b6ced
SR
1413 return !$failed;
1414}
1415
e48c5293
SR
1416sub run_ssh {
1417 my ($cmd) = @_;
1418 my $cp_exec = $ssh_exec;
1419
1420 $cp_exec =~ s/\$SSH_COMMAND/$cmd/g;
1421 return run_command "$cp_exec";
1422}
1423
1424sub run_scp {
02ad2617 1425 my ($src, $dst, $cp_scp) = @_;
e48c5293
SR
1426
1427 $cp_scp =~ s/\$SRC_FILE/$src/g;
1428 $cp_scp =~ s/\$DST_FILE/$dst/g;
1429
1430 return run_command "$cp_scp";
1431}
1432
02ad2617
SR
1433sub run_scp_install {
1434 my ($src, $dst) = @_;
1435
1436 my $cp_scp = $scp_to_target_install;
1437
1438 return run_scp($src, $dst, $cp_scp);
1439}
1440
1441sub run_scp_mod {
1442 my ($src, $dst) = @_;
1443
1444 my $cp_scp = $scp_to_target;
1445
1446 return run_scp($src, $dst, $cp_scp);
1447}
1448
5f9b6ced
SR
1449sub get_grub_index {
1450
a75fecec
SR
1451 if ($reboot_type ne "grub") {
1452 return;
1453 }
5a391fbf 1454 return if (defined($grub_number));
5f9b6ced
SR
1455
1456 doprint "Find grub menu ... ";
1457 $grub_number = -1;
e48c5293
SR
1458
1459 my $ssh_grub = $ssh_exec;
1460 $ssh_grub =~ s,\$SSH_COMMAND,cat /boot/grub/menu.lst,g;
1461
1462 open(IN, "$ssh_grub |")
5f9b6ced 1463 or die "unable to get menu.lst";
e48c5293 1464
eaa1fe25
SR
1465 my $found = 0;
1466
5f9b6ced 1467 while (<IN>) {
a75fecec 1468 if (/^\s*title\s+$grub_menu\s*$/) {
5f9b6ced 1469 $grub_number++;
eaa1fe25 1470 $found = 1;
5f9b6ced
SR
1471 last;
1472 } elsif (/^\s*title\s/) {
1473 $grub_number++;
1474 }
1475 }
1476 close(IN);
1477
a75fecec 1478 die "Could not find '$grub_menu' in /boot/grub/menu on $machine"
eaa1fe25 1479 if (!$found);
5f9b6ced 1480 doprint "$grub_number\n";
2545eb61
SR
1481}
1482
2545eb61
SR
1483sub wait_for_input
1484{
1485 my ($fp, $time) = @_;
1486 my $rin;
1487 my $ready;
1488 my $line;
1489 my $ch;
1490
1491 if (!defined($time)) {
1492 $time = $timeout;
1493 }
1494
1495 $rin = '';
1496 vec($rin, fileno($fp), 1) = 1;
1497 $ready = select($rin, undef, undef, $time);
1498
1499 $line = "";
1500
1501 # try to read one char at a time
1502 while (sysread $fp, $ch, 1) {
1503 $line .= $ch;
1504 last if ($ch eq "\n");
1505 }
1506
1507 if (!length($line)) {
1508 return undef;
1509 }
1510
1511 return $line;
1512}
1513
75c3fda7 1514sub reboot_to {
bc7c5803
SR
1515 if (defined($switch_to_test)) {
1516 run_command $switch_to_test;
1517 }
1518
a75fecec 1519 if ($reboot_type eq "grub") {
c54367f9 1520 run_ssh "'(echo \"savedefault --default=$grub_number --once\" | grub --batch)'";
96f6a0df
SR
1521 } elsif (defined $reboot_script) {
1522 run_command "$reboot_script";
a75fecec 1523 }
96f6a0df 1524 reboot;
2545eb61
SR
1525}
1526
a57419b3
SR
1527sub get_sha1 {
1528 my ($commit) = @_;
1529
1530 doprint "git rev-list --max-count=1 $commit ... ";
1531 my $sha1 = `git rev-list --max-count=1 $commit`;
1532 my $ret = $?;
1533
1534 logit $sha1;
1535
1536 if ($ret) {
1537 doprint "FAILED\n";
1538 dodie "Failed to get git $commit";
1539 }
1540
1541 print "SUCCESS\n";
1542
1543 chomp $sha1;
1544
1545 return $sha1;
1546}
1547
5a391fbf 1548sub monitor {
2545eb61
SR
1549 my $booted = 0;
1550 my $bug = 0;
6ca996cc 1551 my $bug_ignored = 0;
5c42fc5b 1552 my $skip_call_trace = 0;
2b7d9b21 1553 my $loops;
2545eb61 1554
7faafbd6 1555 wait_for_monitor 5;
2545eb61
SR
1556
1557 my $line;
1558 my $full_line = "";
1559
7faafbd6
SR
1560 open(DMESG, "> $dmesg") or
1561 die "unable to write to $dmesg";
2545eb61 1562
75c3fda7 1563 reboot_to;
2545eb61 1564
1c8a617a
SR
1565 my $success_start;
1566 my $failure_start;
2d01b26a
SR
1567 my $monitor_start = time;
1568 my $done = 0;
f1a5b962 1569 my $version_found = 0;
1c8a617a 1570
2d01b26a 1571 while (!$done) {
2545eb61 1572
ecaf8e52
SR
1573 if ($bug && defined($stop_after_failure) &&
1574 $stop_after_failure >= 0) {
1575 my $time = $stop_after_failure - (time - $failure_start);
1576 $line = wait_for_input($monitor_fp, $time);
1577 if (!defined($line)) {
1578 doprint "bug timed out after $booted_timeout seconds\n";
1579 doprint "Test forced to stop after $stop_after_failure seconds after failure\n";
1580 last;
1581 }
1582 } elsif ($booted) {
a75fecec 1583 $line = wait_for_input($monitor_fp, $booted_timeout);
cd4f1d53
SR
1584 if (!defined($line)) {
1585 my $s = $booted_timeout == 1 ? "" : "s";
1586 doprint "Successful boot found: break after $booted_timeout second$s\n";
1587 last;
1588 }
2b7d9b21 1589 } else {
7faafbd6 1590 $line = wait_for_input($monitor_fp);
cd4f1d53
SR
1591 if (!defined($line)) {
1592 my $s = $timeout == 1 ? "" : "s";
1593 doprint "Timed out after $timeout second$s\n";
1594 last;
1595 }
2b7d9b21 1596 }
2545eb61 1597
2545eb61 1598 doprint $line;
7faafbd6 1599 print DMESG $line;
2545eb61
SR
1600
1601 # we are not guaranteed to get a full line
1602 $full_line .= $line;
1603
a75fecec 1604 if ($full_line =~ /$success_line/) {
2545eb61 1605 $booted = 1;
1c8a617a
SR
1606 $success_start = time;
1607 }
1608
1609 if ($booted && defined($stop_after_success) &&
1610 $stop_after_success >= 0) {
1611 my $now = time;
1612 if ($now - $success_start >= $stop_after_success) {
1613 doprint "Test forced to stop after $stop_after_success seconds after success\n";
1614 last;
1615 }
2545eb61
SR
1616 }
1617
5c42fc5b
SR
1618 if ($full_line =~ /\[ backtrace testing \]/) {
1619 $skip_call_trace = 1;
1620 }
1621
2545eb61 1622 if ($full_line =~ /call trace:/i) {
6ca996cc
SR
1623 if (!$bug && !$skip_call_trace) {
1624 if ($ignore_errors) {
1625 $bug_ignored = 1;
1626 } else {
1627 $bug = 1;
1628 $failure_start = time;
1629 }
1c8a617a
SR
1630 }
1631 }
1632
1633 if ($bug && defined($stop_after_failure) &&
1634 $stop_after_failure >= 0) {
1635 my $now = time;
1636 if ($now - $failure_start >= $stop_after_failure) {
1637 doprint "Test forced to stop after $stop_after_failure seconds after failure\n";
1638 last;
1639 }
5c42fc5b
SR
1640 }
1641
1642 if ($full_line =~ /\[ end of backtrace testing \]/) {
1643 $skip_call_trace = 0;
1644 }
1645
1646 if ($full_line =~ /Kernel panic -/) {
10abf118 1647 $failure_start = time;
2545eb61
SR
1648 $bug = 1;
1649 }
1650
f1a5b962
SR
1651 # Detect triple faults by testing the banner
1652 if ($full_line =~ /\bLinux version (\S+).*\n/) {
1653 if ($1 eq $version) {
1654 $version_found = 1;
1655 } elsif ($version_found && $detect_triplefault) {
1656 # We already booted into the kernel we are testing,
1657 # but now we booted into another kernel?
1658 # Consider this a triple fault.
1659 doprint "Aleady booted in Linux kernel $version, but now\n";
1660 doprint "we booted into Linux kernel $1.\n";
1661 doprint "Assuming that this is a triple fault.\n";
1662 doprint "To disable this: set DETECT_TRIPLE_FAULT to 0\n";
1663 last;
1664 }
1665 }
1666
2545eb61
SR
1667 if ($line =~ /\n/) {
1668 $full_line = "";
1669 }
2d01b26a
SR
1670
1671 if ($stop_test_after > 0 && !$booted && !$bug) {
1672 if (time - $monitor_start > $stop_test_after) {
4d62bf51 1673 doprint "STOP_TEST_AFTER ($stop_test_after seconds) timed out\n";
2d01b26a
SR
1674 $done = 1;
1675 }
1676 }
2545eb61
SR
1677 }
1678
7faafbd6 1679 close(DMESG);
2545eb61 1680
a75fecec 1681 if ($bug) {
2b7d9b21 1682 return 0 if ($in_bisect);
576f627c 1683 fail "failed - got a bug report" and return 0;
2545eb61
SR
1684 }
1685
a75fecec 1686 if (!$booted) {
2b7d9b21 1687 return 0 if ($in_bisect);
576f627c 1688 fail "failed - never got a boot prompt." and return 0;
2545eb61 1689 }
5f9b6ced 1690
6ca996cc
SR
1691 if ($bug_ignored) {
1692 doprint "WARNING: Call Trace detected but ignored due to IGNORE_ERRORS=1\n";
1693 }
1694
2b7d9b21 1695 return 1;
2545eb61
SR
1696}
1697
2b29b2f8
SR
1698sub eval_kernel_version {
1699 my ($option) = @_;
1700
1701 $option =~ s/\$KERNEL_VERSION/$version/g;
1702
1703 return $option;
1704}
1705
db05cfef
SR
1706sub do_post_install {
1707
1708 return if (!defined($post_install));
1709
2b29b2f8 1710 my $cp_post_install = eval_kernel_version $post_install;
db05cfef
SR
1711 run_command "$cp_post_install" or
1712 dodie "Failed to run post install";
1713}
1714
2545eb61
SR
1715sub install {
1716
e0a8742e
SR
1717 return if ($no_install);
1718
e5c2ec11
SR
1719 if (defined($pre_install)) {
1720 my $cp_pre_install = eval_kernel_version $pre_install;
1721 run_command "$cp_pre_install" or
1722 dodie "Failed to run pre install";
1723 }
1724
2b29b2f8
SR
1725 my $cp_target = eval_kernel_version $target_image;
1726
02ad2617 1727 run_scp_install "$outputdir/$build_target", "$cp_target" or
5c42fc5b 1728 dodie "failed to copy image";
2545eb61 1729
5f9b6ced 1730 my $install_mods = 0;
2545eb61 1731
5f9b6ced
SR
1732 # should we process modules?
1733 $install_mods = 0;
51ad1dd1 1734 open(IN, "$output_config") or dodie("Can't read config file");
5f9b6ced
SR
1735 while (<IN>) {
1736 if (/CONFIG_MODULES(=y)?/) {
1737 $install_mods = 1 if (defined($1));
1738 last;
5c42fc5b 1739 }
5f9b6ced
SR
1740 }
1741 close(IN);
5c42fc5b 1742
5f9b6ced 1743 if (!$install_mods) {
db05cfef 1744 do_post_install;
5f9b6ced
SR
1745 doprint "No modules needed\n";
1746 return;
1747 }
2545eb61 1748
627977d8 1749 run_command "$make INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH=$tmpdir modules_install" or
5f9b6ced 1750 dodie "Failed to install modules";
5c42fc5b 1751
5f9b6ced 1752 my $modlib = "/lib/modules/$version";
a57419b3 1753 my $modtar = "ktest-mods.tar.bz2";
5c42fc5b 1754
e48c5293 1755 run_ssh "rm -rf $modlib" or
5f9b6ced 1756 dodie "failed to remove old mods: $modlib";
5c42fc5b 1757
5f9b6ced 1758 # would be nice if scp -r did not follow symbolic links
a75fecec 1759 run_command "cd $tmpdir && tar -cjf $modtar lib/modules/$version" or
5f9b6ced
SR
1760 dodie "making tarball";
1761
02ad2617 1762 run_scp_mod "$tmpdir/$modtar", "/tmp" or
5f9b6ced
SR
1763 dodie "failed to copy modules";
1764
a75fecec 1765 unlink "$tmpdir/$modtar";
5f9b6ced 1766
e7b13441 1767 run_ssh "'(cd / && tar xjf /tmp/$modtar)'" or
5f9b6ced 1768 dodie "failed to tar modules";
2545eb61 1769
e48c5293 1770 run_ssh "rm -f /tmp/$modtar";
8b37ca8c 1771
db05cfef 1772 do_post_install;
2545eb61
SR
1773}
1774
ddf607e5
SR
1775sub get_version {
1776 # get the release name
683a3e64 1777 return if ($have_version);
ddf607e5
SR
1778 doprint "$make kernelrelease ... ";
1779 $version = `$make kernelrelease | tail -1`;
1780 chomp($version);
1781 doprint "$version\n";
683a3e64 1782 $have_version = 1;
ddf607e5
SR
1783}
1784
1785sub start_monitor_and_boot {
9f7424cc
SR
1786 # Make sure the stable kernel has finished booting
1787 start_monitor;
1788 wait_for_monitor 5;
1789 end_monitor;
1790
ddf607e5
SR
1791 get_grub_index;
1792 get_version;
1793 install;
1794
1795 start_monitor;
1796 return monitor;
1797}
1798
6c5ee0be
SR
1799sub check_buildlog {
1800 my ($patch) = @_;
1801
6c5ee0be
SR
1802 my @files = `git show $patch | diffstat -l`;
1803
1804 open(IN, "git show $patch |") or
1805 dodie "failed to show $patch";
1806 while (<IN>) {
1807 if (m,^--- a/(.*),) {
1808 chomp $1;
1809 $files[$#files] = $1;
1810 }
1811 }
1812 close(IN);
1813
1814 open(IN, $buildlog) or dodie "Can't open $buildlog";
1815 while (<IN>) {
1816 if (/^\s*(.*?):.*(warning|error)/) {
1817 my $err = $1;
1818 foreach my $file (@files) {
a75fecec 1819 my $fullpath = "$builddir/$file";
6c5ee0be 1820 if ($file eq $err || $fullpath eq $err) {
2b7d9b21 1821 fail "$file built with warnings" and return 0;
6c5ee0be
SR
1822 }
1823 }
1824 }
1825 }
1826 close(IN);
2b7d9b21
SR
1827
1828 return 1;
6c5ee0be
SR
1829}
1830
fcb3f16a
SR
1831sub apply_min_config {
1832 my $outconfig = "$output_config.new";
1833
1834 # Read the config file and remove anything that
1835 # is in the force_config hash (from minconfig and others)
1836 # then add the force config back.
1837
1838 doprint "Applying minimum configurations into $output_config.new\n";
1839
1840 open (OUT, ">$outconfig") or
1841 dodie "Can't create $outconfig";
1842
1843 if (-f $output_config) {
1844 open (IN, $output_config) or
1845 dodie "Failed to open $output_config";
1846 while (<IN>) {
1847 if (/^(# )?(CONFIG_[^\s=]*)/) {
1848 next if (defined($force_config{$2}));
1849 }
1850 print OUT;
1851 }
1852 close IN;
1853 }
1854 foreach my $config (keys %force_config) {
1855 print OUT "$force_config{$config}\n";
1856 }
1857 close OUT;
1858
1859 run_command "mv $outconfig $output_config";
1860}
1861
612b9e9b 1862sub make_oldconfig {
612b9e9b 1863
4c4ab120
SR
1864 my @force_list = keys %force_config;
1865
1866 if ($#force_list >= 0) {
1867 apply_min_config;
1868 }
fcb3f16a
SR
1869
1870 if (!run_command "$make oldnoconfig") {
612b9e9b
SR
1871 # Perhaps oldnoconfig doesn't exist in this version of the kernel
1872 # try a yes '' | oldconfig
1873 doprint "oldnoconfig failed, trying yes '' | make oldconfig\n";
fcb3f16a 1874 run_command "yes '' | $make oldconfig" or
612b9e9b
SR
1875 dodie "failed make config oldconfig";
1876 }
1877}
1878
fcb3f16a
SR
1879# read a config file and use this to force new configs.
1880sub load_force_config {
1881 my ($config) = @_;
1882
cf79fab6 1883 doprint "Loading force configs from $config\n";
fcb3f16a
SR
1884 open(IN, $config) or
1885 dodie "failed to read $config";
1886 while (<IN>) {
1887 chomp;
1888 if (/^(CONFIG[^\s=]*)(\s*=.*)/) {
1889 $force_config{$1} = $_;
1890 } elsif (/^# (CONFIG_\S*) is not set/) {
1891 $force_config{$1} = $_;
1892 }
1893 }
1894 close IN;
1895}
1896
2545eb61
SR
1897sub build {
1898 my ($type) = @_;
5c42fc5b 1899
7faafbd6
SR
1900 unlink $buildlog;
1901
4ab1cce5
SR
1902 # Failed builds should not reboot the target
1903 my $save_no_reboot = $no_reboot;
1904 $no_reboot = 1;
1905
683a3e64
SR
1906 # Calculate a new version from here.
1907 $have_version = 0;
1908
0bd6c1a3
SR
1909 if (defined($pre_build)) {
1910 my $ret = run_command $pre_build;
1911 if (!$ret && defined($pre_build_die) &&
1912 $pre_build_die) {
1913 dodie "failed to pre_build\n";
1914 }
1915 }
1916
75c3fda7 1917 if ($type =~ /^useconfig:(.*)/) {
51ad1dd1 1918 run_command "cp $1 $output_config" or
75c3fda7 1919 dodie "could not copy $1 to .config";
5f9b6ced 1920
75c3fda7
SR
1921 $type = "oldconfig";
1922 }
1923
5c42fc5b
SR
1924 # old config can ask questions
1925 if ($type eq "oldconfig") {
9386c6ab 1926 $type = "oldnoconfig";
75c3fda7
SR
1927
1928 # allow for empty configs
51ad1dd1 1929 run_command "touch $output_config";
75c3fda7 1930
13488231
AJ
1931 if (!$noclean) {
1932 run_command "mv $output_config $outputdir/config_temp" or
1933 dodie "moving .config";
2545eb61 1934
13488231 1935 run_command "$make mrproper" or dodie "make mrproper";
2545eb61 1936
13488231
AJ
1937 run_command "mv $outputdir/config_temp $output_config" or
1938 dodie "moving config_temp";
1939 }
5c42fc5b
SR
1940
1941 } elsif (!$noclean) {
51ad1dd1 1942 unlink "$output_config";
5f9b6ced 1943 run_command "$make mrproper" or
5c42fc5b 1944 dodie "make mrproper";
5c42fc5b 1945 }
2545eb61
SR
1946
1947 # add something to distinguish this build
a75fecec
SR
1948 open(OUT, "> $outputdir/localversion") or dodie("Can't make localversion file");
1949 print OUT "$localversion\n";
2545eb61
SR
1950 close(OUT);
1951
5f9b6ced 1952 if (defined($minconfig)) {
fcb3f16a 1953 load_force_config($minconfig);
2545eb61
SR
1954 }
1955
fcb3f16a
SR
1956 if ($type ne "oldnoconfig") {
1957 run_command "$make $type" or
612b9e9b
SR
1958 dodie "failed make config";
1959 }
fcb3f16a
SR
1960 # Run old config regardless, to enforce min configurations
1961 make_oldconfig;
2545eb61 1962
a75fecec 1963 $redirect = "$buildlog";
0bd6c1a3
SR
1964 my $build_ret = run_command "$make $build_options";
1965 undef $redirect;
1966
1967 if (defined($post_build)) {
683a3e64
SR
1968 # Because a post build may change the kernel version
1969 # do it now.
1970 get_version;
0bd6c1a3
SR
1971 my $ret = run_command $post_build;
1972 if (!$ret && defined($post_build_die) &&
1973 $post_build_die) {
1974 dodie "failed to post_build\n";
1975 }
1976 }
1977
1978 if (!$build_ret) {
5f9b6ced 1979 # bisect may need this to pass
4ab1cce5
SR
1980 if ($in_bisect) {
1981 $no_reboot = $save_no_reboot;
1982 return 0;
1983 }
2b7d9b21 1984 fail "failed build" and return 0;
2545eb61 1985 }
5f9b6ced 1986
4ab1cce5
SR
1987 $no_reboot = $save_no_reboot;
1988
2b7d9b21 1989 return 1;
2545eb61
SR
1990}
1991
75c3fda7 1992sub halt {
e48c5293 1993 if (!run_ssh "halt" or defined($power_off)) {
576f627c
SR
1994 if (defined($poweroff_after_halt)) {
1995 sleep $poweroff_after_halt;
1996 run_command "$power_off";
1997 }
1998 } else {
75c3fda7 1999 # nope? the zap it!
a75fecec 2000 run_command "$power_off";
75c3fda7
SR
2001 }
2002}
2003
5f9b6ced
SR
2004sub success {
2005 my ($i) = @_;
2006
921ed4c7
SR
2007 if (defined($post_test)) {
2008 run_command $post_test;
2009 }
2010
e48c5293
SR
2011 $successes++;
2012
9064af52
SR
2013 my $name = "";
2014
2015 if (defined($test_name)) {
2016 $name = " ($test_name)";
2017 }
2018
5f9b6ced
SR
2019 doprint "\n\n*******************************************\n";
2020 doprint "*******************************************\n";
9064af52 2021 doprint "KTEST RESULT: TEST $i$name SUCCESS!!!! **\n";
5f9b6ced
SR
2022 doprint "*******************************************\n";
2023 doprint "*******************************************\n";
2024
de5b6e3b
RV
2025 if (defined($store_successes)) {
2026 save_logs "success", $store_successes;
2027 }
2028
576f627c 2029 if ($i != $opt{"NUM_TESTS"} && !do_not_reboot) {
a75fecec 2030 doprint "Reboot and wait $sleep_time seconds\n";
bc7c5803 2031 reboot_to_good $sleep_time;
5f9b6ced
SR
2032 }
2033}
2034
c960bb9f
SR
2035sub answer_bisect {
2036 for (;;) {
2037 doprint "Pass or fail? [p/f]";
2038 my $ans = <STDIN>;
2039 chomp $ans;
2040 if ($ans eq "p" || $ans eq "P") {
2041 return 1;
2042 } elsif ($ans eq "f" || $ans eq "F") {
2043 return 0;
2044 } else {
2045 print "Please answer 'P' or 'F'\n";
2046 }
2047 }
2048}
2049
5a391fbf 2050sub child_run_test {
7faafbd6 2051 my $failed = 0;
5a391fbf 2052
7faafbd6 2053 # child should have no power
a75fecec
SR
2054 $reboot_on_error = 0;
2055 $poweroff_on_error = 0;
2056 $die_on_failure = 1;
7faafbd6 2057
a9dd5d63 2058 $redirect = "$testlog";
7faafbd6 2059 run_command $run_test or $failed = 1;
a9dd5d63
RV
2060 undef $redirect;
2061
5a391fbf
SR
2062 exit $failed;
2063}
2064
2065my $child_done;
2066
2067sub child_finished {
2068 $child_done = 1;
2069}
2070
2071sub do_run_test {
2072 my $child_pid;
2073 my $child_exit;
5a391fbf
SR
2074 my $line;
2075 my $full_line;
2076 my $bug = 0;
5a391fbf 2077
7faafbd6 2078 wait_for_monitor 1;
5a391fbf 2079
7faafbd6 2080 doprint "run test $run_test\n";
5a391fbf
SR
2081
2082 $child_done = 0;
2083
2084 $SIG{CHLD} = qw(child_finished);
2085
2086 $child_pid = fork;
2087
2088 child_run_test if (!$child_pid);
2089
2090 $full_line = "";
2091
2092 do {
7faafbd6 2093 $line = wait_for_input($monitor_fp, 1);
5a391fbf
SR
2094 if (defined($line)) {
2095
2096 # we are not guaranteed to get a full line
2097 $full_line .= $line;
8ea0e063 2098 doprint $line;
5a391fbf
SR
2099
2100 if ($full_line =~ /call trace:/i) {
2101 $bug = 1;
2102 }
2103
2104 if ($full_line =~ /Kernel panic -/) {
2105 $bug = 1;
2106 }
2107
2108 if ($line =~ /\n/) {
2109 $full_line = "";
2110 }
2111 }
2112 } while (!$child_done && !$bug);
2113
2114 if ($bug) {
8ea0e063
SR
2115 my $failure_start = time;
2116 my $now;
2117 do {
2118 $line = wait_for_input($monitor_fp, 1);
2119 if (defined($line)) {
2120 doprint $line;
2121 }
2122 $now = time;
2123 if ($now - $failure_start >= $stop_after_failure) {
2124 last;
2125 }
2126 } while (defined($line));
2127
5a391fbf
SR
2128 doprint "Detected kernel crash!\n";
2129 # kill the child with extreme prejudice
2130 kill 9, $child_pid;
2131 }
2132
2133 waitpid $child_pid, 0;
2134 $child_exit = $?;
2135
c5dacb88
SR
2136 if (!$bug && $in_bisect) {
2137 if (defined($bisect_ret_good)) {
2138 if ($child_exit == $bisect_ret_good) {
2139 return 1;
2140 }
2141 }
2142 if (defined($bisect_ret_skip)) {
2143 if ($child_exit == $bisect_ret_skip) {
2144 return -1;
2145 }
2146 }
2147 if (defined($bisect_ret_abort)) {
2148 if ($child_exit == $bisect_ret_abort) {
2149 fail "test abort" and return -2;
2150 }
2151 }
2152 if (defined($bisect_ret_bad)) {
2153 if ($child_exit == $bisect_ret_skip) {
2154 return 0;
2155 }
2156 }
2157 if (defined($bisect_ret_default)) {
2158 if ($bisect_ret_default eq "good") {
2159 return 1;
2160 } elsif ($bisect_ret_default eq "bad") {
2161 return 0;
2162 } elsif ($bisect_ret_default eq "skip") {
2163 return -1;
2164 } elsif ($bisect_ret_default eq "abort") {
2165 return -2;
2166 } else {
2167 fail "unknown default action: $bisect_ret_default"
2168 and return -2;
2169 }
2170 }
2171 }
2172
5a391fbf 2173 if ($bug || $child_exit) {
2b7d9b21
SR
2174 return 0 if $in_bisect;
2175 fail "test failed" and return 0;
5a391fbf 2176 }
2b7d9b21 2177 return 1;
5a391fbf
SR
2178}
2179
a75fecec
SR
2180sub run_git_bisect {
2181 my ($command) = @_;
2182
2183 doprint "$command ... ";
2184
2185 my $output = `$command 2>&1`;
2186 my $ret = $?;
2187
2188 logit $output;
2189
2190 if ($ret) {
2191 doprint "FAILED\n";
2192 dodie "Failed to git bisect";
2193 }
2194
2195 doprint "SUCCESS\n";
2196 if ($output =~ m/^(Bisecting: .*\(roughly \d+ steps?\))\s+\[([[:xdigit:]]+)\]/) {
2197 doprint "$1 [$2]\n";
2198 } elsif ($output =~ m/^([[:xdigit:]]+) is the first bad commit/) {
b5f4aea6 2199 $bisect_bad_commit = $1;
a75fecec
SR
2200 doprint "Found bad commit... $1\n";
2201 return 0;
2202 } else {
2203 # we already logged it, just print it now.
2204 print $output;
2205 }
2206
2207 return 1;
2208}
2209
c23dca7c
SR
2210sub bisect_reboot {
2211 doprint "Reboot and sleep $bisect_sleep_time seconds\n";
bc7c5803 2212 reboot_to_good $bisect_sleep_time;
c23dca7c
SR
2213}
2214
2215# returns 1 on success, 0 on failure, -1 on skip
0a05c769
SR
2216sub run_bisect_test {
2217 my ($type, $buildtype) = @_;
5f9b6ced 2218
2b7d9b21 2219 my $failed = 0;
5f9b6ced
SR
2220 my $result;
2221 my $output;
2222 my $ret;
2223
0a05c769
SR
2224 $in_bisect = 1;
2225
2226 build $buildtype or $failed = 1;
5f9b6ced
SR
2227
2228 if ($type ne "build") {
c23dca7c
SR
2229 if ($failed && $bisect_skip) {
2230 $in_bisect = 0;
2231 return -1;
2232 }
7faafbd6 2233 dodie "Failed on build" if $failed;
5f9b6ced
SR
2234
2235 # Now boot the box
ddf607e5 2236 start_monitor_and_boot or $failed = 1;
5f9b6ced
SR
2237
2238 if ($type ne "boot") {
c23dca7c
SR
2239 if ($failed && $bisect_skip) {
2240 end_monitor;
2241 bisect_reboot;
2242 $in_bisect = 0;
2243 return -1;
2244 }
7faafbd6 2245 dodie "Failed on boot" if $failed;
5a391fbf 2246
2b7d9b21 2247 do_run_test or $failed = 1;
5f9b6ced 2248 }
7faafbd6 2249 end_monitor;
5f9b6ced
SR
2250 }
2251
2252 if ($failed) {
0a05c769 2253 $result = 0;
5f9b6ced 2254 } else {
0a05c769
SR
2255 $result = 1;
2256 }
4025bc62
SR
2257
2258 # reboot the box to a kernel we can ssh to
2259 if ($type ne "build") {
2260 bisect_reboot;
2261 }
0a05c769
SR
2262 $in_bisect = 0;
2263
2264 return $result;
2265}
2266
2267sub run_bisect {
2268 my ($type) = @_;
2269 my $buildtype = "oldconfig";
2270
2271 # We should have a minconfig to use?
2272 if (defined($minconfig)) {
2273 $buildtype = "useconfig:$minconfig";
5f9b6ced
SR
2274 }
2275
0a05c769
SR
2276 my $ret = run_bisect_test $type, $buildtype;
2277
c960bb9f
SR
2278 if ($bisect_manual) {
2279 $ret = answer_bisect;
2280 }
0a05c769 2281
d6ce2a0b 2282 # Are we looking for where it worked, not failed?
5158ba3e 2283 if ($reverse_bisect && $ret >= 0) {
0a05c769 2284 $ret = !$ret;
d6ce2a0b
SR
2285 }
2286
c23dca7c 2287 if ($ret > 0) {
0a05c769 2288 return "good";
c23dca7c 2289 } elsif ($ret == 0) {
0a05c769 2290 return "bad";
c23dca7c
SR
2291 } elsif ($bisect_skip) {
2292 doprint "HIT A BAD COMMIT ... SKIPPING\n";
2293 return "skip";
0a05c769 2294 }
5f9b6ced
SR
2295}
2296
dad98754
SR
2297sub update_bisect_replay {
2298 my $tmp_log = "$tmpdir/ktest_bisect_log";
2299 run_command "git bisect log > $tmp_log" or
2300 die "can't create bisect log";
2301 return $tmp_log;
2302}
2303
5f9b6ced
SR
2304sub bisect {
2305 my ($i) = @_;
2306
2307 my $result;
2308
b5f4aea6
SR
2309 die "BISECT_GOOD[$i] not defined\n" if (!defined($bisect_good));
2310 die "BISECT_BAD[$i] not defined\n" if (!defined($bisect_bad));
2311 die "BISECT_TYPE[$i] not defined\n" if (!defined($bisect_type));
5f9b6ced 2312
b5f4aea6
SR
2313 my $good = $bisect_good;
2314 my $bad = $bisect_bad;
2315 my $type = $bisect_type;
2316 my $start = $bisect_start;
2317 my $replay = $bisect_replay;
2318 my $start_files = $bisect_files;
3410f6fd
SR
2319
2320 if (defined($start_files)) {
2321 $start_files = " -- " . $start_files;
2322 } else {
2323 $start_files = "";
2324 }
5f9b6ced 2325
a57419b3
SR
2326 # convert to true sha1's
2327 $good = get_sha1($good);
2328 $bad = get_sha1($bad);
2329
b5f4aea6 2330 if (defined($bisect_reverse) && $bisect_reverse == 1) {
d6ce2a0b
SR
2331 doprint "Performing a reverse bisect (bad is good, good is bad!)\n";
2332 $reverse_bisect = 1;
2333 } else {
2334 $reverse_bisect = 0;
2335 }
2336
a75fecec
SR
2337 # Can't have a test without having a test to run
2338 if ($type eq "test" && !defined($run_test)) {
2339 $type = "boot";
2340 }
2341
dad98754
SR
2342 # Check if a bisect was running
2343 my $bisect_start_file = "$builddir/.git/BISECT_START";
2344
b5f4aea6 2345 my $check = $bisect_check;
dad98754
SR
2346 my $do_check = defined($check) && $check ne "0";
2347
2348 if ( -f $bisect_start_file ) {
2349 print "Bisect in progress found\n";
2350 if ($do_check) {
2351 print " If you say yes, then no checks of good or bad will be done\n";
2352 }
2353 if (defined($replay)) {
2354 print "** BISECT_REPLAY is defined in config file **";
2355 print " Ignore config option and perform new git bisect log?\n";
2356 if (read_ync " (yes, no, or cancel) ") {
2357 $replay = update_bisect_replay;
2358 $do_check = 0;
2359 }
2360 } elsif (read_yn "read git log and continue?") {
2361 $replay = update_bisect_replay;
2362 $do_check = 0;
2363 }
2364 }
2365
2366 if ($do_check) {
a75fecec
SR
2367
2368 # get current HEAD
a57419b3 2369 my $head = get_sha1("HEAD");
a75fecec
SR
2370
2371 if ($check ne "good") {
2372 doprint "TESTING BISECT BAD [$bad]\n";
2373 run_command "git checkout $bad" or
2374 die "Failed to checkout $bad";
2375
2376 $result = run_bisect $type;
2377
2378 if ($result ne "bad") {
2379 fail "Tested BISECT_BAD [$bad] and it succeeded" and return 0;
2380 }
2381 }
2382
2383 if ($check ne "bad") {
2384 doprint "TESTING BISECT GOOD [$good]\n";
2385 run_command "git checkout $good" or
2386 die "Failed to checkout $good";
2387
2388 $result = run_bisect $type;
2389
2390 if ($result ne "good") {
2391 fail "Tested BISECT_GOOD [$good] and it failed" and return 0;
2392 }
2393 }
2394
2395 # checkout where we started
2396 run_command "git checkout $head" or
2397 die "Failed to checkout $head";
2398 }
2399
3410f6fd 2400 run_command "git bisect start$start_files" or
a75fecec 2401 dodie "could not start bisect";
5f9b6ced
SR
2402
2403 run_command "git bisect good $good" or
a75fecec 2404 dodie "could not set bisect good to $good";
5f9b6ced 2405
a75fecec
SR
2406 run_git_bisect "git bisect bad $bad" or
2407 dodie "could not set bisect bad to $bad";
5f9b6ced 2408
a75fecec
SR
2409 if (defined($replay)) {
2410 run_command "git bisect replay $replay" or
2411 dodie "failed to run replay";
5a391fbf
SR
2412 }
2413
a75fecec
SR
2414 if (defined($start)) {
2415 run_command "git checkout $start" or
2416 dodie "failed to checkout $start";
2417 }
2418
2419 my $test;
5f9b6ced
SR
2420 do {
2421 $result = run_bisect $type;
a75fecec
SR
2422 $test = run_git_bisect "git bisect $result";
2423 } while ($test);
5f9b6ced
SR
2424
2425 run_command "git bisect log" or
2426 dodie "could not capture git bisect log";
2427
2428 run_command "git bisect reset" or
2429 dodie "could not reset git bisect";
2430
b5f4aea6 2431 doprint "Bad commit was [$bisect_bad_commit]\n";
5f9b6ced 2432
0a05c769
SR
2433 success $i;
2434}
2435
cf79fab6
SR
2436# config_ignore holds the configs that were set (or unset) for
2437# a good config and we will ignore these configs for the rest
2438# of a config bisect. These configs stay as they were.
0a05c769 2439my %config_ignore;
cf79fab6
SR
2440
2441# config_set holds what all configs were set as.
0a05c769
SR
2442my %config_set;
2443
cf79fab6
SR
2444# config_off holds the set of configs that the bad config had disabled.
2445# We need to record them and set them in the .config when running
2446# oldnoconfig, because oldnoconfig does not turn off new symbols, but
2447# instead just keeps the defaults.
2448my %config_off;
2449
2450# config_off_tmp holds a set of configs to turn off for now
2451my @config_off_tmp;
2452
2453# config_list is the set of configs that are being tested
0a05c769
SR
2454my %config_list;
2455my %null_config;
2456
2457my %dependency;
2458
4c4ab120
SR
2459sub assign_configs {
2460 my ($hash, $config) = @_;
0a05c769
SR
2461
2462 open (IN, $config)
2463 or dodie "Failed to read $config";
2464
2465 while (<IN>) {
9bf71749 2466 if (/^((CONFIG\S*)=.*)/) {
4c4ab120 2467 ${$hash}{$2} = $1;
0a05c769
SR
2468 }
2469 }
2470
2471 close(IN);
2472}
2473
4c4ab120
SR
2474sub process_config_ignore {
2475 my ($config) = @_;
2476
2477 assign_configs \%config_ignore, $config;
2478}
2479
0a05c769
SR
2480sub read_current_config {
2481 my ($config_ref) = @_;
2482
2483 %{$config_ref} = ();
2484 undef %{$config_ref};
2485
2486 my @key = keys %{$config_ref};
2487 if ($#key >= 0) {
2488 print "did not delete!\n";
2489 exit;
2490 }
2491 open (IN, "$output_config");
2492
2493 while (<IN>) {
2494 if (/^(CONFIG\S+)=(.*)/) {
2495 ${$config_ref}{$1} = $2;
2496 }
2497 }
2498 close(IN);
2499}
2500
2501sub get_dependencies {
2502 my ($config) = @_;
2503
2504 my $arr = $dependency{$config};
2505 if (!defined($arr)) {
2506 return ();
2507 }
2508
2509 my @deps = @{$arr};
2510
2511 foreach my $dep (@{$arr}) {
2512 print "ADD DEP $dep\n";
2513 @deps = (@deps, get_dependencies $dep);
2514 }
2515
2516 return @deps;
2517}
2518
2519sub create_config {
2520 my @configs = @_;
2521
2522 open(OUT, ">$output_config") or dodie "Can not write to $output_config";
2523
2524 foreach my $config (@configs) {
2525 print OUT "$config_set{$config}\n";
2526 my @deps = get_dependencies $config;
2527 foreach my $dep (@deps) {
2528 print OUT "$config_set{$dep}\n";
2529 }
2530 }
2531
cf79fab6
SR
2532 # turn off configs to keep off
2533 foreach my $config (keys %config_off) {
2534 print OUT "# $config is not set\n";
2535 }
2536
2537 # turn off configs that should be off for now
2538 foreach my $config (@config_off_tmp) {
2539 print OUT "# $config is not set\n";
2540 }
2541
0a05c769
SR
2542 foreach my $config (keys %config_ignore) {
2543 print OUT "$config_ignore{$config}\n";
2544 }
2545 close(OUT);
2546
fcb3f16a 2547 make_oldconfig;
0a05c769
SR
2548}
2549
2550sub compare_configs {
2551 my (%a, %b) = @_;
2552
2553 foreach my $item (keys %a) {
2554 if (!defined($b{$item})) {
2555 print "diff $item\n";
2556 return 1;
2557 }
2558 delete $b{$item};
2559 }
2560
2561 my @keys = keys %b;
2562 if ($#keys) {
2563 print "diff2 $keys[0]\n";
2564 }
2565 return -1 if ($#keys >= 0);
2566
2567 return 0;
2568}
2569
2570sub run_config_bisect_test {
2571 my ($type) = @_;
2572
2573 return run_bisect_test $type, "oldconfig";
2574}
2575
2576sub process_passed {
2577 my (%configs) = @_;
2578
2579 doprint "These configs had no failure: (Enabling them for further compiles)\n";
2580 # Passed! All these configs are part of a good compile.
2581 # Add them to the min options.
2582 foreach my $config (keys %configs) {
2583 if (defined($config_list{$config})) {
2584 doprint " removing $config\n";
2585 $config_ignore{$config} = $config_list{$config};
2586 delete $config_list{$config};
2587 }
2588 }
f1a27850
SR
2589 doprint "config copied to $outputdir/config_good\n";
2590 run_command "cp -f $output_config $outputdir/config_good";
0a05c769
SR
2591}
2592
2593sub process_failed {
2594 my ($config) = @_;
2595
2596 doprint "\n\n***************************************\n";
2597 doprint "Found bad config: $config\n";
2598 doprint "***************************************\n\n";
2599}
2600
2601sub run_config_bisect {
2602
2603 my @start_list = keys %config_list;
2604
2605 if ($#start_list < 0) {
2606 doprint "No more configs to test!!!\n";
2607 return -1;
2608 }
2609
2610 doprint "***** RUN TEST ***\n";
b5f4aea6 2611 my $type = $config_bisect_type;
0a05c769
SR
2612 my $ret;
2613 my %current_config;
2614
2615 my $count = $#start_list + 1;
2616 doprint " $count configs to test\n";
2617
2618 my $half = int($#start_list / 2);
2619
2620 do {
2621 my @tophalf = @start_list[0 .. $half];
2622
cf79fab6
SR
2623 # keep the bottom half off
2624 if ($half < $#start_list) {
2625 @config_off_tmp = @start_list[$half + 1 .. $#start_list];
2626 } else {
2627 @config_off_tmp = ();
2628 }
2629
0a05c769
SR
2630 create_config @tophalf;
2631 read_current_config \%current_config;
2632
2633 $count = $#tophalf + 1;
2634 doprint "Testing $count configs\n";
2635 my $found = 0;
2636 # make sure we test something
2637 foreach my $config (@tophalf) {
2638 if (defined($current_config{$config})) {
2639 logit " $config\n";
2640 $found = 1;
2641 }
2642 }
2643 if (!$found) {
2644 # try the other half
2645 doprint "Top half produced no set configs, trying bottom half\n";
cf79fab6
SR
2646
2647 # keep the top half off
2648 @config_off_tmp = @tophalf;
4c8cc55b 2649 @tophalf = @start_list[$half + 1 .. $#start_list];
cf79fab6 2650
0a05c769
SR
2651 create_config @tophalf;
2652 read_current_config \%current_config;
2653 foreach my $config (@tophalf) {
2654 if (defined($current_config{$config})) {
2655 logit " $config\n";
2656 $found = 1;
2657 }
2658 }
2659 if (!$found) {
2660 doprint "Failed: Can't make new config with current configs\n";
2661 foreach my $config (@start_list) {
2662 doprint " CONFIG: $config\n";
2663 }
2664 return -1;
2665 }
2666 $count = $#tophalf + 1;
2667 doprint "Testing $count configs\n";
2668 }
2669
2670 $ret = run_config_bisect_test $type;
c960bb9f
SR
2671 if ($bisect_manual) {
2672 $ret = answer_bisect;
2673 }
0a05c769
SR
2674 if ($ret) {
2675 process_passed %current_config;
2676 return 0;
2677 }
2678
2679 doprint "This config had a failure.\n";
2680 doprint "Removing these configs that were not set in this config:\n";
f1a27850
SR
2681 doprint "config copied to $outputdir/config_bad\n";
2682 run_command "cp -f $output_config $outputdir/config_bad";
0a05c769
SR
2683
2684 # A config exists in this group that was bad.
2685 foreach my $config (keys %config_list) {
2686 if (!defined($current_config{$config})) {
2687 doprint " removing $config\n";
2688 delete $config_list{$config};
2689 }
2690 }
2691
2692 @start_list = @tophalf;
2693
2694 if ($#start_list == 0) {
2695 process_failed $start_list[0];
2696 return 1;
2697 }
2698
2699 # remove half the configs we are looking at and see if
2700 # they are good.
2701 $half = int($#start_list / 2);
4c8cc55b 2702 } while ($#start_list > 0);
0a05c769 2703
c960bb9f
SR
2704 # we found a single config, try it again unless we are running manually
2705
2706 if ($bisect_manual) {
2707 process_failed $start_list[0];
2708 return 1;
2709 }
2710
0a05c769
SR
2711 my @tophalf = @start_list[0 .. 0];
2712
2713 $ret = run_config_bisect_test $type;
2714 if ($ret) {
2715 process_passed %current_config;
2716 return 0;
2717 }
2718
2719 process_failed $start_list[0];
2720 return 1;
2721}
2722
2723sub config_bisect {
2724 my ($i) = @_;
2725
b5f4aea6 2726 my $start_config = $config_bisect;
0a05c769
SR
2727
2728 my $tmpconfig = "$tmpdir/use_config";
2729
30f75da5
SR
2730 if (defined($config_bisect_good)) {
2731 process_config_ignore $config_bisect_good;
2732 }
2733
0a05c769
SR
2734 # Make the file with the bad config and the min config
2735 if (defined($minconfig)) {
2736 # read the min config for things to ignore
2737 run_command "cp $minconfig $tmpconfig" or
2738 dodie "failed to copy $minconfig to $tmpconfig";
2739 } else {
2740 unlink $tmpconfig;
2741 }
2742
0a05c769 2743 if (-f $tmpconfig) {
fcb3f16a 2744 load_force_config($tmpconfig);
0a05c769
SR
2745 process_config_ignore $tmpconfig;
2746 }
2747
2748 # now process the start config
2749 run_command "cp $start_config $output_config" or
2750 dodie "failed to copy $start_config to $output_config";
2751
2752 # read directly what we want to check
2753 my %config_check;
2754 open (IN, $output_config)
f9dee311 2755 or dodie "failed to open $output_config";
0a05c769
SR
2756
2757 while (<IN>) {
2758 if (/^((CONFIG\S*)=.*)/) {
2759 $config_check{$2} = $1;
2760 }
2761 }
2762 close(IN);
2763
250bae8b 2764 # Now run oldconfig with the minconfig
fcb3f16a 2765 make_oldconfig;
0a05c769
SR
2766
2767 # check to see what we lost (or gained)
2768 open (IN, $output_config)
2769 or dodie "Failed to read $start_config";
2770
2771 my %removed_configs;
2772 my %added_configs;
2773
2774 while (<IN>) {
2775 if (/^((CONFIG\S*)=.*)/) {
2776 # save off all options
2777 $config_set{$2} = $1;
2778 if (defined($config_check{$2})) {
2779 if (defined($config_ignore{$2})) {
2780 $removed_configs{$2} = $1;
2781 } else {
2782 $config_list{$2} = $1;
2783 }
2784 } elsif (!defined($config_ignore{$2})) {
2785 $added_configs{$2} = $1;
2786 $config_list{$2} = $1;
2787 }
cf79fab6
SR
2788 } elsif (/^# ((CONFIG\S*).*)/) {
2789 # Keep these configs disabled
2790 $config_set{$2} = $1;
2791 $config_off{$2} = $1;
0a05c769
SR
2792 }
2793 }
2794 close(IN);
2795
2796 my @confs = keys %removed_configs;
2797 if ($#confs >= 0) {
2798 doprint "Configs overridden by default configs and removed from check:\n";
2799 foreach my $config (@confs) {
2800 doprint " $config\n";
2801 }
2802 }
2803 @confs = keys %added_configs;
2804 if ($#confs >= 0) {
2805 doprint "Configs appearing in make oldconfig and added:\n";
2806 foreach my $config (@confs) {
2807 doprint " $config\n";
2808 }
2809 }
2810
2811 my %config_test;
2812 my $once = 0;
2813
cf79fab6
SR
2814 @config_off_tmp = ();
2815
0a05c769
SR
2816 # Sometimes kconfig does weird things. We must make sure
2817 # that the config we autocreate has everything we need
2818 # to test, otherwise we may miss testing configs, or
2819 # may not be able to create a new config.
2820 # Here we create a config with everything set.
2821 create_config (keys %config_list);
2822 read_current_config \%config_test;
2823 foreach my $config (keys %config_list) {
2824 if (!defined($config_test{$config})) {
2825 if (!$once) {
2826 $once = 1;
2827 doprint "Configs not produced by kconfig (will not be checked):\n";
2828 }
2829 doprint " $config\n";
2830 delete $config_list{$config};
2831 }
2832 }
2833 my $ret;
b0918612
SR
2834
2835 if (defined($config_bisect_check) && $config_bisect_check) {
2836 doprint " Checking to make sure bad config with min config fails\n";
2837 create_config keys %config_list;
2838 $ret = run_config_bisect_test $config_bisect_type;
2839 if ($ret) {
2840 doprint " FAILED! Bad config with min config boots fine\n";
2841 return -1;
2842 }
2843 doprint " Bad config with min config fails as expected\n";
2844 }
2845
0a05c769
SR
2846 do {
2847 $ret = run_config_bisect;
2848 } while (!$ret);
2849
2850 return $ret if ($ret < 0);
5f9b6ced
SR
2851
2852 success $i;
2853}
2854
27d934b2
SR
2855sub patchcheck_reboot {
2856 doprint "Reboot and sleep $patchcheck_sleep_time seconds\n";
bc7c5803 2857 reboot_to_good $patchcheck_sleep_time;
27d934b2
SR
2858}
2859
6c5ee0be
SR
2860sub patchcheck {
2861 my ($i) = @_;
2862
2863 die "PATCHCHECK_START[$i] not defined\n"
b5f4aea6 2864 if (!defined($patchcheck_start));
6c5ee0be 2865 die "PATCHCHECK_TYPE[$i] not defined\n"
b5f4aea6 2866 if (!defined($patchcheck_type));
6c5ee0be 2867
b5f4aea6 2868 my $start = $patchcheck_start;
6c5ee0be
SR
2869
2870 my $end = "HEAD";
b5f4aea6
SR
2871 if (defined($patchcheck_end)) {
2872 $end = $patchcheck_end;
6c5ee0be
SR
2873 }
2874
a57419b3
SR
2875 # Get the true sha1's since we can use things like HEAD~3
2876 $start = get_sha1($start);
2877 $end = get_sha1($end);
2878
b5f4aea6 2879 my $type = $patchcheck_type;
6c5ee0be
SR
2880
2881 # Can't have a test without having a test to run
2882 if ($type eq "test" && !defined($run_test)) {
2883 $type = "boot";
2884 }
2885
2886 open (IN, "git log --pretty=oneline $end|") or
2887 dodie "could not get git list";
2888
2889 my @list;
2890
2891 while (<IN>) {
2892 chomp;
2893 $list[$#list+1] = $_;
2894 last if (/^$start/);
2895 }
2896 close(IN);
2897
2898 if ($list[$#list] !~ /^$start/) {
2b7d9b21 2899 fail "SHA1 $start not found";
6c5ee0be
SR
2900 }
2901
2902 # go backwards in the list
2903 @list = reverse @list;
2904
2905 my $save_clean = $noclean;
1990207d
SR
2906 my %ignored_warnings;
2907
2908 if (defined($ignore_warnings)) {
2909 foreach my $sha1 (split /\s+/, $ignore_warnings) {
2910 $ignored_warnings{$sha1} = 1;
2911 }
2912 }
6c5ee0be
SR
2913
2914 $in_patchcheck = 1;
2915 foreach my $item (@list) {
2916 my $sha1 = $item;
2917 $sha1 =~ s/^([[:xdigit:]]+).*/$1/;
2918
2919 doprint "\nProcessing commit $item\n\n";
2920
2921 run_command "git checkout $sha1" or
2922 die "Failed to checkout $sha1";
2923
2924 # only clean on the first and last patch
2925 if ($item eq $list[0] ||
2926 $item eq $list[$#list]) {
2927 $noclean = $save_clean;
2928 } else {
2929 $noclean = 1;
2930 }
2931
2932 if (defined($minconfig)) {
2b7d9b21 2933 build "useconfig:$minconfig" or return 0;
6c5ee0be
SR
2934 } else {
2935 # ?? no config to use?
2b7d9b21 2936 build "oldconfig" or return 0;
6c5ee0be
SR
2937 }
2938
1990207d
SR
2939
2940 if (!defined($ignored_warnings{$sha1})) {
2941 check_buildlog $sha1 or return 0;
2942 }
6c5ee0be
SR
2943
2944 next if ($type eq "build");
2945
7faafbd6
SR
2946 my $failed = 0;
2947
ddf607e5 2948 start_monitor_and_boot or $failed = 1;
7faafbd6
SR
2949
2950 if (!$failed && $type ne "boot"){
2951 do_run_test or $failed = 1;
2952 }
2953 end_monitor;
2954 return 0 if ($failed);
2955
27d934b2
SR
2956 patchcheck_reboot;
2957
6c5ee0be
SR
2958 }
2959 $in_patchcheck = 0;
2960 success $i;
2b7d9b21
SR
2961
2962 return 1;
6c5ee0be
SR
2963}
2964
b9066f6c 2965my %depends;
ac6974c7 2966my %depcount;
b9066f6c
SR
2967my $iflevel = 0;
2968my @ifdeps;
2969
2970# prevent recursion
2971my %read_kconfigs;
2972
ac6974c7
SR
2973sub add_dep {
2974 # $config depends on $dep
2975 my ($config, $dep) = @_;
2976
2977 if (defined($depends{$config})) {
2978 $depends{$config} .= " " . $dep;
2979 } else {
2980 $depends{$config} = $dep;
2981 }
2982
2983 # record the number of configs depending on $dep
2984 if (defined $depcount{$dep}) {
2985 $depcount{$dep}++;
2986 } else {
2987 $depcount{$dep} = 1;
2988 }
2989}
2990
b9066f6c
SR
2991# taken from streamline_config.pl
2992sub read_kconfig {
2993 my ($kconfig) = @_;
2994
2995 my $state = "NONE";
2996 my $config;
2997 my @kconfigs;
2998
2999 my $cont = 0;
3000 my $line;
3001
3002
3003 if (! -f $kconfig) {
3004 doprint "file $kconfig does not exist, skipping\n";
3005 return;
3006 }
3007
3008 open(KIN, "$kconfig")
3009 or die "Can't open $kconfig";
3010 while (<KIN>) {
3011 chomp;
3012
3013 # Make sure that lines ending with \ continue
3014 if ($cont) {
3015 $_ = $line . " " . $_;
3016 }
3017
3018 if (s/\\$//) {
3019 $cont = 1;
3020 $line = $_;
3021 next;
3022 }
3023
3024 $cont = 0;
3025
3026 # collect any Kconfig sources
3027 if (/^source\s*"(.*)"/) {
3028 $kconfigs[$#kconfigs+1] = $1;
3029 }
3030
3031 # configs found
3032 if (/^\s*(menu)?config\s+(\S+)\s*$/) {
3033 $state = "NEW";
3034 $config = $2;
3035
3036 for (my $i = 0; $i < $iflevel; $i++) {
ac6974c7 3037 add_dep $config, $ifdeps[$i];
b9066f6c
SR
3038 }
3039
3040 # collect the depends for the config
3041 } elsif ($state eq "NEW" && /^\s*depends\s+on\s+(.*)$/) {
3042
ac6974c7 3043 add_dep $config, $1;
b9066f6c
SR
3044
3045 # Get the configs that select this config
ac6974c7
SR
3046 } elsif ($state eq "NEW" && /^\s*select\s+(\S+)/) {
3047
3048 # selected by depends on config
3049 add_dep $1, $config;
b9066f6c
SR
3050
3051 # Check for if statements
3052 } elsif (/^if\s+(.*\S)\s*$/) {
3053 my $deps = $1;
3054 # remove beginning and ending non text
3055 $deps =~ s/^[^a-zA-Z0-9_]*//;
3056 $deps =~ s/[^a-zA-Z0-9_]*$//;
3057
3058 my @deps = split /[^a-zA-Z0-9_]+/, $deps;
3059
3060 $ifdeps[$iflevel++] = join ':', @deps;
3061
3062 } elsif (/^endif/) {
3063
3064 $iflevel-- if ($iflevel);
3065
3066 # stop on "help"
3067 } elsif (/^\s*help\s*$/) {
3068 $state = "NONE";
3069 }
3070 }
3071 close(KIN);
3072
3073 # read in any configs that were found.
3074 foreach $kconfig (@kconfigs) {
3075 if (!defined($read_kconfigs{$kconfig})) {
3076 $read_kconfigs{$kconfig} = 1;
3077 read_kconfig("$builddir/$kconfig");
3078 }
3079 }
3080}
3081
3082sub read_depends {
3083 # find out which arch this is by the kconfig file
3084 open (IN, $output_config)
3085 or dodie "Failed to read $output_config";
3086 my $arch;
3087 while (<IN>) {
3088 if (m,Linux/(\S+)\s+\S+\s+Kernel Configuration,) {
3089 $arch = $1;
3090 last;
3091 }
3092 }
3093 close IN;
3094
3095 if (!defined($arch)) {
3096 doprint "Could not find arch from config file\n";
3097 doprint "no dependencies used\n";
3098 return;
3099 }
3100
3101 # arch is really the subarch, we need to know
3102 # what directory to look at.
3103 if ($arch eq "i386" || $arch eq "x86_64") {
3104 $arch = "x86";
3105 } elsif ($arch =~ /^tile/) {
3106 $arch = "tile";
3107 }
3108
3109 my $kconfig = "$builddir/arch/$arch/Kconfig";
3110
3111 if (! -f $kconfig && $arch =~ /\d$/) {
3112 my $orig = $arch;
3113 # some subarchs have numbers, truncate them
3114 $arch =~ s/\d*$//;
3115 $kconfig = "$builddir/arch/$arch/Kconfig";
3116 if (! -f $kconfig) {
3117 doprint "No idea what arch dir $orig is for\n";
3118 doprint "no dependencies used\n";
3119 return;
3120 }
3121 }
3122
3123 read_kconfig($kconfig);
3124}
3125
4c4ab120
SR
3126sub read_config_list {
3127 my ($config) = @_;
3128
3129 open (IN, $config)
3130 or dodie "Failed to read $config";
3131
3132 while (<IN>) {
3133 if (/^((CONFIG\S*)=.*)/) {
3134 if (!defined($config_ignore{$2})) {
3135 $config_list{$2} = $1;
3136 }
3137 }
3138 }
3139
3140 close(IN);
3141}
3142
3143sub read_output_config {
3144 my ($config) = @_;
3145
3146 assign_configs \%config_ignore, $config;
3147}
3148
3149sub make_new_config {
3150 my @configs = @_;
3151
3152 open (OUT, ">$output_config")
3153 or dodie "Failed to write $output_config";
3154
3155 foreach my $config (@configs) {
3156 print OUT "$config\n";
3157 }
3158 close OUT;
3159}
3160
ac6974c7
SR
3161sub chomp_config {
3162 my ($config) = @_;
3163
3164 $config =~ s/CONFIG_//;
3165
3166 return $config;
3167}
3168
b9066f6c
SR
3169sub get_depends {
3170 my ($dep) = @_;
3171
ac6974c7 3172 my $kconfig = chomp_config $dep;
b9066f6c
SR
3173
3174 $dep = $depends{"$kconfig"};
3175
3176 # the dep string we have saves the dependencies as they
3177 # were found, including expressions like ! && ||. We
3178 # want to split this out into just an array of configs.
3179
3180 my $valid = "A-Za-z_0-9";
3181
3182 my @configs;
3183
3184 while ($dep =~ /[$valid]/) {
3185
3186 if ($dep =~ /^[^$valid]*([$valid]+)/) {
3187 my $conf = "CONFIG_" . $1;
3188
3189 $configs[$#configs + 1] = $conf;
3190
3191 $dep =~ s/^[^$valid]*[$valid]+//;
3192 } else {
3193 die "this should never happen";
3194 }
3195 }
3196
3197 return @configs;
3198}
3199
3200my %min_configs;
3201my %keep_configs;
43d1b651 3202my %save_configs;
b9066f6c
SR
3203my %processed_configs;
3204my %nochange_config;
3205
3206sub test_this_config {
3207 my ($config) = @_;
3208
3209 my $found;
3210
3211 # if we already processed this config, skip it
3212 if (defined($processed_configs{$config})) {
3213 return undef;
3214 }
3215 $processed_configs{$config} = 1;
3216
3217 # if this config failed during this round, skip it
3218 if (defined($nochange_config{$config})) {
3219 return undef;
3220 }
3221
ac6974c7 3222 my $kconfig = chomp_config $config;
b9066f6c
SR
3223
3224 # Test dependencies first
3225 if (defined($depends{"$kconfig"})) {
3226 my @parents = get_depends $config;
3227 foreach my $parent (@parents) {
3228 # if the parent is in the min config, check it first
3229 next if (!defined($min_configs{$parent}));
3230 $found = test_this_config($parent);
3231 if (defined($found)) {
3232 return $found;
3233 }
3234 }
3235 }
3236
3237 # Remove this config from the list of configs
3238 # do a make oldnoconfig and then read the resulting
3239 # .config to make sure it is missing the config that
3240 # we had before
3241 my %configs = %min_configs;
3242 delete $configs{$config};
3243 make_new_config ((values %configs), (values %keep_configs));
3244 make_oldconfig;
3245 undef %configs;
3246 assign_configs \%configs, $output_config;
3247
3248 return $config if (!defined($configs{$config}));
3249
3250 doprint "disabling config $config did not change .config\n";
3251
3252 $nochange_config{$config} = 1;
3253
3254 return undef;
3255}
3256
4c4ab120
SR
3257sub make_min_config {
3258 my ($i) = @_;
3259
ccc513b6
SR
3260 my $type = $minconfig_type;
3261 if ($type ne "boot" && $type ne "test") {
3262 fail "Invalid MIN_CONFIG_TYPE '$minconfig_type'\n" .
3263 " make_min_config works only with 'boot' and 'test'\n" and return;
3264 }
3265
4c4ab120
SR
3266 if (!defined($output_minconfig)) {
3267 fail "OUTPUT_MIN_CONFIG not defined" and return;
3268 }
35ce5952
SR
3269
3270 # If output_minconfig exists, and the start_minconfig
3271 # came from min_config, than ask if we should use
3272 # that instead.
3273 if (-f $output_minconfig && !$start_minconfig_defined) {
3274 print "$output_minconfig exists\n";
43de3316
SR
3275 if (!defined($use_output_minconfig)) {
3276 if (read_yn " Use it as minconfig?") {
3277 $start_minconfig = $output_minconfig;
3278 }
3279 } elsif ($use_output_minconfig > 0) {
3280 doprint "Using $output_minconfig as MIN_CONFIG\n";
35ce5952 3281 $start_minconfig = $output_minconfig;
43de3316
SR
3282 } else {
3283 doprint "Set to still use MIN_CONFIG as starting point\n";
35ce5952
SR
3284 }
3285 }
3286
4c4ab120
SR
3287 if (!defined($start_minconfig)) {
3288 fail "START_MIN_CONFIG or MIN_CONFIG not defined" and return;
3289 }
3290
35ce5952
SR
3291 my $temp_config = "$tmpdir/temp_config";
3292
4c4ab120
SR
3293 # First things first. We build an allnoconfig to find
3294 # out what the defaults are that we can't touch.
3295 # Some are selections, but we really can't handle selections.
3296
3297 my $save_minconfig = $minconfig;
3298 undef $minconfig;
3299
3300 run_command "$make allnoconfig" or return 0;
3301
b9066f6c
SR
3302 read_depends;
3303
4c4ab120 3304 process_config_ignore $output_config;
b9066f6c 3305
43d1b651 3306 undef %save_configs;
b9066f6c 3307 undef %min_configs;
4c4ab120
SR
3308
3309 if (defined($ignore_config)) {
3310 # make sure the file exists
3311 `touch $ignore_config`;
43d1b651 3312 assign_configs \%save_configs, $ignore_config;
4c4ab120
SR
3313 }
3314
43d1b651
SR
3315 %keep_configs = %save_configs;
3316
4c4ab120
SR
3317 doprint "Load initial configs from $start_minconfig\n";
3318
3319 # Look at the current min configs, and save off all the
3320 # ones that were set via the allnoconfig
4c4ab120
SR
3321 assign_configs \%min_configs, $start_minconfig;
3322
3323 my @config_keys = keys %min_configs;
3324
ac6974c7
SR
3325 # All configs need a depcount
3326 foreach my $config (@config_keys) {
3327 my $kconfig = chomp_config $config;
3328 if (!defined $depcount{$kconfig}) {
3329 $depcount{$kconfig} = 0;
3330 }
3331 }
3332
4c4ab120
SR
3333 # Remove anything that was set by the make allnoconfig
3334 # we shouldn't need them as they get set for us anyway.
3335 foreach my $config (@config_keys) {
3336 # Remove anything in the ignore_config
3337 if (defined($keep_configs{$config})) {
3338 my $file = $ignore_config;
3339 $file =~ s,.*/(.*?)$,$1,;
3340 doprint "$config set by $file ... ignored\n";
3341 delete $min_configs{$config};
3342 next;
3343 }
3344 # But make sure the settings are the same. If a min config
3345 # sets a selection, we do not want to get rid of it if
3346 # it is not the same as what we have. Just move it into
3347 # the keep configs.
3348 if (defined($config_ignore{$config})) {
3349 if ($config_ignore{$config} ne $min_configs{$config}) {
3350 doprint "$config is in allnoconfig as '$config_ignore{$config}'";
3351 doprint " but it is '$min_configs{$config}' in minconfig .. keeping\n";
3352 $keep_configs{$config} = $min_configs{$config};
3353 } else {
3354 doprint "$config set by allnoconfig ... ignored\n";
3355 }
3356 delete $min_configs{$config};
3357 }
3358 }
3359
4c4ab120 3360 my $done = 0;
b9066f6c 3361 my $take_two = 0;
4c4ab120
SR
3362
3363 while (!$done) {
3364
3365 my $config;
3366 my $found;
3367
3368 # Now disable each config one by one and do a make oldconfig
3369 # till we find a config that changes our list.
3370
4c4ab120 3371 my @test_configs = keys %min_configs;
ac6974c7
SR
3372
3373 # Sort keys by who is most dependent on
3374 @test_configs = sort { $depcount{chomp_config($b)} <=> $depcount{chomp_config($a)} }
3375 @test_configs ;
3376
3377 # Put configs that did not modify the config at the end.
4c4ab120
SR
3378 my $reset = 1;
3379 for (my $i = 0; $i < $#test_configs; $i++) {
3380 if (!defined($nochange_config{$test_configs[0]})) {
3381 $reset = 0;
3382 last;
3383 }
3384 # This config didn't change the .config last time.
3385 # Place it at the end
3386 my $config = shift @test_configs;
3387 push @test_configs, $config;
3388 }
3389
3390 # if every test config has failed to modify the .config file
3391 # in the past, then reset and start over.
3392 if ($reset) {
3393 undef %nochange_config;
3394 }
3395
b9066f6c
SR
3396 undef %processed_configs;
3397
4c4ab120
SR
3398 foreach my $config (@test_configs) {
3399
b9066f6c 3400 $found = test_this_config $config;
4c4ab120 3401
b9066f6c 3402 last if (defined($found));
4c4ab120
SR
3403
3404 # oh well, try another config
4c4ab120
SR
3405 }
3406
3407 if (!defined($found)) {
b9066f6c
SR
3408 # we could have failed due to the nochange_config hash
3409 # reset and try again
3410 if (!$take_two) {
3411 undef %nochange_config;
3412 $take_two = 1;
3413 next;
3414 }
4c4ab120
SR
3415 doprint "No more configs found that we can disable\n";
3416 $done = 1;
3417 last;
3418 }
b9066f6c 3419 $take_two = 0;
4c4ab120
SR
3420
3421 $config = $found;
3422
3423 doprint "Test with $config disabled\n";
3424
3425 # set in_bisect to keep build and monitor from dieing
3426 $in_bisect = 1;
3427
3428 my $failed = 0;
bf1c95ab
SR
3429 build "oldconfig" or $failed = 1;
3430 if (!$failed) {
3431 start_monitor_and_boot or $failed = 1;
ccc513b6
SR
3432
3433 if ($type eq "test" && !$failed) {
3434 do_run_test or $failed = 1;
3435 }
3436
bf1c95ab
SR
3437 end_monitor;
3438 }
4c4ab120
SR
3439
3440 $in_bisect = 0;
3441
3442 if ($failed) {
b9066f6c 3443 doprint "$min_configs{$config} is needed to boot the box... keeping\n";
4c4ab120
SR
3444 # this config is needed, add it to the ignore list.
3445 $keep_configs{$config} = $min_configs{$config};
43d1b651 3446 $save_configs{$config} = $min_configs{$config};
4c4ab120 3447 delete $min_configs{$config};
35ce5952
SR
3448
3449 # update new ignore configs
3450 if (defined($ignore_config)) {
3451 open (OUT, ">$temp_config")
3452 or die "Can't write to $temp_config";
43d1b651
SR
3453 foreach my $config (keys %save_configs) {
3454 print OUT "$save_configs{$config}\n";
35ce5952
SR
3455 }
3456 close OUT;
3457 run_command "mv $temp_config $ignore_config" or
3458 dodie "failed to copy update to $ignore_config";
3459 }
3460
4c4ab120
SR
3461 } else {
3462 # We booted without this config, remove it from the minconfigs.
3463 doprint "$config is not needed, disabling\n";
3464
3465 delete $min_configs{$config};
3466
3467 # Also disable anything that is not enabled in this config
3468 my %configs;
3469 assign_configs \%configs, $output_config;
3470 my @config_keys = keys %min_configs;
3471 foreach my $config (@config_keys) {
3472 if (!defined($configs{$config})) {
3473 doprint "$config is not set, disabling\n";
3474 delete $min_configs{$config};
3475 }
3476 }
3477
3478 # Save off all the current mandidory configs
35ce5952
SR
3479 open (OUT, ">$temp_config")
3480 or die "Can't write to $temp_config";
4c4ab120
SR
3481 foreach my $config (keys %keep_configs) {
3482 print OUT "$keep_configs{$config}\n";
3483 }
3484 foreach my $config (keys %min_configs) {
3485 print OUT "$min_configs{$config}\n";
3486 }
3487 close OUT;
35ce5952
SR
3488
3489 run_command "mv $temp_config $output_minconfig" or
3490 dodie "failed to copy update to $output_minconfig";
4c4ab120
SR
3491 }
3492
3493 doprint "Reboot and wait $sleep_time seconds\n";
bc7c5803 3494 reboot_to_good $sleep_time;
4c4ab120
SR
3495 }
3496
3497 success $i;
3498 return 1;
3499}
3500
8d1491ba
SR
3501$#ARGV < 1 or die "ktest.pl version: $VERSION\n usage: ktest.pl config-file\n";
3502
3503if ($#ARGV == 0) {
3504 $ktest_config = $ARGV[0];
3505 if (! -f $ktest_config) {
3506 print "$ktest_config does not exist.\n";
35ce5952 3507 if (!read_yn "Create it?") {
8d1491ba
SR
3508 exit 0;
3509 }
3510 }
3511} else {
3512 $ktest_config = "ktest.conf";
3513}
3514
3515if (! -f $ktest_config) {
dbd3783b 3516 $newconfig = 1;
c4261d0f 3517 get_test_case;
8d1491ba
SR
3518 open(OUT, ">$ktest_config") or die "Can not create $ktest_config";
3519 print OUT << "EOF"
3520# Generated by ktest.pl
3521#
0e7a22de
SR
3522
3523# PWD is a ktest.pl variable that will result in the process working
3524# directory that ktest.pl is executed in.
3525
3526# THIS_DIR is automatically assigned the PWD of the path that generated
3527# the config file. It is best to use this variable when assigning other
3528# directory paths within this directory. This allows you to easily
3529# move the test cases to other locations or to other machines.
3530#
3531THIS_DIR := $variable{"PWD"}
3532
8d1491ba
SR
3533# Define each test with TEST_START
3534# The config options below it will override the defaults
3535TEST_START
c4261d0f 3536TEST_TYPE = $default{"TEST_TYPE"}
8d1491ba
SR
3537
3538DEFAULTS
3539EOF
3540;
3541 close(OUT);
3542}
3543read_config $ktest_config;
3544
23715c3c
SR
3545if (defined($opt{"LOG_FILE"})) {
3546 $opt{"LOG_FILE"} = eval_option($opt{"LOG_FILE"}, -1);
3547}
3548
8d1491ba
SR
3549# Append any configs entered in manually to the config file.
3550my @new_configs = keys %entered_configs;
3551if ($#new_configs >= 0) {
3552 print "\nAppending entered in configs to $ktest_config\n";
3553 open(OUT, ">>$ktest_config") or die "Can not append to $ktest_config";
3554 foreach my $config (@new_configs) {
3555 print OUT "$config = $entered_configs{$config}\n";
0e7a22de 3556 $opt{$config} = process_variables($entered_configs{$config});
8d1491ba
SR
3557 }
3558}
2545eb61 3559
2b7d9b21
SR
3560if ($opt{"CLEAR_LOG"} && defined($opt{"LOG_FILE"})) {
3561 unlink $opt{"LOG_FILE"};
3562}
2545eb61 3563
2b7d9b21
SR
3564doprint "\n\nSTARTING AUTOMATED TESTS\n\n";
3565
a57419b3
SR
3566for (my $i = 0, my $repeat = 1; $i <= $opt{"NUM_TESTS"}; $i += $repeat) {
3567
3568 if (!$i) {
3569 doprint "DEFAULT OPTIONS:\n";
3570 } else {
3571 doprint "\nTEST $i OPTIONS";
3572 if (defined($repeat_tests{$i})) {
3573 $repeat = $repeat_tests{$i};
3574 doprint " ITERATE $repeat";
3575 }
3576 doprint "\n";
3577 }
3578
3579 foreach my $option (sort keys %opt) {
3580
3581 if ($option =~ /\[(\d+)\]$/) {
3582 next if ($i != $1);
3583 } else {
3584 next if ($i);
3585 }
3586
3587 doprint "$option = $opt{$option}\n";
3588 }
2b7d9b21 3589}
2545eb61 3590
2a62512b 3591sub __set_test_option {
5a391fbf 3592 my ($name, $i) = @_;
2545eb61 3593
5a391fbf 3594 my $option = "$name\[$i\]";
5c42fc5b 3595
5a391fbf
SR
3596 if (defined($opt{$option})) {
3597 return $opt{$option};
5f9b6ced
SR
3598 }
3599
a57419b3
SR
3600 foreach my $test (keys %repeat_tests) {
3601 if ($i >= $test &&
3602 $i < $test + $repeat_tests{$test}) {
3603 $option = "$name\[$test\]";
3604 if (defined($opt{$option})) {
3605 return $opt{$option};
3606 }
3607 }
3608 }
3609
5a391fbf
SR
3610 if (defined($opt{$name})) {
3611 return $opt{$name};
2545eb61
SR
3612 }
3613
5a391fbf
SR
3614 return undef;
3615}
3616
2a62512b
SR
3617sub set_test_option {
3618 my ($name, $i) = @_;
3619
3620 my $option = __set_test_option($name, $i);
3621 return $option if (!defined($option));
3622
23715c3c 3623 return eval_option($option, $i);
2a62512b
SR
3624}
3625
5a391fbf 3626# First we need to do is the builds
a75fecec
SR
3627for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {
3628
4ab1cce5
SR
3629 # Do not reboot on failing test options
3630 $no_reboot = 1;
759a3cc6 3631 $reboot_success = 0;
4ab1cce5 3632
683a3e64
SR
3633 $have_version = 0;
3634
576f627c
SR
3635 $iteration = $i;
3636
c1434dcc
SR
3637 undef %force_config;
3638
a75fecec
SR
3639 my $makecmd = set_test_option("MAKE_CMD", $i);
3640
9cc9e091
SR
3641 # Load all the options into their mapped variable names
3642 foreach my $opt (keys %option_map) {
3643 ${$option_map{$opt}} = set_test_option($opt, $i);
3644 }
b5f4aea6 3645
35ce5952
SR
3646 $start_minconfig_defined = 1;
3647
921ed4c7
SR
3648 # The first test may override the PRE_KTEST option
3649 if (defined($pre_ktest) && $i == 1) {
3650 doprint "\n";
3651 run_command $pre_ktest;
3652 }
3653
3654 # Any test can override the POST_KTEST option
3655 # The last test takes precedence.
3656 if (defined($post_ktest)) {
3657 $final_post_ktest = $post_ktest;
3658 }
3659
4c4ab120 3660 if (!defined($start_minconfig)) {
35ce5952 3661 $start_minconfig_defined = 0;
4c4ab120
SR
3662 $start_minconfig = $minconfig;
3663 }
3664
a75fecec
SR
3665 chdir $builddir || die "can't change directory to $builddir";
3666
a908a665
AJ
3667 foreach my $dir ($tmpdir, $outputdir) {
3668 if (!-d $dir) {
3669 mkpath($dir) or
3670 die "can't create $dir";
3671 }
a75fecec 3672 }
1a5cfce3 3673
e48c5293
SR
3674 $ENV{"SSH_USER"} = $ssh_user;
3675 $ENV{"MACHINE"} = $machine;
3676
a75fecec 3677 $buildlog = "$tmpdir/buildlog-$machine";
a9dd5d63 3678 $testlog = "$tmpdir/testlog-$machine";
a75fecec
SR
3679 $dmesg = "$tmpdir/dmesg-$machine";
3680 $make = "$makecmd O=$outputdir";
51ad1dd1 3681 $output_config = "$outputdir/.config";
a75fecec 3682
bb8474b1
SR
3683 if (!$buildonly) {
3684 $target = "$ssh_user\@$machine";
3685 if ($reboot_type eq "grub") {
3686 dodie "GRUB_MENU not defined" if (!defined($grub_menu));
bb8474b1 3687 }
a75fecec
SR
3688 }
3689
3690 my $run_type = $build_type;
3691 if ($test_type eq "patchcheck") {
b5f4aea6 3692 $run_type = $patchcheck_type;
a75fecec 3693 } elsif ($test_type eq "bisect") {
b5f4aea6 3694 $run_type = $bisect_type;
0a05c769 3695 } elsif ($test_type eq "config_bisect") {
b5f4aea6 3696 $run_type = $config_bisect_type;
a75fecec
SR
3697 }
3698
4c4ab120
SR
3699 if ($test_type eq "make_min_config") {
3700 $run_type = "";
3701 }
3702
a75fecec
SR
3703 # mistake in config file?
3704 if (!defined($run_type)) {
3705 $run_type = "ERROR";
3706 }
5a391fbf 3707
e0a8742e
SR
3708 my $installme = "";
3709 $installme = " no_install" if ($no_install);
3710
2545eb61 3711 doprint "\n\n";
e0a8742e 3712 doprint "RUNNING TEST $i of $opt{NUM_TESTS} with option $test_type $run_type$installme\n\n";
7faafbd6 3713
921ed4c7
SR
3714 if (defined($pre_test)) {
3715 run_command $pre_test;
3716 }
3717
7faafbd6
SR
3718 unlink $dmesg;
3719 unlink $buildlog;
a9dd5d63 3720 unlink $testlog;
2545eb61 3721
250bae8b
SR
3722 if (defined($addconfig)) {
3723 my $min = $minconfig;
3724 if (!defined($minconfig)) {
3725 $min = "";
3726 }
3727 run_command "cat $addconfig $min > $tmpdir/add_config" or
2b7d9b21 3728 dodie "Failed to create temp config";
9be2e6b5 3729 $minconfig = "$tmpdir/add_config";
2b7d9b21
SR
3730 }
3731
6c5ee0be
SR
3732 if (defined($checkout)) {
3733 run_command "git checkout $checkout" or
3734 die "failed to checkout $checkout";
3735 }
3736
759a3cc6
SR
3737 $no_reboot = 0;
3738
648a182c
SR
3739 # A test may opt to not reboot the box
3740 if ($reboot_on_success) {
759a3cc6 3741 $reboot_success = 1;
648a182c 3742 }
4ab1cce5 3743
a75fecec 3744 if ($test_type eq "bisect") {
5f9b6ced
SR
3745 bisect $i;
3746 next;
0a05c769
SR
3747 } elsif ($test_type eq "config_bisect") {
3748 config_bisect $i;
3749 next;
a75fecec 3750 } elsif ($test_type eq "patchcheck") {
6c5ee0be
SR
3751 patchcheck $i;
3752 next;
4c4ab120
SR
3753 } elsif ($test_type eq "make_min_config") {
3754 make_min_config $i;
3755 next;
2545eb61 3756 }
2545eb61 3757
7faafbd6
SR
3758 if ($build_type ne "nobuild") {
3759 build $build_type or next;
2545eb61
SR
3760 }
3761
cd8e368f
SR
3762 if ($test_type eq "install") {
3763 get_version;
3764 install;
3765 success $i;
3766 next;
3767 }
3768
a75fecec 3769 if ($test_type ne "build") {
a75fecec 3770 my $failed = 0;
ddf607e5 3771 start_monitor_and_boot or $failed = 1;
a75fecec
SR
3772
3773 if (!$failed && $test_type ne "boot" && defined($run_test)) {
3774 do_run_test or $failed = 1;
3775 }
3776 end_monitor;
3777 next if ($failed);
5a391fbf
SR
3778 }
3779
5f9b6ced 3780 success $i;
2545eb61
SR
3781}
3782
921ed4c7
SR
3783if (defined($final_post_ktest)) {
3784 run_command $final_post_ktest;
3785}
3786
5c42fc5b 3787if ($opt{"POWEROFF_ON_SUCCESS"}) {
75c3fda7 3788 halt;
759a3cc6 3789} elsif ($opt{"REBOOT_ON_SUCCESS"} && !do_not_reboot && $reboot_success) {
bc7c5803 3790 reboot_to_good;
648a182c
SR
3791} elsif (defined($switch_to_good)) {
3792 # still need to get to the good kernel
3793 run_command $switch_to_good;
5c42fc5b 3794}
75c3fda7 3795
648a182c 3796
e48c5293
SR
3797doprint "\n $successes of $opt{NUM_TESTS} tests were successful\n\n";
3798
2545eb61 3799exit 0;
This page took 0.275528 seconds and 5 git commands to generate.