Merge tag 'pm-6.16-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
[linux-2.6-block.git] / tools / testing / ktest / ktest.pl
CommitLineData
2545eb61 1#!/usr/bin/perl -w
4f19048f 2# SPDX-License-Identifier: GPL-2.0-only
d6ce2a0b 3#
cce1dac8 4# Copyright 2010 - Steven Rostedt <srostedt@redhat.com>, Red Hat Inc.
d6ce2a0b 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 12use FileHandle;
40667fb5 13use FindBin;
eefb9d2b 14use IO::Handle;
2545eb61 15
e48c5293
SR
16my $VERSION = "0.2";
17
2545eb61
SR
18$| = 1;
19
20my %opt;
a57419b3
SR
21my %repeat_tests;
22my %repeats;
c75d22d9 23my %evals;
2545eb61
SR
24
25#default opts
4f43e0dc 26my %default = (
c043ccbf 27 "MAILER" => "sendmail", # default mailer
2ceb2d85
TTC
28 "EMAIL_ON_ERROR" => 1,
29 "EMAIL_WHEN_FINISHED" => 1,
30 "EMAIL_WHEN_CANCELED" => 0,
31 "EMAIL_WHEN_STARTED" => 0,
4f43e0dc
SR
32 "NUM_TESTS" => 1,
33 "TEST_TYPE" => "build",
791dc9d6 34 "BUILD_TYPE" => "oldconfig",
4f43e0dc 35 "MAKE_CMD" => "make",
5a5d8e48 36 "CLOSE_CONSOLE_SIGNAL" => "INT",
4f43e0dc
SR
37 "TIMEOUT" => 120,
38 "TMP_DIR" => "/tmp/ktest/\${MACHINE}",
c043ccbf 39 "SLEEP_TIME" => 60, # sleep time between tests
4f43e0dc
SR
40 "BUILD_NOCLEAN" => 0,
41 "REBOOT_ON_ERROR" => 0,
42 "POWEROFF_ON_ERROR" => 0,
43 "REBOOT_ON_SUCCESS" => 1,
44 "POWEROFF_ON_SUCCESS" => 0,
45 "BUILD_OPTIONS" => "",
c043ccbf
JWHV
46 "BISECT_SLEEP_TIME" => 60, # sleep time between bisects
47 "PATCHCHECK_SLEEP_TIME" => 60, # sleep time between patch checks
4f43e0dc
SR
48 "CLEAR_LOG" => 0,
49 "BISECT_MANUAL" => 0,
50 "BISECT_SKIP" => 1,
961d9cac 51 "BISECT_TRIES" => 1,
ccc513b6 52 "MIN_CONFIG_TYPE" => "boot",
4f43e0dc
SR
53 "SUCCESS_LINE" => "login:",
54 "DETECT_TRIPLE_FAULT" => 1,
55 "NO_INSTALL" => 0,
56 "BOOTED_TIMEOUT" => 1,
57 "DIE_ON_FAILURE" => 1,
58 "SSH_EXEC" => "ssh \$SSH_USER\@\$MACHINE \$SSH_COMMAND",
59 "SCP_TO_TARGET" => "scp \$SRC_FILE \$SSH_USER\@\$MACHINE:\$DST_FILE",
02ad2617 60 "SCP_TO_TARGET_INSTALL" => "\${SCP_TO_TARGET}",
4f43e0dc 61 "REBOOT" => "ssh \$SSH_USER\@\$MACHINE reboot",
37e16773 62 "REBOOT_RETURN_CODE" => 255,
4f43e0dc
SR
63 "STOP_AFTER_SUCCESS" => 10,
64 "STOP_AFTER_FAILURE" => 60,
65 "STOP_TEST_AFTER" => 600,
407b95b7 66 "MAX_MONITOR_WAIT" => 1800,
a15ba913 67 "GRUB_REBOOT" => "grub2-reboot",
ac246645 68 "GRUB_BLS_GET" => "grubby --info=ALL",
7786954c
SR
69 "SYSLINUX" => "extlinux",
70 "SYSLINUX_PATH" => "/boot/extlinux",
3e1d3678 71 "CONNECT_TIMEOUT" => 25,
600bbf0a
SR
72
73# required, and we will ask users if they don't have them but we keep the default
74# value something that is common.
4f43e0dc
SR
75 "REBOOT_TYPE" => "grub",
76 "LOCALVERSION" => "-test",
77 "SSH_USER" => "root",
78 "BUILD_TARGET" => "arch/x86/boot/bzImage",
79 "TARGET_IMAGE" => "/boot/vmlinuz-test",
9cc9e091
SR
80
81 "LOG_FILE" => undef,
82 "IGNORE_UNUSED" => 0,
4f43e0dc 83);
2545eb61 84
34148b13
SRV
85my $test_log_start = 0;
86
5269faad 87my $ktest_config = "ktest.conf";
2545eb61 88my $version;
683a3e64 89my $have_version = 0;
a75fecec 90my $machine;
df5f7c66 91my $last_machine;
e48c5293 92my $ssh_user;
a75fecec
SR
93my $tmpdir;
94my $builddir;
95my $outputdir;
51ad1dd1 96my $output_config;
a75fecec 97my $test_type;
7faafbd6 98my $build_type;
a75fecec 99my $build_options;
921ed4c7
SR
100my $final_post_ktest;
101my $pre_ktest;
102my $post_ktest;
103my $pre_test;
d53cdda3 104my $pre_test_die;
921ed4c7 105my $post_test;
0bd6c1a3
SR
106my $pre_build;
107my $post_build;
108my $pre_build_die;
109my $post_build_die;
a75fecec
SR
110my $reboot_type;
111my $reboot_script;
112my $power_cycle;
e48c5293 113my $reboot;
37e16773 114my $reboot_return_code;
a75fecec 115my $reboot_on_error;
bc7c5803
SR
116my $switch_to_good;
117my $switch_to_test;
a75fecec 118my $poweroff_on_error;
648a182c 119my $reboot_on_success;
a75fecec 120my $die_on_failure;
576f627c
SR
121my $powercycle_after_reboot;
122my $poweroff_after_halt;
407b95b7 123my $max_monitor_wait;
e48c5293
SR
124my $ssh_exec;
125my $scp_to_target;
02ad2617 126my $scp_to_target_install;
a75fecec
SR
127my $power_off;
128my $grub_menu;
752d9665 129my $last_grub_menu;
a15ba913 130my $grub_file;
2545eb61 131my $grub_number;
a15ba913 132my $grub_reboot;
ac246645 133my $grub_bls_get;
7786954c
SR
134my $syslinux;
135my $syslinux_path;
136my $syslinux_label;
2545eb61
SR
137my $target;
138my $make;
e5c2ec11 139my $pre_install;
8b37ca8c 140my $post_install;
e0a8742e 141my $no_install;
5c42fc5b 142my $noclean;
5f9b6ced 143my $minconfig;
4c4ab120 144my $start_minconfig;
35ce5952 145my $start_minconfig_defined;
4c4ab120 146my $output_minconfig;
ccc513b6 147my $minconfig_type;
43de3316 148my $use_output_minconfig;
4283b169 149my $warnings_file;
4c4ab120 150my $ignore_config;
be405f95 151my $ignore_errors;
2b7d9b21 152my $addconfig;
5f9b6ced 153my $in_bisect = 0;
b5f4aea6 154my $bisect_bad_commit = "";
d6ce2a0b 155my $reverse_bisect;
c960bb9f 156my $bisect_manual;
c23dca7c 157my $bisect_skip;
961d9cac 158my $bisect_tries;
30f75da5 159my $config_bisect_good;
c5dacb88
SR
160my $bisect_ret_good;
161my $bisect_ret_bad;
162my $bisect_ret_skip;
163my $bisect_ret_abort;
164my $bisect_ret_default;
6c5ee0be 165my $in_patchcheck = 0;
5a391fbf 166my $run_test;
7faafbd6 167my $buildlog;
a9dd5d63 168my $testlog;
7faafbd6
SR
169my $dmesg;
170my $monitor_fp;
171my $monitor_pid;
172my $monitor_cnt = 0;
a75fecec
SR
173my $sleep_time;
174my $bisect_sleep_time;
27d934b2 175my $patchcheck_sleep_time;
1990207d 176my $ignore_warnings;
a75fecec 177my $store_failures;
de5b6e3b 178my $store_successes;
9064af52 179my $test_name;
a75fecec 180my $timeout;
4e7d2a8f 181my $run_timeout;
3e1d3678 182my $connect_timeout;
40667fb5 183my $config_bisect_exec;
a75fecec 184my $booted_timeout;
f1a5b962 185my $detect_triplefault;
a75fecec 186my $console;
5a5d8e48 187my $close_console_signal;
2b803365 188my $reboot_success_line;
a75fecec 189my $success_line;
1c8a617a
SR
190my $stop_after_success;
191my $stop_after_failure;
2d01b26a 192my $stop_test_after;
a75fecec
SR
193my $build_target;
194my $target_image;
b5f4aea6 195my $checkout;
a75fecec 196my $localversion;
576f627c 197my $iteration = 0;
e48c5293 198my $successes = 0;
9d2f7f05 199my $stty_orig;
5739438b 200my $run_command_status = 0;
2545eb61 201
b5f4aea6
SR
202my $bisect_good;
203my $bisect_bad;
204my $bisect_type;
205my $bisect_start;
206my $bisect_replay;
207my $bisect_files;
208my $bisect_reverse;
209my $bisect_check;
210
211my $config_bisect;
212my $config_bisect_type;
b0918612 213my $config_bisect_check;
b5f4aea6
SR
214
215my $patchcheck_type;
216my $patchcheck_start;
23a0e161 217my $patchcheck_cherry;
b5f4aea6
SR
218my $patchcheck_end;
219
38fa3dc1
SRRH
220my $build_time;
221my $install_time;
222my $reboot_time;
223my $test_time;
224
d441734d
SR
225my $warning_found = 0;
226
40667fb5
SRV
227my $pwd;
228my $dirname = $FindBin::Bin;
229
2ceb2d85
TTC
230my $mailto;
231my $mailer;
be1546b8 232my $mail_path;
f9869002 233my $mail_max_size;
c2d84ddb 234my $mail_command;
2ceb2d85
TTC
235my $email_on_error;
236my $email_when_finished;
237my $email_when_started;
238my $email_when_canceled;
239
240my $script_start_time = localtime();
241
165708b2 242# set when a test is something other that just building or install
bb8474b1
SR
243# which would require more options.
244my $buildonly = 1;
245
4283b169
SRRH
246# tell build not to worry about warnings, even when WARNINGS_FILE is set
247my $warnings_ok = 0;
248
dbd3783b
SR
249# set when creating a new config
250my $newconfig = 0;
251
8d1491ba
SR
252my %entered_configs;
253my %config_help;
77d942ce 254my %variable;
cf79fab6
SR
255
256# force_config is the list of configs that we force enabled (or disabled)
257# in a .config file. The MIN_CONFIG and ADD_CONFIG configs.
fcb3f16a 258my %force_config;
8d1491ba 259
4ab1cce5
SR
260# do not force reboots on config problems
261my $no_reboot = 1;
262
759a3cc6
SR
263# reboot on success
264my $reboot_success = 0;
265
9cc9e091 266my %option_map = (
be1546b8
SRV
267 "MAILTO" => \$mailto,
268 "MAILER" => \$mailer,
269 "MAIL_PATH" => \$mail_path,
f9869002 270 "MAIL_MAX_SIZE" => \$mail_max_size,
c2d84ddb 271 "MAIL_COMMAND" => \$mail_command,
2ceb2d85
TTC
272 "EMAIL_ON_ERROR" => \$email_on_error,
273 "EMAIL_WHEN_FINISHED" => \$email_when_finished,
274 "EMAIL_WHEN_STARTED" => \$email_when_started,
275 "EMAIL_WHEN_CANCELED" => \$email_when_canceled,
9cc9e091
SR
276 "MACHINE" => \$machine,
277 "SSH_USER" => \$ssh_user,
278 "TMP_DIR" => \$tmpdir,
279 "OUTPUT_DIR" => \$outputdir,
280 "BUILD_DIR" => \$builddir,
281 "TEST_TYPE" => \$test_type,
921ed4c7
SR
282 "PRE_KTEST" => \$pre_ktest,
283 "POST_KTEST" => \$post_ktest,
284 "PRE_TEST" => \$pre_test,
d53cdda3 285 "PRE_TEST_DIE" => \$pre_test_die,
921ed4c7 286 "POST_TEST" => \$post_test,
9cc9e091
SR
287 "BUILD_TYPE" => \$build_type,
288 "BUILD_OPTIONS" => \$build_options,
289 "PRE_BUILD" => \$pre_build,
290 "POST_BUILD" => \$post_build,
291 "PRE_BUILD_DIE" => \$pre_build_die,
292 "POST_BUILD_DIE" => \$post_build_die,
293 "POWER_CYCLE" => \$power_cycle,
294 "REBOOT" => \$reboot,
37e16773 295 "REBOOT_RETURN_CODE" => \$reboot_return_code,
9cc9e091
SR
296 "BUILD_NOCLEAN" => \$noclean,
297 "MIN_CONFIG" => \$minconfig,
298 "OUTPUT_MIN_CONFIG" => \$output_minconfig,
299 "START_MIN_CONFIG" => \$start_minconfig,
ccc513b6 300 "MIN_CONFIG_TYPE" => \$minconfig_type,
43de3316 301 "USE_OUTPUT_MIN_CONFIG" => \$use_output_minconfig,
4283b169 302 "WARNINGS_FILE" => \$warnings_file,
9cc9e091
SR
303 "IGNORE_CONFIG" => \$ignore_config,
304 "TEST" => \$run_test,
305 "ADD_CONFIG" => \$addconfig,
306 "REBOOT_TYPE" => \$reboot_type,
307 "GRUB_MENU" => \$grub_menu,
a15ba913
SR
308 "GRUB_FILE" => \$grub_file,
309 "GRUB_REBOOT" => \$grub_reboot,
ac246645 310 "GRUB_BLS_GET" => \$grub_bls_get,
7786954c
SR
311 "SYSLINUX" => \$syslinux,
312 "SYSLINUX_PATH" => \$syslinux_path,
313 "SYSLINUX_LABEL" => \$syslinux_label,
e5c2ec11 314 "PRE_INSTALL" => \$pre_install,
9cc9e091
SR
315 "POST_INSTALL" => \$post_install,
316 "NO_INSTALL" => \$no_install,
317 "REBOOT_SCRIPT" => \$reboot_script,
318 "REBOOT_ON_ERROR" => \$reboot_on_error,
319 "SWITCH_TO_GOOD" => \$switch_to_good,
320 "SWITCH_TO_TEST" => \$switch_to_test,
321 "POWEROFF_ON_ERROR" => \$poweroff_on_error,
648a182c 322 "REBOOT_ON_SUCCESS" => \$reboot_on_success,
9cc9e091
SR
323 "DIE_ON_FAILURE" => \$die_on_failure,
324 "POWER_OFF" => \$power_off,
325 "POWERCYCLE_AFTER_REBOOT" => \$powercycle_after_reboot,
326 "POWEROFF_AFTER_HALT" => \$poweroff_after_halt,
407b95b7 327 "MAX_MONITOR_WAIT" => \$max_monitor_wait,
9cc9e091
SR
328 "SLEEP_TIME" => \$sleep_time,
329 "BISECT_SLEEP_TIME" => \$bisect_sleep_time,
330 "PATCHCHECK_SLEEP_TIME" => \$patchcheck_sleep_time,
331 "IGNORE_WARNINGS" => \$ignore_warnings,
be405f95 332 "IGNORE_ERRORS" => \$ignore_errors,
9cc9e091
SR
333 "BISECT_MANUAL" => \$bisect_manual,
334 "BISECT_SKIP" => \$bisect_skip,
961d9cac 335 "BISECT_TRIES" => \$bisect_tries,
9cc9e091
SR
336 "CONFIG_BISECT_GOOD" => \$config_bisect_good,
337 "BISECT_RET_GOOD" => \$bisect_ret_good,
338 "BISECT_RET_BAD" => \$bisect_ret_bad,
339 "BISECT_RET_SKIP" => \$bisect_ret_skip,
340 "BISECT_RET_ABORT" => \$bisect_ret_abort,
341 "BISECT_RET_DEFAULT" => \$bisect_ret_default,
342 "STORE_FAILURES" => \$store_failures,
343 "STORE_SUCCESSES" => \$store_successes,
344 "TEST_NAME" => \$test_name,
345 "TIMEOUT" => \$timeout,
4e7d2a8f 346 "RUN_TIMEOUT" => \$run_timeout,
3e1d3678 347 "CONNECT_TIMEOUT" => \$connect_timeout,
40667fb5 348 "CONFIG_BISECT_EXEC" => \$config_bisect_exec,
9cc9e091
SR
349 "BOOTED_TIMEOUT" => \$booted_timeout,
350 "CONSOLE" => \$console,
5a5d8e48 351 "CLOSE_CONSOLE_SIGNAL" => \$close_console_signal,
9cc9e091
SR
352 "DETECT_TRIPLE_FAULT" => \$detect_triplefault,
353 "SUCCESS_LINE" => \$success_line,
354 "REBOOT_SUCCESS_LINE" => \$reboot_success_line,
355 "STOP_AFTER_SUCCESS" => \$stop_after_success,
356 "STOP_AFTER_FAILURE" => \$stop_after_failure,
357 "STOP_TEST_AFTER" => \$stop_test_after,
358 "BUILD_TARGET" => \$build_target,
359 "SSH_EXEC" => \$ssh_exec,
360 "SCP_TO_TARGET" => \$scp_to_target,
02ad2617 361 "SCP_TO_TARGET_INSTALL" => \$scp_to_target_install,
9cc9e091
SR
362 "CHECKOUT" => \$checkout,
363 "TARGET_IMAGE" => \$target_image,
364 "LOCALVERSION" => \$localversion,
365
366 "BISECT_GOOD" => \$bisect_good,
367 "BISECT_BAD" => \$bisect_bad,
368 "BISECT_TYPE" => \$bisect_type,
369 "BISECT_START" => \$bisect_start,
370 "BISECT_REPLAY" => \$bisect_replay,
371 "BISECT_FILES" => \$bisect_files,
372 "BISECT_REVERSE" => \$bisect_reverse,
373 "BISECT_CHECK" => \$bisect_check,
374
375 "CONFIG_BISECT" => \$config_bisect,
376 "CONFIG_BISECT_TYPE" => \$config_bisect_type,
b0918612 377 "CONFIG_BISECT_CHECK" => \$config_bisect_check,
9cc9e091
SR
378
379 "PATCHCHECK_TYPE" => \$patchcheck_type,
380 "PATCHCHECK_START" => \$patchcheck_start,
23a0e161 381 "PATCHCHECK_CHERRY" => \$patchcheck_cherry,
9cc9e091
SR
382 "PATCHCHECK_END" => \$patchcheck_end,
383);
384
385# Options may be used by other options, record them.
386my %used_options;
387
7bf51073
SR
388# default variables that can be used
389chomp ($variable{"PWD"} = `pwd`);
40667fb5 390$pwd = $variable{"PWD"};
7bf51073 391
8d1491ba
SR
392$config_help{"MACHINE"} = << "EOF"
393 The machine hostname that you will test.
bb8474b1 394 For build only tests, it is still needed to differentiate log files.
8d1491ba
SR
395EOF
396 ;
397$config_help{"SSH_USER"} = << "EOF"
398 The box is expected to have ssh on normal bootup, provide the user
399 (most likely root, since you need privileged operations)
400EOF
401 ;
402$config_help{"BUILD_DIR"} = << "EOF"
403 The directory that contains the Linux source code (full path).
0e7a22de
SR
404 You can use \${PWD} that will be the path where ktest.pl is run, or use
405 \${THIS_DIR} which is assigned \${PWD} but may be changed later.
8d1491ba
SR
406EOF
407 ;
408$config_help{"OUTPUT_DIR"} = << "EOF"
409 The directory that the objects will be built (full path).
410 (can not be same as BUILD_DIR)
0e7a22de
SR
411 You can use \${PWD} that will be the path where ktest.pl is run, or use
412 \${THIS_DIR} which is assigned \${PWD} but may be changed later.
8d1491ba
SR
413EOF
414 ;
415$config_help{"BUILD_TARGET"} = << "EOF"
416 The location of the compiled file to copy to the target.
417 (relative to OUTPUT_DIR)
418EOF
419 ;
dbd3783b
SR
420$config_help{"BUILD_OPTIONS"} = << "EOF"
421 Options to add to \"make\" when building.
422 i.e. -j20
423EOF
424 ;
8d1491ba
SR
425$config_help{"TARGET_IMAGE"} = << "EOF"
426 The place to put your image on the test machine.
427EOF
428 ;
429$config_help{"POWER_CYCLE"} = << "EOF"
430 A script or command to reboot the box.
431
432 Here is a digital loggers power switch example
433 POWER_CYCLE = wget --no-proxy -O /dev/null -q --auth-no-challenge 'http://admin:admin\@power/outlet?5=CCL'
434
435 Here is an example to reboot a virtual box on the current host
436 with the name "Guest".
437 POWER_CYCLE = virsh destroy Guest; sleep 5; virsh start Guest
438EOF
439 ;
440$config_help{"CONSOLE"} = << "EOF"
441 The script or command that reads the console
442
443 If you use ttywatch server, something like the following would work.
444CONSOLE = nc -d localhost 3001
445
446 For a virtual machine with guest name "Guest".
447CONSOLE = virsh console Guest
448EOF
449 ;
450$config_help{"LOCALVERSION"} = << "EOF"
451 Required version ending to differentiate the test
452 from other linux builds on the system.
453EOF
454 ;
455$config_help{"REBOOT_TYPE"} = << "EOF"
456 Way to reboot the box to the test kernel.
ac246645 457 Only valid options so far are "grub", "grub2", "grub2bls", "syslinux", and "script".
8d1491ba
SR
458
459 If you specify grub, it will assume grub version 1
460 and will search in /boot/grub/menu.lst for the title \$GRUB_MENU
461 and select that target to reboot to the kernel. If this is not
462 your setup, then specify "script" and have a command or script
463 specified in REBOOT_SCRIPT to boot to the target.
464
465 The entry in /boot/grub/menu.lst must be entered in manually.
466 The test will not modify that file.
a15ba913
SR
467
468 If you specify grub2, then you also need to specify both \$GRUB_MENU
469 and \$GRUB_FILE.
7786954c 470
ac246645
MM
471 If you specify grub2bls, then you also need to specify \$GRUB_MENU.
472
7786954c
SR
473 If you specify syslinux, then you may use SYSLINUX to define the syslinux
474 command (defaults to extlinux), and SYSLINUX_PATH to specify the path to
475 the syslinux install (defaults to /boot/extlinux). But you have to specify
476 SYSLINUX_LABEL to define the label to boot to for the test kernel.
8d1491ba
SR
477EOF
478 ;
479$config_help{"GRUB_MENU"} = << "EOF"
480 The grub title name for the test kernel to boot
a15ba913 481 (Only mandatory if REBOOT_TYPE = grub or grub2)
8d1491ba
SR
482
483 Note, ktest.pl will not update the grub menu.lst, you need to
484 manually add an option for the test. ktest.pl will search
485 the grub menu.lst for this option to find what kernel to
486 reboot into.
487
488 For example, if in the /boot/grub/menu.lst the test kernel title has:
489 title Test Kernel
490 kernel vmlinuz-test
491 GRUB_MENU = Test Kernel
a15ba913
SR
492
493 For grub2, a search of \$GRUB_FILE is performed for the lines
494 that begin with "menuentry". It will not detect submenus. The
495 menu must be a non-nested menu. Add the quotes used in the menu
496 to guarantee your selection, as the first menuentry with the content
497 of \$GRUB_MENU that is found will be used.
ac246645
MM
498
499 For grub2bls, \$GRUB_MENU is searched on the result of \$GRUB_BLS_GET
500 command for the lines that begin with "title".
a15ba913
SR
501EOF
502 ;
503$config_help{"GRUB_FILE"} = << "EOF"
504 If grub2 is used, the full path for the grub.cfg file is placed
505 here. Use something like /boot/grub2/grub.cfg to search.
8d1491ba
SR
506EOF
507 ;
7786954c
SR
508$config_help{"SYSLINUX_LABEL"} = << "EOF"
509 If syslinux is used, the label that boots the target kernel must
510 be specified with SYSLINUX_LABEL.
511EOF
512 ;
8d1491ba
SR
513$config_help{"REBOOT_SCRIPT"} = << "EOF"
514 A script to reboot the target into the test kernel
515 (Only mandatory if REBOOT_TYPE = script)
516EOF
517 ;
518
6a0f3652
JWHV
519# used with process_expression()
520my $d = 0;
521
522# defined before get_test_name()
523my $in_die = 0;
524
525# defined before process_warning_line()
526my $check_build_re = ".*:.*(warning|error|Error):.*";
527my $utf8_quote = "\\x{e2}\\x{80}(\\x{98}|\\x{99})";
528
529# defined before child_finished()
530my $child_done;
531
532# config_ignore holds the configs that were set (or unset) for
533# a good config and we will ignore these configs for the rest
534# of a config bisect. These configs stay as they were.
535my %config_ignore;
536
537# config_set holds what all configs were set as.
538my %config_set;
539
540# config_off holds the set of configs that the bad config had disabled.
541# We need to record them and set them in the .config when running
542# olddefconfig, because olddefconfig keeps the defaults.
543my %config_off;
544
545# config_off_tmp holds a set of configs to turn off for now
546my @config_off_tmp;
547
548# config_list is the set of configs that are being tested
549my %config_list;
550my %null_config;
551
552my %dependency;
553
554# found above run_config_bisect()
555my $pass = 1;
556
557# found above add_dep()
558
559my %depends;
560my %depcount;
561my $iflevel = 0;
562my @ifdeps;
563
564# prevent recursion
565my %read_kconfigs;
566
567# found above test_this_config()
568my %min_configs;
569my %keep_configs;
570my %save_configs;
571my %processed_configs;
572my %nochange_config;
573
574#
575# These are first defined here, main function later on
576#
577sub run_command;
578sub start_monitor;
579sub end_monitor;
580sub wait_for_monitor;
581
c75d22d9
SRRH
582sub _logit {
583 if (defined($opt{"LOG_FILE"})) {
d6bc29d9 584 print LOG @_;
c75d22d9
SRRH
585 }
586}
587
588sub logit {
589 if (defined($opt{"LOG_FILE"})) {
590 _logit @_;
591 } else {
592 print @_;
593 }
594}
595
596sub doprint {
597 print @_;
598 _logit @_;
599}
600
dad98754
SR
601sub read_prompt {
602 my ($cancel, $prompt) = @_;
35ce5952
SR
603
604 my $ans;
605
606 for (;;) {
c043ccbf 607 if ($cancel) {
dad98754
SR
608 print "$prompt [y/n/C] ";
609 } else {
610 print "$prompt [Y/n] ";
611 }
35ce5952
SR
612 $ans = <STDIN>;
613 chomp $ans;
614 if ($ans =~ /^\s*$/) {
dad98754
SR
615 if ($cancel) {
616 $ans = "c";
617 } else {
618 $ans = "y";
619 }
35ce5952
SR
620 }
621 last if ($ans =~ /^y$/i || $ans =~ /^n$/i);
dad98754
SR
622 if ($cancel) {
623 last if ($ans =~ /^c$/i);
624 print "Please answer either 'y', 'n' or 'c'.\n";
625 } else {
626 print "Please answer either 'y' or 'n'.\n";
627 }
628 }
629 if ($ans =~ /^c/i) {
630 exit;
35ce5952
SR
631 }
632 if ($ans !~ /^y$/i) {
633 return 0;
634 }
635 return 1;
636}
8d1491ba 637
dad98754
SR
638sub read_yn {
639 my ($prompt) = @_;
640
641 return read_prompt 0, $prompt;
642}
643
644sub read_ync {
645 my ($prompt) = @_;
646
647 return read_prompt 1, $prompt;
648}
649
5269faad 650sub get_mandatory_config {
8d1491ba 651 my ($config) = @_;
815e2bd7 652 my $ans;
8d1491ba
SR
653
654 return if (defined($opt{$config}));
655
656 if (defined($config_help{$config})) {
657 print "\n";
658 print $config_help{$config};
659 }
660
661 for (;;) {
662 print "$config = ";
dbd3783b 663 if (defined($default{$config}) && length($default{$config})) {
8d1491ba
SR
664 print "\[$default{$config}\] ";
665 }
815e2bd7
SR
666 $ans = <STDIN>;
667 $ans =~ s/^\s*(.*\S)\s*$/$1/;
668 if ($ans =~ /^\s*$/) {
8d1491ba 669 if ($default{$config}) {
815e2bd7 670 $ans = $default{$config};
8d1491ba
SR
671 } else {
672 print "Your answer can not be blank\n";
673 next;
674 }
675 }
0e7a22de 676 $entered_configs{$config} = ${ans};
8d1491ba
SR
677 last;
678 }
679}
680
38fa3dc1
SRRH
681sub show_time {
682 my ($time) = @_;
683
684 my $hours = 0;
685 my $minutes = 0;
686
687 if ($time > 3600) {
688 $hours = int($time / 3600);
689 $time -= $hours * 3600;
690 }
691 if ($time > 60) {
692 $minutes = int($time / 60);
693 $time -= $minutes * 60;
694 }
695
696 if ($hours > 0) {
697 doprint "$hours hour";
698 doprint "s" if ($hours > 1);
699 doprint " ";
700 }
701
702 if ($minutes > 0) {
703 doprint "$minutes minute";
704 doprint "s" if ($minutes > 1);
705 doprint " ";
706 }
707
708 doprint "$time second";
709 doprint "s" if ($time != 1);
710}
711
712sub print_times {
713 doprint "\n";
714 if ($build_time) {
715 doprint "Build time: ";
716 show_time($build_time);
717 doprint "\n";
718 }
719 if ($install_time) {
720 doprint "Install time: ";
721 show_time($install_time);
722 doprint "\n";
723 }
724 if ($reboot_time) {
725 doprint "Reboot time: ";
726 show_time($reboot_time);
727 doprint "\n";
728 }
729 if ($test_time) {
730 doprint "Test time: ";
731 show_time($test_time);
732 doprint "\n";
733 }
d441734d
SR
734 if ($warning_found) {
735 doprint "\n*** WARNING";
736 doprint "S" if ($warning_found > 1);
737 doprint " found in build: $warning_found ***\n\n";
738 }
739
38fa3dc1
SRRH
740 # reset for iterations like bisect
741 $build_time = 0;
742 $install_time = 0;
743 $reboot_time = 0;
744 $test_time = 0;
d441734d 745 $warning_found = 0;
38fa3dc1
SRRH
746}
747
5269faad
ST
748sub get_mandatory_configs {
749 get_mandatory_config("MACHINE");
750 get_mandatory_config("BUILD_DIR");
751 get_mandatory_config("OUTPUT_DIR");
bb8474b1 752
dbd3783b 753 if ($newconfig) {
5269faad 754 get_mandatory_config("BUILD_OPTIONS");
dbd3783b
SR
755 }
756
bb8474b1
SR
757 # options required for other than just building a kernel
758 if (!$buildonly) {
5269faad
ST
759 get_mandatory_config("POWER_CYCLE");
760 get_mandatory_config("CONSOLE");
165708b2
SR
761 }
762
763 # options required for install and more
764 if ($buildonly != 1) {
5269faad
ST
765 get_mandatory_config("SSH_USER");
766 get_mandatory_config("BUILD_TARGET");
767 get_mandatory_config("TARGET_IMAGE");
bb8474b1
SR
768 }
769
5269faad 770 get_mandatory_config("LOCALVERSION");
8d1491ba 771
bb8474b1
SR
772 return if ($buildonly);
773
8d1491ba
SR
774 my $rtype = $opt{"REBOOT_TYPE"};
775
776 if (!defined($rtype)) {
777 if (!defined($opt{"GRUB_MENU"})) {
5269faad 778 get_mandatory_config("REBOOT_TYPE");
8d1491ba
SR
779 $rtype = $entered_configs{"REBOOT_TYPE"};
780 } else {
781 $rtype = "grub";
782 }
783 }
784
ac246645 785 if (($rtype eq "grub") or ($rtype eq "grub2bls")) {
5269faad 786 get_mandatory_config("GRUB_MENU");
8d1491ba 787 }
a15ba913
SR
788
789 if ($rtype eq "grub2") {
5269faad
ST
790 get_mandatory_config("GRUB_MENU");
791 get_mandatory_config("GRUB_FILE");
a15ba913 792 }
7786954c
SR
793
794 if ($rtype eq "syslinux") {
5269faad 795 get_mandatory_config("SYSLINUX_LABEL");
7786954c 796 }
8d1491ba
SR
797}
798
77d942ce 799sub process_variables {
8d735212 800 my ($value, $remove_undef) = @_;
77d942ce
SR
801 my $retval = "";
802
803 # We want to check for '\', and it is just easier
ca8edb78 804 # to check the previous character of '$' and not need
77d942ce
SR
805 # to worry if '$' is the first character. By adding
806 # a space to $value, we can just check [^\\]\$ and
807 # it will still work.
808 $value = " $value";
809
ca8edb78 810 while ($value =~ /(.*?[^\\])\$\{([^\{]*?)\}(.*)/) {
77d942ce
SR
811 my $begin = $1;
812 my $var = $2;
813 my $end = $3;
814 # append beginning of value to retval
815 $retval = "$retval$begin";
88a51b4f
SRG
816 if ($var =~ s/^shell\s+//) {
817 $retval = `$var`;
818 if ($?) {
819 doprint "WARNING: $var returned an error\n";
820 } else {
821 chomp $retval;
822 }
823 } elsif (defined($variable{$var})) {
77d942ce 824 $retval = "$retval$variable{$var}";
8d735212
SR
825 } elsif (defined($remove_undef) && $remove_undef) {
826 # for if statements, any variable that is not defined,
827 # we simple convert to 0
828 $retval = "${retval}0";
77d942ce 829 } else {
ca8edb78
SR
830 # put back the origin piece, but with $#### to not reprocess it
831 $retval = "$retval\$####\{$var\}";
9cc9e091
SR
832 # This could be an option that is used later, save
833 # it so we don't warn if this option is not one of
834 # ktests options.
835 $used_options{$var} = 1;
77d942ce 836 }
ca8edb78
SR
837 $value = "$retval$end";
838 $retval = "";
77d942ce 839 }
ca8edb78
SR
840 $retval = $value;
841
842 # Convert the saved variables with $####{var} back to ${var}
843 $retval =~ s/\$####/\$/g;
77d942ce
SR
844
845 # remove the space added in the beginning
846 $retval =~ s/ //;
847
12d4cddd 848 return "$retval";
77d942ce
SR
849}
850
a57419b3 851sub set_value {
3d1cc414 852 my ($lvalue, $rvalue, $override, $overrides, $name) = @_;
a57419b3 853
cad96669
SR
854 my $prvalue = process_variables($rvalue);
855
25bc70fa
SW
856 if ($lvalue =~ /^(TEST|BISECT|CONFIG_BISECT)_TYPE(\[.*\])?$/ &&
857 $prvalue !~ /^(config_|)bisect$/ &&
858 $prvalue !~ /^build$/ &&
07283c18 859 $prvalue !~ /^make_warnings_file$/ &&
25bc70fa
SW
860 $buildonly) {
861
bb8474b1 862 # Note if a test is something other than build, then we
22722799 863 # will need other mandatory options.
cad96669 864 if ($prvalue ne "install") {
165708b2
SR
865 $buildonly = 0;
866 } else {
22722799 867 # install still limits some mandatory options.
165708b2
SR
868 $buildonly = 2;
869 }
bb8474b1
SR
870 }
871
a57419b3 872 if (defined($opt{$lvalue})) {
3d1cc414
SR
873 if (!$override || defined(${$overrides}{$lvalue})) {
874 my $extra = "";
875 if ($override) {
876 $extra = "In the same override section!\n";
877 }
878 die "$name: $.: Option $lvalue defined more than once!\n$extra";
879 }
cad96669 880 ${$overrides}{$lvalue} = $prvalue;
a57419b3 881 }
22c37a9a
SRRH
882
883 $opt{$lvalue} = $prvalue;
a57419b3
SR
884}
885
c75d22d9
SRRH
886sub set_eval {
887 my ($lvalue, $rvalue, $name) = @_;
888
889 my $prvalue = process_variables($rvalue);
890 my $arr;
891
892 if (defined($evals{$lvalue})) {
893 $arr = $evals{$lvalue};
894 } else {
895 $arr = [];
896 $evals{$lvalue} = $arr;
897 }
898
899 push @{$arr}, $rvalue;
900}
901
77d942ce
SR
902sub set_variable {
903 my ($lvalue, $rvalue) = @_;
904
905 if ($rvalue =~ /^\s*$/) {
906 delete $variable{$lvalue};
907 } else {
908 $rvalue = process_variables($rvalue);
909 $variable{$lvalue} = $rvalue;
910 }
911}
912
ab7a3f52
SR
913sub process_compare {
914 my ($lval, $cmp, $rval) = @_;
915
916 # remove whitespace
917
918 $lval =~ s/^\s*//;
919 $lval =~ s/\s*$//;
920
921 $rval =~ s/^\s*//;
922 $rval =~ s/\s*$//;
923
924 if ($cmp eq "==") {
925 return $lval eq $rval;
926 } elsif ($cmp eq "!=") {
927 return $lval ne $rval;
8fddbe9b
SR
928 } elsif ($cmp eq "=~") {
929 return $lval =~ m/$rval/;
930 } elsif ($cmp eq "!~") {
931 return $lval !~ m/$rval/;
ab7a3f52
SR
932 }
933
934 my $statement = "$lval $cmp $rval";
935 my $ret = eval $statement;
936
937 # $@ stores error of eval
938 if ($@) {
939 return -1;
940 }
941
942 return $ret;
943}
944
9900b5dc
SR
945sub value_defined {
946 my ($val) = @_;
947
948 return defined($variable{$2}) ||
949 defined($opt{$2});
950}
951
8d735212
SR
952sub process_expression {
953 my ($name, $val) = @_;
954
955 my $c = $d++;
956
957 while ($val =~ s/\(([^\(]*?)\)/\&\&\&\&VAL\&\&\&\&/) {
958 my $express = $1;
959
960 if (process_expression($name, $express)) {
961 $val =~ s/\&\&\&\&VAL\&\&\&\&/ 1 /;
962 } else {
963 $val =~ s/\&\&\&\&VAL\&\&\&\&/ 0 /;
964 }
965 }
966
967 $d--;
968 my $OR = "\\|\\|";
969 my $AND = "\\&\\&";
45d73a5d 970
8d735212
SR
971 while ($val =~ s/^(.*?)($OR|$AND)//) {
972 my $express = $1;
973 my $op = $2;
974
975 if (process_expression($name, $express)) {
976 if ($op eq "||") {
977 return 1;
978 }
979 } else {
980 if ($op eq "&&") {
981 return 0;
982 }
983 }
984 }
45d73a5d 985
8fddbe9b 986 if ($val =~ /(.*)(==|\!=|>=|<=|>|<|=~|\!~)(.*)/) {
ab7a3f52
SR
987 my $ret = process_compare($1, $2, $3);
988 if ($ret < 0) {
989 die "$name: $.: Unable to process comparison\n";
990 }
991 return $ret;
992 }
993
9900b5dc
SR
994 if ($val =~ /^\s*(NOT\s*)?DEFINED\s+(\S+)\s*$/) {
995 if (defined $1) {
996 return !value_defined($2);
997 } else {
998 return value_defined($2);
999 }
1000 }
1001
16723426
SRV
1002 if ($val =~ s/^\s*NOT\s+(.*)//) {
1003 my $express = $1;
1004 my $ret = process_expression($name, $express);
1005 return !$ret;
1006 }
1007
45d73a5d
SR
1008 if ($val =~ /^\s*0\s*$/) {
1009 return 0;
1010 } elsif ($val =~ /^\s*\d+\s*$/) {
1011 return 1;
1012 }
1013
9900b5dc 1014 die ("$name: $.: Undefined content $val in if statement\n");
8d735212
SR
1015}
1016
1017sub process_if {
1018 my ($name, $value) = @_;
1019
1020 # Convert variables and replace undefined ones with 0
1021 my $val = process_variables($value, 1);
1022 my $ret = process_expression $name, $val;
1023
1024 return $ret;
45d73a5d
SR
1025}
1026
2ed3b161
SR
1027sub __read_config {
1028 my ($config, $current_test_num) = @_;
2545eb61 1029
2ed3b161
SR
1030 my $in;
1031 open($in, $config) || die "can't read file $config";
2545eb61 1032
a57419b3
SR
1033 my $name = $config;
1034 $name =~ s,.*/(.*),$1,;
1035
2ed3b161 1036 my $test_num = $$current_test_num;
a57419b3
SR
1037 my $default = 1;
1038 my $repeat = 1;
1039 my $num_tests_set = 0;
1040 my $skip = 0;
1041 my $rest;
a9f84424 1042 my $line;
0df213ca 1043 my $test_case = 0;
45d73a5d
SR
1044 my $if = 0;
1045 my $if_set = 0;
3d1cc414
SR
1046 my $override = 0;
1047
1048 my %overrides;
a57419b3 1049
2ed3b161 1050 while (<$in>) {
2545eb61
SR
1051
1052 # ignore blank lines and comments
1053 next if (/^\s*$/ || /\s*\#/);
1054
0050b6bb 1055 if (/^\s*(TEST_START|DEFAULTS)\b(.*)/) {
a57419b3 1056
0050b6bb
SR
1057 my $type = $1;
1058 $rest = $2;
a9f84424 1059 $line = $2;
a57419b3 1060
0050b6bb
SR
1061 my $old_test_num;
1062 my $old_repeat;
3d1cc414 1063 $override = 0;
0050b6bb
SR
1064
1065 if ($type eq "TEST_START") {
0050b6bb
SR
1066 if ($num_tests_set) {
1067 die "$name: $.: Can not specify both NUM_TESTS and TEST_START\n";
1068 }
a57419b3 1069
0050b6bb
SR
1070 $old_test_num = $test_num;
1071 $old_repeat = $repeat;
a57419b3 1072
0050b6bb
SR
1073 $test_num += $repeat;
1074 $default = 0;
1075 $repeat = 1;
1076 } else {
1077 $default = 1;
1078 }
a57419b3 1079
a9f84424
SR
1080 # If SKIP is anywhere in the line, the command will be skipped
1081 if ($rest =~ s/\s+SKIP\b//) {
a57419b3
SR
1082 $skip = 1;
1083 } else {
0df213ca 1084 $test_case = 1;
a57419b3
SR
1085 $skip = 0;
1086 }
1087
a9f84424
SR
1088 if ($rest =~ s/\sELSE\b//) {
1089 if (!$if) {
1090 die "$name: $.: ELSE found with out matching IF section\n$_";
1091 }
1092 $if = 0;
1093
1094 if ($if_set) {
1095 $skip = 1;
1096 } else {
1097 $skip = 0;
3d1cc414 1098 }
a57419b3
SR
1099 }
1100
a9f84424 1101 if ($rest =~ s/\sIF\s+(.*)//) {
45d73a5d
SR
1102 if (process_if($name, $1)) {
1103 $if_set = 1;
1104 } else {
1105 $skip = 1;
1106 }
1107 $if = 1;
1108 } else {
1109 $if = 0;
a9f84424
SR
1110 $if_set = 0;
1111 }
1112
1113 if (!$skip) {
1114 if ($type eq "TEST_START") {
1115 if ($rest =~ s/\s+ITERATE\s+(\d+)//) {
1116 $repeat = $1;
1117 $repeat_tests{"$test_num"} = $repeat;
1118 }
1119 } elsif ($rest =~ s/\sOVERRIDE\b//) {
1120 # DEFAULT only
1121 $override = 1;
1122 # Clear previous overrides
1123 %overrides = ();
1124 }
a57419b3
SR
1125 }
1126
a9f84424 1127 if (!$skip && $rest !~ /^\s*$/) {
1091c8fc 1128 die "$name: $.: Garbage found after $type\n$_";
a57419b3
SR
1129 }
1130
0050b6bb 1131 if ($skip && $type eq "TEST_START") {
a57419b3 1132 $test_num = $old_test_num;
e48c5293 1133 $repeat = $old_repeat;
a57419b3 1134 }
ab7a3f52 1135 } elsif (/^\s*ELSE\b(.*)$/) {
45d73a5d
SR
1136 if (!$if) {
1137 die "$name: $.: ELSE found with out matching IF section\n$_";
1138 }
1139 $rest = $1;
1140 if ($if_set) {
1141 $skip = 1;
ab7a3f52 1142 $rest = "";
45d73a5d
SR
1143 } else {
1144 $skip = 0;
1145
ab7a3f52 1146 if ($rest =~ /\sIF\s+(.*)/) {
45d73a5d 1147 # May be a ELSE IF section.
95f57838
SR
1148 if (process_if($name, $1)) {
1149 $if_set = 1;
1150 } else {
45d73a5d
SR
1151 $skip = 1;
1152 }
ab7a3f52 1153 $rest = "";
45d73a5d
SR
1154 } else {
1155 $if = 0;
1156 }
1157 }
1158
ab7a3f52 1159 if ($rest !~ /^\s*$/) {
1091c8fc 1160 die "$name: $.: Garbage found after DEFAULTS\n$_";
ab7a3f52
SR
1161 }
1162
2ed3b161
SR
1163 } elsif (/^\s*INCLUDE\s+(\S+)/) {
1164
1165 next if ($skip);
1166
1167 if (!$default) {
1168 die "$name: $.: INCLUDE can only be done in default sections\n$_";
1169 }
1170
1171 my $file = process_variables($1);
1172
1173 if ($file !~ m,^/,) {
1174 # check the path of the config file first
1175 if ($config =~ m,(.*)/,) {
1176 if (-f "$1/$file") {
1177 $file = "$1/$file";
1178 }
1179 }
1180 }
12d4cddd 1181
2ed3b161
SR
1182 if ( ! -r $file ) {
1183 die "$name: $.: Can't read file $file\n$_";
1184 }
1185
1186 if (__read_config($file, \$test_num)) {
1187 $test_case = 1;
1188 }
1189
c75d22d9
SRRH
1190 } elsif (/^\s*([A-Z_\[\]\d]+)\s*=~\s*(.*?)\s*$/) {
1191
1192 next if ($skip);
1193
1194 my $lvalue = $1;
1195 my $rvalue = $2;
1196
1197 if ($default || $lvalue =~ /\[\d+\]$/) {
1198 set_eval($lvalue, $rvalue, $name);
1199 } else {
1200 my $val = "$lvalue\[$test_num\]";
1201 set_eval($val, $rvalue, $name);
1202 }
1203
a57419b3
SR
1204 } elsif (/^\s*([A-Z_\[\]\d]+)\s*=\s*(.*?)\s*$/) {
1205
1206 next if ($skip);
1207
2545eb61
SR
1208 my $lvalue = $1;
1209 my $rvalue = $2;
1210
a57419b3
SR
1211 if (!$default &&
1212 ($lvalue eq "NUM_TESTS" ||
1213 $lvalue eq "LOG_FILE" ||
1214 $lvalue eq "CLEAR_LOG")) {
1215 die "$name: $.: $lvalue must be set in DEFAULTS section\n";
1216 }
1217
1218 if ($lvalue eq "NUM_TESTS") {
1219 if ($test_num) {
1220 die "$name: $.: Can not specify both NUM_TESTS and TEST_START\n";
1221 }
1222 if (!$default) {
1223 die "$name: $.: NUM_TESTS must be set in default section\n";
1224 }
1225 $num_tests_set = 1;
1226 }
1227
1228 if ($default || $lvalue =~ /\[\d+\]$/) {
3d1cc414 1229 set_value($lvalue, $rvalue, $override, \%overrides, $name);
a57419b3
SR
1230 } else {
1231 my $val = "$lvalue\[$test_num\]";
3d1cc414 1232 set_value($val, $rvalue, $override, \%overrides, $name);
a57419b3
SR
1233
1234 if ($repeat > 1) {
1235 $repeats{$val} = $repeat;
1236 }
a75fecec 1237 }
77d942ce
SR
1238 } elsif (/^\s*([A-Z_\[\]\d]+)\s*:=\s*(.*?)\s*$/) {
1239 next if ($skip);
1240
1241 my $lvalue = $1;
1242 my $rvalue = $2;
1243
1244 # process config variables.
1245 # Config variables are only active while reading the
1246 # config and can be defined anywhere. They also ignore
1247 # TEST_START and DEFAULTS, but are skipped if they are in
770221a3 1248 # one of these sections that have SKIP defined.
77d942ce
SR
1249 # The save variable can be
1250 # defined multiple times and the new one simply overrides
1091c8fc 1251 # the previous one.
77d942ce
SR
1252 set_variable($lvalue, $rvalue);
1253
a57419b3
SR
1254 } else {
1255 die "$name: $.: Garbage found in config\n$_";
2545eb61
SR
1256 }
1257 }
1258
a57419b3
SR
1259 if ($test_num) {
1260 $test_num += $repeat - 1;
1261 $opt{"NUM_TESTS"} = $test_num;
1262 }
1263
2ed3b161
SR
1264 close($in);
1265
1266 $$current_test_num = $test_num;
1267
1268 return $test_case;
1269}
1270
c4261d0f 1271sub get_test_case {
12d4cddd
JWHV
1272 print "What test case would you like to run?\n";
1273 print " (build, install or boot)\n";
1274 print " Other tests are available but require editing ktest.conf\n";
1275 print " (see tools/testing/ktest/sample.conf)\n";
1276 my $ans = <STDIN>;
1277 chomp $ans;
1278 $default{"TEST_TYPE"} = $ans;
c4261d0f
SR
1279}
1280
2ed3b161
SR
1281sub read_config {
1282 my ($config) = @_;
1283
1284 my $test_case;
1285 my $test_num = 0;
1286
1287 $test_case = __read_config $config, \$test_num;
1288
8d1491ba 1289 # make sure we have all mandatory configs
5269faad 1290 get_mandatory_configs;
8d1491ba 1291
0df213ca
SR
1292 # was a test specified?
1293 if (!$test_case) {
1294 print "No test case specified.\n";
c4261d0f 1295 get_test_case;
0df213ca
SR
1296 }
1297
a75fecec
SR
1298 # set any defaults
1299
1300 foreach my $default (keys %default) {
1301 if (!defined($opt{$default})) {
1302 $opt{$default} = $default{$default};
1303 }
1304 }
9cc9e091
SR
1305
1306 if ($opt{"IGNORE_UNUSED"} == 1) {
1307 return;
1308 }
1309
1310 my %not_used;
1311
1312 # check if there are any stragglers (typos?)
1313 foreach my $option (keys %opt) {
1314 my $op = $option;
1315 # remove per test labels.
1316 $op =~ s/\[.*\]//;
1317 if (!exists($option_map{$op}) &&
1318 !exists($default{$op}) &&
1319 !exists($used_options{$op})) {
1320 $not_used{$op} = 1;
1321 }
1322 }
1323
1324 if (%not_used) {
1325 my $s = "s are";
1326 $s = " is" if (keys %not_used == 1);
1327 print "The following option$s not used; could be a typo:\n";
1328 foreach my $option (keys %not_used) {
1329 print "$option\n";
1330 }
1091c8fc 1331 print "Set IGNORE_UNUSED = 1 to have ktest ignore unused variables\n";
9cc9e091
SR
1332 if (!read_yn "Do you want to continue?") {
1333 exit -1;
1334 }
1335 }
2545eb61
SR
1336}
1337
23715c3c 1338sub __eval_option {
04262be3 1339 my ($name, $option, $i) = @_;
23715c3c
SR
1340
1341 # Add space to evaluate the character before $
1342 $option = " $option";
1343 my $retval = "";
f9dfb65b
RV
1344 my $repeated = 0;
1345 my $parent = 0;
1346
1347 foreach my $test (keys %repeat_tests) {
1348 if ($i >= $test &&
1349 $i < $test + $repeat_tests{$test}) {
1350
1351 $repeated = 1;
1352 $parent = $test;
1353 last;
1354 }
1355 }
23715c3c
SR
1356
1357 while ($option =~ /(.*?[^\\])\$\{(.*?)\}(.*)/) {
1358 my $start = $1;
1359 my $var = $2;
1360 my $end = $3;
1361
1362 # Append beginning of line
1363 $retval = "$retval$start";
1364
1365 # If the iteration option OPT[$i] exists, then use that.
1366 # otherwise see if the default OPT (without [$i]) exists.
1367
1368 my $o = "$var\[$i\]";
f9dfb65b 1369 my $parento = "$var\[$parent\]";
23715c3c 1370
04262be3
SRRH
1371 # If a variable contains itself, use the default var
1372 if (($var eq $name) && defined($opt{$var})) {
1373 $o = $opt{$var};
1374 $retval = "$retval$o";
1375 } elsif (defined($opt{$o})) {
23715c3c
SR
1376 $o = $opt{$o};
1377 $retval = "$retval$o";
f9dfb65b
RV
1378 } elsif ($repeated && defined($opt{$parento})) {
1379 $o = $opt{$parento};
1380 $retval = "$retval$o";
23715c3c
SR
1381 } elsif (defined($opt{$var})) {
1382 $o = $opt{$var};
1383 $retval = "$retval$o";
8e80bf05
SRRH
1384 } elsif ($var eq "KERNEL_VERSION" && defined($make)) {
1385 # special option KERNEL_VERSION uses kernel version
1386 get_version();
1387 $retval = "$retval$version";
23715c3c
SR
1388 } else {
1389 $retval = "$retval\$\{$var\}";
1390 }
1391
1392 $option = $end;
1393 }
1394
1395 $retval = "$retval$option";
1396
1397 $retval =~ s/^ //;
1398
1399 return $retval;
1400}
1401
c75d22d9
SRRH
1402sub process_evals {
1403 my ($name, $option, $i) = @_;
1404
1405 my $option_name = "$name\[$i\]";
1406 my $ev;
1407
1408 my $old_option = $option;
1409
1410 if (defined($evals{$option_name})) {
1411 $ev = $evals{$option_name};
1412 } elsif (defined($evals{$name})) {
1413 $ev = $evals{$name};
1414 } else {
1415 return $option;
1416 }
1417
1418 for my $e (@{$ev}) {
1419 eval "\$option =~ $e";
1420 }
1421
1422 if ($option ne $old_option) {
1423 doprint("$name changed from '$old_option' to '$option'\n");
1424 }
1425
1426 return $option;
1427}
1428
23715c3c 1429sub eval_option {
04262be3 1430 my ($name, $option, $i) = @_;
23715c3c
SR
1431
1432 my $prev = "";
1433
1434 # Since an option can evaluate to another option,
1435 # keep iterating until we do not evaluate any more
1436 # options.
1437 my $r = 0;
1438 while ($prev ne $option) {
1439 # Check for recursive evaluations.
1440 # 100 deep should be more than enough.
1441 if ($r++ > 100) {
1091c8fc 1442 die "Over 100 evaluations occurred with $option\n" .
23715c3c
SR
1443 "Check for recursive variables\n";
1444 }
1445 $prev = $option;
04262be3 1446 $option = __eval_option($name, $option, $i);
23715c3c
SR
1447 }
1448
c75d22d9 1449 $option = process_evals($name, $option, $i);
23715c3c 1450
c75d22d9 1451 return $option;
5f9b6ced
SR
1452}
1453
7faafbd6 1454sub reboot {
2728be41 1455 my ($time) = @_;
6474ace9 1456 my $powercycle = 0;
2728be41 1457
3e1d3678
SRV
1458 # test if the machine can be connected to within a few seconds
1459 my $stat = run_ssh("echo check machine status", $connect_timeout);
6474ace9
SRV
1460 if (!$stat) {
1461 doprint("power cycle\n");
1462 $powercycle = 1;
1463 }
1464
1465 if ($powercycle) {
1466 run_command "$power_cycle";
a4968722 1467
2b803365
SR
1468 start_monitor;
1469 # flush out current monitor
1470 # May contain the reboot success line
1471 wait_for_monitor 1;
2b803365 1472
6474ace9
SRV
1473 } else {
1474 # Make sure everything has been written to disk
4d00fc47 1475 run_ssh("sync", 10);
6474ace9
SRV
1476
1477 if (defined($time)) {
1478 start_monitor;
1479 # flush out current monitor
1480 # May contain the reboot success line
1481 wait_for_monitor 1;
1482 }
1483
1484 # try to reboot normally
1485 if (run_command $reboot) {
1486 if (defined($powercycle_after_reboot)) {
1487 sleep $powercycle_after_reboot;
1488 run_command "$power_cycle";
1489 }
1490 } else {
1491 # nope? power cycle it.
576f627c
SR
1492 run_command "$power_cycle";
1493 }
7faafbd6 1494 }
2728be41
AJ
1495
1496 if (defined($time)) {
4c0b67a2
SRRH
1497
1498 # We only want to get to the new kernel, don't fail
1499 # if we stumble over a call trace.
1500 my $save_ignore_errors = $ignore_errors;
1501 $ignore_errors = 1;
1502
d6845536
SRRH
1503 # Look for the good kernel to boot
1504 if (wait_for_monitor($time, "Linux version")) {
407b95b7 1505 # reboot got stuck?
8a80c727 1506 doprint "Reboot did not finish. Forcing power cycle\n";
407b95b7
SR
1507 run_command "$power_cycle";
1508 }
d6845536 1509
4c0b67a2
SRRH
1510 $ignore_errors = $save_ignore_errors;
1511
d6845536
SRRH
1512 # Still need to wait for the reboot to finish
1513 wait_for_monitor($time, $reboot_success_line);
e8bf9b98
SR
1514 }
1515 if ($powercycle || $time) {
2728be41
AJ
1516 end_monitor;
1517 }
7faafbd6
SR
1518}
1519
bc7c5803
SR
1520sub reboot_to_good {
1521 my ($time) = @_;
1522
1523 if (defined($switch_to_good)) {
1524 run_command $switch_to_good;
bc7c5803
SR
1525 }
1526
1527 reboot $time;
1528}
1529
576f627c
SR
1530sub do_not_reboot {
1531 my $i = $iteration;
1532
4ab1cce5 1533 return $test_type eq "build" || $no_reboot ||
576f627c 1534 ($test_type eq "patchcheck" && $opt{"PATCHCHECK_TYPE[$i]"} eq "build") ||
649c0f12
SW
1535 ($test_type eq "bisect" && $opt{"BISECT_TYPE[$i]"} eq "build") ||
1536 ($test_type eq "config_bisect" && $opt{"CONFIG_BISECT_TYPE[$i]"} eq "build");
576f627c
SR
1537}
1538
fca797f1
SRV
1539sub get_test_name() {
1540 my $name;
1541
1542 if (defined($test_name)) {
1543 $name = "$test_name:$test_type";
1544 } else {
1545 $name = $test_type;
1546 }
1547 return $name;
1548}
1549
5c42fc5b 1550sub dodie {
1091c8fc 1551 # avoid recursion
255769a1
SRV
1552 return if ($in_die);
1553 $in_die = 1;
1554
7dc8e24f
MHG
1555 if ($monitor_cnt) {
1556 # restore terminal settings
1557 system("stty $stty_orig");
1558 }
1559
576f627c
SR
1560 my $i = $iteration;
1561
fca797f1
SRV
1562 doprint "CRITICAL FAILURE... [TEST $i] ", @_, "\n";
1563
576f627c 1564 if ($reboot_on_error && !do_not_reboot) {
75c3fda7 1565 doprint "REBOOTING\n";
bc7c5803 1566 reboot_to_good;
a75fecec 1567 } elsif ($poweroff_on_error && defined($power_off)) {
5c42fc5b 1568 doprint "POWERING OFF\n";
a75fecec 1569 `$power_off`;
5c42fc5b 1570 }
75c3fda7 1571
f80802cb
SR
1572 if (defined($opt{"LOG_FILE"})) {
1573 print " See $opt{LOG_FILE} for more info.\n";
1574 }
1575
2ceb2d85 1576 if ($email_on_error) {
fca797f1 1577 my $name = get_test_name;
34148b13
SRV
1578 my $log_file;
1579
1580 if (defined($opt{"LOG_FILE"})) {
170f4869
SRV
1581 my $whence = 2; # End of file
1582 my $log_size = tell LOG;
1583 my $size = $log_size - $test_log_start;
855d8abd 1584
f9869002 1585 if (defined($mail_max_size)) {
170f4869
SRV
1586 if ($size > $mail_max_size) {
1587 $size = $mail_max_size;
f9869002
SRV
1588 }
1589 }
170f4869 1590 my $pos = - $size;
34148b13
SRV
1591 $log_file = "$tmpdir/log";
1592 open (L, "$opt{LOG_FILE}") or die "Can't open $opt{LOG_FILE} to read)";
1593 open (O, "> $tmpdir/log") or die "Can't open $tmpdir/log\n";
855d8abd 1594 seek(L, $pos, $whence);
34148b13
SRV
1595 while (<L>) {
1596 print O;
1597 }
1598 close O;
1599 close L;
1600 }
c043ccbf 1601
12d4cddd 1602 send_email("KTEST: critical failure for test $i [$name]",
c043ccbf 1603 "Your test started at $script_start_time has failed with:\n@_\n", $log_file);
2ceb2d85
TTC
1604 }
1605
2e07c9f5
SRV
1606 if (defined($post_test)) {
1607 run_command $post_test;
1608 }
1609
576f627c 1610 die @_, "\n";
5c42fc5b
SR
1611}
1612
9f2cdcbb
JP
1613sub create_pty {
1614 my ($ptm, $pts) = @_;
1615 my $tmp;
1616 my $TIOCSPTLCK = 0x40045431;
1617 my $TIOCGPTN = 0x80045430;
1618
1619 sysopen($ptm, "/dev/ptmx", O_RDWR | O_NONBLOCK) or
ff131eff 1620 dodie "Can't open /dev/ptmx";
9f2cdcbb
JP
1621
1622 # unlockpt()
1623 $tmp = pack("i", 0);
1624 ioctl($ptm, $TIOCSPTLCK, $tmp) or
1625 dodie "ioctl TIOCSPTLCK for /dev/ptmx failed";
1626
1627 # ptsname()
1628 ioctl($ptm, $TIOCGPTN, $tmp) or
1629 dodie "ioctl TIOCGPTN for /dev/ptmx failed";
1630 $tmp = unpack("i", $tmp);
1631
1632 sysopen($pts, "/dev/pts/$tmp", O_RDWR | O_NONBLOCK) or
1633 dodie "Can't open /dev/pts/$tmp";
1634}
1635
1636sub exec_console {
1637 my ($ptm, $pts) = @_;
1638
1639 close($ptm);
1640
1641 close(\*STDIN);
1642 close(\*STDOUT);
1643 close(\*STDERR);
1644
1645 open(\*STDIN, '<&', $pts);
1646 open(\*STDOUT, '>&', $pts);
1647 open(\*STDERR, '>&', $pts);
1648
1649 close($pts);
1650
1651 exec $console or
df46fce6 1652 dodie "Can't open console $console";
9f2cdcbb 1653}
7faafbd6 1654
9f2cdcbb
JP
1655sub open_console {
1656 my ($ptm) = @_;
1657 my $pts = \*PTSFD;
1658 my $pid;
7faafbd6 1659
98842782 1660 # save terminal settings
9d2f7f05
JP
1661 $stty_orig = `stty -g`;
1662
1663 # place terminal in cbreak mode so that stdin can be read one character at
1664 # a time without having to wait for a newline
1665 system("stty -icanon -echo -icrnl");
98842782 1666
9f2cdcbb 1667 create_pty($ptm, $pts);
7faafbd6 1668
9f2cdcbb
JP
1669 $pid = fork;
1670
1671 if (!$pid) {
1672 # child
1673 exec_console($ptm, $pts)
1674 }
1675
1676 # parent
1677 close($pts);
7faafbd6
SR
1678
1679 return $pid;
9f2cdcbb
JP
1680
1681 open(PTSFD, "Stop perl from warning about single use of PTSFD");
7faafbd6
SR
1682}
1683
1684sub close_console {
1685 my ($fp, $pid) = @_;
1686
1687 doprint "kill child process $pid\n";
5a5d8e48 1688 kill $close_console_signal, $pid;
7faafbd6 1689
9f23b129
SRV
1690 doprint "wait for child process $pid to exit\n";
1691 waitpid($pid, 0);
1692
7faafbd6
SR
1693 print "closing!\n";
1694 close($fp);
98842782
JP
1695
1696 # restore terminal settings
9d2f7f05 1697 system("stty $stty_orig");
7faafbd6
SR
1698}
1699
1700sub start_monitor {
1701 if ($monitor_cnt++) {
1702 return;
1703 }
1704 $monitor_fp = \*MONFD;
1705 $monitor_pid = open_console $monitor_fp;
a75fecec
SR
1706
1707 return;
1708
1709 open(MONFD, "Stop perl from warning about single use of MONFD");
7faafbd6
SR
1710}
1711
1712sub end_monitor {
319ab14f 1713 return if (!defined $console);
7faafbd6
SR
1714 if (--$monitor_cnt) {
1715 return;
1716 }
1717 close_console($monitor_fp, $monitor_pid);
1718}
1719
1720sub wait_for_monitor {
2b803365
SR
1721 my ($time, $stop) = @_;
1722 my $full_line = "";
7faafbd6 1723 my $line;
2b803365 1724 my $booted = 0;
407b95b7 1725 my $start_time = time;
8a80c727
SR
1726 my $skip_call_trace = 0;
1727 my $bug = 0;
1728 my $bug_ignored = 0;
407b95b7 1729 my $now;
7faafbd6 1730
a75fecec 1731 doprint "** Wait for monitor to settle down **\n";
7faafbd6
SR
1732
1733 # read the monitor and wait for the system to calm down
2b803365 1734 while (!$booted) {
7faafbd6 1735 $line = wait_for_input($monitor_fp, $time);
2b803365
SR
1736 last if (!defined($line));
1737 print "$line";
1738 $full_line .= $line;
1739
1740 if (defined($stop) && $full_line =~ /$stop/) {
1741 doprint "wait for monitor detected $stop\n";
1742 $booted = 1;
1743 }
1744
8a80c727
SR
1745 if ($full_line =~ /\[ backtrace testing \]/) {
1746 $skip_call_trace = 1;
1747 }
1748
1749 if ($full_line =~ /call trace:/i) {
1750 if (!$bug && !$skip_call_trace) {
1751 if ($ignore_errors) {
1752 $bug_ignored = 1;
1753 } else {
1754 $bug = 1;
1755 }
1756 }
1757 }
1758
1759 if ($full_line =~ /\[ end of backtrace testing \]/) {
1760 $skip_call_trace = 0;
1761 }
1762
1763 if ($full_line =~ /Kernel panic -/) {
1764 $bug = 1;
1765 }
1766
2b803365
SR
1767 if ($line =~ /\n/) {
1768 $full_line = "";
1769 }
407b95b7
SR
1770 $now = time;
1771 if ($now - $start_time >= $max_monitor_wait) {
1772 doprint "Exiting monitor flush due to hitting MAX_MONITOR_WAIT\n";
1773 return 1;
1774 }
2b803365 1775 }
a75fecec 1776 print "** Monitor flushed **\n";
995bc431
SRRH
1777
1778 # if stop is defined but wasn't hit, return error
1779 # used by reboot (which wants to see a reboot)
1780 if (defined($stop) && !$booted) {
1781 $bug = 1;
1782 }
8a80c727 1783 return $bug;
7faafbd6
SR
1784}
1785
de5b6e3b 1786sub save_logs {
12d4cddd
JWHV
1787 my ($result, $basedir) = @_;
1788 my @t = localtime;
1789 my $date = sprintf "%04d%02d%02d%02d%02d%02d",
1790 1900+$t[5],$t[4],$t[3],$t[2],$t[1],$t[0];
de5b6e3b 1791
12d4cddd
JWHV
1792 my $type = $build_type;
1793 if ($type =~ /useconfig/) {
1794 $type = "useconfig";
1795 }
de5b6e3b 1796
12d4cddd 1797 my $dir = "$machine-$test_type-$type-$result-$date";
de5b6e3b 1798
12d4cddd 1799 $dir = "$basedir/$dir";
de5b6e3b 1800
12d4cddd
JWHV
1801 if (!-d $dir) {
1802 mkpath($dir) or
1803 dodie "can't create $dir";
1804 }
de5b6e3b 1805
12d4cddd
JWHV
1806 my %files = (
1807 "config" => $output_config,
1808 "buildlog" => $buildlog,
1809 "dmesg" => $dmesg,
1810 "testlog" => $testlog,
1811 );
de5b6e3b 1812
12d4cddd
JWHV
1813 while (my ($name, $source) = each(%files)) {
1814 if (-f "$source") {
1815 cp "$source", "$dir/$name" or
1816 dodie "failed to copy $source";
de5b6e3b 1817 }
12d4cddd 1818 }
de5b6e3b 1819
12d4cddd 1820 doprint "*** Saved info to $dir ***\n";
de5b6e3b
RV
1821}
1822
2b7d9b21
SR
1823sub fail {
1824
12d4cddd
JWHV
1825 if ($die_on_failure) {
1826 dodie @_;
1827 }
2b7d9b21 1828
12d4cddd 1829 doprint "FAILED\n";
7faafbd6 1830
12d4cddd 1831 my $i = $iteration;
576f627c 1832
12d4cddd
JWHV
1833 # no need to reboot for just building.
1834 if (!do_not_reboot) {
1835 doprint "REBOOTING\n";
1836 reboot_to_good $sleep_time;
1837 }
7faafbd6 1838
12d4cddd 1839 my $name = "";
9064af52 1840
12d4cddd
JWHV
1841 if (defined($test_name)) {
1842 $name = " ($test_name)";
1843 }
9064af52 1844
12d4cddd 1845 print_times;
4bf6e1fc 1846
12d4cddd
JWHV
1847 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
1848 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
1849 doprint "KTEST RESULT: TEST $i$name Failed: ", @_, "\n";
1850 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
1851 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
a75fecec 1852
12d4cddd
JWHV
1853 if (defined($store_failures)) {
1854 save_logs "fail", $store_failures;
1855 }
7faafbd6 1856
12d4cddd
JWHV
1857 if (defined($post_test)) {
1858 run_command $post_test;
1859 }
2e07c9f5 1860
12d4cddd 1861 return 1;
2b7d9b21
SR
1862}
1863
2545eb61 1864sub run_command {
6e98d1b4 1865 my ($command, $redirect, $timeout) = @_;
b53486e0
SRRH
1866 my $start_time;
1867 my $end_time;
d6ce2a0b
SR
1868 my $dolog = 0;
1869 my $dord = 0;
b337f979 1870 my $dostdout = 0;
d6ce2a0b 1871 my $pid;
37e16773 1872 my $command_orig = $command;
d6ce2a0b 1873
e48c5293
SR
1874 $command =~ s/\$SSH_USER/$ssh_user/g;
1875 $command =~ s/\$MACHINE/$machine/g;
1876
4e7d2a8f
SR
1877 if (!defined($timeout)) {
1878 $timeout = $run_timeout;
1879 }
1880
1881 if (!defined($timeout)) {
1882 $timeout = -1; # tell wait_for_input to wait indefinitely
1883 }
1884
d6ce2a0b 1885 doprint("$command ... ");
6e98d1b4 1886 $start_time = time;
d6ce2a0b
SR
1887
1888 $pid = open(CMD, "$command 2>&1 |") or
2b7d9b21 1889 (fail "unable to exec $command" and return 0);
2545eb61
SR
1890
1891 if (defined($opt{"LOG_FILE"})) {
d6ce2a0b 1892 $dolog = 1;
6c5ee0be
SR
1893 }
1894
1895 if (defined($redirect)) {
b337f979
SRV
1896 if ($redirect eq 1) {
1897 $dostdout = 1;
1898 # Have the output of the command on its own line
1899 doprint "\n";
1900 } else {
1901 open (RD, ">$redirect") or
1902 dodie "failed to write to redirect $redirect";
1903 $dord = 1;
1904 }
2545eb61
SR
1905 }
1906
6e98d1b4
SRV
1907 my $hit_timeout = 0;
1908
1909 while (1) {
1910 my $fp = \*CMD;
6e98d1b4
SRV
1911 my $line = wait_for_input($fp, $timeout);
1912 if (!defined($line)) {
1913 my $now = time;
4e7d2a8f 1914 if ($timeout >= 0 && (($now - $start_time) >= $timeout)) {
6e98d1b4
SRV
1915 doprint "Hit timeout of $timeout, killing process\n";
1916 $hit_timeout = 1;
1917 kill 9, $pid;
1918 }
1919 last;
1920 }
1921 print LOG $line if ($dolog);
1922 print RD $line if ($dord);
b337f979 1923 print $line if ($dostdout);
d6ce2a0b 1924 }
2545eb61 1925
d6ce2a0b 1926 waitpid($pid, 0);
5739438b
SRV
1927 # shift 8 for real exit status
1928 $run_command_status = $? >> 8;
2545eb61 1929
37e16773
MM
1930 if ($command_orig eq $default{REBOOT} &&
1931 $run_command_status == $reboot_return_code) {
1932 $run_command_status = 0;
1933 }
1934
d6ce2a0b 1935 close(CMD);
d6ce2a0b
SR
1936 close(RD) if ($dord);
1937
b53486e0
SRRH
1938 $end_time = time;
1939 my $delta = $end_time - $start_time;
1940
1941 if ($delta == 1) {
1942 doprint "[1 second] ";
1943 } else {
1944 doprint "[$delta seconds] ";
1945 }
1946
5739438b
SRV
1947 if ($hit_timeout) {
1948 $run_command_status = 1;
1949 }
1950
1951 if ($run_command_status) {
2545eb61
SR
1952 doprint "FAILED!\n";
1953 } else {
1954 doprint "SUCCESS\n";
1955 }
1956
5739438b 1957 return !$run_command_status;
5f9b6ced
SR
1958}
1959
e48c5293 1960sub run_ssh {
6e98d1b4 1961 my ($cmd, $timeout) = @_;
e48c5293
SR
1962 my $cp_exec = $ssh_exec;
1963
1964 $cp_exec =~ s/\$SSH_COMMAND/$cmd/g;
6e98d1b4 1965 return run_command "$cp_exec", undef , $timeout;
e48c5293
SR
1966}
1967
1968sub run_scp {
02ad2617 1969 my ($src, $dst, $cp_scp) = @_;
e48c5293
SR
1970
1971 $cp_scp =~ s/\$SRC_FILE/$src/g;
1972 $cp_scp =~ s/\$DST_FILE/$dst/g;
1973
1974 return run_command "$cp_scp";
1975}
1976
02ad2617
SR
1977sub run_scp_install {
1978 my ($src, $dst) = @_;
1979
1980 my $cp_scp = $scp_to_target_install;
1981
1982 return run_scp($src, $dst, $cp_scp);
1983}
1984
1985sub run_scp_mod {
1986 my ($src, $dst) = @_;
1987
1988 my $cp_scp = $scp_to_target;
1989
1990 return run_scp($src, $dst, $cp_scp);
1991}
1992
f824b686
MM
1993sub _get_grub_index {
1994
26df05a8 1995 my ($command, $target, $skip, $submenu) = @_;
f824b686
MM
1996
1997 return if (defined($grub_number) && defined($last_grub_menu) &&
c043ccbf
JWHV
1998 $last_grub_menu eq $grub_menu && defined($last_machine) &&
1999 $last_machine eq $machine);
f824b686
MM
2000
2001 doprint "Find $reboot_type menu ... ";
2002 $grub_number = -1;
2003
2004 my $ssh_grub = $ssh_exec;
2005 $ssh_grub =~ s,\$SSH_COMMAND,$command,g;
2006
c043ccbf
JWHV
2007 open(IN, "$ssh_grub |") or
2008 dodie "unable to execute $command";
f824b686
MM
2009
2010 my $found = 0;
2011
26df05a8
SR
2012 my $submenu_number = 0;
2013
f824b686
MM
2014 while (<IN>) {
2015 if (/$target/) {
2016 $grub_number++;
2017 $found = 1;
2018 last;
26df05a8
SR
2019 } elsif (defined($submenu) && /$submenu/) {
2020 $submenu_number++;
2021 $grub_number = -1;
f824b686
MM
2022 } elsif (/$skip/) {
2023 $grub_number++;
2024 }
2025 }
2026 close(IN);
2027
2028 dodie "Could not find '$grub_menu' through $command on $machine"
2029 if (!$found);
26df05a8
SR
2030 if ($submenu_number > 0) {
2031 $grub_number = "$submenu_number>$grub_number";
2032 }
f824b686
MM
2033 doprint "$grub_number\n";
2034 $last_grub_menu = $grub_menu;
2035 $last_machine = $machine;
2036}
2037
5f9b6ced
SR
2038sub get_grub_index {
2039
38891392
MM
2040 my $command;
2041 my $target;
2042 my $skip;
26df05a8 2043 my $submenu;
38891392 2044 my $grub_menu_qt;
a15ba913 2045
38891392 2046 if ($reboot_type !~ /^grub/) {
a75fecec
SR
2047 return;
2048 }
e48c5293 2049
38891392 2050 $grub_menu_qt = quotemeta($grub_menu);
eaa1fe25 2051
38891392
MM
2052 if ($reboot_type eq "grub") {
2053 $command = "cat /boot/grub/menu.lst";
2054 $target = '^\s*title\s+' . $grub_menu_qt . '\s*$';
2055 $skip = '^\s*title\s';
2056 } elsif ($reboot_type eq "grub2") {
2057 $command = "cat $grub_file";
26df05a8 2058 $target = '^\s*menuentry.*' . $grub_menu_qt;
2351e8c6 2059 $skip = '^\s*menuentry\s';
26df05a8 2060 $submenu = '^\s*submenu\s';
ac246645 2061 } elsif ($reboot_type eq "grub2bls") {
12d4cddd
JWHV
2062 $command = $grub_bls_get;
2063 $target = '^title=.*' . $grub_menu_qt;
2064 $skip = '^title=';
38891392
MM
2065 } else {
2066 return;
5f9b6ced 2067 }
5f9b6ced 2068
26df05a8 2069 _get_grub_index($command, $target, $skip, $submenu);
2545eb61
SR
2070}
2071
c043ccbf 2072sub wait_for_input {
2545eb61 2073 my ($fp, $time) = @_;
f7c6401f 2074 my $start_time;
2545eb61 2075 my $rin;
9d2f7f05
JP
2076 my $rout;
2077 my $nr;
2078 my $buf;
2545eb61
SR
2079 my $line;
2080 my $ch;
2081
2082 if (!defined($time)) {
2083 $time = $timeout;
2084 }
2085
4e7d2a8f
SR
2086 if ($time < 0) {
2087 # Negative number means wait indefinitely
2088 undef $time;
2089 }
2090
2545eb61
SR
2091 $rin = '';
2092 vec($rin, fileno($fp), 1) = 1;
9d2f7f05 2093 vec($rin, fileno(\*STDIN), 1) = 1;
2545eb61 2094
f7c6401f
SRV
2095 $start_time = time;
2096
9d2f7f05
JP
2097 while (1) {
2098 $nr = select($rout=$rin, undef, undef, $time);
2545eb61 2099
f7c6401f 2100 last if ($nr <= 0);
2545eb61 2101
9d2f7f05
JP
2102 # copy data from stdin to the console
2103 if (vec($rout, fileno(\*STDIN), 1) == 1) {
99c014a8
SRV
2104 $nr = sysread(\*STDIN, $buf, 1000);
2105 syswrite($fp, $buf, $nr) if ($nr > 0);
9d2f7f05
JP
2106 }
2107
f7c6401f
SRV
2108 # The timeout is based on time waiting for the fp data
2109 if (vec($rout, fileno($fp), 1) != 1) {
2110 last if (defined($time) && (time - $start_time > $time));
9d2f7f05
JP
2111 next;
2112 }
2113
2114 $line = "";
2545eb61 2115
9d2f7f05
JP
2116 # try to read one char at a time
2117 while (sysread $fp, $ch, 1) {
2118 $line .= $ch;
2119 last if ($ch eq "\n");
2120 }
2121
f7c6401f 2122 last if (!length($line));
9d2f7f05
JP
2123
2124 return $line;
2125 }
f7c6401f 2126 return undef;
2545eb61
SR
2127}
2128
75c3fda7 2129sub reboot_to {
bc7c5803
SR
2130 if (defined($switch_to_test)) {
2131 run_command $switch_to_test;
2132 }
2133
a75fecec 2134 if ($reboot_type eq "grub") {
c54367f9 2135 run_ssh "'(echo \"savedefault --default=$grub_number --once\" | grub --batch)'";
271e0c9d 2136 } elsif (($reboot_type eq "grub2") or ($reboot_type eq "grub2bls")) {
26df05a8 2137 run_ssh "$grub_reboot \"'$grub_number'\"";
7786954c
SR
2138 } elsif ($reboot_type eq "syslinux") {
2139 run_ssh "$syslinux --once \\\"$syslinux_label\\\" $syslinux_path";
96f6a0df
SR
2140 } elsif (defined $reboot_script) {
2141 run_command "$reboot_script";
a75fecec 2142 }
96f6a0df 2143 reboot;
2545eb61
SR
2144}
2145
a57419b3
SR
2146sub get_sha1 {
2147 my ($commit) = @_;
2148
2149 doprint "git rev-list --max-count=1 $commit ... ";
2150 my $sha1 = `git rev-list --max-count=1 $commit`;
2151 my $ret = $?;
2152
2153 logit $sha1;
2154
2155 if ($ret) {
2156 doprint "FAILED\n";
2157 dodie "Failed to get git $commit";
2158 }
2159
2160 print "SUCCESS\n";
2161
2162 chomp $sha1;
2163
2164 return $sha1;
2165}
2166
5a391fbf 2167sub monitor {
2545eb61
SR
2168 my $booted = 0;
2169 my $bug = 0;
6ca996cc 2170 my $bug_ignored = 0;
5c42fc5b 2171 my $skip_call_trace = 0;
2b7d9b21 2172 my $loops;
2545eb61 2173
38fa3dc1
SRRH
2174 my $start_time = time;
2175
7faafbd6 2176 wait_for_monitor 5;
2545eb61
SR
2177
2178 my $line;
2179 my $full_line = "";
2180
7faafbd6 2181 open(DMESG, "> $dmesg") or
df46fce6 2182 dodie "unable to write to $dmesg";
2545eb61 2183
75c3fda7 2184 reboot_to;
2545eb61 2185
1c8a617a
SR
2186 my $success_start;
2187 my $failure_start;
2d01b26a
SR
2188 my $monitor_start = time;
2189 my $done = 0;
f1a5b962 2190 my $version_found = 0;
1c8a617a 2191
2d01b26a 2192 while (!$done) {
ecaf8e52
SR
2193 if ($bug && defined($stop_after_failure) &&
2194 $stop_after_failure >= 0) {
2195 my $time = $stop_after_failure - (time - $failure_start);
2196 $line = wait_for_input($monitor_fp, $time);
2197 if (!defined($line)) {
2198 doprint "bug timed out after $booted_timeout seconds\n";
2199 doprint "Test forced to stop after $stop_after_failure seconds after failure\n";
2200 last;
2201 }
2202 } elsif ($booted) {
a75fecec 2203 $line = wait_for_input($monitor_fp, $booted_timeout);
cd4f1d53
SR
2204 if (!defined($line)) {
2205 my $s = $booted_timeout == 1 ? "" : "s";
2206 doprint "Successful boot found: break after $booted_timeout second$s\n";
2207 last;
2208 }
2b7d9b21 2209 } else {
7faafbd6 2210 $line = wait_for_input($monitor_fp);
cd4f1d53
SR
2211 if (!defined($line)) {
2212 my $s = $timeout == 1 ? "" : "s";
2213 doprint "Timed out after $timeout second$s\n";
2214 last;
2215 }
2b7d9b21 2216 }
2545eb61 2217
2545eb61 2218 doprint $line;
7faafbd6 2219 print DMESG $line;
2545eb61
SR
2220
2221 # we are not guaranteed to get a full line
2222 $full_line .= $line;
2223
a75fecec 2224 if ($full_line =~ /$success_line/) {
2545eb61 2225 $booted = 1;
1c8a617a
SR
2226 $success_start = time;
2227 }
2228
2229 if ($booted && defined($stop_after_success) &&
2230 $stop_after_success >= 0) {
2231 my $now = time;
2232 if ($now - $success_start >= $stop_after_success) {
2233 doprint "Test forced to stop after $stop_after_success seconds after success\n";
2234 last;
2235 }
2545eb61
SR
2236 }
2237
5c42fc5b
SR
2238 if ($full_line =~ /\[ backtrace testing \]/) {
2239 $skip_call_trace = 1;
2240 }
2241
2545eb61 2242 if ($full_line =~ /call trace:/i) {
6ca996cc
SR
2243 if (!$bug && !$skip_call_trace) {
2244 if ($ignore_errors) {
2245 $bug_ignored = 1;
2246 } else {
2247 $bug = 1;
2248 $failure_start = time;
2249 }
1c8a617a
SR
2250 }
2251 }
2252
2253 if ($bug && defined($stop_after_failure) &&
2254 $stop_after_failure >= 0) {
2255 my $now = time;
2256 if ($now - $failure_start >= $stop_after_failure) {
2257 doprint "Test forced to stop after $stop_after_failure seconds after failure\n";
2258 last;
2259 }
5c42fc5b
SR
2260 }
2261
2262 if ($full_line =~ /\[ end of backtrace testing \]/) {
2263 $skip_call_trace = 0;
2264 }
2265
2266 if ($full_line =~ /Kernel panic -/) {
10abf118 2267 $failure_start = time;
2545eb61
SR
2268 $bug = 1;
2269 }
2270
f1a5b962
SR
2271 # Detect triple faults by testing the banner
2272 if ($full_line =~ /\bLinux version (\S+).*\n/) {
2273 if ($1 eq $version) {
2274 $version_found = 1;
2275 } elsif ($version_found && $detect_triplefault) {
2276 # We already booted into the kernel we are testing,
2277 # but now we booted into another kernel?
2278 # Consider this a triple fault.
8b513d0c 2279 doprint "Already booted in Linux kernel $version, but now\n";
f1a5b962
SR
2280 doprint "we booted into Linux kernel $1.\n";
2281 doprint "Assuming that this is a triple fault.\n";
2282 doprint "To disable this: set DETECT_TRIPLE_FAULT to 0\n";
2283 last;
2284 }
2285 }
2286
2545eb61
SR
2287 if ($line =~ /\n/) {
2288 $full_line = "";
2289 }
2d01b26a
SR
2290
2291 if ($stop_test_after > 0 && !$booted && !$bug) {
2292 if (time - $monitor_start > $stop_test_after) {
4d62bf51 2293 doprint "STOP_TEST_AFTER ($stop_test_after seconds) timed out\n";
2d01b26a
SR
2294 $done = 1;
2295 }
2296 }
2545eb61
SR
2297 }
2298
38fa3dc1
SRRH
2299 my $end_time = time;
2300 $reboot_time = $end_time - $start_time;
2301
7faafbd6 2302 close(DMESG);
2545eb61 2303
a75fecec 2304 if ($bug) {
2b7d9b21 2305 return 0 if ($in_bisect);
576f627c 2306 fail "failed - got a bug report" and return 0;
2545eb61
SR
2307 }
2308
a75fecec 2309 if (!$booted) {
2b7d9b21 2310 return 0 if ($in_bisect);
576f627c 2311 fail "failed - never got a boot prompt." and return 0;
2545eb61 2312 }
5f9b6ced 2313
6ca996cc
SR
2314 if ($bug_ignored) {
2315 doprint "WARNING: Call Trace detected but ignored due to IGNORE_ERRORS=1\n";
2316 }
2317
2b7d9b21 2318 return 1;
2545eb61
SR
2319}
2320
2b29b2f8
SR
2321sub eval_kernel_version {
2322 my ($option) = @_;
2323
2324 $option =~ s/\$KERNEL_VERSION/$version/g;
2325
2326 return $option;
2327}
2328
db05cfef
SR
2329sub do_post_install {
2330
2331 return if (!defined($post_install));
2332
2b29b2f8 2333 my $cp_post_install = eval_kernel_version $post_install;
db05cfef
SR
2334 run_command "$cp_post_install" or
2335 dodie "Failed to run post install";
2336}
2337
e1a6c3d7
SR
2338# Sometimes the reboot fails, and will hang. We try to ssh to the box
2339# and if we fail, we force another reboot, that should powercycle it.
2340sub test_booted {
2341 if (!run_ssh "echo testing connection") {
2342 reboot $sleep_time;
2343 }
2344}
2345
2545eb61
SR
2346sub install {
2347
e0a8742e
SR
2348 return if ($no_install);
2349
38fa3dc1
SRRH
2350 my $start_time = time;
2351
e5c2ec11
SR
2352 if (defined($pre_install)) {
2353 my $cp_pre_install = eval_kernel_version $pre_install;
2354 run_command "$cp_pre_install" or
2355 dodie "Failed to run pre install";
2356 }
2357
2b29b2f8
SR
2358 my $cp_target = eval_kernel_version $target_image;
2359
e1a6c3d7
SR
2360 test_booted;
2361
02ad2617 2362 run_scp_install "$outputdir/$build_target", "$cp_target" or
5c42fc5b 2363 dodie "failed to copy image";
2545eb61 2364
5f9b6ced 2365 my $install_mods = 0;
2545eb61 2366
5f9b6ced
SR
2367 # should we process modules?
2368 $install_mods = 0;
51ad1dd1 2369 open(IN, "$output_config") or dodie("Can't read config file");
5f9b6ced
SR
2370 while (<IN>) {
2371 if (/CONFIG_MODULES(=y)?/) {
8bc5e4ea
SR
2372 if (defined($1)) {
2373 $install_mods = 1;
2374 last;
2375 }
5c42fc5b 2376 }
5f9b6ced
SR
2377 }
2378 close(IN);
5c42fc5b 2379
5f9b6ced 2380 if (!$install_mods) {
db05cfef 2381 do_post_install;
5f9b6ced 2382 doprint "No modules needed\n";
38fa3dc1
SRRH
2383 my $end_time = time;
2384 $install_time = $end_time - $start_time;
5f9b6ced
SR
2385 return;
2386 }
2545eb61 2387
627977d8 2388 run_command "$make INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH=$tmpdir modules_install" or
5f9b6ced 2389 dodie "Failed to install modules";
5c42fc5b 2390
5f9b6ced 2391 my $modlib = "/lib/modules/$version";
a57419b3 2392 my $modtar = "ktest-mods.tar.bz2";
5c42fc5b 2393
e48c5293 2394 run_ssh "rm -rf $modlib" or
5f9b6ced 2395 dodie "failed to remove old mods: $modlib";
5c42fc5b 2396
5f9b6ced 2397 # would be nice if scp -r did not follow symbolic links
a75fecec 2398 run_command "cd $tmpdir && tar -cjf $modtar lib/modules/$version" or
5f9b6ced
SR
2399 dodie "making tarball";
2400
02ad2617 2401 run_scp_mod "$tmpdir/$modtar", "/tmp" or
5f9b6ced
SR
2402 dodie "failed to copy modules";
2403
a75fecec 2404 unlink "$tmpdir/$modtar";
5f9b6ced 2405
e7b13441 2406 run_ssh "'(cd / && tar xjf /tmp/$modtar)'" or
5f9b6ced 2407 dodie "failed to tar modules";
2545eb61 2408
e48c5293 2409 run_ssh "rm -f /tmp/$modtar";
8b37ca8c 2410
db05cfef 2411 do_post_install;
38fa3dc1
SRRH
2412
2413 my $end_time = time;
2414 $install_time = $end_time - $start_time;
2545eb61
SR
2415}
2416
ddf607e5
SR
2417sub get_version {
2418 # get the release name
683a3e64 2419 return if ($have_version);
ddf607e5 2420 doprint "$make kernelrelease ... ";
17150fef 2421 $version = `$make -s kernelrelease | tail -1`;
a4e17a8f
RM
2422 if (!length($version)) {
2423 run_command "$make allnoconfig" or return 0;
2424 doprint "$make kernelrelease ... ";
2425 $version = `$make -s kernelrelease | tail -1`;
2426 }
ddf607e5
SR
2427 chomp($version);
2428 doprint "$version\n";
683a3e64 2429 $have_version = 1;
ddf607e5
SR
2430}
2431
64d98283 2432sub start_monitor_and_install {
9f7424cc 2433 # Make sure the stable kernel has finished booting
319ab14f
SRRH
2434
2435 # Install bisects, don't need console
2436 if (defined $console) {
2437 start_monitor;
2438 wait_for_monitor 5;
2439 end_monitor;
2440 }
9f7424cc 2441
ddf607e5
SR
2442 get_grub_index;
2443 get_version;
2444 install;
2445
319ab14f 2446 start_monitor if (defined $console);
ddf607e5
SR
2447 return monitor;
2448}
2449
7328735c
SRRH
2450sub process_warning_line {
2451 my ($line) = @_;
2452
2453 chomp $line;
2454
2455 # for distcc heterogeneous systems, some compilers
2456 # do things differently causing warning lines
2457 # to be slightly different. This makes an attempt
2458 # to fixe those issues.
2459
2460 # chop off the index into the line
2461 # using distcc, some compilers give different indexes
2462 # depending on white space
2463 $line =~ s/^(\s*\S+:\d+:)\d+/$1/;
2464
2465 # Some compilers use UTF-8 extended for quotes and some don't.
2466 $line =~ s/$utf8_quote/'/g;
2467
2468 return $line;
2469}
2470
4283b169
SRRH
2471# Read buildlog and check against warnings file for any
2472# new warnings.
2473#
2474# Returns 1 if OK
2475# 0 otherwise
6c5ee0be 2476sub check_buildlog {
4283b169
SRRH
2477 my %warnings_list;
2478
2479 # Failed builds should not reboot the target
2480 my $save_no_reboot = $no_reboot;
2481 $no_reboot = 1;
2482
2483 if (-f $warnings_file) {
2484 open(IN, $warnings_file) or
2485 dodie "Error opening $warnings_file";
2486
2487 while (<IN>) {
2488 if (/$check_build_re/) {
7328735c 2489 my $warning = process_warning_line $_;
12d4cddd 2490
7328735c 2491 $warnings_list{$warning} = 1;
4283b169
SRRH
2492 }
2493 }
2494 close(IN);
2495 }
2496
4283b169
SRRH
2497 open(IN, $buildlog) or dodie "Can't open $buildlog";
2498 while (<IN>) {
2499 if (/$check_build_re/) {
7328735c 2500 my $warning = process_warning_line $_;
4283b169 2501
7328735c 2502 if (!defined $warnings_list{$warning}) {
d441734d
SR
2503 $warning_found++;
2504
2505 # If warnings file didn't exist, and WARNINGS_FILE exist,
2506 # then we fail on any warning!
2507 if (defined $warnings_file) {
2508 fail "New warning found (not in $warnings_file)\n$_\n";
2509 $no_reboot = $save_no_reboot;
2510 return 0;
2511 }
4283b169
SRRH
2512 }
2513 }
2514 }
2515 $no_reboot = $save_no_reboot;
2516 close(IN);
2517}
2518
2519sub check_patch_buildlog {
6c5ee0be
SR
2520 my ($patch) = @_;
2521
6c5ee0be
SR
2522 my @files = `git show $patch | diffstat -l`;
2523
35275685
SRRH
2524 foreach my $file (@files) {
2525 chomp $file;
2526 }
2527
6c5ee0be
SR
2528 open(IN, "git show $patch |") or
2529 dodie "failed to show $patch";
2530 while (<IN>) {
2531 if (m,^--- a/(.*),) {
2532 chomp $1;
2533 $files[$#files] = $1;
2534 }
2535 }
2536 close(IN);
2537
2538 open(IN, $buildlog) or dodie "Can't open $buildlog";
2539 while (<IN>) {
2540 if (/^\s*(.*?):.*(warning|error)/) {
2541 my $err = $1;
2542 foreach my $file (@files) {
a75fecec 2543 my $fullpath = "$builddir/$file";
6c5ee0be 2544 if ($file eq $err || $fullpath eq $err) {
2b7d9b21 2545 fail "$file built with warnings" and return 0;
6c5ee0be
SR
2546 }
2547 }
2548 }
2549 }
2550 close(IN);
2b7d9b21
SR
2551
2552 return 1;
6c5ee0be
SR
2553}
2554
fcb3f16a
SR
2555sub apply_min_config {
2556 my $outconfig = "$output_config.new";
2557
2558 # Read the config file and remove anything that
2559 # is in the force_config hash (from minconfig and others)
2560 # then add the force config back.
2561
2562 doprint "Applying minimum configurations into $output_config.new\n";
2563
2564 open (OUT, ">$outconfig") or
2565 dodie "Can't create $outconfig";
2566
2567 if (-f $output_config) {
2568 open (IN, $output_config) or
2569 dodie "Failed to open $output_config";
2570 while (<IN>) {
2571 if (/^(# )?(CONFIG_[^\s=]*)/) {
2572 next if (defined($force_config{$2}));
2573 }
2574 print OUT;
2575 }
2576 close IN;
2577 }
2578 foreach my $config (keys %force_config) {
2579 print OUT "$force_config{$config}\n";
2580 }
2581 close OUT;
2582
2583 run_command "mv $outconfig $output_config";
2584}
2585
612b9e9b 2586sub make_oldconfig {
612b9e9b 2587
4c4ab120
SR
2588 my @force_list = keys %force_config;
2589
2590 if ($#force_list >= 0) {
2591 apply_min_config;
2592 }
fcb3f16a 2593
fb16d891
AL
2594 if (!run_command "$make olddefconfig") {
2595 # Perhaps olddefconfig doesn't exist in this version of the kernel
18925170
SR
2596 # try oldnoconfig
2597 doprint "olddefconfig failed, trying make oldnoconfig\n";
2598 if (!run_command "$make oldnoconfig") {
2599 doprint "oldnoconfig failed, trying yes '' | make oldconfig\n";
2600 # try a yes '' | oldconfig
2601 run_command "yes '' | $make oldconfig" or
2602 dodie "failed make config oldconfig";
2603 }
612b9e9b
SR
2604 }
2605}
2606
fcb3f16a
SR
2607# read a config file and use this to force new configs.
2608sub load_force_config {
2609 my ($config) = @_;
2610
cf79fab6 2611 doprint "Loading force configs from $config\n";
fcb3f16a
SR
2612 open(IN, $config) or
2613 dodie "failed to read $config";
2614 while (<IN>) {
2615 chomp;
2616 if (/^(CONFIG[^\s=]*)(\s*=.*)/) {
2617 $force_config{$1} = $_;
2618 } elsif (/^# (CONFIG_\S*) is not set/) {
2619 $force_config{$1} = $_;
2620 }
2621 }
2622 close IN;
2623}
2624
2545eb61
SR
2625sub build {
2626 my ($type) = @_;
5c42fc5b 2627
7faafbd6
SR
2628 unlink $buildlog;
2629
38fa3dc1
SRRH
2630 my $start_time = time;
2631
4ab1cce5
SR
2632 # Failed builds should not reboot the target
2633 my $save_no_reboot = $no_reboot;
2634 $no_reboot = 1;
2635
683a3e64
SR
2636 # Calculate a new version from here.
2637 $have_version = 0;
2638
0bd6c1a3
SR
2639 if (defined($pre_build)) {
2640 my $ret = run_command $pre_build;
2641 if (!$ret && defined($pre_build_die) &&
2642 $pre_build_die) {
2643 dodie "failed to pre_build\n";
2644 }
2645 }
2646
75c3fda7 2647 if ($type =~ /^useconfig:(.*)/) {
51ad1dd1 2648 run_command "cp $1 $output_config" or
75c3fda7 2649 dodie "could not copy $1 to .config";
5f9b6ced 2650
75c3fda7
SR
2651 $type = "oldconfig";
2652 }
2653
5c42fc5b
SR
2654 # old config can ask questions
2655 if ($type eq "oldconfig") {
fb16d891 2656 $type = "olddefconfig";
75c3fda7
SR
2657
2658 # allow for empty configs
51ad1dd1 2659 run_command "touch $output_config";
75c3fda7 2660
13488231
AJ
2661 if (!$noclean) {
2662 run_command "mv $output_config $outputdir/config_temp" or
2663 dodie "moving .config";
2545eb61 2664
13488231 2665 run_command "$make mrproper" or dodie "make mrproper";
2545eb61 2666
13488231
AJ
2667 run_command "mv $outputdir/config_temp $output_config" or
2668 dodie "moving config_temp";
2669 }
5c42fc5b 2670 } elsif (!$noclean) {
51ad1dd1 2671 unlink "$output_config";
5f9b6ced 2672 run_command "$make mrproper" or
5c42fc5b 2673 dodie "make mrproper";
5c42fc5b 2674 }
2545eb61
SR
2675
2676 # add something to distinguish this build
a75fecec
SR
2677 open(OUT, "> $outputdir/localversion") or dodie("Can't make localversion file");
2678 print OUT "$localversion\n";
2545eb61
SR
2679 close(OUT);
2680
5f9b6ced 2681 if (defined($minconfig)) {
fcb3f16a 2682 load_force_config($minconfig);
2545eb61
SR
2683 }
2684
fb16d891 2685 if ($type ne "olddefconfig") {
fcb3f16a 2686 run_command "$make $type" or
612b9e9b
SR
2687 dodie "failed make config";
2688 }
fcb3f16a
SR
2689 # Run old config regardless, to enforce min configurations
2690 make_oldconfig;
2545eb61 2691
da2e5663
JWHV
2692 if (not defined($build_options)){
2693 $build_options = "";
2694 }
f983a2bc 2695 my $build_ret = run_command "$make $build_options", $buildlog;
0bd6c1a3
SR
2696
2697 if (defined($post_build)) {
683a3e64
SR
2698 # Because a post build may change the kernel version
2699 # do it now.
2700 get_version;
0bd6c1a3
SR
2701 my $ret = run_command $post_build;
2702 if (!$ret && defined($post_build_die) &&
2703 $post_build_die) {
2704 dodie "failed to post_build\n";
2705 }
2706 }
2707
2708 if (!$build_ret) {
5f9b6ced 2709 # bisect may need this to pass
4ab1cce5
SR
2710 if ($in_bisect) {
2711 $no_reboot = $save_no_reboot;
2712 return 0;
2713 }
2b7d9b21 2714 fail "failed build" and return 0;
2545eb61 2715 }
5f9b6ced 2716
4ab1cce5
SR
2717 $no_reboot = $save_no_reboot;
2718
38fa3dc1
SRRH
2719 my $end_time = time;
2720 $build_time = $end_time - $start_time;
2721
2b7d9b21 2722 return 1;
2545eb61
SR
2723}
2724
75c3fda7 2725sub halt {
e48c5293 2726 if (!run_ssh "halt" or defined($power_off)) {
576f627c
SR
2727 if (defined($poweroff_after_halt)) {
2728 sleep $poweroff_after_halt;
2729 run_command "$power_off";
2730 }
2731 } else {
75c3fda7 2732 # nope? the zap it!
a75fecec 2733 run_command "$power_off";
75c3fda7
SR
2734 }
2735}
2736
5f9b6ced
SR
2737sub success {
2738 my ($i) = @_;
2739
e48c5293
SR
2740 $successes++;
2741
9064af52
SR
2742 my $name = "";
2743
2744 if (defined($test_name)) {
2745 $name = " ($test_name)";
2746 }
2747
4bf6e1fc
SRRH
2748 print_times;
2749
c043ccbf
JWHV
2750 doprint "\n\n";
2751 doprint "*******************************************\n";
2752 doprint "*******************************************\n";
2753 doprint "KTEST RESULT: TEST $i$name SUCCESS!!!! **\n";
2754 doprint "*******************************************\n";
2755 doprint "*******************************************\n";
5f9b6ced 2756
de5b6e3b 2757 if (defined($store_successes)) {
12d4cddd 2758 save_logs "success", $store_successes;
de5b6e3b
RV
2759 }
2760
576f627c 2761 if ($i != $opt{"NUM_TESTS"} && !do_not_reboot) {
a75fecec 2762 doprint "Reboot and wait $sleep_time seconds\n";
bc7c5803 2763 reboot_to_good $sleep_time;
5f9b6ced 2764 }
2e07c9f5
SRV
2765
2766 if (defined($post_test)) {
2767 run_command $post_test;
2768 }
5f9b6ced
SR
2769}
2770
c960bb9f
SR
2771sub answer_bisect {
2772 for (;;) {
fee9d3e6 2773 doprint "Pass, fail, or skip? [p/f/s]";
c960bb9f
SR
2774 my $ans = <STDIN>;
2775 chomp $ans;
2776 if ($ans eq "p" || $ans eq "P") {
2777 return 1;
2778 } elsif ($ans eq "f" || $ans eq "F") {
2779 return 0;
fee9d3e6
CA
2780 } elsif ($ans eq "s" || $ans eq "S") {
2781 return -1;
c960bb9f 2782 } else {
fee9d3e6 2783 print "Please answer 'p', 'f', or 's'\n";
c960bb9f
SR
2784 }
2785 }
2786}
2787
5a391fbf 2788sub child_run_test {
5a391fbf 2789
7faafbd6 2790 # child should have no power
a75fecec
SR
2791 $reboot_on_error = 0;
2792 $poweroff_on_error = 0;
2793 $die_on_failure = 1;
7faafbd6 2794
5739438b 2795 run_command $run_test, $testlog;
a9dd5d63 2796
5739438b 2797 exit $run_command_status;
5a391fbf
SR
2798}
2799
5a391fbf
SR
2800sub child_finished {
2801 $child_done = 1;
2802}
2803
2804sub do_run_test {
2805 my $child_pid;
2806 my $child_exit;
5a391fbf
SR
2807 my $line;
2808 my $full_line;
2809 my $bug = 0;
9b1d367d 2810 my $bug_ignored = 0;
5a391fbf 2811
38fa3dc1
SRRH
2812 my $start_time = time;
2813
7faafbd6 2814 wait_for_monitor 1;
5a391fbf 2815
7faafbd6 2816 doprint "run test $run_test\n";
5a391fbf
SR
2817
2818 $child_done = 0;
2819
2820 $SIG{CHLD} = qw(child_finished);
2821
2822 $child_pid = fork;
2823
2824 child_run_test if (!$child_pid);
2825
2826 $full_line = "";
2827
2828 do {
7faafbd6 2829 $line = wait_for_input($monitor_fp, 1);
5a391fbf
SR
2830 if (defined($line)) {
2831
2832 # we are not guaranteed to get a full line
2833 $full_line .= $line;
8ea0e063 2834 doprint $line;
5a391fbf
SR
2835
2836 if ($full_line =~ /call trace:/i) {
9b1d367d
SR
2837 if ($ignore_errors) {
2838 $bug_ignored = 1;
2839 } else {
2840 $bug = 1;
2841 }
5a391fbf
SR
2842 }
2843
2844 if ($full_line =~ /Kernel panic -/) {
2845 $bug = 1;
2846 }
2847
2848 if ($line =~ /\n/) {
2849 $full_line = "";
2850 }
2851 }
2852 } while (!$child_done && !$bug);
2853
9b1d367d
SR
2854 if (!$bug && $bug_ignored) {
2855 doprint "WARNING: Call Trace detected but ignored due to IGNORE_ERRORS=1\n";
2856 }
2857
5a391fbf 2858 if ($bug) {
8ea0e063
SR
2859 my $failure_start = time;
2860 my $now;
2861 do {
2862 $line = wait_for_input($monitor_fp, 1);
2863 if (defined($line)) {
2864 doprint $line;
2865 }
2866 $now = time;
2867 if ($now - $failure_start >= $stop_after_failure) {
2868 last;
2869 }
2870 } while (defined($line));
2871
5a391fbf
SR
2872 doprint "Detected kernel crash!\n";
2873 # kill the child with extreme prejudice
2874 kill 9, $child_pid;
2875 }
2876
2877 waitpid $child_pid, 0;
32677207 2878 $child_exit = $? >> 8;
5a391fbf 2879
38fa3dc1
SRRH
2880 my $end_time = time;
2881 $test_time = $end_time - $start_time;
2882
c5dacb88
SR
2883 if (!$bug && $in_bisect) {
2884 if (defined($bisect_ret_good)) {
2885 if ($child_exit == $bisect_ret_good) {
2886 return 1;
2887 }
2888 }
2889 if (defined($bisect_ret_skip)) {
2890 if ($child_exit == $bisect_ret_skip) {
2891 return -1;
2892 }
2893 }
2894 if (defined($bisect_ret_abort)) {
2895 if ($child_exit == $bisect_ret_abort) {
2896 fail "test abort" and return -2;
2897 }
2898 }
2899 if (defined($bisect_ret_bad)) {
2900 if ($child_exit == $bisect_ret_skip) {
2901 return 0;
2902 }
2903 }
2904 if (defined($bisect_ret_default)) {
2905 if ($bisect_ret_default eq "good") {
2906 return 1;
2907 } elsif ($bisect_ret_default eq "bad") {
2908 return 0;
2909 } elsif ($bisect_ret_default eq "skip") {
2910 return -1;
2911 } elsif ($bisect_ret_default eq "abort") {
2912 return -2;
2913 } else {
2914 fail "unknown default action: $bisect_ret_default"
2915 and return -2;
2916 }
2917 }
2918 }
2919
5a391fbf 2920 if ($bug || $child_exit) {
2b7d9b21
SR
2921 return 0 if $in_bisect;
2922 fail "test failed" and return 0;
5a391fbf 2923 }
2b7d9b21 2924 return 1;
5a391fbf
SR
2925}
2926
a75fecec
SR
2927sub run_git_bisect {
2928 my ($command) = @_;
2929
2930 doprint "$command ... ";
2931
2932 my $output = `$command 2>&1`;
2933 my $ret = $?;
2934
2935 logit $output;
2936
2937 if ($ret) {
2938 doprint "FAILED\n";
2939 dodie "Failed to git bisect";
2940 }
2941
2942 doprint "SUCCESS\n";
2943 if ($output =~ m/^(Bisecting: .*\(roughly \d+ steps?\))\s+\[([[:xdigit:]]+)\]/) {
2944 doprint "$1 [$2]\n";
2945 } elsif ($output =~ m/^([[:xdigit:]]+) is the first bad commit/) {
b5f4aea6 2946 $bisect_bad_commit = $1;
a75fecec
SR
2947 doprint "Found bad commit... $1\n";
2948 return 0;
2949 } else {
2950 # we already logged it, just print it now.
2951 print $output;
2952 }
2953
2954 return 1;
2955}
2956
c23dca7c
SR
2957sub bisect_reboot {
2958 doprint "Reboot and sleep $bisect_sleep_time seconds\n";
bc7c5803 2959 reboot_to_good $bisect_sleep_time;
c23dca7c
SR
2960}
2961
2962# returns 1 on success, 0 on failure, -1 on skip
0a05c769
SR
2963sub run_bisect_test {
2964 my ($type, $buildtype) = @_;
5f9b6ced 2965
2b7d9b21 2966 my $failed = 0;
5f9b6ced 2967 my $result;
5f9b6ced 2968
0a05c769
SR
2969 $in_bisect = 1;
2970
2971 build $buildtype or $failed = 1;
5f9b6ced
SR
2972
2973 if ($type ne "build") {
c23dca7c
SR
2974 if ($failed && $bisect_skip) {
2975 $in_bisect = 0;
2976 return -1;
2977 }
7faafbd6 2978 dodie "Failed on build" if $failed;
5f9b6ced
SR
2979
2980 # Now boot the box
64d98283 2981 start_monitor_and_install or $failed = 1;
5f9b6ced
SR
2982
2983 if ($type ne "boot") {
c23dca7c
SR
2984 if ($failed && $bisect_skip) {
2985 end_monitor;
2986 bisect_reboot;
2987 $in_bisect = 0;
2988 return -1;
2989 }
7faafbd6 2990 dodie "Failed on boot" if $failed;
5a391fbf 2991
2b7d9b21 2992 do_run_test or $failed = 1;
5f9b6ced 2993 }
7faafbd6 2994 end_monitor;
5f9b6ced
SR
2995 }
2996
2997 if ($failed) {
0a05c769 2998 $result = 0;
5f9b6ced 2999 } else {
0a05c769
SR
3000 $result = 1;
3001 }
4025bc62
SR
3002
3003 # reboot the box to a kernel we can ssh to
3004 if ($type ne "build") {
3005 bisect_reboot;
3006 }
0a05c769
SR
3007 $in_bisect = 0;
3008
3009 return $result;
3010}
3011
3012sub run_bisect {
3013 my ($type) = @_;
3014 my $buildtype = "oldconfig";
3015
3016 # We should have a minconfig to use?
3017 if (defined($minconfig)) {
3018 $buildtype = "useconfig:$minconfig";
5f9b6ced
SR
3019 }
3020
961d9cac
SRRH
3021 # If the user sets bisect_tries to less than 1, then no tries
3022 # is a success.
3023 my $ret = 1;
0a05c769 3024
961d9cac
SRRH
3025 # Still let the user manually decide that though.
3026 if ($bisect_tries < 1 && $bisect_manual) {
c960bb9f
SR
3027 $ret = answer_bisect;
3028 }
0a05c769 3029
961d9cac
SRRH
3030 for (my $i = 0; $i < $bisect_tries; $i++) {
3031 if ($bisect_tries > 1) {
3032 my $t = $i + 1;
3033 doprint("Running bisect trial $t of $bisect_tries:\n");
3034 }
3035 $ret = run_bisect_test $type, $buildtype;
3036
3037 if ($bisect_manual) {
3038 $ret = answer_bisect;
3039 }
3040
3041 last if (!$ret);
3042 }
3043
d6ce2a0b 3044 # Are we looking for where it worked, not failed?
5158ba3e 3045 if ($reverse_bisect && $ret >= 0) {
0a05c769 3046 $ret = !$ret;
d6ce2a0b
SR
3047 }
3048
c23dca7c 3049 if ($ret > 0) {
0a05c769 3050 return "good";
c23dca7c 3051 } elsif ($ret == 0) {
0a05c769 3052 return "bad";
c23dca7c
SR
3053 } elsif ($bisect_skip) {
3054 doprint "HIT A BAD COMMIT ... SKIPPING\n";
3055 return "skip";
0a05c769 3056 }
5f9b6ced
SR
3057}
3058
dad98754
SR
3059sub update_bisect_replay {
3060 my $tmp_log = "$tmpdir/ktest_bisect_log";
3061 run_command "git bisect log > $tmp_log" or
df46fce6 3062 dodie "can't create bisect log";
dad98754
SR
3063 return $tmp_log;
3064}
3065
5f9b6ced
SR
3066sub bisect {
3067 my ($i) = @_;
3068
3069 my $result;
3070
df46fce6
TTC
3071 dodie "BISECT_GOOD[$i] not defined\n" if (!defined($bisect_good));
3072 dodie "BISECT_BAD[$i] not defined\n" if (!defined($bisect_bad));
3073 dodie "BISECT_TYPE[$i] not defined\n" if (!defined($bisect_type));
5f9b6ced 3074
b5f4aea6
SR
3075 my $good = $bisect_good;
3076 my $bad = $bisect_bad;
3077 my $type = $bisect_type;
3078 my $start = $bisect_start;
3079 my $replay = $bisect_replay;
3080 my $start_files = $bisect_files;
3410f6fd
SR
3081
3082 if (defined($start_files)) {
3083 $start_files = " -- " . $start_files;
3084 } else {
3085 $start_files = "";
3086 }
5f9b6ced 3087
a57419b3
SR
3088 # convert to true sha1's
3089 $good = get_sha1($good);
3090 $bad = get_sha1($bad);
3091
b5f4aea6 3092 if (defined($bisect_reverse) && $bisect_reverse == 1) {
d6ce2a0b
SR
3093 doprint "Performing a reverse bisect (bad is good, good is bad!)\n";
3094 $reverse_bisect = 1;
3095 } else {
3096 $reverse_bisect = 0;
3097 }
3098
a75fecec
SR
3099 # Can't have a test without having a test to run
3100 if ($type eq "test" && !defined($run_test)) {
3101 $type = "boot";
3102 }
3103
dad98754
SR
3104 # Check if a bisect was running
3105 my $bisect_start_file = "$builddir/.git/BISECT_START";
3106
b5f4aea6 3107 my $check = $bisect_check;
dad98754
SR
3108 my $do_check = defined($check) && $check ne "0";
3109
3110 if ( -f $bisect_start_file ) {
3111 print "Bisect in progress found\n";
3112 if ($do_check) {
3113 print " If you say yes, then no checks of good or bad will be done\n";
3114 }
3115 if (defined($replay)) {
3116 print "** BISECT_REPLAY is defined in config file **";
3117 print " Ignore config option and perform new git bisect log?\n";
3118 if (read_ync " (yes, no, or cancel) ") {
3119 $replay = update_bisect_replay;
3120 $do_check = 0;
3121 }
3122 } elsif (read_yn "read git log and continue?") {
3123 $replay = update_bisect_replay;
3124 $do_check = 0;
3125 }
3126 }
3127
3128 if ($do_check) {
a75fecec 3129 # get current HEAD
a57419b3 3130 my $head = get_sha1("HEAD");
a75fecec
SR
3131
3132 if ($check ne "good") {
3133 doprint "TESTING BISECT BAD [$bad]\n";
3134 run_command "git checkout $bad" or
df46fce6 3135 dodie "Failed to checkout $bad";
a75fecec
SR
3136
3137 $result = run_bisect $type;
3138
3139 if ($result ne "bad") {
3140 fail "Tested BISECT_BAD [$bad] and it succeeded" and return 0;
3141 }
3142 }
3143
3144 if ($check ne "bad") {
3145 doprint "TESTING BISECT GOOD [$good]\n";
3146 run_command "git checkout $good" or
df46fce6 3147 dodie "Failed to checkout $good";
a75fecec
SR
3148
3149 $result = run_bisect $type;
3150
3151 if ($result ne "good") {
3152 fail "Tested BISECT_GOOD [$good] and it failed" and return 0;
3153 }
3154 }
3155
3156 # checkout where we started
3157 run_command "git checkout $head" or
df46fce6 3158 dodie "Failed to checkout $head";
a75fecec
SR
3159 }
3160
3410f6fd 3161 run_command "git bisect start$start_files" or
a75fecec 3162 dodie "could not start bisect";
5f9b6ced 3163
a75fecec
SR
3164 if (defined($replay)) {
3165 run_command "git bisect replay $replay" or
3166 dodie "failed to run replay";
d832d743 3167 } else {
d832d743
SRRH
3168 run_command "git bisect good $good" or
3169 dodie "could not set bisect good to $good";
3170
3171 run_git_bisect "git bisect bad $bad" or
3172 dodie "could not set bisect bad to $bad";
5a391fbf
SR
3173 }
3174
a75fecec
SR
3175 if (defined($start)) {
3176 run_command "git checkout $start" or
3177 dodie "failed to checkout $start";
3178 }
3179
3180 my $test;
5f9b6ced
SR
3181 do {
3182 $result = run_bisect $type;
a75fecec 3183 $test = run_git_bisect "git bisect $result";
38fa3dc1 3184 print_times;
a75fecec 3185 } while ($test);
5f9b6ced
SR
3186
3187 run_command "git bisect log" or
3188 dodie "could not capture git bisect log";
3189
3190 run_command "git bisect reset" or
3191 dodie "could not reset git bisect";
3192
b5f4aea6 3193 doprint "Bad commit was [$bisect_bad_commit]\n";
5f9b6ced 3194
0a05c769
SR
3195 success $i;
3196}
3197
4c4ab120
SR
3198sub assign_configs {
3199 my ($hash, $config) = @_;
0a05c769 3200
6071c22e
SRRH
3201 doprint "Reading configs from $config\n";
3202
c043ccbf
JWHV
3203 open (IN, $config) or
3204 dodie "Failed to read $config";
0a05c769
SR
3205
3206 while (<IN>) {
6071c22e 3207 chomp;
9bf71749 3208 if (/^((CONFIG\S*)=.*)/) {
4c4ab120 3209 ${$hash}{$2} = $1;
6071c22e
SRRH
3210 } elsif (/^(# (CONFIG\S*) is not set)/) {
3211 ${$hash}{$2} = $1;
0a05c769
SR
3212 }
3213 }
3214
3215 close(IN);
3216}
3217
4c4ab120
SR
3218sub process_config_ignore {
3219 my ($config) = @_;
3220
3221 assign_configs \%config_ignore, $config;
3222}
3223
0a05c769
SR
3224sub get_dependencies {
3225 my ($config) = @_;
3226
3227 my $arr = $dependency{$config};
3228 if (!defined($arr)) {
3229 return ();
3230 }
3231
3232 my @deps = @{$arr};
3233
3234 foreach my $dep (@{$arr}) {
3235 print "ADD DEP $dep\n";
3236 @deps = (@deps, get_dependencies $dep);
3237 }
3238
3239 return @deps;
3240}
3241
6071c22e
SRRH
3242sub save_config {
3243 my ($pc, $file) = @_;
3244
3245 my %configs = %{$pc};
3246
3247 doprint "Saving configs into $file\n";
3248
3249 open(OUT, ">$file") or dodie "Can not write to $file";
3250
3251 foreach my $config (keys %configs) {
3252 print OUT "$configs{$config}\n";
3253 }
3254 close(OUT);
3255}
3256
0a05c769 3257sub create_config {
6071c22e
SRRH
3258 my ($name, $pc) = @_;
3259
3260 doprint "Creating old config from $name configs\n";
3261
3262 save_config $pc, $output_config;
3263
3264 make_oldconfig;
3265}
0a05c769 3266
0a05c769
SR
3267sub run_config_bisect_test {
3268 my ($type) = @_;
3269
4cc559bd
SRRH
3270 my $ret = run_bisect_test $type, "oldconfig";
3271
3272 if ($bisect_manual) {
3273 $ret = answer_bisect;
3274 }
3275
3276 return $ret;
0a05c769
SR
3277}
3278
a9adc261
SW
3279sub config_bisect_end {
3280 my ($good, $bad) = @_;
b2b07ea2 3281 my $diffexec = "diff -u";
0a05c769 3282
b2b07ea2
SRV
3283 if (-f "$builddir/scripts/diffconfig") {
3284 $diffexec = "$builddir/scripts/diffconfig";
3285 }
0a05c769 3286 doprint "\n\n***************************************\n";
a9adc261 3287 doprint "No more config bisecting possible.\n";
b2b07ea2 3288 run_command "$diffexec $good $bad", 1;
0a05c769
SR
3289 doprint "***************************************\n\n";
3290}
3291
6071c22e 3292sub run_config_bisect {
a9adc261 3293 my ($good, $bad, $last_result) = @_;
133087f0 3294 my $reset = "";
a9adc261 3295 my $cmd;
6071c22e 3296 my $ret;
cf79fab6 3297
133087f0
SRV
3298 if (!length($last_result)) {
3299 $reset = "-r";
6071c22e 3300 }
40667fb5 3301 run_command "$config_bisect_exec $reset -b $outputdir $good $bad $last_result", 1;
0a05c769 3302
a9adc261
SW
3303 # config-bisect returns:
3304 # 0 if there is more to bisect
3305 # 1 for finding a good config
3306 # 2 if it can not find any more configs
3307 # -1 (255) on error
3308 if ($run_command_status) {
3309 return $run_command_status;
6071c22e
SRRH
3310 }
3311
a9adc261
SW
3312 $ret = run_config_bisect_test $config_bisect_type;
3313 if ($ret) {
12d4cddd 3314 doprint "NEW GOOD CONFIG ($pass)\n";
9dce29e6
SRV
3315 system("cp $output_config $tmpdir/good_config.tmp.$pass");
3316 $pass++;
a9adc261
SW
3317 # Return 3 for good config
3318 return 3;
3319 } else {
12d4cddd 3320 doprint "NEW BAD CONFIG ($pass)\n";
9dce29e6
SRV
3321 system("cp $output_config $tmpdir/bad_config.tmp.$pass");
3322 $pass++;
a9adc261
SW
3323 # Return 4 for bad config
3324 return 4;
0a05c769 3325 }
0a05c769
SR
3326}
3327
3328sub config_bisect {
3329 my ($i) = @_;
3330
a9adc261
SW
3331 my $good_config;
3332 my $bad_config;
3333
6071c22e 3334 my $type = $config_bisect_type;
c4d1d11f 3335 my $ret;
0a05c769 3336
6071c22e 3337 $bad_config = $config_bisect;
0a05c769 3338
30f75da5 3339 if (defined($config_bisect_good)) {
6071c22e
SRRH
3340 $good_config = $config_bisect_good;
3341 } elsif (defined($minconfig)) {
3342 $good_config = $minconfig;
0a05c769 3343 } else {
6071c22e 3344 doprint "No config specified, checking if defconfig works";
c4d1d11f 3345 $ret = run_bisect_test $type, "defconfig";
6071c22e
SRRH
3346 if (!$ret) {
3347 fail "Have no good config to compare with, please set CONFIG_BISECT_GOOD";
3348 return 1;
0a05c769 3349 }
6071c22e 3350 $good_config = $output_config;
0a05c769 3351 }
0a05c769 3352
40667fb5
SRV
3353 if (!defined($config_bisect_exec)) {
3354 # First check the location that ktest.pl ran
c043ccbf
JWHV
3355 my @locations = (
3356 "$pwd/config-bisect.pl",
3357 "$dirname/config-bisect.pl",
3358 "$builddir/tools/testing/ktest/config-bisect.pl",
3359 undef );
40667fb5
SRV
3360 foreach my $loc (@locations) {
3361 doprint "loc = $loc\n";
3362 $config_bisect_exec = $loc;
3363 last if (defined($config_bisect_exec && -x $config_bisect_exec));
3364 }
3365 if (!defined($config_bisect_exec)) {
3366 fail "Could not find an executable config-bisect.pl\n",
3367 " Set CONFIG_BISECT_EXEC to point to config-bisect.pl";
3368 return 1;
3369 }
3370 }
3371
6071c22e
SRRH
3372 # we don't want min configs to cause issues here.
3373 doprint "Disabling 'MIN_CONFIG' for this test\n";
3374 undef $minconfig;
0a05c769 3375
6071c22e
SRRH
3376 my %good_configs;
3377 my %bad_configs;
3378 my %tmp_configs;
0a05c769 3379
5a57299a
SRV
3380 if (-f "$tmpdir/good_config.tmp" || -f "$tmpdir/bad_config.tmp") {
3381 if (read_yn "Interrupted config-bisect. Continue (n - will start new)?") {
3382 if (-f "$tmpdir/good_config.tmp") {
3383 $good_config = "$tmpdir/good_config.tmp";
3384 } else {
3385 $good_config = "$tmpdir/good_config";
3386 }
3387 if (-f "$tmpdir/bad_config.tmp") {
3388 $bad_config = "$tmpdir/bad_config.tmp";
3389 } else {
3390 $bad_config = "$tmpdir/bad_config";
3391 }
3392 }
3393 }
6071c22e
SRRH
3394 doprint "Run good configs through make oldconfig\n";
3395 assign_configs \%tmp_configs, $good_config;
3396 create_config "$good_config", \%tmp_configs;
a9adc261
SW
3397 $good_config = "$tmpdir/good_config";
3398 system("cp $output_config $good_config") == 0 or dodie "cp good config";
0a05c769 3399
6071c22e
SRRH
3400 doprint "Run bad configs through make oldconfig\n";
3401 assign_configs \%tmp_configs, $bad_config;
3402 create_config "$bad_config", \%tmp_configs;
6071c22e 3403 $bad_config = "$tmpdir/bad_config";
a9adc261 3404 system("cp $output_config $bad_config") == 0 or dodie "cp bad config";
cf79fab6 3405
c4d1d11f
SRRH
3406 if (defined($config_bisect_check) && $config_bisect_check ne "0") {
3407 if ($config_bisect_check ne "good") {
3408 doprint "Testing bad config\n";
3409
3410 $ret = run_bisect_test $type, "useconfig:$bad_config";
3411 if ($ret) {
3412 fail "Bad config succeeded when expected to fail!";
3413 return 0;
3414 }
3415 }
3416 if ($config_bisect_check ne "bad") {
3417 doprint "Testing good config\n";
3418
3419 $ret = run_bisect_test $type, "useconfig:$good_config";
3420 if (!$ret) {
3421 fail "Good config failed when expected to succeed!";
3422 return 0;
3423 }
3424 }
3425 }
b0918612 3426
a9adc261
SW
3427 my $last_run = "";
3428
0a05c769 3429 do {
a9adc261
SW
3430 $ret = run_config_bisect $good_config, $bad_config, $last_run;
3431 if ($ret == 3) {
3432 $last_run = "good";
3433 } elsif ($ret == 4) {
3434 $last_run = "bad";
3435 }
38fa3dc1 3436 print_times;
a9adc261
SW
3437 } while ($ret == 3 || $ret == 4);
3438
3439 if ($ret == 2) {
12d4cddd 3440 config_bisect_end "$good_config.tmp", "$bad_config.tmp";
a9adc261 3441 }
0a05c769
SR
3442
3443 return $ret if ($ret < 0);
5f9b6ced
SR
3444
3445 success $i;
3446}
3447
27d934b2
SR
3448sub patchcheck_reboot {
3449 doprint "Reboot and sleep $patchcheck_sleep_time seconds\n";
bc7c5803 3450 reboot_to_good $patchcheck_sleep_time;
27d934b2
SR
3451}
3452
6c5ee0be
SR
3453sub patchcheck {
3454 my ($i) = @_;
3455
df46fce6 3456 dodie "PATCHCHECK_START[$i] not defined\n"
b5f4aea6 3457 if (!defined($patchcheck_start));
df46fce6 3458 dodie "PATCHCHECK_TYPE[$i] not defined\n"
b5f4aea6 3459 if (!defined($patchcheck_type));
6c5ee0be 3460
b5f4aea6 3461 my $start = $patchcheck_start;
6c5ee0be 3462
23a0e161
SRRH
3463 my $cherry = $patchcheck_cherry;
3464 if (!defined($cherry)) {
3465 $cherry = 0;
3466 }
3467
6c5ee0be 3468 my $end = "HEAD";
b5f4aea6
SR
3469 if (defined($patchcheck_end)) {
3470 $end = $patchcheck_end;
23a0e161 3471 } elsif ($cherry) {
df46fce6 3472 dodie "PATCHCHECK_END must be defined with PATCHCHECK_CHERRY\n";
6c5ee0be
SR
3473 }
3474
a57419b3
SR
3475 # Get the true sha1's since we can use things like HEAD~3
3476 $start = get_sha1($start);
3477 $end = get_sha1($end);
3478
b5f4aea6 3479 my $type = $patchcheck_type;
6c5ee0be
SR
3480
3481 # Can't have a test without having a test to run
3482 if ($type eq "test" && !defined($run_test)) {
3483 $type = "boot";
3484 }
3485
23a0e161
SRRH
3486 if ($cherry) {
3487 open (IN, "git cherry -v $start $end|") or
3488 dodie "could not get git list";
3489 } else {
3490 open (IN, "git log --pretty=oneline $end|") or
3491 dodie "could not get git list";
3492 }
6c5ee0be
SR
3493
3494 my @list;
3495
3496 while (<IN>) {
3497 chomp;
23a0e161
SRRH
3498 # git cherry adds a '+' we want to remove
3499 s/^\+ //;
6c5ee0be
SR
3500 $list[$#list+1] = $_;
3501 last if (/^$start/);
3502 }
3503 close(IN);
3504
23a0e161
SRRH
3505 if (!$cherry) {
3506 if ($list[$#list] !~ /^$start/) {
3507 fail "SHA1 $start not found";
3508 }
3509
3510 # go backwards in the list
3511 @list = reverse @list;
6c5ee0be
SR
3512 }
3513
23a0e161
SRRH
3514 doprint("Going to test the following commits:\n");
3515 foreach my $l (@list) {
3516 doprint "$l\n";
3517 }
6c5ee0be
SR
3518
3519 my $save_clean = $noclean;
1990207d
SR
3520 my %ignored_warnings;
3521
3522 if (defined($ignore_warnings)) {
3523 foreach my $sha1 (split /\s+/, $ignore_warnings) {
3524 $ignored_warnings{$sha1} = 1;
3525 }
3526 }
6c5ee0be
SR
3527
3528 $in_patchcheck = 1;
3529 foreach my $item (@list) {
3530 my $sha1 = $item;
3531 $sha1 =~ s/^([[:xdigit:]]+).*/$1/;
3532
7c2c49ec 3533 doprint "\nProcessing commit \"$item\"\n\n";
6c5ee0be
SR
3534
3535 run_command "git checkout $sha1" or
df46fce6 3536 dodie "Failed to checkout $sha1";
6c5ee0be
SR
3537
3538 # only clean on the first and last patch
3539 if ($item eq $list[0] ||
3540 $item eq $list[$#list]) {
3541 $noclean = $save_clean;
3542 } else {
3543 $noclean = 1;
3544 }
3545
3546 if (defined($minconfig)) {
2b7d9b21 3547 build "useconfig:$minconfig" or return 0;
6c5ee0be
SR
3548 } else {
3549 # ?? no config to use?
2b7d9b21 3550 build "oldconfig" or return 0;
6c5ee0be
SR
3551 }
3552
4283b169
SRRH
3553 # No need to do per patch checking if warnings file exists
3554 if (!defined($warnings_file) && !defined($ignored_warnings{$sha1})) {
3555 check_patch_buildlog $sha1 or return 0;
1990207d 3556 }
6c5ee0be 3557
4283b169
SRRH
3558 check_buildlog or return 0;
3559
6c5ee0be
SR
3560 next if ($type eq "build");
3561
7faafbd6
SR
3562 my $failed = 0;
3563
64d98283 3564 start_monitor_and_install or $failed = 1;
7faafbd6
SR
3565
3566 if (!$failed && $type ne "boot"){
3567 do_run_test or $failed = 1;
3568 }
3569 end_monitor;
38fa3dc1
SRRH
3570 if ($failed) {
3571 print_times;
3572 return 0;
3573 }
27d934b2 3574 patchcheck_reboot;
38fa3dc1 3575 print_times;
6c5ee0be
SR
3576 }
3577 $in_patchcheck = 0;
3578 success $i;
2b7d9b21
SR
3579
3580 return 1;
6c5ee0be
SR
3581}
3582
ac6974c7
SR
3583sub add_dep {
3584 # $config depends on $dep
3585 my ($config, $dep) = @_;
3586
3587 if (defined($depends{$config})) {
3588 $depends{$config} .= " " . $dep;
3589 } else {
3590 $depends{$config} = $dep;
3591 }
3592
3593 # record the number of configs depending on $dep
3594 if (defined $depcount{$dep}) {
3595 $depcount{$dep}++;
3596 } else {
3597 $depcount{$dep} = 1;
3598 }
3599}
3600
b9066f6c
SR
3601# taken from streamline_config.pl
3602sub read_kconfig {
3603 my ($kconfig) = @_;
3604
3605 my $state = "NONE";
3606 my $config;
3607 my @kconfigs;
3608
3609 my $cont = 0;
3610 my $line;
3611
b9066f6c
SR
3612 if (! -f $kconfig) {
3613 doprint "file $kconfig does not exist, skipping\n";
3614 return;
3615 }
3616
3617 open(KIN, "$kconfig")
df46fce6 3618 or dodie "Can't open $kconfig";
b9066f6c
SR
3619 while (<KIN>) {
3620 chomp;
3621
3622 # Make sure that lines ending with \ continue
3623 if ($cont) {
3624 $_ = $line . " " . $_;
3625 }
3626
3627 if (s/\\$//) {
3628 $cont = 1;
3629 $line = $_;
3630 next;
3631 }
3632
3633 $cont = 0;
3634
3635 # collect any Kconfig sources
3636 if (/^source\s*"(.*)"/) {
3637 $kconfigs[$#kconfigs+1] = $1;
3638 }
3639
3640 # configs found
3641 if (/^\s*(menu)?config\s+(\S+)\s*$/) {
3642 $state = "NEW";
3643 $config = $2;
3644
3645 for (my $i = 0; $i < $iflevel; $i++) {
ac6974c7 3646 add_dep $config, $ifdeps[$i];
b9066f6c
SR
3647 }
3648
3649 # collect the depends for the config
3650 } elsif ($state eq "NEW" && /^\s*depends\s+on\s+(.*)$/) {
3651
ac6974c7 3652 add_dep $config, $1;
b9066f6c
SR
3653
3654 # Get the configs that select this config
ac6974c7
SR
3655 } elsif ($state eq "NEW" && /^\s*select\s+(\S+)/) {
3656
3657 # selected by depends on config
3658 add_dep $1, $config;
b9066f6c
SR
3659
3660 # Check for if statements
3661 } elsif (/^if\s+(.*\S)\s*$/) {
3662 my $deps = $1;
3663 # remove beginning and ending non text
3664 $deps =~ s/^[^a-zA-Z0-9_]*//;
3665 $deps =~ s/[^a-zA-Z0-9_]*$//;
3666
3667 my @deps = split /[^a-zA-Z0-9_]+/, $deps;
3668
3669 $ifdeps[$iflevel++] = join ':', @deps;
3670
3671 } elsif (/^endif/) {
3672
3673 $iflevel-- if ($iflevel);
3674
3675 # stop on "help"
3676 } elsif (/^\s*help\s*$/) {
3677 $state = "NONE";
3678 }
3679 }
3680 close(KIN);
3681
3682 # read in any configs that were found.
3683 foreach $kconfig (@kconfigs) {
3684 if (!defined($read_kconfigs{$kconfig})) {
3685 $read_kconfigs{$kconfig} = 1;
3686 read_kconfig("$builddir/$kconfig");
3687 }
3688 }
3689}
3690
3691sub read_depends {
3692 # find out which arch this is by the kconfig file
c043ccbf
JWHV
3693 open (IN, $output_config) or
3694 dodie "Failed to read $output_config";
b9066f6c
SR
3695 my $arch;
3696 while (<IN>) {
3697 if (m,Linux/(\S+)\s+\S+\s+Kernel Configuration,) {
3698 $arch = $1;
3699 last;
3700 }
3701 }
3702 close IN;
3703
3704 if (!defined($arch)) {
3705 doprint "Could not find arch from config file\n";
3706 doprint "no dependencies used\n";
3707 return;
3708 }
3709
3710 # arch is really the subarch, we need to know
3711 # what directory to look at.
3712 if ($arch eq "i386" || $arch eq "x86_64") {
3713 $arch = "x86";
b9066f6c
SR
3714 }
3715
3716 my $kconfig = "$builddir/arch/$arch/Kconfig";
3717
3718 if (! -f $kconfig && $arch =~ /\d$/) {
3719 my $orig = $arch;
12d4cddd 3720 # some subarchs have numbers, truncate them
b9066f6c
SR
3721 $arch =~ s/\d*$//;
3722 $kconfig = "$builddir/arch/$arch/Kconfig";
3723 if (! -f $kconfig) {
3724 doprint "No idea what arch dir $orig is for\n";
3725 doprint "no dependencies used\n";
3726 return;
3727 }
3728 }
3729
3730 read_kconfig($kconfig);
3731}
3732
4c4ab120
SR
3733sub make_new_config {
3734 my @configs = @_;
3735
3736 open (OUT, ">$output_config")
3737 or dodie "Failed to write $output_config";
3738
3739 foreach my $config (@configs) {
3740 print OUT "$config\n";
3741 }
3742 close OUT;
3743}
3744
ac6974c7
SR
3745sub chomp_config {
3746 my ($config) = @_;
3747
3748 $config =~ s/CONFIG_//;
3749
3750 return $config;
3751}
3752
b9066f6c
SR
3753sub get_depends {
3754 my ($dep) = @_;
3755
ac6974c7 3756 my $kconfig = chomp_config $dep;
b9066f6c
SR
3757
3758 $dep = $depends{"$kconfig"};
3759
3760 # the dep string we have saves the dependencies as they
3761 # were found, including expressions like ! && ||. We
3762 # want to split this out into just an array of configs.
3763
3764 my $valid = "A-Za-z_0-9";
3765
3766 my @configs;
3767
3768 while ($dep =~ /[$valid]/) {
b9066f6c
SR
3769 if ($dep =~ /^[^$valid]*([$valid]+)/) {
3770 my $conf = "CONFIG_" . $1;
3771
3772 $configs[$#configs + 1] = $conf;
3773
3774 $dep =~ s/^[^$valid]*[$valid]+//;
3775 } else {
df46fce6 3776 dodie "this should never happen";
b9066f6c
SR
3777 }
3778 }
3779
3780 return @configs;
3781}
3782
b9066f6c
SR
3783sub test_this_config {
3784 my ($config) = @_;
3785
3786 my $found;
3787
3788 # if we already processed this config, skip it
3789 if (defined($processed_configs{$config})) {
3790 return undef;
3791 }
3792 $processed_configs{$config} = 1;
3793
3794 # if this config failed during this round, skip it
3795 if (defined($nochange_config{$config})) {
3796 return undef;
3797 }
3798
ac6974c7 3799 my $kconfig = chomp_config $config;
b9066f6c
SR
3800
3801 # Test dependencies first
3802 if (defined($depends{"$kconfig"})) {
3803 my @parents = get_depends $config;
3804 foreach my $parent (@parents) {
3805 # if the parent is in the min config, check it first
3806 next if (!defined($min_configs{$parent}));
3807 $found = test_this_config($parent);
3808 if (defined($found)) {
3809 return $found;
3810 }
3811 }
3812 }
3813
3814 # Remove this config from the list of configs
fb16d891 3815 # do a make olddefconfig and then read the resulting
b9066f6c
SR
3816 # .config to make sure it is missing the config that
3817 # we had before
3818 my %configs = %min_configs;
ef784eeb 3819 $configs{$config} = "# $config is not set";
b9066f6c
SR
3820 make_new_config ((values %configs), (values %keep_configs));
3821 make_oldconfig;
ef784eeb 3822 delete $configs{$config};
b9066f6c
SR
3823 undef %configs;
3824 assign_configs \%configs, $output_config;
3825
9972fc0b
SRRH
3826 if (!defined($configs{$config}) || $configs{$config} =~ /^#/) {
3827 return $config;
3828 }
b9066f6c
SR
3829
3830 doprint "disabling config $config did not change .config\n";
3831
3832 $nochange_config{$config} = 1;
3833
3834 return undef;
3835}
3836
4c4ab120
SR
3837sub make_min_config {
3838 my ($i) = @_;
3839
ccc513b6
SR
3840 my $type = $minconfig_type;
3841 if ($type ne "boot" && $type ne "test") {
3842 fail "Invalid MIN_CONFIG_TYPE '$minconfig_type'\n" .
3843 " make_min_config works only with 'boot' and 'test'\n" and return;
3844 }
3845
4c4ab120
SR
3846 if (!defined($output_minconfig)) {
3847 fail "OUTPUT_MIN_CONFIG not defined" and return;
3848 }
35ce5952
SR
3849
3850 # If output_minconfig exists, and the start_minconfig
3851 # came from min_config, than ask if we should use
3852 # that instead.
3853 if (-f $output_minconfig && !$start_minconfig_defined) {
3854 print "$output_minconfig exists\n";
43de3316
SR
3855 if (!defined($use_output_minconfig)) {
3856 if (read_yn " Use it as minconfig?") {
3857 $start_minconfig = $output_minconfig;
3858 }
3859 } elsif ($use_output_minconfig > 0) {
3860 doprint "Using $output_minconfig as MIN_CONFIG\n";
35ce5952 3861 $start_minconfig = $output_minconfig;
43de3316
SR
3862 } else {
3863 doprint "Set to still use MIN_CONFIG as starting point\n";
35ce5952
SR
3864 }
3865 }
3866
4c4ab120
SR
3867 if (!defined($start_minconfig)) {
3868 fail "START_MIN_CONFIG or MIN_CONFIG not defined" and return;
3869 }
3870
35ce5952
SR
3871 my $temp_config = "$tmpdir/temp_config";
3872
4c4ab120
SR
3873 # First things first. We build an allnoconfig to find
3874 # out what the defaults are that we can't touch.
3875 # Some are selections, but we really can't handle selections.
3876
3877 my $save_minconfig = $minconfig;
3878 undef $minconfig;
3879
3880 run_command "$make allnoconfig" or return 0;
3881
b9066f6c
SR
3882 read_depends;
3883
4c4ab120 3884 process_config_ignore $output_config;
b9066f6c 3885
43d1b651 3886 undef %save_configs;
b9066f6c 3887 undef %min_configs;
4c4ab120
SR
3888
3889 if (defined($ignore_config)) {
3890 # make sure the file exists
3891 `touch $ignore_config`;
43d1b651 3892 assign_configs \%save_configs, $ignore_config;
4c4ab120
SR
3893 }
3894
43d1b651
SR
3895 %keep_configs = %save_configs;
3896
4c4ab120
SR
3897 doprint "Load initial configs from $start_minconfig\n";
3898
3899 # Look at the current min configs, and save off all the
3900 # ones that were set via the allnoconfig
4c4ab120
SR
3901 assign_configs \%min_configs, $start_minconfig;
3902
3903 my @config_keys = keys %min_configs;
3904
ac6974c7
SR
3905 # All configs need a depcount
3906 foreach my $config (@config_keys) {
3907 my $kconfig = chomp_config $config;
3908 if (!defined $depcount{$kconfig}) {
12d4cddd 3909 $depcount{$kconfig} = 0;
ac6974c7
SR
3910 }
3911 }
3912
4c4ab120
SR
3913 # Remove anything that was set by the make allnoconfig
3914 # we shouldn't need them as they get set for us anyway.
3915 foreach my $config (@config_keys) {
3916 # Remove anything in the ignore_config
3917 if (defined($keep_configs{$config})) {
3918 my $file = $ignore_config;
3919 $file =~ s,.*/(.*?)$,$1,;
3920 doprint "$config set by $file ... ignored\n";
3921 delete $min_configs{$config};
3922 next;
3923 }
3924 # But make sure the settings are the same. If a min config
3925 # sets a selection, we do not want to get rid of it if
3926 # it is not the same as what we have. Just move it into
3927 # the keep configs.
3928 if (defined($config_ignore{$config})) {
3929 if ($config_ignore{$config} ne $min_configs{$config}) {
3930 doprint "$config is in allnoconfig as '$config_ignore{$config}'";
3931 doprint " but it is '$min_configs{$config}' in minconfig .. keeping\n";
3932 $keep_configs{$config} = $min_configs{$config};
3933 } else {
3934 doprint "$config set by allnoconfig ... ignored\n";
3935 }
3936 delete $min_configs{$config};
3937 }
3938 }
3939
4c4ab120 3940 my $done = 0;
b9066f6c 3941 my $take_two = 0;
4c4ab120
SR
3942
3943 while (!$done) {
4c4ab120
SR
3944 my $config;
3945 my $found;
3946
3947 # Now disable each config one by one and do a make oldconfig
3948 # till we find a config that changes our list.
3949
4c4ab120 3950 my @test_configs = keys %min_configs;
ac6974c7
SR
3951
3952 # Sort keys by who is most dependent on
3953 @test_configs = sort { $depcount{chomp_config($b)} <=> $depcount{chomp_config($a)} }
c043ccbf 3954 @test_configs ;
ac6974c7
SR
3955
3956 # Put configs that did not modify the config at the end.
4c4ab120
SR
3957 my $reset = 1;
3958 for (my $i = 0; $i < $#test_configs; $i++) {
3959 if (!defined($nochange_config{$test_configs[0]})) {
3960 $reset = 0;
3961 last;
3962 }
3963 # This config didn't change the .config last time.
3964 # Place it at the end
3965 my $config = shift @test_configs;
3966 push @test_configs, $config;
3967 }
3968
3969 # if every test config has failed to modify the .config file
3970 # in the past, then reset and start over.
3971 if ($reset) {
3972 undef %nochange_config;
3973 }
3974
b9066f6c
SR
3975 undef %processed_configs;
3976
4c4ab120
SR
3977 foreach my $config (@test_configs) {
3978
b9066f6c 3979 $found = test_this_config $config;
4c4ab120 3980
b9066f6c 3981 last if (defined($found));
4c4ab120
SR
3982
3983 # oh well, try another config
4c4ab120
SR
3984 }
3985
3986 if (!defined($found)) {
b9066f6c
SR
3987 # we could have failed due to the nochange_config hash
3988 # reset and try again
3989 if (!$take_two) {
3990 undef %nochange_config;
3991 $take_two = 1;
3992 next;
3993 }
4c4ab120
SR
3994 doprint "No more configs found that we can disable\n";
3995 $done = 1;
3996 last;
3997 }
b9066f6c 3998 $take_two = 0;
4c4ab120
SR
3999
4000 $config = $found;
4001
4002 doprint "Test with $config disabled\n";
4003
4004 # set in_bisect to keep build and monitor from dieing
4005 $in_bisect = 1;
4006
4007 my $failed = 0;
bf1c95ab
SR
4008 build "oldconfig" or $failed = 1;
4009 if (!$failed) {
12d4cddd 4010 start_monitor_and_install or $failed = 1;
ccc513b6 4011
12d4cddd
JWHV
4012 if ($type eq "test" && !$failed) {
4013 do_run_test or $failed = 1;
4014 }
ccc513b6 4015
12d4cddd 4016 end_monitor;
bf1c95ab 4017 }
4c4ab120
SR
4018
4019 $in_bisect = 0;
4020
4021 if ($failed) {
b9066f6c 4022 doprint "$min_configs{$config} is needed to boot the box... keeping\n";
4c4ab120
SR
4023 # this config is needed, add it to the ignore list.
4024 $keep_configs{$config} = $min_configs{$config};
43d1b651 4025 $save_configs{$config} = $min_configs{$config};
4c4ab120 4026 delete $min_configs{$config};
35ce5952
SR
4027
4028 # update new ignore configs
4029 if (defined($ignore_config)) {
c043ccbf
JWHV
4030 open (OUT, ">$temp_config") or
4031 dodie "Can't write to $temp_config";
43d1b651
SR
4032 foreach my $config (keys %save_configs) {
4033 print OUT "$save_configs{$config}\n";
35ce5952
SR
4034 }
4035 close OUT;
4036 run_command "mv $temp_config $ignore_config" or
4037 dodie "failed to copy update to $ignore_config";
4038 }
4039
4c4ab120
SR
4040 } else {
4041 # We booted without this config, remove it from the minconfigs.
4042 doprint "$config is not needed, disabling\n";
4043
4044 delete $min_configs{$config};
4045
4046 # Also disable anything that is not enabled in this config
4047 my %configs;
4048 assign_configs \%configs, $output_config;
4049 my @config_keys = keys %min_configs;
4050 foreach my $config (@config_keys) {
4051 if (!defined($configs{$config})) {
4052 doprint "$config is not set, disabling\n";
4053 delete $min_configs{$config};
4054 }
4055 }
4056
22722799 4057 # Save off all the current mandatory configs
c043ccbf
JWHV
4058 open (OUT, ">$temp_config") or
4059 dodie "Can't write to $temp_config";
4c4ab120
SR
4060 foreach my $config (keys %keep_configs) {
4061 print OUT "$keep_configs{$config}\n";
4062 }
4063 foreach my $config (keys %min_configs) {
4064 print OUT "$min_configs{$config}\n";
4065 }
4066 close OUT;
35ce5952
SR
4067
4068 run_command "mv $temp_config $output_minconfig" or
4069 dodie "failed to copy update to $output_minconfig";
4c4ab120
SR
4070 }
4071
4072 doprint "Reboot and wait $sleep_time seconds\n";
bc7c5803 4073 reboot_to_good $sleep_time;
4c4ab120
SR
4074 }
4075
4076 success $i;
4077 return 1;
4078}
4079
4283b169
SRRH
4080sub make_warnings_file {
4081 my ($i) = @_;
4082
4083 if (!defined($warnings_file)) {
4084 dodie "Must define WARNINGS_FILE for make_warnings_file test";
4085 }
4086
4087 if ($build_type eq "nobuild") {
4088 dodie "BUILD_TYPE can not be 'nobuild' for make_warnings_file test";
4089 }
4090
4091 build $build_type or dodie "Failed to build";
4092
4093 open(OUT, ">$warnings_file") or dodie "Can't create $warnings_file";
4094
4095 open(IN, $buildlog) or dodie "Can't open $buildlog";
4096 while (<IN>) {
4283b169
SRRH
4097 # Some compilers use UTF-8 extended for quotes
4098 # for distcc heterogeneous systems, this causes issues
4099 s/$utf8_quote/'/g;
4100
4101 if (/$check_build_re/) {
4102 print OUT;
4103 }
4104 }
4105 close(IN);
4106
4107 close(OUT);
4108
4109 success $i;
4110}
4111
22c37a9a
SRRH
4112sub option_defined {
4113 my ($option) = @_;
4114
4115 if (defined($opt{$option}) && $opt{$option} !~ /^\s*$/) {
4116 return 1;
4117 }
4118
4119 return 0;
4120}
4121
2a62512b 4122sub __set_test_option {
5a391fbf 4123 my ($name, $i) = @_;
2545eb61 4124
5a391fbf 4125 my $option = "$name\[$i\]";
5c42fc5b 4126
22c37a9a 4127 if (option_defined($option)) {
5a391fbf 4128 return $opt{$option};
5f9b6ced
SR
4129 }
4130
a57419b3
SR
4131 foreach my $test (keys %repeat_tests) {
4132 if ($i >= $test &&
4133 $i < $test + $repeat_tests{$test}) {
4134 $option = "$name\[$test\]";
22c37a9a 4135 if (option_defined($option)) {
a57419b3
SR
4136 return $opt{$option};
4137 }
4138 }
4139 }
4140
22c37a9a 4141 if (option_defined($name)) {
5a391fbf 4142 return $opt{$name};
2545eb61
SR
4143 }
4144
5a391fbf
SR
4145 return undef;
4146}
4147
2a62512b
SR
4148sub set_test_option {
4149 my ($name, $i) = @_;
4150
4151 my $option = __set_test_option($name, $i);
4152 return $option if (!defined($option));
4153
04262be3 4154 return eval_option($name, $option, $i);
2a62512b
SR
4155}
4156
be1546b8
SRV
4157sub find_mailer {
4158 my ($mailer) = @_;
4159
4160 my @paths = split /:/, $ENV{PATH};
4161
4162 # sendmail is usually in /usr/sbin
4163 $paths[$#paths + 1] = "/usr/sbin";
4164
4165 foreach my $path (@paths) {
4166 if (-x "$path/$mailer") {
4167 return $path;
4168 }
4169 }
4170
4171 return undef;
2ceb2d85
TTC
4172}
4173
c2d84ddb 4174sub do_send_mail {
34148b13 4175 my ($subject, $message, $file) = @_;
c2d84ddb
SRV
4176
4177 if (!defined($mail_path)) {
4178 # find the mailer
4179 $mail_path = find_mailer $mailer;
4180 if (!defined($mail_path)) {
4181 die "\nCan not find $mailer in PATH\n";
4182 }
4183 }
4184
34148b13
SRV
4185 my $header_file = "$tmpdir/header";
4186 open (HEAD, ">$header_file") or die "Can not create $header_file\n";
4187 print HEAD "To: $mailto\n";
4188 print HEAD "Subject: $subject\n\n";
4189 print HEAD "$message\n";
4190 close HEAD;
4191
c2d84ddb
SRV
4192 if (!defined($mail_command)) {
4193 if ($mailer eq "mail" || $mailer eq "mailx") {
34148b13 4194 $mail_command = "cat \$HEADER_FILE \$BODY_FILE | \$MAIL_PATH/\$MAILER -s \'\$SUBJECT\' \$MAILTO";
c2d84ddb 4195 } elsif ($mailer eq "sendmail" ) {
34148b13 4196 $mail_command = "cat \$HEADER_FILE \$BODY_FILE | \$MAIL_PATH/\$MAILER -t \$MAILTO";
c2d84ddb
SRV
4197 } else {
4198 die "\nYour mailer: $mailer is not supported.\n";
4199 }
4200 }
4201
34148b13
SRV
4202 if (defined($file)) {
4203 $mail_command =~ s/\$BODY_FILE/$file/g;
4204 } else {
4205 $mail_command =~ s/\$BODY_FILE//g;
4206 }
4207
4208 $mail_command =~ s/\$HEADER_FILE/$header_file/g;
c2d84ddb
SRV
4209 $mail_command =~ s/\$MAILER/$mailer/g;
4210 $mail_command =~ s/\$MAIL_PATH/$mail_path/g;
4211 $mail_command =~ s/\$MAILTO/$mailto/g;
4212 $mail_command =~ s/\$SUBJECT/$subject/g;
4213 $mail_command =~ s/\$MESSAGE/$message/g;
4214
8cd6bc03
SRV
4215 my $ret = run_command $mail_command;
4216 if (!$ret && defined($file)) {
4217 # try again without the file
4218 $message .= "\n\n*** FAILED TO SEND LOG ***\n\n";
4219 do_send_email($subject, $message);
4220 }
c2d84ddb
SRV
4221}
4222
2ceb2d85 4223sub send_email {
f5ef4885
SRV
4224 if (defined($mailto)) {
4225 if (!defined($mailer)) {
4226 doprint "No email sent: email or mailer not specified in config.\n";
4227 return;
4228 }
c2d84ddb 4229 do_send_mail @_;
2ceb2d85
TTC
4230 }
4231}
4232
92db453e 4233sub cancel_test {
83d29d43
SR
4234 if ($monitor_cnt) {
4235 end_monitor;
4236 }
92db453e 4237 if ($email_when_canceled) {
fca797f1 4238 my $name = get_test_name;
12d4cddd 4239 send_email("KTEST: Your [$name] test was cancelled",
c043ccbf 4240 "Your test started at $script_start_time was cancelled: sig int");
92db453e
TTC
4241 }
4242 die "\nCaught Sig Int, test interrupted: $!\n"
4243}
4244
6a0f3652
JWHV
4245$#ARGV < 1 or die "ktest.pl version: $VERSION\n usage: ktest.pl [config-file]\n";
4246
4247if ($#ARGV == 0) {
4248 $ktest_config = $ARGV[0];
4249 if (! -f $ktest_config) {
4250 print "$ktest_config does not exist.\n";
4251 if (!read_yn "Create it?") {
4252 exit 0;
4253 }
4254 }
4255}
4256
4257if (! -f $ktest_config) {
4258 $newconfig = 1;
4259 get_test_case;
4260 open(OUT, ">$ktest_config") or die "Can not create $ktest_config";
4261 print OUT << "EOF"
4262# Generated by ktest.pl
4263#
4264
4265# PWD is a ktest.pl variable that will result in the process working
4266# directory that ktest.pl is executed in.
4267
4268# THIS_DIR is automatically assigned the PWD of the path that generated
4269# the config file. It is best to use this variable when assigning other
4270# directory paths within this directory. This allows you to easily
4271# move the test cases to other locations or to other machines.
4272#
4273THIS_DIR := $variable{"PWD"}
4274
4275# Define each test with TEST_START
4276# The config options below it will override the defaults
4277TEST_START
4278TEST_TYPE = $default{"TEST_TYPE"}
4279
4280DEFAULTS
4281EOF
4282;
4283 close(OUT);
4284}
4285read_config $ktest_config;
4286
4287if (defined($opt{"LOG_FILE"})) {
4288 $opt{"LOG_FILE"} = eval_option("LOG_FILE", $opt{"LOG_FILE"}, -1);
4289}
4290
4291# Append any configs entered in manually to the config file.
4292my @new_configs = keys %entered_configs;
4293if ($#new_configs >= 0) {
4294 print "\nAppending entered in configs to $ktest_config\n";
4295 open(OUT, ">>$ktest_config") or die "Can not append to $ktest_config";
4296 foreach my $config (@new_configs) {
4297 print OUT "$config = $entered_configs{$config}\n";
4298 $opt{$config} = process_variables($entered_configs{$config});
4299 }
4300}
4301
4302if (defined($opt{"LOG_FILE"})) {
4303 if ($opt{"CLEAR_LOG"}) {
4304 unlink $opt{"LOG_FILE"};
4305 }
5a1bed23
AJ
4306
4307 if (! -e $opt{"LOG_FILE"} && $opt{"LOG_FILE"} =~ m,^(.*/),) {
4308 my $dir = $1;
4309 if (! -d $dir) {
4310 mkpath($dir) or die "Failed to create directories '$dir': $!";
4311 print "\nThe log directory $dir did not exist, so it was created.\n";
4312 }
4313 }
6a0f3652
JWHV
4314 open(LOG, ">> $opt{LOG_FILE}") or die "Can't write to $opt{LOG_FILE}";
4315 LOG->autoflush(1);
4316}
4317
4318doprint "\n\nSTARTING AUTOMATED TESTS\n\n";
4319
4320for (my $i = 0, my $repeat = 1; $i <= $opt{"NUM_TESTS"}; $i += $repeat) {
4321
4322 if (!$i) {
4323 doprint "DEFAULT OPTIONS:\n";
4324 } else {
4325 doprint "\nTEST $i OPTIONS";
4326 if (defined($repeat_tests{$i})) {
4327 $repeat = $repeat_tests{$i};
4328 doprint " ITERATE $repeat";
4329 }
4330 doprint "\n";
4331 }
4332
4333 foreach my $option (sort keys %opt) {
4334 if ($option =~ /\[(\d+)\]$/) {
4335 next if ($i != $1);
4336 } else {
4337 next if ($i);
4338 }
4339
4340 doprint "$option = $opt{$option}\n";
4341 }
4342}
4343
92db453e
TTC
4344$SIG{INT} = qw(cancel_test);
4345
5a391fbf 4346# First we need to do is the builds
a75fecec
SR
4347for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {
4348
4ab1cce5
SR
4349 # Do not reboot on failing test options
4350 $no_reboot = 1;
759a3cc6 4351 $reboot_success = 0;
4ab1cce5 4352
683a3e64
SR
4353 $have_version = 0;
4354
576f627c
SR
4355 $iteration = $i;
4356
38fa3dc1
SRRH
4357 $build_time = 0;
4358 $install_time = 0;
4359 $reboot_time = 0;
4360 $test_time = 0;
4361
c1434dcc
SR
4362 undef %force_config;
4363
a75fecec
SR
4364 my $makecmd = set_test_option("MAKE_CMD", $i);
4365
8e80bf05
SRRH
4366 $outputdir = set_test_option("OUTPUT_DIR", $i);
4367 $builddir = set_test_option("BUILD_DIR", $i);
4368
df46fce6 4369 chdir $builddir || dodie "can't change directory to $builddir";
8e80bf05
SRRH
4370
4371 if (!-d $outputdir) {
4372 mkpath($outputdir) or
df46fce6 4373 dodie "can't create $outputdir";
8e80bf05
SRRH
4374 }
4375
4376 $make = "$makecmd O=$outputdir";
4377
9cc9e091
SR
4378 # Load all the options into their mapped variable names
4379 foreach my $opt (keys %option_map) {
4380 ${$option_map{$opt}} = set_test_option($opt, $i);
4381 }
b5f4aea6 4382
35ce5952
SR
4383 $start_minconfig_defined = 1;
4384
921ed4c7 4385 # The first test may override the PRE_KTEST option
2ceb2d85 4386 if ($i == 1) {
12d4cddd
JWHV
4387 if (defined($pre_ktest)) {
4388 doprint "\n";
4389 run_command $pre_ktest;
4390 }
4391 if ($email_when_started) {
fca797f1 4392 my $name = get_test_name;
12d4cddd 4393 send_email("KTEST: Your [$name] test was started",
c043ccbf 4394 "Your test was started on $script_start_time");
12d4cddd 4395 }
921ed4c7
SR
4396 }
4397
4398 # Any test can override the POST_KTEST option
4399 # The last test takes precedence.
4400 if (defined($post_ktest)) {
4401 $final_post_ktest = $post_ktest;
4402 }
4403
4c4ab120 4404 if (!defined($start_minconfig)) {
35ce5952 4405 $start_minconfig_defined = 0;
4c4ab120
SR
4406 $start_minconfig = $minconfig;
4407 }
4408
8e80bf05
SRRH
4409 if (!-d $tmpdir) {
4410 mkpath($tmpdir) or
df46fce6 4411 dodie "can't create $tmpdir";
a75fecec 4412 }
1a5cfce3 4413
e48c5293
SR
4414 $ENV{"SSH_USER"} = $ssh_user;
4415 $ENV{"MACHINE"} = $machine;
4416
a75fecec 4417 $buildlog = "$tmpdir/buildlog-$machine";
a9dd5d63 4418 $testlog = "$tmpdir/testlog-$machine";
a75fecec 4419 $dmesg = "$tmpdir/dmesg-$machine";
51ad1dd1 4420 $output_config = "$outputdir/.config";
a75fecec 4421
bb8474b1
SR
4422 if (!$buildonly) {
4423 $target = "$ssh_user\@$machine";
ac246645 4424 if (($reboot_type eq "grub") or ($reboot_type eq "grub2bls")) {
bb8474b1 4425 dodie "GRUB_MENU not defined" if (!defined($grub_menu));
a15ba913
SR
4426 } elsif ($reboot_type eq "grub2") {
4427 dodie "GRUB_MENU not defined" if (!defined($grub_menu));
4428 dodie "GRUB_FILE not defined" if (!defined($grub_file));
7786954c
SR
4429 } elsif ($reboot_type eq "syslinux") {
4430 dodie "SYSLINUX_LABEL not defined" if (!defined($syslinux_label));
bb8474b1 4431 }
a75fecec
SR
4432 }
4433
4434 my $run_type = $build_type;
4435 if ($test_type eq "patchcheck") {
b5f4aea6 4436 $run_type = $patchcheck_type;
a75fecec 4437 } elsif ($test_type eq "bisect") {
b5f4aea6 4438 $run_type = $bisect_type;
0a05c769 4439 } elsif ($test_type eq "config_bisect") {
b5f4aea6 4440 $run_type = $config_bisect_type;
4283b169
SRRH
4441 } elsif ($test_type eq "make_min_config") {
4442 $run_type = "";
4443 } elsif ($test_type eq "make_warnings_file") {
4c4ab120
SR
4444 $run_type = "";
4445 }
4446
a75fecec
SR
4447 # mistake in config file?
4448 if (!defined($run_type)) {
4449 $run_type = "ERROR";
4450 }
5a391fbf 4451
e0a8742e
SR
4452 my $installme = "";
4453 $installme = " no_install" if ($no_install);
4454
18656c70
SRRH
4455 my $name = "";
4456
4457 if (defined($test_name)) {
4458 $name = " ($test_name)";
4459 }
4460
2545eb61 4461 doprint "\n\n";
34148b13
SRV
4462
4463 if (defined($opt{"LOG_FILE"})) {
4464 $test_log_start = tell(LOG);
4465 }
4466
18656c70 4467 doprint "RUNNING TEST $i of $opt{NUM_TESTS}$name with option $test_type $run_type$installme\n\n";
7faafbd6 4468
921ed4c7 4469 if (defined($pre_test)) {
d53cdda3
SRV
4470 my $ret = run_command $pre_test;
4471 if (!$ret && defined($pre_test_die) &&
4472 $pre_test_die) {
c043ccbf 4473 dodie "failed to pre_test\n";
d53cdda3 4474 }
921ed4c7
SR
4475 }
4476
7faafbd6
SR
4477 unlink $dmesg;
4478 unlink $buildlog;
a9dd5d63 4479 unlink $testlog;
2545eb61 4480
250bae8b
SR
4481 if (defined($addconfig)) {
4482 my $min = $minconfig;
4483 if (!defined($minconfig)) {
4484 $min = "";
4485 }
4486 run_command "cat $addconfig $min > $tmpdir/add_config" or
2b7d9b21 4487 dodie "Failed to create temp config";
9be2e6b5 4488 $minconfig = "$tmpdir/add_config";
2b7d9b21
SR
4489 }
4490
6c5ee0be
SR
4491 if (defined($checkout)) {
4492 run_command "git checkout $checkout" or
df46fce6 4493 dodie "failed to checkout $checkout";
6c5ee0be
SR
4494 }
4495
759a3cc6
SR
4496 $no_reboot = 0;
4497
648a182c
SR
4498 # A test may opt to not reboot the box
4499 if ($reboot_on_success) {
759a3cc6 4500 $reboot_success = 1;
648a182c 4501 }
4ab1cce5 4502
a75fecec 4503 if ($test_type eq "bisect") {
5f9b6ced
SR
4504 bisect $i;
4505 next;
0a05c769
SR
4506 } elsif ($test_type eq "config_bisect") {
4507 config_bisect $i;
4508 next;
a75fecec 4509 } elsif ($test_type eq "patchcheck") {
6c5ee0be
SR
4510 patchcheck $i;
4511 next;
4c4ab120
SR
4512 } elsif ($test_type eq "make_min_config") {
4513 make_min_config $i;
4514 next;
4283b169
SRRH
4515 } elsif ($test_type eq "make_warnings_file") {
4516 $no_reboot = 1;
4517 make_warnings_file $i;
4518 next;
2545eb61 4519 }
2545eb61 4520
7faafbd6
SR
4521 if ($build_type ne "nobuild") {
4522 build $build_type or next;
4283b169 4523 check_buildlog or next;
2545eb61
SR
4524 }
4525
cd8e368f
SR
4526 if ($test_type eq "install") {
4527 get_version;
4528 install;
4529 success $i;
4530 next;
4531 }
4532
a75fecec 4533 if ($test_type ne "build") {
a75fecec 4534 my $failed = 0;
64d98283 4535 start_monitor_and_install or $failed = 1;
a75fecec
SR
4536
4537 if (!$failed && $test_type ne "boot" && defined($run_test)) {
4538 do_run_test or $failed = 1;
4539 }
4540 end_monitor;
38fa3dc1
SRRH
4541 if ($failed) {
4542 print_times;
4543 next;
4544 }
5a391fbf
SR
4545 }
4546
38fa3dc1
SRRH
4547 print_times;
4548
5f9b6ced 4549 success $i;
2545eb61
SR
4550}
4551
921ed4c7 4552if (defined($final_post_ktest)) {
cc2eb3a2
MM
4553
4554 my $cp_final_post_ktest = eval_kernel_version $final_post_ktest;
4555 run_command $cp_final_post_ktest;
921ed4c7
SR
4556}
4557
5c42fc5b 4558if ($opt{"POWEROFF_ON_SUCCESS"}) {
75c3fda7 4559 halt;
759a3cc6 4560} elsif ($opt{"REBOOT_ON_SUCCESS"} && !do_not_reboot && $reboot_success) {
bc7c5803 4561 reboot_to_good;
648a182c
SR
4562} elsif (defined($switch_to_good)) {
4563 # still need to get to the good kernel
4564 run_command $switch_to_good;
5c42fc5b 4565}
75c3fda7 4566
e48c5293
SR
4567doprint "\n $successes of $opt{NUM_TESTS} tests were successful\n\n";
4568
2ceb2d85 4569if ($email_when_finished) {
fca797f1 4570 send_email("KTEST: Your test has finished!",
c043ccbf 4571 "$successes of $opt{NUM_TESTS} tests started at $script_start_time were successful!");
2ceb2d85 4572}
d6bc29d9
SRV
4573
4574if (defined($opt{"LOG_FILE"})) {
4575 print "\n See $opt{LOG_FILE} for the record of results.\n\n";
4576 close LOG;
4577}
4578
2545eb61 4579exit 0;
becdd17b
JWHV
4580
4581##
4582# The following are here to standardize tabs/spaces/etc across the most likely editors
4583###
4584
4585# Local Variables:
4586# mode: perl
4587# End:
4588# vim: softtabstop=4