~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/tools/testing/ktest/ktest.pl

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /tools/testing/ktest/ktest.pl (Version linux-6.12-rc7) and /tools/testing/ktest/ktest.pl (Version linux-3.10.108)


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

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php