Blame view

tools/testing/ktest/ktest.pl 76.6 KB
2545eb619   Steven Rostedt   Initial start of ...
1
  #!/usr/bin/perl -w
d6ce2a0b3   Steven Rostedt   ktest: Add revers...
2
  #
cce1dac87   Uwe Kleine-König   trivial: Fix Stev...
3
  # Copyright 2010 - Steven Rostedt <srostedt@redhat.com>, Red Hat Inc.
d6ce2a0b3   Steven Rostedt   ktest: Add revers...
4
5
  # Licensed under the terms of the GNU GPL License version 2
  #
2545eb619   Steven Rostedt   Initial start of ...
6
7
8
9
  
  use strict;
  use IPC::Open2;
  use Fcntl qw(F_GETFL F_SETFL O_NONBLOCK);
7faafbd69   Steven Rostedt   ktest: Add open a...
10
11
  use File::Path qw(mkpath);
  use File::Copy qw(cp);
2545eb619   Steven Rostedt   Initial start of ...
12
  use FileHandle;
e48c5293b   Steven Rostedt   ktest/cleanups: A...
13
  my $VERSION = "0.2";
2545eb619   Steven Rostedt   Initial start of ...
14
15
16
  $| = 1;
  
  my %opt;
a57419b36   Steven Rostedt   ktest: New TEST_S...
17
18
  my %repeat_tests;
  my %repeats;
2545eb619   Steven Rostedt   Initial start of ...
19
20
  
  #default opts
4f43e0dca   Steven Rostedt   ktest: Change ini...
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
  my %default = (
      "NUM_TESTS"			=> 1,
      "TEST_TYPE"			=> "build",
      "BUILD_TYPE"		=> "randconfig",
      "MAKE_CMD"			=> "make",
      "TIMEOUT"			=> 120,
      "TMP_DIR"			=> "/tmp/ktest/\${MACHINE}",
      "SLEEP_TIME"		=> 60,	# sleep time between tests
      "BUILD_NOCLEAN"		=> 0,
      "REBOOT_ON_ERROR"		=> 0,
      "POWEROFF_ON_ERROR"		=> 0,
      "REBOOT_ON_SUCCESS"		=> 1,
      "POWEROFF_ON_SUCCESS"	=> 0,
      "BUILD_OPTIONS"		=> "",
      "BISECT_SLEEP_TIME"		=> 60,   # sleep time between bisects
      "PATCHCHECK_SLEEP_TIME"	=> 60, # sleep time between patch checks
      "CLEAR_LOG"			=> 0,
      "BISECT_MANUAL"		=> 0,
      "BISECT_SKIP"		=> 1,
      "SUCCESS_LINE"		=> "login:",
      "DETECT_TRIPLE_FAULT"	=> 1,
      "NO_INSTALL"		=> 0,
      "BOOTED_TIMEOUT"		=> 1,
      "DIE_ON_FAILURE"		=> 1,
      "SSH_EXEC"			=> "ssh \$SSH_USER\@\$MACHINE \$SSH_COMMAND",
      "SCP_TO_TARGET"		=> "scp \$SRC_FILE \$SSH_USER\@\$MACHINE:\$DST_FILE",
      "REBOOT"			=> "ssh \$SSH_USER\@\$MACHINE reboot",
      "STOP_AFTER_SUCCESS"	=> 10,
      "STOP_AFTER_FAILURE"	=> 60,
      "STOP_TEST_AFTER"		=> 600,
600bbf0aa   Steven Rostedt   ktest: Add defaul...
51
52
53
  
  # required, and we will ask users if they don't have them but we keep the default
  # value something that is common.
4f43e0dca   Steven Rostedt   ktest: Change ini...
54
55
56
57
58
      "REBOOT_TYPE"		=> "grub",
      "LOCALVERSION"		=> "-test",
      "SSH_USER"			=> "root",
      "BUILD_TARGET"	 	=> "arch/x86/boot/bzImage",
      "TARGET_IMAGE"		=> "/boot/vmlinuz-test",
9cc9e091e   Steven Rostedt   ktest: Detect typ...
59
60
61
  
      "LOG_FILE"			=> undef,
      "IGNORE_UNUSED"		=> 0,
4f43e0dca   Steven Rostedt   ktest: Change ini...
62
  );
2545eb619   Steven Rostedt   Initial start of ...
63

8d1491bae   Steven Rostedt   ktest: Ask for th...
64
  my $ktest_config;
2545eb619   Steven Rostedt   Initial start of ...
65
  my $version;
a75fececf   Steven Rostedt   ktest: Added samp...
66
  my $machine;
e48c5293b   Steven Rostedt   ktest/cleanups: A...
67
  my $ssh_user;
a75fececf   Steven Rostedt   ktest: Added samp...
68
69
70
  my $tmpdir;
  my $builddir;
  my $outputdir;
51ad1dd10   Steven Rostedt   ktest: Use $outpu...
71
  my $output_config;
a75fececf   Steven Rostedt   ktest: Added samp...
72
  my $test_type;
7faafbd69   Steven Rostedt   ktest: Add open a...
73
  my $build_type;
a75fececf   Steven Rostedt   ktest: Added samp...
74
  my $build_options;
0bd6c1a38   Steven Rostedt   ktest: Add POST/P...
75
76
77
78
  my $pre_build;
  my $post_build;
  my $pre_build_die;
  my $post_build_die;
a75fececf   Steven Rostedt   ktest: Added samp...
79
80
81
  my $reboot_type;
  my $reboot_script;
  my $power_cycle;
e48c5293b   Steven Rostedt   ktest/cleanups: A...
82
  my $reboot;
a75fececf   Steven Rostedt   ktest: Added samp...
83
  my $reboot_on_error;
bc7c58037   Steven Rostedt   ktest: Add option...
84
85
  my $switch_to_good;
  my $switch_to_test;
a75fececf   Steven Rostedt   ktest: Added samp...
86
87
  my $poweroff_on_error;
  my $die_on_failure;
576f627c8   Steven Rostedt   ktest: Add powero...
88
89
  my $powercycle_after_reboot;
  my $poweroff_after_halt;
e48c5293b   Steven Rostedt   ktest/cleanups: A...
90
91
  my $ssh_exec;
  my $scp_to_target;
a75fececf   Steven Rostedt   ktest: Added samp...
92
93
  my $power_off;
  my $grub_menu;
2545eb619   Steven Rostedt   Initial start of ...
94
95
96
  my $grub_number;
  my $target;
  my $make;
8b37ca8ca   Steven Rostedt   ktest: Add POST_I...
97
  my $post_install;
e0a8742e3   Steven Rostedt   ktest: Add NO_INS...
98
  my $no_install;
5c42fc5b9   Steven Rostedt   ktest: New featur...
99
  my $noclean;
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
100
  my $minconfig;
4c4ab1204   Steven Rostedt   ktest: Add test t...
101
  my $start_minconfig;
35ce5952e   Steven Rostedt   ktest: Add prompt...
102
  my $start_minconfig_defined;
4c4ab1204   Steven Rostedt   ktest: Add test t...
103
104
  my $output_minconfig;
  my $ignore_config;
be405f95f   Steven Rostedt   ktest: Add INGORE...
105
  my $ignore_errors;
2b7d9b214   Steven Rostedt   ktest: Added cont...
106
  my $addconfig;
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
107
  my $in_bisect = 0;
b5f4aea68   Steven Rostedt   ktest: Have all v...
108
  my $bisect_bad_commit = "";
d6ce2a0b3   Steven Rostedt   ktest: Add revers...
109
  my $reverse_bisect;
c960bb9f5   Steven Rostedt   ktest: Add manual...
110
  my $bisect_manual;
c23dca7cd   Steven Rostedt   ktest: Add BISECT...
111
  my $bisect_skip;
30f75da5f   Steven Rostedt   ktest: Add CONFIG...
112
  my $config_bisect_good;
c5dacb88f   Steven Rostedt   ktest: Allow over...
113
114
115
116
117
  my $bisect_ret_good;
  my $bisect_ret_bad;
  my $bisect_ret_skip;
  my $bisect_ret_abort;
  my $bisect_ret_default;
6c5ee0be0   Steven Rostedt   ktest: Added patc...
118
  my $in_patchcheck = 0;
5a391fbff   Steven Rostedt   ktest: Added bett...
119
  my $run_test;
6c5ee0be0   Steven Rostedt   ktest: Added patc...
120
  my $redirect;
7faafbd69   Steven Rostedt   ktest: Add open a...
121
  my $buildlog;
a9dd5d631   Rabin Vincent   ktest: Save test ...
122
  my $testlog;
7faafbd69   Steven Rostedt   ktest: Add open a...
123
124
125
126
  my $dmesg;
  my $monitor_fp;
  my $monitor_pid;
  my $monitor_cnt = 0;
a75fececf   Steven Rostedt   ktest: Added samp...
127
128
  my $sleep_time;
  my $bisect_sleep_time;
27d934b28   Steven Rostedt   ktest: Reboot aft...
129
  my $patchcheck_sleep_time;
1990207d5   Steven Rostedt   ktest: Add IGNORE...
130
  my $ignore_warnings;
a75fececf   Steven Rostedt   ktest: Added samp...
131
  my $store_failures;
de5b6e3bf   Rabin Vincent   ktest: Allow succ...
132
  my $store_successes;
9064af520   Steven Rostedt   ktest: Add TEST_N...
133
  my $test_name;
a75fececf   Steven Rostedt   ktest: Added samp...
134
135
  my $timeout;
  my $booted_timeout;
f1a5b9621   Steven Rostedt   ktest: Add detect...
136
  my $detect_triplefault;
a75fececf   Steven Rostedt   ktest: Added samp...
137
  my $console;
2b803365a   Steven Rostedt   ktest: Add option...
138
  my $reboot_success_line;
a75fececf   Steven Rostedt   ktest: Added samp...
139
  my $success_line;
1c8a617a2   Steven Rostedt   ktest: Added forc...
140
141
  my $stop_after_success;
  my $stop_after_failure;
2d01b26a1   Steven Rostedt   ktest: Add STOP_T...
142
  my $stop_test_after;
a75fececf   Steven Rostedt   ktest: Added samp...
143
144
  my $build_target;
  my $target_image;
b5f4aea68   Steven Rostedt   ktest: Have all v...
145
  my $checkout;
a75fececf   Steven Rostedt   ktest: Added samp...
146
  my $localversion;
576f627c8   Steven Rostedt   ktest: Add powero...
147
  my $iteration = 0;
e48c5293b   Steven Rostedt   ktest/cleanups: A...
148
  my $successes = 0;
2545eb619   Steven Rostedt   Initial start of ...
149

b5f4aea68   Steven Rostedt   ktest: Have all v...
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
  my $bisect_good;
  my $bisect_bad;
  my $bisect_type;
  my $bisect_start;
  my $bisect_replay;
  my $bisect_files;
  my $bisect_reverse;
  my $bisect_check;
  
  my $config_bisect;
  my $config_bisect_type;
  
  my $patchcheck_type;
  my $patchcheck_start;
  my $patchcheck_end;
165708b27   Steven Rostedt   ktest: Only ask o...
165
  # set when a test is something other that just building or install
bb8474b18   Steven Rostedt   ktest: Do not ask...
166
167
  # which would require more options.
  my $buildonly = 1;
dbd3783b4   Steven Rostedt   ktest: When creat...
168
169
  # set when creating a new config
  my $newconfig = 0;
8d1491bae   Steven Rostedt   ktest: Ask for th...
170
171
  my %entered_configs;
  my %config_help;
77d942cea   Steven Rostedt   ktest: Create var...
172
  my %variable;
fcb3f16a4   Steven Rostedt   ktest: Implement ...
173
  my %force_config;
8d1491bae   Steven Rostedt   ktest: Ask for th...
174

4ab1cce5b   Steven Rostedt   ktest: Do not reb...
175
176
  # do not force reboots on config problems
  my $no_reboot = 1;
9cc9e091e   Steven Rostedt   ktest: Detect typ...
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
  my %option_map = (
      "MACHINE"			=> \$machine,
      "SSH_USER"			=> \$ssh_user,
      "TMP_DIR"			=> \$tmpdir,
      "OUTPUT_DIR"		=> \$outputdir,
      "BUILD_DIR"			=> \$builddir,
      "TEST_TYPE"			=> \$test_type,
      "BUILD_TYPE"		=> \$build_type,
      "BUILD_OPTIONS"		=> \$build_options,
      "PRE_BUILD"			=> \$pre_build,
      "POST_BUILD"		=> \$post_build,
      "PRE_BUILD_DIE"		=> \$pre_build_die,
      "POST_BUILD_DIE"		=> \$post_build_die,
      "POWER_CYCLE"		=> \$power_cycle,
      "REBOOT"			=> \$reboot,
      "BUILD_NOCLEAN"		=> \$noclean,
      "MIN_CONFIG"		=> \$minconfig,
      "OUTPUT_MIN_CONFIG"		=> \$output_minconfig,
      "START_MIN_CONFIG"		=> \$start_minconfig,
      "IGNORE_CONFIG"		=> \$ignore_config,
      "TEST"			=> \$run_test,
      "ADD_CONFIG"		=> \$addconfig,
      "REBOOT_TYPE"		=> \$reboot_type,
      "GRUB_MENU"			=> \$grub_menu,
      "POST_INSTALL"		=> \$post_install,
      "NO_INSTALL"		=> \$no_install,
      "REBOOT_SCRIPT"		=> \$reboot_script,
      "REBOOT_ON_ERROR"		=> \$reboot_on_error,
      "SWITCH_TO_GOOD"		=> \$switch_to_good,
      "SWITCH_TO_TEST"		=> \$switch_to_test,
      "POWEROFF_ON_ERROR"		=> \$poweroff_on_error,
      "DIE_ON_FAILURE"		=> \$die_on_failure,
      "POWER_OFF"			=> \$power_off,
      "POWERCYCLE_AFTER_REBOOT"	=> \$powercycle_after_reboot,
      "POWEROFF_AFTER_HALT"	=> \$poweroff_after_halt,
      "SLEEP_TIME"		=> \$sleep_time,
      "BISECT_SLEEP_TIME"		=> \$bisect_sleep_time,
      "PATCHCHECK_SLEEP_TIME"	=> \$patchcheck_sleep_time,
      "IGNORE_WARNINGS"		=> \$ignore_warnings,
be405f95f   Steven Rostedt   ktest: Add INGORE...
216
      "IGNORE_ERRORS"		=> \$ignore_errors,
9cc9e091e   Steven Rostedt   ktest: Detect typ...
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
      "BISECT_MANUAL"		=> \$bisect_manual,
      "BISECT_SKIP"		=> \$bisect_skip,
      "CONFIG_BISECT_GOOD"	=> \$config_bisect_good,
      "BISECT_RET_GOOD"		=> \$bisect_ret_good,
      "BISECT_RET_BAD"		=> \$bisect_ret_bad,
      "BISECT_RET_SKIP"		=> \$bisect_ret_skip,
      "BISECT_RET_ABORT"		=> \$bisect_ret_abort,
      "BISECT_RET_DEFAULT"	=> \$bisect_ret_default,
      "STORE_FAILURES"		=> \$store_failures,
      "STORE_SUCCESSES"		=> \$store_successes,
      "TEST_NAME"			=> \$test_name,
      "TIMEOUT"			=> \$timeout,
      "BOOTED_TIMEOUT"		=> \$booted_timeout,
      "CONSOLE"			=> \$console,
      "DETECT_TRIPLE_FAULT"	=> \$detect_triplefault,
      "SUCCESS_LINE"		=> \$success_line,
      "REBOOT_SUCCESS_LINE"	=> \$reboot_success_line,
      "STOP_AFTER_SUCCESS"	=> \$stop_after_success,
      "STOP_AFTER_FAILURE"	=> \$stop_after_failure,
      "STOP_TEST_AFTER"		=> \$stop_test_after,
      "BUILD_TARGET"		=> \$build_target,
      "SSH_EXEC"			=> \$ssh_exec,
      "SCP_TO_TARGET"		=> \$scp_to_target,
      "CHECKOUT"			=> \$checkout,
      "TARGET_IMAGE"		=> \$target_image,
      "LOCALVERSION"		=> \$localversion,
  
      "BISECT_GOOD"		=> \$bisect_good,
      "BISECT_BAD"		=> \$bisect_bad,
      "BISECT_TYPE"		=> \$bisect_type,
      "BISECT_START"		=> \$bisect_start,
      "BISECT_REPLAY"		=> \$bisect_replay,
      "BISECT_FILES"		=> \$bisect_files,
      "BISECT_REVERSE"		=> \$bisect_reverse,
      "BISECT_CHECK"		=> \$bisect_check,
  
      "CONFIG_BISECT"		=> \$config_bisect,
      "CONFIG_BISECT_TYPE"	=> \$config_bisect_type,
  
      "PATCHCHECK_TYPE"		=> \$patchcheck_type,
      "PATCHCHECK_START"		=> \$patchcheck_start,
      "PATCHCHECK_END"		=> \$patchcheck_end,
  );
  
  # Options may be used by other options, record them.
  my %used_options;
7bf510734   Steven Rostedt   ktest: Add variab...
263
264
  # default variables that can be used
  chomp ($variable{"PWD"} = `pwd`);
8d1491bae   Steven Rostedt   ktest: Ask for th...
265
266
  $config_help{"MACHINE"} = << "EOF"
   The machine hostname that you will test.
bb8474b18   Steven Rostedt   ktest: Do not ask...
267
   For build only tests, it is still needed to differentiate log files.
8d1491bae   Steven Rostedt   ktest: Ask for th...
268
269
270
271
272
273
274
275
276
  EOF
      ;
  $config_help{"SSH_USER"} = << "EOF"
   The box is expected to have ssh on normal bootup, provide the user
    (most likely root, since you need privileged operations)
  EOF
      ;
  $config_help{"BUILD_DIR"} = << "EOF"
   The directory that contains the Linux source code (full path).
0e7a22de2   Steven Rostedt   ktest: When creat...
277
278
   You can use \${PWD} that will be the path where ktest.pl is run, or use
   \${THIS_DIR} which is assigned \${PWD} but may be changed later.
8d1491bae   Steven Rostedt   ktest: Ask for th...
279
280
281
282
283
  EOF
      ;
  $config_help{"OUTPUT_DIR"} = << "EOF"
   The directory that the objects will be built (full path).
   (can not be same as BUILD_DIR)
0e7a22de2   Steven Rostedt   ktest: When creat...
284
285
   You can use \${PWD} that will be the path where ktest.pl is run, or use
   \${THIS_DIR} which is assigned \${PWD} but may be changed later.
8d1491bae   Steven Rostedt   ktest: Ask for th...
286
287
288
289
290
291
292
  EOF
      ;
  $config_help{"BUILD_TARGET"} = << "EOF"
   The location of the compiled file to copy to the target.
   (relative to OUTPUT_DIR)
  EOF
      ;
dbd3783b4   Steven Rostedt   ktest: When creat...
293
294
295
296
297
  $config_help{"BUILD_OPTIONS"} = << "EOF"
   Options to add to \"make\" when building.
   i.e.  -j20
  EOF
      ;
8d1491bae   Steven Rostedt   ktest: Ask for th...
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
  $config_help{"TARGET_IMAGE"} = << "EOF"
   The place to put your image on the test machine.
  EOF
      ;
  $config_help{"POWER_CYCLE"} = << "EOF"
   A script or command to reboot the box.
  
   Here is a digital loggers power switch example
   POWER_CYCLE = wget --no-proxy -O /dev/null -q  --auth-no-challenge 'http://admin:admin\@power/outlet?5=CCL'
  
   Here is an example to reboot a virtual box on the current host
   with the name "Guest".
   POWER_CYCLE = virsh destroy Guest; sleep 5; virsh start Guest
  EOF
      ;
  $config_help{"CONSOLE"} = << "EOF"
   The script or command that reads the console
  
    If you use ttywatch server, something like the following would work.
  CONSOLE = nc -d localhost 3001
  
   For a virtual machine with guest name "Guest".
  CONSOLE =  virsh console Guest
  EOF
      ;
  $config_help{"LOCALVERSION"} = << "EOF"
   Required version ending to differentiate the test
   from other linux builds on the system.
  EOF
      ;
  $config_help{"REBOOT_TYPE"} = << "EOF"
   Way to reboot the box to the test kernel.
   Only valid options so far are "grub" and "script".
  
   If you specify grub, it will assume grub version 1
   and will search in /boot/grub/menu.lst for the title \$GRUB_MENU
   and select that target to reboot to the kernel. If this is not
   your setup, then specify "script" and have a command or script
   specified in REBOOT_SCRIPT to boot to the target.
  
   The entry in /boot/grub/menu.lst must be entered in manually.
   The test will not modify that file.
  EOF
      ;
  $config_help{"GRUB_MENU"} = << "EOF"
   The grub title name for the test kernel to boot
   (Only mandatory if REBOOT_TYPE = grub)
  
   Note, ktest.pl will not update the grub menu.lst, you need to
   manually add an option for the test. ktest.pl will search
   the grub menu.lst for this option to find what kernel to
   reboot into.
  
   For example, if in the /boot/grub/menu.lst the test kernel title has:
   title Test Kernel
   kernel vmlinuz-test
   GRUB_MENU = Test Kernel
  EOF
      ;
  $config_help{"REBOOT_SCRIPT"} = << "EOF"
   A script to reboot the target into the test kernel
   (Only mandatory if REBOOT_TYPE = script)
  EOF
      ;
dad987549   Steven Rostedt   ktest: Allow bise...
362
363
  sub read_prompt {
      my ($cancel, $prompt) = @_;
35ce5952e   Steven Rostedt   ktest: Add prompt...
364
365
366
367
  
      my $ans;
  
      for (;;) {
dad987549   Steven Rostedt   ktest: Allow bise...
368
369
370
371
372
  	if ($cancel) {
  	    print "$prompt [y/n/C] ";
  	} else {
  	    print "$prompt [Y/n] ";
  	}
35ce5952e   Steven Rostedt   ktest: Add prompt...
373
374
375
  	$ans = <STDIN>;
  	chomp $ans;
  	if ($ans =~ /^\s*$/) {
dad987549   Steven Rostedt   ktest: Allow bise...
376
377
378
379
380
  	    if ($cancel) {
  		$ans = "c";
  	    } else {
  		$ans = "y";
  	    }
35ce5952e   Steven Rostedt   ktest: Add prompt...
381
382
  	}
  	last if ($ans =~ /^y$/i || $ans =~ /^n$/i);
dad987549   Steven Rostedt   ktest: Allow bise...
383
384
385
386
387
388
389
390
391
392
393
  	if ($cancel) {
  	    last if ($ans =~ /^c$/i);
  	    print "Please answer either 'y', 'n' or 'c'.
  ";
  	} else {
  	    print "Please answer either 'y' or 'n'.
  ";
  	}
      }
      if ($ans =~ /^c/i) {
  	exit;
35ce5952e   Steven Rostedt   ktest: Add prompt...
394
395
396
397
398
399
      }
      if ($ans !~ /^y$/i) {
  	return 0;
      }
      return 1;
  }
8d1491bae   Steven Rostedt   ktest: Ask for th...
400

dad987549   Steven Rostedt   ktest: Allow bise...
401
402
403
404
405
406
407
408
409
410
411
  sub read_yn {
      my ($prompt) = @_;
  
      return read_prompt 0, $prompt;
  }
  
  sub read_ync {
      my ($prompt) = @_;
  
      return read_prompt 1, $prompt;
  }
8d1491bae   Steven Rostedt   ktest: Ask for th...
412
413
  sub get_ktest_config {
      my ($config) = @_;
815e2bd7d   Steven Rostedt   ktest: Evaluate v...
414
      my $ans;
8d1491bae   Steven Rostedt   ktest: Ask for th...
415
416
417
418
419
420
421
422
423
424
425
  
      return if (defined($opt{$config}));
  
      if (defined($config_help{$config})) {
  	print "
  ";
  	print $config_help{$config};
      }
  
      for (;;) {
  	print "$config = ";
dbd3783b4   Steven Rostedt   ktest: When creat...
426
  	if (defined($default{$config}) && length($default{$config})) {
8d1491bae   Steven Rostedt   ktest: Ask for th...
427
428
  	    print "\[$default{$config}\] ";
  	}
815e2bd7d   Steven Rostedt   ktest: Evaluate v...
429
430
431
  	$ans = <STDIN>;
  	$ans =~ s/^\s*(.*\S)\s*$/$1/;
  	if ($ans =~ /^\s*$/) {
8d1491bae   Steven Rostedt   ktest: Ask for th...
432
  	    if ($default{$config}) {
815e2bd7d   Steven Rostedt   ktest: Evaluate v...
433
  		$ans = $default{$config};
8d1491bae   Steven Rostedt   ktest: Ask for th...
434
435
436
437
438
439
  	    } else {
  		print "Your answer can not be blank
  ";
  		next;
  	    }
  	}
0e7a22de2   Steven Rostedt   ktest: When creat...
440
  	$entered_configs{$config} = ${ans};
8d1491bae   Steven Rostedt   ktest: Ask for th...
441
442
443
444
445
446
  	last;
      }
  }
  
  sub get_ktest_configs {
      get_ktest_config("MACHINE");
8d1491bae   Steven Rostedt   ktest: Ask for th...
447
448
      get_ktest_config("BUILD_DIR");
      get_ktest_config("OUTPUT_DIR");
bb8474b18   Steven Rostedt   ktest: Do not ask...
449

dbd3783b4   Steven Rostedt   ktest: When creat...
450
451
452
      if ($newconfig) {
  	get_ktest_config("BUILD_OPTIONS");
      }
bb8474b18   Steven Rostedt   ktest: Do not ask...
453
454
      # options required for other than just building a kernel
      if (!$buildonly) {
165708b27   Steven Rostedt   ktest: Only ask o...
455
456
457
458
459
460
  	get_ktest_config("POWER_CYCLE");
  	get_ktest_config("CONSOLE");
      }
  
      # options required for install and more
      if ($buildonly != 1) {
bb8474b18   Steven Rostedt   ktest: Do not ask...
461
462
463
  	get_ktest_config("SSH_USER");
  	get_ktest_config("BUILD_TARGET");
  	get_ktest_config("TARGET_IMAGE");
bb8474b18   Steven Rostedt   ktest: Do not ask...
464
      }
8d1491bae   Steven Rostedt   ktest: Ask for th...
465
      get_ktest_config("LOCALVERSION");
bb8474b18   Steven Rostedt   ktest: Do not ask...
466
      return if ($buildonly);
8d1491bae   Steven Rostedt   ktest: Ask for th...
467
468
469
470
471
472
473
474
475
476
477
478
479
      my $rtype = $opt{"REBOOT_TYPE"};
  
      if (!defined($rtype)) {
  	if (!defined($opt{"GRUB_MENU"})) {
  	    get_ktest_config("REBOOT_TYPE");
  	    $rtype = $entered_configs{"REBOOT_TYPE"};
  	} else {
  	    $rtype = "grub";
  	}
      }
  
      if ($rtype eq "grub") {
  	get_ktest_config("GRUB_MENU");
8d1491bae   Steven Rostedt   ktest: Ask for th...
480
481
      }
  }
77d942cea   Steven Rostedt   ktest: Create var...
482
  sub process_variables {
8d735212e   Steven Rostedt   ktest: Add proces...
483
      my ($value, $remove_undef) = @_;
77d942cea   Steven Rostedt   ktest: Create var...
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
      my $retval = "";
  
      # We want to check for '\', and it is just easier
      # to check the previous characet of '$' and not need
      # to worry if '$' is the first character. By adding
      # a space to $value, we can just check [^\\]\$ and
      # it will still work.
      $value = " $value";
  
      while ($value =~ /(.*?[^\\])\$\{(.*?)\}(.*)/) {
  	my $begin = $1;
  	my $var = $2;
  	my $end = $3;
  	# append beginning of value to retval
  	$retval = "$retval$begin";
  	if (defined($variable{$var})) {
  	    $retval = "$retval$variable{$var}";
8d735212e   Steven Rostedt   ktest: Add proces...
501
502
503
504
  	} elsif (defined($remove_undef) && $remove_undef) {
  	    # for if statements, any variable that is not defined,
  	    # we simple convert to 0
  	    $retval = "${retval}0";
77d942cea   Steven Rostedt   ktest: Create var...
505
506
507
  	} else {
  	    # put back the origin piece.
  	    $retval = "$retval\$\{$var\}";
9cc9e091e   Steven Rostedt   ktest: Detect typ...
508
509
510
511
  	    # This could be an option that is used later, save
  	    # it so we don't warn if this option is not one of
  	    # ktests options.
  	    $used_options{$var} = 1;
77d942cea   Steven Rostedt   ktest: Create var...
512
513
514
515
516
517
518
519
520
521
  	}
  	$value = $end;
      }
      $retval = "$retval$value";
  
      # remove the space added in the beginning
      $retval =~ s/ //;
  
      return "$retval"
  }
a57419b36   Steven Rostedt   ktest: New TEST_S...
522
  sub set_value {
3d1cc4143   Steven Rostedt   ktest: Add OVERRI...
523
      my ($lvalue, $rvalue, $override, $overrides, $name) = @_;
a57419b36   Steven Rostedt   ktest: New TEST_S...
524

cad966698   Steven Rostedt   ktest: Evaluate o...
525
526
527
      my $prvalue = process_variables($rvalue);
  
      if ($buildonly && $lvalue =~ /^TEST_TYPE(\[.*\])?$/ && $prvalue ne "build") {
bb8474b18   Steven Rostedt   ktest: Do not ask...
528
529
  	# Note if a test is something other than build, then we
  	# will need other manditory options.
cad966698   Steven Rostedt   ktest: Evaluate o...
530
  	if ($prvalue ne "install") {
165708b27   Steven Rostedt   ktest: Only ask o...
531
532
533
534
535
  	    $buildonly = 0;
  	} else {
  	    # install still limits some manditory options.
  	    $buildonly = 2;
  	}
bb8474b18   Steven Rostedt   ktest: Do not ask...
536
      }
a57419b36   Steven Rostedt   ktest: New TEST_S...
537
      if (defined($opt{$lvalue})) {
3d1cc4143   Steven Rostedt   ktest: Add OVERRI...
538
539
540
541
542
543
544
545
546
  	if (!$override || defined(${$overrides}{$lvalue})) {
  	    my $extra = "";
  	    if ($override) {
  		$extra = "In the same override section!
  ";
  	    }
  	    die "$name: $.: Option $lvalue defined more than once!
  $extra";
  	}
cad966698   Steven Rostedt   ktest: Evaluate o...
547
  	${$overrides}{$lvalue} = $prvalue;
a57419b36   Steven Rostedt   ktest: New TEST_S...
548
      }
21a9679fe   Steven Rostedt   ktest: Allow a te...
549
550
551
      if ($rvalue =~ /^\s*$/) {
  	delete $opt{$lvalue};
      } else {
cad966698   Steven Rostedt   ktest: Evaluate o...
552
  	$opt{$lvalue} = $prvalue;
21a9679fe   Steven Rostedt   ktest: Allow a te...
553
      }
a57419b36   Steven Rostedt   ktest: New TEST_S...
554
  }
77d942cea   Steven Rostedt   ktest: Create var...
555
556
557
558
559
560
561
562
563
564
  sub set_variable {
      my ($lvalue, $rvalue) = @_;
  
      if ($rvalue =~ /^\s*$/) {
  	delete $variable{$lvalue};
      } else {
  	$rvalue = process_variables($rvalue);
  	$variable{$lvalue} = $rvalue;
      }
  }
ab7a3f52c   Steven Rostedt   ktest: Let IF key...
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
  sub process_compare {
      my ($lval, $cmp, $rval) = @_;
  
      # remove whitespace
  
      $lval =~ s/^\s*//;
      $lval =~ s/\s*$//;
  
      $rval =~ s/^\s*//;
      $rval =~ s/\s*$//;
  
      if ($cmp eq "==") {
  	return $lval eq $rval;
      } elsif ($cmp eq "!=") {
  	return $lval ne $rval;
      }
  
      my $statement = "$lval $cmp $rval";
      my $ret = eval $statement;
  
      # $@ stores error of eval
      if ($@) {
  	return -1;
      }
  
      return $ret;
  }
9900b5dc0   Steven Rostedt   ktest: Add DEFINE...
592
593
594
595
596
597
  sub value_defined {
      my ($val) = @_;
  
      return defined($variable{$2}) ||
  	defined($opt{$2});
  }
8d735212e   Steven Rostedt   ktest: Add proces...
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
  my $d = 0;
  sub process_expression {
      my ($name, $val) = @_;
  
      my $c = $d++;
  
      while ($val =~ s/\(([^\(]*?)\)/\&\&\&\&VAL\&\&\&\&/) {
  	my $express = $1;
  
  	if (process_expression($name, $express)) {
  	    $val =~ s/\&\&\&\&VAL\&\&\&\&/ 1 /;
  	} else {
  	    $val =~ s/\&\&\&\&VAL\&\&\&\&/ 0 /;
  	}
      }
  
      $d--;
      my $OR = "\\|\\|";
      my $AND = "\\&\\&";
45d73a5d8   Steven Rostedt   ktest: Add IF and...
617

8d735212e   Steven Rostedt   ktest: Add proces...
618
619
620
621
622
623
624
625
626
627
628
629
630
631
      while ($val =~ s/^(.*?)($OR|$AND)//) {
  	my $express = $1;
  	my $op = $2;
  
  	if (process_expression($name, $express)) {
  	    if ($op eq "||") {
  		return 1;
  	    }
  	} else {
  	    if ($op eq "&&") {
  		return 0;
  	    }
  	}
      }
45d73a5d8   Steven Rostedt   ktest: Add IF and...
632

ab7a3f52c   Steven Rostedt   ktest: Let IF key...
633
634
635
636
637
638
639
640
      if ($val =~ /(.*)(==|\!=|>=|<=|>|<)(.*)/) {
  	my $ret = process_compare($1, $2, $3);
  	if ($ret < 0) {
  	    die "$name: $.: Unable to process comparison
  ";
  	}
  	return $ret;
      }
9900b5dc0   Steven Rostedt   ktest: Add DEFINE...
641
642
643
644
645
646
647
      if ($val =~ /^\s*(NOT\s*)?DEFINED\s+(\S+)\s*$/) {
  	if (defined $1) {
  	    return !value_defined($2);
  	} else {
  	    return value_defined($2);
  	}
      }
45d73a5d8   Steven Rostedt   ktest: Add IF and...
648
649
650
651
652
      if ($val =~ /^\s*0\s*$/) {
  	return 0;
      } elsif ($val =~ /^\s*\d+\s*$/) {
  	return 1;
      }
9900b5dc0   Steven Rostedt   ktest: Add DEFINE...
653
654
      die ("$name: $.: Undefined content $val in if statement
  ");
8d735212e   Steven Rostedt   ktest: Add proces...
655
656
657
658
659
660
661
662
663
664
  }
  
  sub process_if {
      my ($name, $value) = @_;
  
      # Convert variables and replace undefined ones with 0
      my $val = process_variables($value, 1);
      my $ret = process_expression $name, $val;
  
      return $ret;
45d73a5d8   Steven Rostedt   ktest: Add IF and...
665
  }
2ed3b1612   Steven Rostedt   ktest: Add INCLUD...
666
667
  sub __read_config {
      my ($config, $current_test_num) = @_;
2545eb619   Steven Rostedt   Initial start of ...
668

2ed3b1612   Steven Rostedt   ktest: Add INCLUD...
669
670
      my $in;
      open($in, $config) || die "can't read file $config";
2545eb619   Steven Rostedt   Initial start of ...
671

a57419b36   Steven Rostedt   ktest: New TEST_S...
672
673
      my $name = $config;
      $name =~ s,.*/(.*),$1,;
2ed3b1612   Steven Rostedt   ktest: Add INCLUD...
674
      my $test_num = $$current_test_num;
a57419b36   Steven Rostedt   ktest: New TEST_S...
675
676
677
678
679
      my $default = 1;
      my $repeat = 1;
      my $num_tests_set = 0;
      my $skip = 0;
      my $rest;
a9f84424b   Steven Rostedt   ktest: Fix parsin...
680
      my $line;
0df213ca3   Steven Rostedt   ktest: Require on...
681
      my $test_case = 0;
45d73a5d8   Steven Rostedt   ktest: Add IF and...
682
683
      my $if = 0;
      my $if_set = 0;
3d1cc4143   Steven Rostedt   ktest: Add OVERRI...
684
685
686
      my $override = 0;
  
      my %overrides;
a57419b36   Steven Rostedt   ktest: New TEST_S...
687

2ed3b1612   Steven Rostedt   ktest: Add INCLUD...
688
      while (<$in>) {
2545eb619   Steven Rostedt   Initial start of ...
689
690
691
  
  	# ignore blank lines and comments
  	next if (/^\s*$/ || /\s*\#/);
0050b6bbe   Steven Rostedt   ktest: Consolidat...
692
  	if (/^\s*(TEST_START|DEFAULTS)\b(.*)/) {
a57419b36   Steven Rostedt   ktest: New TEST_S...
693

0050b6bbe   Steven Rostedt   ktest: Consolidat...
694
695
  	    my $type = $1;
  	    $rest = $2;
a9f84424b   Steven Rostedt   ktest: Fix parsin...
696
  	    $line = $2;
a57419b36   Steven Rostedt   ktest: New TEST_S...
697

0050b6bbe   Steven Rostedt   ktest: Consolidat...
698
699
  	    my $old_test_num;
  	    my $old_repeat;
3d1cc4143   Steven Rostedt   ktest: Add OVERRI...
700
  	    $override = 0;
0050b6bbe   Steven Rostedt   ktest: Consolidat...
701
702
703
704
705
706
707
  
  	    if ($type eq "TEST_START") {
  
  		if ($num_tests_set) {
  		    die "$name: $.: Can not specify both NUM_TESTS and TEST_START
  ";
  		}
a57419b36   Steven Rostedt   ktest: New TEST_S...
708

0050b6bbe   Steven Rostedt   ktest: Consolidat...
709
710
  		$old_test_num = $test_num;
  		$old_repeat = $repeat;
a57419b36   Steven Rostedt   ktest: New TEST_S...
711

0050b6bbe   Steven Rostedt   ktest: Consolidat...
712
713
714
715
716
717
  		$test_num += $repeat;
  		$default = 0;
  		$repeat = 1;
  	    } else {
  		$default = 1;
  	    }
a57419b36   Steven Rostedt   ktest: New TEST_S...
718

a9f84424b   Steven Rostedt   ktest: Fix parsin...
719
720
  	    # If SKIP is anywhere in the line, the command will be skipped
  	    if ($rest =~ s/\s+SKIP\b//) {
a57419b36   Steven Rostedt   ktest: New TEST_S...
721
722
  		$skip = 1;
  	    } else {
0df213ca3   Steven Rostedt   ktest: Require on...
723
  		$test_case = 1;
a57419b36   Steven Rostedt   ktest: New TEST_S...
724
725
  		$skip = 0;
  	    }
a9f84424b   Steven Rostedt   ktest: Fix parsin...
726
727
728
729
730
731
732
733
734
735
736
  	    if ($rest =~ s/\sELSE\b//) {
  		if (!$if) {
  		    die "$name: $.: ELSE found with out matching IF section
  $_";
  		}
  		$if = 0;
  
  		if ($if_set) {
  		    $skip = 1;
  		} else {
  		    $skip = 0;
3d1cc4143   Steven Rostedt   ktest: Add OVERRI...
737
  		}
a57419b36   Steven Rostedt   ktest: New TEST_S...
738
  	    }
a9f84424b   Steven Rostedt   ktest: Fix parsin...
739
  	    if ($rest =~ s/\sIF\s+(.*)//) {
45d73a5d8   Steven Rostedt   ktest: Add IF and...
740
741
742
743
744
745
746
747
  		if (process_if($name, $1)) {
  		    $if_set = 1;
  		} else {
  		    $skip = 1;
  		}
  		$if = 1;
  	    } else {
  		$if = 0;
a9f84424b   Steven Rostedt   ktest: Fix parsin...
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
  		$if_set = 0;
  	    }
  
  	    if (!$skip) {
  		if ($type eq "TEST_START") {
  		    if ($rest =~ s/\s+ITERATE\s+(\d+)//) {
  			$repeat = $1;
  			$repeat_tests{"$test_num"} = $repeat;
  		    }
  		} elsif ($rest =~ s/\sOVERRIDE\b//) {
  		    # DEFAULT only
  		    $override = 1;
  		    # Clear previous overrides
  		    %overrides = ();
  		}
a57419b36   Steven Rostedt   ktest: New TEST_S...
763
  	    }
a9f84424b   Steven Rostedt   ktest: Fix parsin...
764
  	    if (!$skip && $rest !~ /^\s*$/) {
0050b6bbe   Steven Rostedt   ktest: Consolidat...
765
766
  		die "$name: $.: Gargbage found after $type
  $_";
a57419b36   Steven Rostedt   ktest: New TEST_S...
767
  	    }
0050b6bbe   Steven Rostedt   ktest: Consolidat...
768
  	    if ($skip && $type eq "TEST_START") {
a57419b36   Steven Rostedt   ktest: New TEST_S...
769
  		$test_num = $old_test_num;
e48c5293b   Steven Rostedt   ktest/cleanups: A...
770
  		$repeat = $old_repeat;
a57419b36   Steven Rostedt   ktest: New TEST_S...
771
  	    }
ab7a3f52c   Steven Rostedt   ktest: Let IF key...
772
  	} elsif (/^\s*ELSE\b(.*)$/) {
45d73a5d8   Steven Rostedt   ktest: Add IF and...
773
774
775
776
777
778
779
  	    if (!$if) {
  		die "$name: $.: ELSE found with out matching IF section
  $_";
  	    }
  	    $rest = $1;
  	    if ($if_set) {
  		$skip = 1;
ab7a3f52c   Steven Rostedt   ktest: Let IF key...
780
  		$rest = "";
45d73a5d8   Steven Rostedt   ktest: Add IF and...
781
782
  	    } else {
  		$skip = 0;
ab7a3f52c   Steven Rostedt   ktest: Let IF key...
783
  		if ($rest =~ /\sIF\s+(.*)/) {
45d73a5d8   Steven Rostedt   ktest: Add IF and...
784
785
786
787
  		    # May be a ELSE IF section.
  		    if (!process_if($name, $1)) {
  			$skip = 1;
  		    }
ab7a3f52c   Steven Rostedt   ktest: Let IF key...
788
  		    $rest = "";
45d73a5d8   Steven Rostedt   ktest: Add IF and...
789
790
791
792
  		} else {
  		    $if = 0;
  		}
  	    }
ab7a3f52c   Steven Rostedt   ktest: Let IF key...
793
794
795
796
  	    if ($rest !~ /^\s*$/) {
  		die "$name: $.: Gargbage found after DEFAULTS
  $_";
  	    }
2ed3b1612   Steven Rostedt   ktest: Add INCLUD...
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
  	} elsif (/^\s*INCLUDE\s+(\S+)/) {
  
  	    next if ($skip);
  
  	    if (!$default) {
  		die "$name: $.: INCLUDE can only be done in default sections
  $_";
  	    }
  
  	    my $file = process_variables($1);
  
  	    if ($file !~ m,^/,) {
  		# check the path of the config file first
  		if ($config =~ m,(.*)/,) {
  		    if (-f "$1/$file") {
  			$file = "$1/$file";
  		    }
  		}
  	    }
  		
  	    if ( ! -r $file ) {
  		die "$name: $.: Can't read file $file
  $_";
  	    }
  
  	    if (__read_config($file, \$test_num)) {
  		$test_case = 1;
  	    }
a57419b36   Steven Rostedt   ktest: New TEST_S...
825
826
827
  	} elsif (/^\s*([A-Z_\[\]\d]+)\s*=\s*(.*?)\s*$/) {
  
  	    next if ($skip);
2545eb619   Steven Rostedt   Initial start of ...
828
829
  	    my $lvalue = $1;
  	    my $rvalue = $2;
a57419b36   Steven Rostedt   ktest: New TEST_S...
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
  	    if (!$default &&
  		($lvalue eq "NUM_TESTS" ||
  		 $lvalue eq "LOG_FILE" ||
  		 $lvalue eq "CLEAR_LOG")) {
  		die "$name: $.: $lvalue must be set in DEFAULTS section
  ";
  	    }
  
  	    if ($lvalue eq "NUM_TESTS") {
  		if ($test_num) {
  		    die "$name: $.: Can not specify both NUM_TESTS and TEST_START
  ";
  		}
  		if (!$default) {
  		    die "$name: $.: NUM_TESTS must be set in default section
  ";
  		}
  		$num_tests_set = 1;
  	    }
  
  	    if ($default || $lvalue =~ /\[\d+\]$/) {
3d1cc4143   Steven Rostedt   ktest: Add OVERRI...
851
  		set_value($lvalue, $rvalue, $override, \%overrides, $name);
a57419b36   Steven Rostedt   ktest: New TEST_S...
852
853
  	    } else {
  		my $val = "$lvalue\[$test_num\]";
3d1cc4143   Steven Rostedt   ktest: Add OVERRI...
854
  		set_value($val, $rvalue, $override, \%overrides, $name);
a57419b36   Steven Rostedt   ktest: New TEST_S...
855
856
857
858
  
  		if ($repeat > 1) {
  		    $repeats{$val} = $repeat;
  		}
a75fececf   Steven Rostedt   ktest: Added samp...
859
  	    }
77d942cea   Steven Rostedt   ktest: Create var...
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
  	} elsif (/^\s*([A-Z_\[\]\d]+)\s*:=\s*(.*?)\s*$/) {
  	    next if ($skip);
  
  	    my $lvalue = $1;
  	    my $rvalue = $2;
  
  	    # process config variables.
  	    # Config variables are only active while reading the
  	    # config and can be defined anywhere. They also ignore
  	    # TEST_START and DEFAULTS, but are skipped if they are in
  	    # on of these sections that have SKIP defined.
  	    # The save variable can be
  	    # defined multiple times and the new one simply overrides
  	    # the prevous one.
  	    set_variable($lvalue, $rvalue);
a57419b36   Steven Rostedt   ktest: New TEST_S...
875
876
877
  	} else {
  	    die "$name: $.: Garbage found in config
  $_";
2545eb619   Steven Rostedt   Initial start of ...
878
879
  	}
      }
a57419b36   Steven Rostedt   ktest: New TEST_S...
880
881
882
883
      if ($test_num) {
  	$test_num += $repeat - 1;
  	$opt{"NUM_TESTS"} = $test_num;
      }
2ed3b1612   Steven Rostedt   ktest: Add INCLUD...
884
885
886
887
888
889
      close($in);
  
      $$current_test_num = $test_num;
  
      return $test_case;
  }
c4261d0f6   Steven Rostedt   ktest: Ask for ty...
890
891
892
893
894
895
896
897
898
899
900
  sub get_test_case {
  	print "What test case would you like to run?
  ";
  	print " (build, install or boot)
  ";
  	print " Other tests are available but require editing the config file
  ";
  	my $ans = <STDIN>;
  	chomp $ans;
  	$default{"TEST_TYPE"} = $ans;
  }
2ed3b1612   Steven Rostedt   ktest: Add INCLUD...
901
902
903
904
905
906
907
  sub read_config {
      my ($config) = @_;
  
      my $test_case;
      my $test_num = 0;
  
      $test_case = __read_config $config, \$test_num;
8d1491bae   Steven Rostedt   ktest: Ask for th...
908
909
      # make sure we have all mandatory configs
      get_ktest_configs;
0df213ca3   Steven Rostedt   ktest: Require on...
910
911
912
913
      # was a test specified?
      if (!$test_case) {
  	print "No test case specified.
  ";
c4261d0f6   Steven Rostedt   ktest: Ask for ty...
914
  	get_test_case;
0df213ca3   Steven Rostedt   ktest: Require on...
915
      }
a75fececf   Steven Rostedt   ktest: Added samp...
916
917
918
919
920
921
922
      # set any defaults
  
      foreach my $default (keys %default) {
  	if (!defined($opt{$default})) {
  	    $opt{$default} = $default{$default};
  	}
      }
9cc9e091e   Steven Rostedt   ktest: Detect typ...
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
  
      if ($opt{"IGNORE_UNUSED"} == 1) {
  	return;
      }
  
      my %not_used;
  
      # check if there are any stragglers (typos?)
      foreach my $option (keys %opt) {
  	my $op = $option;
  	# remove per test labels.
  	$op =~ s/\[.*\]//;
  	if (!exists($option_map{$op}) &&
  	    !exists($default{$op}) &&
  	    !exists($used_options{$op})) {
  	    $not_used{$op} = 1;
  	}
      }
  
      if (%not_used) {
  	my $s = "s are";
  	$s = " is" if (keys %not_used == 1);
  	print "The following option$s not used; could be a typo:
  ";
  	foreach my $option (keys %not_used) {
  	    print "$option
  ";
  	}
  	print "Set IGRNORE_UNUSED = 1 to have ktest ignore unused variables
  ";
  	if (!read_yn "Do you want to continue?") {
  	    exit -1;
  	}
      }
2545eb619   Steven Rostedt   Initial start of ...
957
  }
23715c3c9   Steven Rostedt   ktest: Have LOG_F...
958
959
960
961
962
963
  sub __eval_option {
      my ($option, $i) = @_;
  
      # Add space to evaluate the character before $
      $option = " $option";
      my $retval = "";
f9dfb65b0   Rabin Vincent   ktest: Check pare...
964
965
966
967
968
969
970
971
972
973
974
975
      my $repeated = 0;
      my $parent = 0;
  
      foreach my $test (keys %repeat_tests) {
  	if ($i >= $test &&
  	    $i < $test + $repeat_tests{$test}) {
  
  	    $repeated = 1;
  	    $parent = $test;
  	    last;
  	}
      }
23715c3c9   Steven Rostedt   ktest: Have LOG_F...
976
977
978
979
980
981
982
983
984
985
986
987
988
  
      while ($option =~ /(.*?[^\\])\$\{(.*?)\}(.*)/) {
  	my $start = $1;
  	my $var = $2;
  	my $end = $3;
  
  	# Append beginning of line
  	$retval = "$retval$start";
  
  	# If the iteration option OPT[$i] exists, then use that.
  	# otherwise see if the default OPT (without [$i]) exists.
  
  	my $o = "$var\[$i\]";
f9dfb65b0   Rabin Vincent   ktest: Check pare...
989
  	my $parento = "$var\[$parent\]";
23715c3c9   Steven Rostedt   ktest: Have LOG_F...
990
991
992
993
  
  	if (defined($opt{$o})) {
  	    $o = $opt{$o};
  	    $retval = "$retval$o";
f9dfb65b0   Rabin Vincent   ktest: Check pare...
994
995
996
  	} elsif ($repeated && defined($opt{$parento})) {
  	    $o = $opt{$parento};
  	    $retval = "$retval$o";
23715c3c9   Steven Rostedt   ktest: Have LOG_F...
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
  	} elsif (defined($opt{$var})) {
  	    $o = $opt{$var};
  	    $retval = "$retval$o";
  	} else {
  	    $retval = "$retval\$\{$var\}";
  	}
  
  	$option = $end;
      }
  
      $retval = "$retval$option";
  
      $retval =~ s/^ //;
  
      return $retval;
  }
  
  sub eval_option {
      my ($option, $i) = @_;
  
      my $prev = "";
  
      # Since an option can evaluate to another option,
      # keep iterating until we do not evaluate any more
      # options.
      my $r = 0;
      while ($prev ne $option) {
  	# Check for recursive evaluations.
  	# 100 deep should be more than enough.
  	if ($r++ > 100) {
  	    die "Over 100 evaluations accurred with $option
  " .
  		"Check for recursive variables
  ";
  	}
  	$prev = $option;
  	$option = __eval_option($option, $i);
      }
  
      return $option;
  }
d1e2f22ad   Steven Rostedt   ktest: Write to s...
1038
  sub _logit {
2545eb619   Steven Rostedt   Initial start of ...
1039
1040
1041
1042
1043
1044
      if (defined($opt{"LOG_FILE"})) {
  	open(OUT, ">> $opt{LOG_FILE}") or die "Can't write to $opt{LOG_FILE}";
  	print OUT @_;
  	close(OUT);
      }
  }
d1e2f22ad   Steven Rostedt   ktest: Write to s...
1045
1046
1047
1048
1049
1050
1051
  sub logit {
      if (defined($opt{"LOG_FILE"})) {
  	_logit @_;
      } else {
  	print @_;
      }
  }
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1052
1053
  sub doprint {
      print @_;
d1e2f22ad   Steven Rostedt   ktest: Write to s...
1054
      _logit @_;
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1055
  }
7faafbd69   Steven Rostedt   ktest: Add open a...
1056
  sub run_command;
2728be418   Andrew Jones   ktest: Include mo...
1057
1058
1059
  sub start_monitor;
  sub end_monitor;
  sub wait_for_monitor;
7faafbd69   Steven Rostedt   ktest: Add open a...
1060
1061
  
  sub reboot {
2728be418   Andrew Jones   ktest: Include mo...
1062
      my ($time) = @_;
2b803365a   Steven Rostedt   ktest: Add option...
1063
1064
1065
1066
1067
1068
      if (defined($time)) {
  	start_monitor;
  	# flush out current monitor
  	# May contain the reboot success line
  	wait_for_monitor 1;
      }
7faafbd69   Steven Rostedt   ktest: Add open a...
1069
      # try to reboot normally
e48c5293b   Steven Rostedt   ktest/cleanups: A...
1070
      if (run_command $reboot) {
576f627c8   Steven Rostedt   ktest: Add powero...
1071
1072
1073
1074
1075
  	if (defined($powercycle_after_reboot)) {
  	    sleep $powercycle_after_reboot;
  	    run_command "$power_cycle";
  	}
      } else {
7faafbd69   Steven Rostedt   ktest: Add open a...
1076
  	# nope? power cycle it.
a75fececf   Steven Rostedt   ktest: Added samp...
1077
  	run_command "$power_cycle";
7faafbd69   Steven Rostedt   ktest: Add open a...
1078
      }
2728be418   Andrew Jones   ktest: Include mo...
1079
1080
  
      if (defined($time)) {
2b803365a   Steven Rostedt   ktest: Add option...
1081
  	wait_for_monitor($time, $reboot_success_line);
2728be418   Andrew Jones   ktest: Include mo...
1082
1083
  	end_monitor;
      }
7faafbd69   Steven Rostedt   ktest: Add open a...
1084
  }
bc7c58037   Steven Rostedt   ktest: Add option...
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
  sub reboot_to_good {
      my ($time) = @_;
  
      if (defined($switch_to_good)) {
  	run_command $switch_to_good;
  	return;
      }
  
      reboot $time;
  }
576f627c8   Steven Rostedt   ktest: Add powero...
1095
1096
  sub do_not_reboot {
      my $i = $iteration;
4ab1cce5b   Steven Rostedt   ktest: Do not reb...
1097
      return $test_type eq "build" || $no_reboot ||
576f627c8   Steven Rostedt   ktest: Add powero...
1098
1099
1100
  	($test_type eq "patchcheck" && $opt{"PATCHCHECK_TYPE[$i]"} eq "build") ||
  	($test_type eq "bisect" && $opt{"BISECT_TYPE[$i]"} eq "build");
  }
5c42fc5b9   Steven Rostedt   ktest: New featur...
1101
  sub dodie {
5a391fbff   Steven Rostedt   ktest: Added bett...
1102
1103
      doprint "CRITICAL FAILURE... ", @_, "
  ";
5c42fc5b9   Steven Rostedt   ktest: New featur...
1104

576f627c8   Steven Rostedt   ktest: Add powero...
1105
1106
1107
      my $i = $iteration;
  
      if ($reboot_on_error && !do_not_reboot) {
75c3fda79   Steven Rostedt   ktest: New featur...
1108
1109
  	doprint "REBOOTING
  ";
bc7c58037   Steven Rostedt   ktest: Add option...
1110
  	reboot_to_good;
75c3fda79   Steven Rostedt   ktest: New featur...
1111

a75fececf   Steven Rostedt   ktest: Added samp...
1112
      } elsif ($poweroff_on_error && defined($power_off)) {
5c42fc5b9   Steven Rostedt   ktest: New featur...
1113
1114
  	doprint "POWERING OFF
  ";
a75fececf   Steven Rostedt   ktest: Added samp...
1115
  	`$power_off`;
5c42fc5b9   Steven Rostedt   ktest: New featur...
1116
      }
75c3fda79   Steven Rostedt   ktest: New featur...
1117

f80802cb1   Steven Rostedt   ktest: Print logf...
1118
1119
1120
1121
      if (defined($opt{"LOG_FILE"})) {
  	print " See $opt{LOG_FILE} for more info.
  ";
      }
576f627c8   Steven Rostedt   ktest: Add powero...
1122
1123
      die @_, "
  ";
5c42fc5b9   Steven Rostedt   ktest: New featur...
1124
  }
7faafbd69   Steven Rostedt   ktest: Add open a...
1125
1126
1127
1128
  sub open_console {
      my ($fp) = @_;
  
      my $flags;
a75fececf   Steven Rostedt   ktest: Added samp...
1129
1130
      my $pid = open($fp, "$console|") or
  	dodie "Can't open console $console";
7faafbd69   Steven Rostedt   ktest: Add open a...
1131
1132
  
      $flags = fcntl($fp, F_GETFL, 0) or
576f627c8   Steven Rostedt   ktest: Add powero...
1133
  	dodie "Can't get flags for the socket: $!";
7faafbd69   Steven Rostedt   ktest: Add open a...
1134
      $flags = fcntl($fp, F_SETFL, $flags | O_NONBLOCK) or
576f627c8   Steven Rostedt   ktest: Add powero...
1135
  	dodie "Can't set flags for the socket: $!";
7faafbd69   Steven Rostedt   ktest: Add open a...
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
  
      return $pid;
  }
  
  sub close_console {
      my ($fp, $pid) = @_;
  
      doprint "kill child process $pid
  ";
      kill 2, $pid;
  
      print "closing!
  ";
      close($fp);
  }
  
  sub start_monitor {
      if ($monitor_cnt++) {
  	return;
      }
      $monitor_fp = \*MONFD;
      $monitor_pid = open_console $monitor_fp;
a75fececf   Steven Rostedt   ktest: Added samp...
1158
1159
1160
1161
  
      return;
  
      open(MONFD, "Stop perl from warning about single use of MONFD");
7faafbd69   Steven Rostedt   ktest: Add open a...
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
  }
  
  sub end_monitor {
      if (--$monitor_cnt) {
  	return;
      }
      close_console($monitor_fp, $monitor_pid);
  }
  
  sub wait_for_monitor {
2b803365a   Steven Rostedt   ktest: Add option...
1172
1173
      my ($time, $stop) = @_;
      my $full_line = "";
7faafbd69   Steven Rostedt   ktest: Add open a...
1174
      my $line;
2b803365a   Steven Rostedt   ktest: Add option...
1175
      my $booted = 0;
7faafbd69   Steven Rostedt   ktest: Add open a...
1176

a75fececf   Steven Rostedt   ktest: Added samp...
1177
1178
      doprint "** Wait for monitor to settle down **
  ";
7faafbd69   Steven Rostedt   ktest: Add open a...
1179
1180
  
      # read the monitor and wait for the system to calm down
2b803365a   Steven Rostedt   ktest: Add option...
1181
      while (!$booted) {
7faafbd69   Steven Rostedt   ktest: Add open a...
1182
  	$line = wait_for_input($monitor_fp, $time);
2b803365a   Steven Rostedt   ktest: Add option...
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
  	last if (!defined($line));
  	print "$line";
  	$full_line .= $line;
  
  	if (defined($stop) && $full_line =~ /$stop/) {
  	    doprint "wait for monitor detected $stop
  ";
  	    $booted = 1;
  	}
  
  	if ($line =~ /
  /) {
  	    $full_line = "";
  	}
      }
a75fececf   Steven Rostedt   ktest: Added samp...
1198
1199
      print "** Monitor flushed **
  ";
7faafbd69   Steven Rostedt   ktest: Add open a...
1200
  }
de5b6e3bf   Rabin Vincent   ktest: Allow succ...
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
  sub save_logs {
  	my ($result, $basedir) = @_;
  	my @t = localtime;
  	my $date = sprintf "%04d%02d%02d%02d%02d%02d",
  		1900+$t[5],$t[4],$t[3],$t[2],$t[1],$t[0];
  
  	my $type = $build_type;
  	if ($type =~ /useconfig/) {
  	    $type = "useconfig";
  	}
  
  	my $dir = "$machine-$test_type-$type-$result-$date";
  
  	$dir = "$basedir/$dir";
  
  	if (!-d $dir) {
  	    mkpath($dir) or
  		die "can't create $dir";
  	}
  
  	my %files = (
  		"config" => $output_config,
  		"buildlog" => $buildlog,
  		"dmesg" => $dmesg,
  		"testlog" => $testlog,
  	);
  
  	while (my ($name, $source) = each(%files)) {
  		if (-f "$source") {
  			cp "$source", "$dir/$name" or
  				die "failed to copy $source";
  		}
  	}
  
  	doprint "*** Saved info to $dir ***
  ";
  }
2b7d9b214   Steven Rostedt   ktest: Added cont...
1238
  sub fail {
a75fececf   Steven Rostedt   ktest: Added samp...
1239
  	if ($die_on_failure) {
2b7d9b214   Steven Rostedt   ktest: Added cont...
1240
1241
  		dodie @_;
  	}
a75fececf   Steven Rostedt   ktest: Added samp...
1242
1243
  	doprint "FAILED
  ";
7faafbd69   Steven Rostedt   ktest: Add open a...
1244

576f627c8   Steven Rostedt   ktest: Add powero...
1245
  	my $i = $iteration;
a75fececf   Steven Rostedt   ktest: Added samp...
1246
  	# no need to reboot for just building.
576f627c8   Steven Rostedt   ktest: Add powero...
1247
  	if (!do_not_reboot) {
a75fececf   Steven Rostedt   ktest: Added samp...
1248
1249
  	    doprint "REBOOTING
  ";
bc7c58037   Steven Rostedt   ktest: Add option...
1250
  	    reboot_to_good $sleep_time;
a75fececf   Steven Rostedt   ktest: Added samp...
1251
  	}
7faafbd69   Steven Rostedt   ktest: Add open a...
1252

9064af520   Steven Rostedt   ktest: Add TEST_N...
1253
1254
1255
1256
1257
  	my $name = "";
  
  	if (defined($test_name)) {
  	    $name = " ($test_name)";
  	}
576f627c8   Steven Rostedt   ktest: Add powero...
1258
1259
1260
1261
  	doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  ";
  	doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  ";
9064af520   Steven Rostedt   ktest: Add TEST_N...
1262
1263
  	doprint "KTEST RESULT: TEST $i$name Failed: ", @_, "
  ";
576f627c8   Steven Rostedt   ktest: Add powero...
1264
1265
1266
1267
  	doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  ";
  	doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  ";
a75fececf   Steven Rostedt   ktest: Added samp...
1268

de5b6e3bf   Rabin Vincent   ktest: Allow succ...
1269
1270
1271
  	if (defined($store_failures)) {
  	    save_logs "fail", $store_failures;
          }
7faafbd69   Steven Rostedt   ktest: Add open a...
1272

2b7d9b214   Steven Rostedt   ktest: Added cont...
1273
1274
  	return 1;
  }
2545eb619   Steven Rostedt   Initial start of ...
1275
1276
  sub run_command {
      my ($command) = @_;
d6ce2a0b3   Steven Rostedt   ktest: Add revers...
1277
1278
1279
      my $dolog = 0;
      my $dord = 0;
      my $pid;
e48c5293b   Steven Rostedt   ktest/cleanups: A...
1280
1281
      $command =~ s/\$SSH_USER/$ssh_user/g;
      $command =~ s/\$MACHINE/$machine/g;
d6ce2a0b3   Steven Rostedt   ktest: Add revers...
1282
1283
1284
      doprint("$command ... ");
  
      $pid = open(CMD, "$command 2>&1 |") or
2b7d9b214   Steven Rostedt   ktest: Added cont...
1285
  	(fail "unable to exec $command" and return 0);
2545eb619   Steven Rostedt   Initial start of ...
1286
1287
  
      if (defined($opt{"LOG_FILE"})) {
d6ce2a0b3   Steven Rostedt   ktest: Add revers...
1288
1289
1290
  	open(LOG, ">>$opt{LOG_FILE}") or
  	    dodie "failed to write to log";
  	$dolog = 1;
6c5ee0be0   Steven Rostedt   ktest: Added patc...
1291
1292
1293
      }
  
      if (defined($redirect)) {
d6ce2a0b3   Steven Rostedt   ktest: Add revers...
1294
1295
1296
  	open (RD, ">$redirect") or
  	    dodie "failed to write to redirect $redirect";
  	$dord = 1;
2545eb619   Steven Rostedt   Initial start of ...
1297
      }
d6ce2a0b3   Steven Rostedt   ktest: Add revers...
1298
1299
1300
1301
      while (<CMD>) {
  	print LOG if ($dolog);
  	print RD  if ($dord);
      }
2545eb619   Steven Rostedt   Initial start of ...
1302

d6ce2a0b3   Steven Rostedt   ktest: Add revers...
1303
      waitpid($pid, 0);
2545eb619   Steven Rostedt   Initial start of ...
1304
      my $failed = $?;
d6ce2a0b3   Steven Rostedt   ktest: Add revers...
1305
1306
1307
      close(CMD);
      close(LOG) if ($dolog);
      close(RD)  if ($dord);
2545eb619   Steven Rostedt   Initial start of ...
1308
1309
1310
1311
1312
1313
1314
      if ($failed) {
  	doprint "FAILED!
  ";
      } else {
  	doprint "SUCCESS
  ";
      }
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1315
1316
      return !$failed;
  }
e48c5293b   Steven Rostedt   ktest/cleanups: A...
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
  sub run_ssh {
      my ($cmd) = @_;
      my $cp_exec = $ssh_exec;
  
      $cp_exec =~ s/\$SSH_COMMAND/$cmd/g;
      return run_command "$cp_exec";
  }
  
  sub run_scp {
      my ($src, $dst) = @_;
      my $cp_scp = $scp_to_target;
  
      $cp_scp =~ s/\$SRC_FILE/$src/g;
      $cp_scp =~ s/\$DST_FILE/$dst/g;
  
      return run_command "$cp_scp";
  }
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1334
  sub get_grub_index {
a75fececf   Steven Rostedt   ktest: Added samp...
1335
1336
1337
      if ($reboot_type ne "grub") {
  	return;
      }
5a391fbff   Steven Rostedt   ktest: Added bett...
1338
      return if (defined($grub_number));
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1339
1340
1341
  
      doprint "Find grub menu ... ";
      $grub_number = -1;
e48c5293b   Steven Rostedt   ktest/cleanups: A...
1342
1343
1344
1345
1346
  
      my $ssh_grub = $ssh_exec;
      $ssh_grub =~ s,\$SSH_COMMAND,cat /boot/grub/menu.lst,g;
  
      open(IN, "$ssh_grub |")
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1347
  	or die "unable to get menu.lst";
e48c5293b   Steven Rostedt   ktest/cleanups: A...
1348

eaa1fe25e   Steven Rostedt   ktest: Fail when ...
1349
      my $found = 0;
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1350
      while (<IN>) {
a75fececf   Steven Rostedt   ktest: Added samp...
1351
  	if (/^\s*title\s+$grub_menu\s*$/) {
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1352
  	    $grub_number++;
eaa1fe25e   Steven Rostedt   ktest: Fail when ...
1353
  	    $found = 1;
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1354
1355
1356
1357
1358
1359
  	    last;
  	} elsif (/^\s*title\s/) {
  	    $grub_number++;
  	}
      }
      close(IN);
a75fececf   Steven Rostedt   ktest: Added samp...
1360
      die "Could not find '$grub_menu' in /boot/grub/menu on $machine"
eaa1fe25e   Steven Rostedt   ktest: Fail when ...
1361
  	if (!$found);
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1362
1363
      doprint "$grub_number
  ";
2545eb619   Steven Rostedt   Initial start of ...
1364
  }
2545eb619   Steven Rostedt   Initial start of ...
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
  sub wait_for_input
  {
      my ($fp, $time) = @_;
      my $rin;
      my $ready;
      my $line;
      my $ch;
  
      if (!defined($time)) {
  	$time = $timeout;
      }
  
      $rin = '';
      vec($rin, fileno($fp), 1) = 1;
      $ready = select($rin, undef, undef, $time);
  
      $line = "";
  
      # try to read one char at a time
      while (sysread $fp, $ch, 1) {
  	$line .= $ch;
  	last if ($ch eq "
  ");
      }
  
      if (!length($line)) {
  	return undef;
      }
  
      return $line;
  }
75c3fda79   Steven Rostedt   ktest: New featur...
1396
  sub reboot_to {
bc7c58037   Steven Rostedt   ktest: Add option...
1397
1398
1399
      if (defined($switch_to_test)) {
  	run_command $switch_to_test;
      }
a75fececf   Steven Rostedt   ktest: Added samp...
1400
      if ($reboot_type eq "grub") {
c54367f9d   Steven Rostedt   ktest: Do not ope...
1401
  	run_ssh "'(echo \"savedefault --default=$grub_number --once\" | grub --batch)'";
96f6a0df1   Steven Rostedt   ktest: Still do r...
1402
1403
      } elsif (defined $reboot_script) {
  	run_command "$reboot_script";
a75fececf   Steven Rostedt   ktest: Added samp...
1404
      }
96f6a0df1   Steven Rostedt   ktest: Still do r...
1405
      reboot;
2545eb619   Steven Rostedt   Initial start of ...
1406
  }
a57419b36   Steven Rostedt   ktest: New TEST_S...
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
  sub get_sha1 {
      my ($commit) = @_;
  
      doprint "git rev-list --max-count=1 $commit ... ";
      my $sha1 = `git rev-list --max-count=1 $commit`;
      my $ret = $?;
  
      logit $sha1;
  
      if ($ret) {
  	doprint "FAILED
  ";
  	dodie "Failed to get git $commit";
      }
  
      print "SUCCESS
  ";
  
      chomp $sha1;
  
      return $sha1;
  }
5a391fbff   Steven Rostedt   ktest: Added bett...
1429
  sub monitor {
2545eb619   Steven Rostedt   Initial start of ...
1430
1431
      my $booted = 0;
      my $bug = 0;
5c42fc5b9   Steven Rostedt   ktest: New featur...
1432
      my $skip_call_trace = 0;
2b7d9b214   Steven Rostedt   ktest: Added cont...
1433
      my $loops;
2545eb619   Steven Rostedt   Initial start of ...
1434

7faafbd69   Steven Rostedt   ktest: Add open a...
1435
      wait_for_monitor 5;
2545eb619   Steven Rostedt   Initial start of ...
1436
1437
1438
  
      my $line;
      my $full_line = "";
7faafbd69   Steven Rostedt   ktest: Add open a...
1439
1440
      open(DMESG, "> $dmesg") or
  	die "unable to write to $dmesg";
2545eb619   Steven Rostedt   Initial start of ...
1441

75c3fda79   Steven Rostedt   ktest: New featur...
1442
      reboot_to;
2545eb619   Steven Rostedt   Initial start of ...
1443

1c8a617a2   Steven Rostedt   ktest: Added forc...
1444
1445
      my $success_start;
      my $failure_start;
2d01b26a1   Steven Rostedt   ktest: Add STOP_T...
1446
1447
      my $monitor_start = time;
      my $done = 0;
f1a5b9621   Steven Rostedt   ktest: Add detect...
1448
      my $version_found = 0;
1c8a617a2   Steven Rostedt   ktest: Added forc...
1449

2d01b26a1   Steven Rostedt   ktest: Add STOP_T...
1450
      while (!$done) {
2545eb619   Steven Rostedt   Initial start of ...
1451

ecaf8e521   Steven Rostedt   ktest: Have wait ...
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
  	if ($bug && defined($stop_after_failure) &&
  	    $stop_after_failure >= 0) {
  	    my $time = $stop_after_failure - (time - $failure_start);
  	    $line = wait_for_input($monitor_fp, $time);
  	    if (!defined($line)) {
  		doprint "bug timed out after $booted_timeout seconds
  ";
  		doprint "Test forced to stop after $stop_after_failure seconds after failure
  ";
  		last;
  	    }
  	} elsif ($booted) {
a75fececf   Steven Rostedt   ktest: Added samp...
1464
  	    $line = wait_for_input($monitor_fp, $booted_timeout);
cd4f1d536   Steven Rostedt   ktest: Notify rea...
1465
1466
1467
1468
1469
1470
  	    if (!defined($line)) {
  		my $s = $booted_timeout == 1 ? "" : "s";
  		doprint "Successful boot found: break after $booted_timeout second$s
  ";
  		last;
  	    }
2b7d9b214   Steven Rostedt   ktest: Added cont...
1471
  	} else {
7faafbd69   Steven Rostedt   ktest: Add open a...
1472
  	    $line = wait_for_input($monitor_fp);
cd4f1d536   Steven Rostedt   ktest: Notify rea...
1473
1474
1475
1476
1477
1478
  	    if (!defined($line)) {
  		my $s = $timeout == 1 ? "" : "s";
  		doprint "Timed out after $timeout second$s
  ";
  		last;
  	    }
2b7d9b214   Steven Rostedt   ktest: Added cont...
1479
  	}
2545eb619   Steven Rostedt   Initial start of ...
1480

2545eb619   Steven Rostedt   Initial start of ...
1481
  	doprint $line;
7faafbd69   Steven Rostedt   ktest: Add open a...
1482
  	print DMESG $line;
2545eb619   Steven Rostedt   Initial start of ...
1483
1484
1485
  
  	# we are not guaranteed to get a full line
  	$full_line .= $line;
a75fececf   Steven Rostedt   ktest: Added samp...
1486
  	if ($full_line =~ /$success_line/) {
2545eb619   Steven Rostedt   Initial start of ...
1487
  	    $booted = 1;
1c8a617a2   Steven Rostedt   ktest: Added forc...
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
  	    $success_start = time;
  	}
  
  	if ($booted && defined($stop_after_success) &&
  	    $stop_after_success >= 0) {
  	    my $now = time;
  	    if ($now - $success_start >= $stop_after_success) {
  		doprint "Test forced to stop after $stop_after_success seconds after success
  ";
  		last;
  	    }
2545eb619   Steven Rostedt   Initial start of ...
1499
  	}
5c42fc5b9   Steven Rostedt   ktest: New featur...
1500
1501
1502
  	if ($full_line =~ /\[ backtrace testing \]/) {
  	    $skip_call_trace = 1;
  	}
2545eb619   Steven Rostedt   Initial start of ...
1503
  	if ($full_line =~ /call trace:/i) {
be405f95f   Steven Rostedt   ktest: Add INGORE...
1504
  	    if (!$ignore_errors && !$bug && !$skip_call_trace) {
1c8a617a2   Steven Rostedt   ktest: Added forc...
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
  		$bug = 1;
  		$failure_start = time;
  	    }
  	}
  
  	if ($bug && defined($stop_after_failure) &&
  	    $stop_after_failure >= 0) {
  	    my $now = time;
  	    if ($now - $failure_start >= $stop_after_failure) {
  		doprint "Test forced to stop after $stop_after_failure seconds after failure
  ";
  		last;
  	    }
5c42fc5b9   Steven Rostedt   ktest: New featur...
1518
1519
1520
1521
1522
1523
1524
  	}
  
  	if ($full_line =~ /\[ end of backtrace testing \]/) {
  	    $skip_call_trace = 0;
  	}
  
  	if ($full_line =~ /Kernel panic -/) {
10abf118f   Steven Rostedt   ktest: Start fail...
1525
  	    $failure_start = time;
2545eb619   Steven Rostedt   Initial start of ...
1526
1527
  	    $bug = 1;
  	}
f1a5b9621   Steven Rostedt   ktest: Add detect...
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
  	# Detect triple faults by testing the banner
  	if ($full_line =~ /\bLinux version (\S+).*
  /) {
  	    if ($1 eq $version) {
  		$version_found = 1;
  	    } elsif ($version_found && $detect_triplefault) {
  		# We already booted into the kernel we are testing,
  		# but now we booted into another kernel?
  		# Consider this a triple fault.
  		doprint "Aleady booted in Linux kernel $version, but now
  ";
  		doprint "we booted into Linux kernel $1.
  ";
  		doprint "Assuming that this is a triple fault.
  ";
  		doprint "To disable this: set DETECT_TRIPLE_FAULT to 0
  ";
  		last;
  	    }
  	}
2545eb619   Steven Rostedt   Initial start of ...
1548
1549
1550
1551
  	if ($line =~ /
  /) {
  	    $full_line = "";
  	}
2d01b26a1   Steven Rostedt   ktest: Add STOP_T...
1552
1553
1554
  
  	if ($stop_test_after > 0 && !$booted && !$bug) {
  	    if (time - $monitor_start > $stop_test_after) {
4d62bf51a   Steven Rostedt   ktest: If test fa...
1555
1556
  		doprint "STOP_TEST_AFTER ($stop_test_after seconds) timed out
  ";
2d01b26a1   Steven Rostedt   ktest: Add STOP_T...
1557
1558
1559
  		$done = 1;
  	    }
  	}
2545eb619   Steven Rostedt   Initial start of ...
1560
      }
7faafbd69   Steven Rostedt   ktest: Add open a...
1561
      close(DMESG);
2545eb619   Steven Rostedt   Initial start of ...
1562

a75fececf   Steven Rostedt   ktest: Added samp...
1563
      if ($bug) {
2b7d9b214   Steven Rostedt   ktest: Added cont...
1564
  	return 0 if ($in_bisect);
576f627c8   Steven Rostedt   ktest: Add powero...
1565
  	fail "failed - got a bug report" and return 0;
2545eb619   Steven Rostedt   Initial start of ...
1566
      }
a75fececf   Steven Rostedt   ktest: Added samp...
1567
      if (!$booted) {
2b7d9b214   Steven Rostedt   ktest: Added cont...
1568
  	return 0 if ($in_bisect);
576f627c8   Steven Rostedt   ktest: Add powero...
1569
  	fail "failed - never got a boot prompt." and return 0;
2545eb619   Steven Rostedt   Initial start of ...
1570
      }
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1571

2b7d9b214   Steven Rostedt   ktest: Added cont...
1572
      return 1;
2545eb619   Steven Rostedt   Initial start of ...
1573
  }
2b29b2f8f   Steven Rostedt   ktest: Evaluate $...
1574
1575
1576
1577
1578
1579
1580
  sub eval_kernel_version {
      my ($option) = @_;
  
      $option =~ s/\$KERNEL_VERSION/$version/g;
  
      return $option;
  }
db05cfefc   Steven Rostedt   ktest: Allow init...
1581
1582
1583
  sub do_post_install {
  
      return if (!defined($post_install));
2b29b2f8f   Steven Rostedt   ktest: Evaluate $...
1584
      my $cp_post_install = eval_kernel_version $post_install;
db05cfefc   Steven Rostedt   ktest: Allow init...
1585
1586
1587
      run_command "$cp_post_install" or
  	dodie "Failed to run post install";
  }
2545eb619   Steven Rostedt   Initial start of ...
1588
  sub install {
e0a8742e3   Steven Rostedt   ktest: Add NO_INS...
1589
      return if ($no_install);
2b29b2f8f   Steven Rostedt   ktest: Evaluate $...
1590
1591
1592
      my $cp_target = eval_kernel_version $target_image;
  
      run_scp "$outputdir/$build_target", "$cp_target" or
5c42fc5b9   Steven Rostedt   ktest: New featur...
1593
  	dodie "failed to copy image";
2545eb619   Steven Rostedt   Initial start of ...
1594

5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1595
      my $install_mods = 0;
2545eb619   Steven Rostedt   Initial start of ...
1596

5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1597
1598
      # should we process modules?
      $install_mods = 0;
51ad1dd10   Steven Rostedt   ktest: Use $outpu...
1599
      open(IN, "$output_config") or dodie("Can't read config file");
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1600
1601
1602
1603
      while (<IN>) {
  	if (/CONFIG_MODULES(=y)?/) {
  	    $install_mods = 1 if (defined($1));
  	    last;
5c42fc5b9   Steven Rostedt   ktest: New featur...
1604
  	}
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1605
1606
      }
      close(IN);
5c42fc5b9   Steven Rostedt   ktest: New featur...
1607

5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1608
      if (!$install_mods) {
db05cfefc   Steven Rostedt   ktest: Allow init...
1609
  	do_post_install;
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1610
1611
1612
1613
  	doprint "No modules needed
  ";
  	return;
      }
2545eb619   Steven Rostedt   Initial start of ...
1614

a75fececf   Steven Rostedt   ktest: Added samp...
1615
      run_command "$make INSTALL_MOD_PATH=$tmpdir modules_install" or
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1616
  	dodie "Failed to install modules";
5c42fc5b9   Steven Rostedt   ktest: New featur...
1617

5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1618
      my $modlib = "/lib/modules/$version";
a57419b36   Steven Rostedt   ktest: New TEST_S...
1619
      my $modtar = "ktest-mods.tar.bz2";
5c42fc5b9   Steven Rostedt   ktest: New featur...
1620

e48c5293b   Steven Rostedt   ktest/cleanups: A...
1621
      run_ssh "rm -rf $modlib" or
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1622
  	dodie "failed to remove old mods: $modlib";
5c42fc5b9   Steven Rostedt   ktest: New featur...
1623

5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1624
      # would be nice if scp -r did not follow symbolic links
a75fececf   Steven Rostedt   ktest: Added samp...
1625
      run_command "cd $tmpdir && tar -cjf $modtar lib/modules/$version" or
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1626
  	dodie "making tarball";
e48c5293b   Steven Rostedt   ktest/cleanups: A...
1627
      run_scp "$tmpdir/$modtar", "/tmp" or
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1628
  	dodie "failed to copy modules";
a75fececf   Steven Rostedt   ktest: Added samp...
1629
      unlink "$tmpdir/$modtar";
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1630

e7b134418   Steven Rostedt   ktest: Fix tar ex...
1631
      run_ssh "'(cd / && tar xjf /tmp/$modtar)'" or
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1632
  	dodie "failed to tar modules";
2545eb619   Steven Rostedt   Initial start of ...
1633

e48c5293b   Steven Rostedt   ktest/cleanups: A...
1634
      run_ssh "rm -f /tmp/$modtar";
8b37ca8ca   Steven Rostedt   ktest: Add POST_I...
1635

db05cfefc   Steven Rostedt   ktest: Allow init...
1636
      do_post_install;
2545eb619   Steven Rostedt   Initial start of ...
1637
  }
ddf607e5f   Steven Rostedt   ktest: Add helper...
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
  sub get_version {
      # get the release name
      doprint "$make kernelrelease ... ";
      $version = `$make kernelrelease | tail -1`;
      chomp($version);
      doprint "$version
  ";
  }
  
  sub start_monitor_and_boot {
9f7424cc8   Steven Rostedt   ktest: Add anothe...
1648
1649
1650
1651
      # Make sure the stable kernel has finished booting
      start_monitor;
      wait_for_monitor 5;
      end_monitor;
ddf607e5f   Steven Rostedt   ktest: Add helper...
1652
1653
1654
1655
1656
1657
1658
      get_grub_index;
      get_version;
      install;
  
      start_monitor;
      return monitor;
  }
6c5ee0be0   Steven Rostedt   ktest: Added patc...
1659
1660
  sub check_buildlog {
      my ($patch) = @_;
6c5ee0be0   Steven Rostedt   ktest: Added patc...
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
      my @files = `git show $patch | diffstat -l`;
  
      open(IN, "git show $patch |") or
  	dodie "failed to show $patch";
      while (<IN>) {
  	if (m,^--- a/(.*),) {
  	    chomp $1;
  	    $files[$#files] = $1;
  	}
      }
      close(IN);
  
      open(IN, $buildlog) or dodie "Can't open $buildlog";
      while (<IN>) {
  	if (/^\s*(.*?):.*(warning|error)/) {
  	    my $err = $1;
  	    foreach my $file (@files) {
a75fececf   Steven Rostedt   ktest: Added samp...
1678
  		my $fullpath = "$builddir/$file";
6c5ee0be0   Steven Rostedt   ktest: Added patc...
1679
  		if ($file eq $err || $fullpath eq $err) {
2b7d9b214   Steven Rostedt   ktest: Added cont...
1680
  		    fail "$file built with warnings" and return 0;
6c5ee0be0   Steven Rostedt   ktest: Added patc...
1681
1682
1683
1684
1685
  		}
  	    }
  	}
      }
      close(IN);
2b7d9b214   Steven Rostedt   ktest: Added cont...
1686
1687
  
      return 1;
6c5ee0be0   Steven Rostedt   ktest: Added patc...
1688
  }
fcb3f16a4   Steven Rostedt   ktest: Implement ...
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
  sub apply_min_config {
      my $outconfig = "$output_config.new";
  
      # Read the config file and remove anything that
      # is in the force_config hash (from minconfig and others)
      # then add the force config back.
  
      doprint "Applying minimum configurations into $output_config.new
  ";
  
      open (OUT, ">$outconfig") or
  	dodie "Can't create $outconfig";
  
      if (-f $output_config) {
  	open (IN, $output_config) or
  	    dodie "Failed to open $output_config";
  	while (<IN>) {
  	    if (/^(# )?(CONFIG_[^\s=]*)/) {
  		next if (defined($force_config{$2}));
  	    }
  	    print OUT;
  	}
  	close IN;
      }
      foreach my $config (keys %force_config) {
  	print OUT "$force_config{$config}
  ";
      }
      close OUT;
  
      run_command "mv $outconfig $output_config";
  }
612b9e9bd   Steven Rostedt   ktest: Handle ker...
1721
  sub make_oldconfig {
612b9e9bd   Steven Rostedt   ktest: Handle ker...
1722

4c4ab1204   Steven Rostedt   ktest: Add test t...
1723
1724
1725
1726
1727
      my @force_list = keys %force_config;
  
      if ($#force_list >= 0) {
  	apply_min_config;
      }
fcb3f16a4   Steven Rostedt   ktest: Implement ...
1728
1729
  
      if (!run_command "$make oldnoconfig") {
612b9e9bd   Steven Rostedt   ktest: Handle ker...
1730
1731
1732
1733
  	# Perhaps oldnoconfig doesn't exist in this version of the kernel
  	# try a yes '' | oldconfig
  	doprint "oldnoconfig failed, trying yes '' | make oldconfig
  ";
fcb3f16a4   Steven Rostedt   ktest: Implement ...
1734
  	run_command "yes '' | $make oldconfig" or
612b9e9bd   Steven Rostedt   ktest: Handle ker...
1735
1736
1737
  	    dodie "failed make config oldconfig";
      }
  }
fcb3f16a4   Steven Rostedt   ktest: Implement ...
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
  # read a config file and use this to force new configs.
  sub load_force_config {
      my ($config) = @_;
  
      open(IN, $config) or
  	dodie "failed to read $config";
      while (<IN>) {
  	chomp;
  	if (/^(CONFIG[^\s=]*)(\s*=.*)/) {
  	    $force_config{$1} = $_;
  	} elsif (/^# (CONFIG_\S*) is not set/) {
  	    $force_config{$1} = $_;
  	}
      }
      close IN;
  }
2545eb619   Steven Rostedt   Initial start of ...
1754
1755
  sub build {
      my ($type) = @_;
5c42fc5b9   Steven Rostedt   ktest: New featur...
1756

7faafbd69   Steven Rostedt   ktest: Add open a...
1757
      unlink $buildlog;
4ab1cce5b   Steven Rostedt   ktest: Do not reb...
1758
1759
1760
      # Failed builds should not reboot the target
      my $save_no_reboot = $no_reboot;
      $no_reboot = 1;
0bd6c1a38   Steven Rostedt   ktest: Add POST/P...
1761
1762
1763
1764
1765
1766
1767
1768
      if (defined($pre_build)) {
  	my $ret = run_command $pre_build;
  	if (!$ret && defined($pre_build_die) &&
  	    $pre_build_die) {
  	    dodie "failed to pre_build
  ";
  	}
      }
75c3fda79   Steven Rostedt   ktest: New featur...
1769
      if ($type =~ /^useconfig:(.*)/) {
51ad1dd10   Steven Rostedt   ktest: Use $outpu...
1770
  	run_command "cp $1 $output_config" or
75c3fda79   Steven Rostedt   ktest: New featur...
1771
  	    dodie "could not copy $1 to .config";
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1772

75c3fda79   Steven Rostedt   ktest: New featur...
1773
1774
  	$type = "oldconfig";
      }
5c42fc5b9   Steven Rostedt   ktest: New featur...
1775
1776
      # old config can ask questions
      if ($type eq "oldconfig") {
9386c6ab7   Steven Rostedt   ktest: Use oldnoc...
1777
  	$type = "oldnoconfig";
75c3fda79   Steven Rostedt   ktest: New featur...
1778
1779
  
  	# allow for empty configs
51ad1dd10   Steven Rostedt   ktest: Use $outpu...
1780
  	run_command "touch $output_config";
75c3fda79   Steven Rostedt   ktest: New featur...
1781

134882311   Andrew Jones   ktest: Only need ...
1782
1783
1784
  	if (!$noclean) {
  	    run_command "mv $output_config $outputdir/config_temp" or
  		dodie "moving .config";
2545eb619   Steven Rostedt   Initial start of ...
1785

134882311   Andrew Jones   ktest: Only need ...
1786
  	    run_command "$make mrproper" or dodie "make mrproper";
2545eb619   Steven Rostedt   Initial start of ...
1787

134882311   Andrew Jones   ktest: Only need ...
1788
1789
1790
  	    run_command "mv $outputdir/config_temp $output_config" or
  		dodie "moving config_temp";
  	}
5c42fc5b9   Steven Rostedt   ktest: New featur...
1791
1792
  
      } elsif (!$noclean) {
51ad1dd10   Steven Rostedt   ktest: Use $outpu...
1793
  	unlink "$output_config";
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1794
  	run_command "$make mrproper" or
5c42fc5b9   Steven Rostedt   ktest: New featur...
1795
  	    dodie "make mrproper";
5c42fc5b9   Steven Rostedt   ktest: New featur...
1796
      }
2545eb619   Steven Rostedt   Initial start of ...
1797
1798
  
      # add something to distinguish this build
a75fececf   Steven Rostedt   ktest: Added samp...
1799
1800
1801
      open(OUT, "> $outputdir/localversion") or dodie("Can't make localversion file");
      print OUT "$localversion
  ";
2545eb619   Steven Rostedt   Initial start of ...
1802
      close(OUT);
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1803
      if (defined($minconfig)) {
fcb3f16a4   Steven Rostedt   ktest: Implement ...
1804
  	load_force_config($minconfig);
2545eb619   Steven Rostedt   Initial start of ...
1805
      }
fcb3f16a4   Steven Rostedt   ktest: Implement ...
1806
1807
      if ($type ne "oldnoconfig") {
  	run_command "$make $type" or
612b9e9bd   Steven Rostedt   ktest: Handle ker...
1808
1809
  	    dodie "failed make config";
      }
fcb3f16a4   Steven Rostedt   ktest: Implement ...
1810
1811
      # Run old config regardless, to enforce min configurations
      make_oldconfig;
2545eb619   Steven Rostedt   Initial start of ...
1812

a75fececf   Steven Rostedt   ktest: Added samp...
1813
      $redirect = "$buildlog";
0bd6c1a38   Steven Rostedt   ktest: Add POST/P...
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
      my $build_ret = run_command "$make $build_options";
      undef $redirect;
  
      if (defined($post_build)) {
  	my $ret = run_command $post_build;
  	if (!$ret && defined($post_build_die) &&
  	    $post_build_die) {
  	    dodie "failed to post_build
  ";
  	}
      }
  
      if (!$build_ret) {
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1827
  	# bisect may need this to pass
4ab1cce5b   Steven Rostedt   ktest: Do not reb...
1828
1829
1830
1831
  	if ($in_bisect) {
  	    $no_reboot = $save_no_reboot;
  	    return 0;
  	}
2b7d9b214   Steven Rostedt   ktest: Added cont...
1832
  	fail "failed build" and return 0;
2545eb619   Steven Rostedt   Initial start of ...
1833
      }
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1834

4ab1cce5b   Steven Rostedt   ktest: Do not reb...
1835
      $no_reboot = $save_no_reboot;
2b7d9b214   Steven Rostedt   ktest: Added cont...
1836
      return 1;
2545eb619   Steven Rostedt   Initial start of ...
1837
  }
75c3fda79   Steven Rostedt   ktest: New featur...
1838
  sub halt {
e48c5293b   Steven Rostedt   ktest/cleanups: A...
1839
      if (!run_ssh "halt" or defined($power_off)) {
576f627c8   Steven Rostedt   ktest: Add powero...
1840
1841
1842
1843
1844
  	if (defined($poweroff_after_halt)) {
  	    sleep $poweroff_after_halt;
  	    run_command "$power_off";
  	}
      } else {
75c3fda79   Steven Rostedt   ktest: New featur...
1845
  	# nope? the zap it!
a75fececf   Steven Rostedt   ktest: Added samp...
1846
  	run_command "$power_off";
75c3fda79   Steven Rostedt   ktest: New featur...
1847
1848
      }
  }
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1849
1850
  sub success {
      my ($i) = @_;
e48c5293b   Steven Rostedt   ktest/cleanups: A...
1851
      $successes++;
9064af520   Steven Rostedt   ktest: Add TEST_N...
1852
1853
1854
1855
1856
      my $name = "";
  
      if (defined($test_name)) {
  	$name = " ($test_name)";
      }
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1857
1858
1859
1860
1861
1862
      doprint "
  
  *******************************************
  ";
      doprint     "*******************************************
  ";
9064af520   Steven Rostedt   ktest: Add TEST_N...
1863
1864
      doprint     "KTEST RESULT: TEST $i$name SUCCESS!!!!         **
  ";
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1865
1866
1867
1868
      doprint     "*******************************************
  ";
      doprint     "*******************************************
  ";
de5b6e3bf   Rabin Vincent   ktest: Allow succ...
1869
1870
1871
      if (defined($store_successes)) {
          save_logs "success", $store_successes;
      }
576f627c8   Steven Rostedt   ktest: Add powero...
1872
      if ($i != $opt{"NUM_TESTS"} && !do_not_reboot) {
a75fececf   Steven Rostedt   ktest: Added samp...
1873
1874
  	doprint "Reboot and wait $sleep_time seconds
  ";
bc7c58037   Steven Rostedt   ktest: Add option...
1875
  	reboot_to_good $sleep_time;
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
1876
1877
      }
  }
c960bb9f5   Steven Rostedt   ktest: Add manual...
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
  sub answer_bisect {
      for (;;) {
  	doprint "Pass or fail? [p/f]";
  	my $ans = <STDIN>;
  	chomp $ans;
  	if ($ans eq "p" || $ans eq "P") {
  	    return 1;
  	} elsif ($ans eq "f" || $ans eq "F") {
  	    return 0;
  	} else {
  	    print "Please answer 'P' or 'F'
  ";
  	}
      }
  }
5a391fbff   Steven Rostedt   ktest: Added bett...
1893
  sub child_run_test {
7faafbd69   Steven Rostedt   ktest: Add open a...
1894
      my $failed = 0;
5a391fbff   Steven Rostedt   ktest: Added bett...
1895

7faafbd69   Steven Rostedt   ktest: Add open a...
1896
      # child should have no power
a75fececf   Steven Rostedt   ktest: Added samp...
1897
1898
1899
      $reboot_on_error = 0;
      $poweroff_on_error = 0;
      $die_on_failure = 1;
7faafbd69   Steven Rostedt   ktest: Add open a...
1900

a9dd5d631   Rabin Vincent   ktest: Save test ...
1901
      $redirect = "$testlog";
7faafbd69   Steven Rostedt   ktest: Add open a...
1902
      run_command $run_test or $failed = 1;
a9dd5d631   Rabin Vincent   ktest: Save test ...
1903
      undef $redirect;
5a391fbff   Steven Rostedt   ktest: Added bett...
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
      exit $failed;
  }
  
  my $child_done;
  
  sub child_finished {
      $child_done = 1;
  }
  
  sub do_run_test {
      my $child_pid;
      my $child_exit;
5a391fbff   Steven Rostedt   ktest: Added bett...
1916
1917
1918
      my $line;
      my $full_line;
      my $bug = 0;
5a391fbff   Steven Rostedt   ktest: Added bett...
1919

7faafbd69   Steven Rostedt   ktest: Add open a...
1920
      wait_for_monitor 1;
5a391fbff   Steven Rostedt   ktest: Added bett...
1921

7faafbd69   Steven Rostedt   ktest: Add open a...
1922
1923
      doprint "run test $run_test
  ";
5a391fbff   Steven Rostedt   ktest: Added bett...
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
  
      $child_done = 0;
  
      $SIG{CHLD} = qw(child_finished);
  
      $child_pid = fork;
  
      child_run_test if (!$child_pid);
  
      $full_line = "";
  
      do {
7faafbd69   Steven Rostedt   ktest: Add open a...
1936
  	$line = wait_for_input($monitor_fp, 1);
5a391fbff   Steven Rostedt   ktest: Added bett...
1937
1938
1939
1940
  	if (defined($line)) {
  
  	    # we are not guaranteed to get a full line
  	    $full_line .= $line;
8ea0e063a   Steven Rostedt   ktest: Monitor ke...
1941
  	    doprint $line;
5a391fbff   Steven Rostedt   ktest: Added bett...
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
  
  	    if ($full_line =~ /call trace:/i) {
  		$bug = 1;
  	    }
  
  	    if ($full_line =~ /Kernel panic -/) {
  		$bug = 1;
  	    }
  
  	    if ($line =~ /
  /) {
  		$full_line = "";
  	    }
  	}
      } while (!$child_done && !$bug);
  
      if ($bug) {
8ea0e063a   Steven Rostedt   ktest: Monitor ke...
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
  	my $failure_start = time;
  	my $now;
  	do {
  	    $line = wait_for_input($monitor_fp, 1);
  	    if (defined($line)) {
  		doprint $line;
  	    }
  	    $now = time;
  	    if ($now - $failure_start >= $stop_after_failure) {
  		last;
  	    }
  	} while (defined($line));
5a391fbff   Steven Rostedt   ktest: Added bett...
1971
1972
1973
1974
1975
1976
1977
1978
  	doprint "Detected kernel crash!
  ";
  	# kill the child with extreme prejudice
  	kill 9, $child_pid;
      }
  
      waitpid $child_pid, 0;
      $child_exit = $?;
c5dacb88f   Steven Rostedt   ktest: Allow over...
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
      if (!$bug && $in_bisect) {
  	if (defined($bisect_ret_good)) {
  	    if ($child_exit == $bisect_ret_good) {
  		return 1;
  	    }
  	}
  	if (defined($bisect_ret_skip)) {
  	    if ($child_exit == $bisect_ret_skip) {
  		return -1;
  	    }
  	}
  	if (defined($bisect_ret_abort)) {
  	    if ($child_exit == $bisect_ret_abort) {
  		fail "test abort" and return -2;
  	    }
  	}
  	if (defined($bisect_ret_bad)) {
  	    if ($child_exit == $bisect_ret_skip) {
  		return 0;
  	    }
  	}
  	if (defined($bisect_ret_default)) {
  	    if ($bisect_ret_default eq "good") {
  		return 1;
  	    } elsif ($bisect_ret_default eq "bad") {
  		return 0;
  	    } elsif ($bisect_ret_default eq "skip") {
  		return -1;
  	    } elsif ($bisect_ret_default eq "abort") {
  		return -2;
  	    } else {
  		fail "unknown default action: $bisect_ret_default"
  		    and return -2;
  	    }
  	}
      }
5a391fbff   Steven Rostedt   ktest: Added bett...
2015
      if ($bug || $child_exit) {
2b7d9b214   Steven Rostedt   ktest: Added cont...
2016
2017
  	return 0 if $in_bisect;
  	fail "test failed" and return 0;
5a391fbff   Steven Rostedt   ktest: Added bett...
2018
      }
2b7d9b214   Steven Rostedt   ktest: Added cont...
2019
      return 1;
5a391fbff   Steven Rostedt   ktest: Added bett...
2020
  }
a75fececf   Steven Rostedt   ktest: Added samp...
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
  sub run_git_bisect {
      my ($command) = @_;
  
      doprint "$command ... ";
  
      my $output = `$command 2>&1`;
      my $ret = $?;
  
      logit $output;
  
      if ($ret) {
  	doprint "FAILED
  ";
  	dodie "Failed to git bisect";
      }
  
      doprint "SUCCESS
  ";
      if ($output =~ m/^(Bisecting: .*\(roughly \d+ steps?\))\s+\[([[:xdigit:]]+)\]/) {
  	doprint "$1 [$2]
  ";
      } elsif ($output =~ m/^([[:xdigit:]]+) is the first bad commit/) {
b5f4aea68   Steven Rostedt   ktest: Have all v...
2043
  	$bisect_bad_commit = $1;
a75fececf   Steven Rostedt   ktest: Added samp...
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
  	doprint "Found bad commit... $1
  ";
  	return 0;
      } else {
  	# we already logged it, just print it now.
  	print $output;
      }
  
      return 1;
  }
c23dca7cd   Steven Rostedt   ktest: Add BISECT...
2054
2055
2056
  sub bisect_reboot {
      doprint "Reboot and sleep $bisect_sleep_time seconds
  ";
bc7c58037   Steven Rostedt   ktest: Add option...
2057
      reboot_to_good $bisect_sleep_time;
c23dca7cd   Steven Rostedt   ktest: Add BISECT...
2058
2059
2060
  }
  
  # returns 1 on success, 0 on failure, -1 on skip
0a05c769a   Steven Rostedt   ktest: Added conf...
2061
2062
  sub run_bisect_test {
      my ($type, $buildtype) = @_;
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
2063

2b7d9b214   Steven Rostedt   ktest: Added cont...
2064
      my $failed = 0;
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
2065
2066
2067
      my $result;
      my $output;
      my $ret;
0a05c769a   Steven Rostedt   ktest: Added conf...
2068
2069
2070
      $in_bisect = 1;
  
      build $buildtype or $failed = 1;
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
2071
2072
  
      if ($type ne "build") {
c23dca7cd   Steven Rostedt   ktest: Add BISECT...
2073
2074
2075
2076
  	if ($failed && $bisect_skip) {
  	    $in_bisect = 0;
  	    return -1;
  	}
7faafbd69   Steven Rostedt   ktest: Add open a...
2077
  	dodie "Failed on build" if $failed;
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
2078
2079
  
  	# Now boot the box
ddf607e5f   Steven Rostedt   ktest: Add helper...
2080
  	start_monitor_and_boot or $failed = 1;
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
2081
2082
  
  	if ($type ne "boot") {
c23dca7cd   Steven Rostedt   ktest: Add BISECT...
2083
2084
2085
2086
2087
2088
  	    if ($failed && $bisect_skip) {
  		end_monitor;
  		bisect_reboot;
  		$in_bisect = 0;
  		return -1;
  	    }
7faafbd69   Steven Rostedt   ktest: Add open a...
2089
  	    dodie "Failed on boot" if $failed;
5a391fbff   Steven Rostedt   ktest: Added bett...
2090

2b7d9b214   Steven Rostedt   ktest: Added cont...
2091
  	    do_run_test or $failed = 1;
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
2092
  	}
7faafbd69   Steven Rostedt   ktest: Add open a...
2093
  	end_monitor;
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
2094
2095
2096
      }
  
      if ($failed) {
0a05c769a   Steven Rostedt   ktest: Added conf...
2097
  	$result = 0;
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
2098
      } else {
0a05c769a   Steven Rostedt   ktest: Added conf...
2099
2100
  	$result = 1;
      }
4025bc62d   Steven Rostedt   ktest: Reboot to ...
2101
2102
2103
2104
2105
  
      # reboot the box to a kernel we can ssh to
      if ($type ne "build") {
  	bisect_reboot;
      }
0a05c769a   Steven Rostedt   ktest: Added conf...
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
      $in_bisect = 0;
  
      return $result;
  }
  
  sub run_bisect {
      my ($type) = @_;
      my $buildtype = "oldconfig";
  
      # We should have a minconfig to use?
      if (defined($minconfig)) {
  	$buildtype = "useconfig:$minconfig";
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
2118
      }
0a05c769a   Steven Rostedt   ktest: Added conf...
2119
      my $ret = run_bisect_test $type, $buildtype;
c960bb9f5   Steven Rostedt   ktest: Add manual...
2120
2121
2122
      if ($bisect_manual) {
  	$ret = answer_bisect;
      }
0a05c769a   Steven Rostedt   ktest: Added conf...
2123

d6ce2a0b3   Steven Rostedt   ktest: Add revers...
2124
2125
      # Are we looking for where it worked, not failed?
      if ($reverse_bisect) {
0a05c769a   Steven Rostedt   ktest: Added conf...
2126
  	$ret = !$ret;
d6ce2a0b3   Steven Rostedt   ktest: Add revers...
2127
      }
c23dca7cd   Steven Rostedt   ktest: Add BISECT...
2128
      if ($ret > 0) {
0a05c769a   Steven Rostedt   ktest: Added conf...
2129
  	return "good";
c23dca7cd   Steven Rostedt   ktest: Add BISECT...
2130
      } elsif ($ret == 0) {
0a05c769a   Steven Rostedt   ktest: Added conf...
2131
  	return  "bad";
c23dca7cd   Steven Rostedt   ktest: Add BISECT...
2132
2133
2134
2135
      } elsif ($bisect_skip) {
  	doprint "HIT A BAD COMMIT ... SKIPPING
  ";
  	return "skip";
0a05c769a   Steven Rostedt   ktest: Added conf...
2136
      }
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
2137
  }
dad987549   Steven Rostedt   ktest: Allow bise...
2138
2139
2140
2141
2142
2143
  sub update_bisect_replay {
      my $tmp_log = "$tmpdir/ktest_bisect_log";
      run_command "git bisect log > $tmp_log" or
  	die "can't create bisect log";
      return $tmp_log;
  }
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
2144
2145
2146
2147
  sub bisect {
      my ($i) = @_;
  
      my $result;
b5f4aea68   Steven Rostedt   ktest: Have all v...
2148
2149
2150
2151
2152
2153
      die "BISECT_GOOD[$i] not defined
  "	if (!defined($bisect_good));
      die "BISECT_BAD[$i] not defined
  "	if (!defined($bisect_bad));
      die "BISECT_TYPE[$i] not defined
  "	if (!defined($bisect_type));
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
2154

b5f4aea68   Steven Rostedt   ktest: Have all v...
2155
2156
2157
2158
2159
2160
      my $good = $bisect_good;
      my $bad = $bisect_bad;
      my $type = $bisect_type;
      my $start = $bisect_start;
      my $replay = $bisect_replay;
      my $start_files = $bisect_files;
3410f6fd5   Steven Rostedt   ktest: Add BISECT...
2161
2162
2163
2164
2165
2166
  
      if (defined($start_files)) {
  	$start_files = " -- " . $start_files;
      } else {
  	$start_files = "";
      }
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
2167

a57419b36   Steven Rostedt   ktest: New TEST_S...
2168
2169
2170
      # convert to true sha1's
      $good = get_sha1($good);
      $bad = get_sha1($bad);
b5f4aea68   Steven Rostedt   ktest: Have all v...
2171
      if (defined($bisect_reverse) && $bisect_reverse == 1) {
d6ce2a0b3   Steven Rostedt   ktest: Add revers...
2172
2173
2174
2175
2176
2177
  	doprint "Performing a reverse bisect (bad is good, good is bad!)
  ";
  	$reverse_bisect = 1;
      } else {
  	$reverse_bisect = 0;
      }
a75fececf   Steven Rostedt   ktest: Added samp...
2178
2179
2180
2181
      # Can't have a test without having a test to run
      if ($type eq "test" && !defined($run_test)) {
  	$type = "boot";
      }
dad987549   Steven Rostedt   ktest: Allow bise...
2182
2183
      # Check if a bisect was running
      my $bisect_start_file = "$builddir/.git/BISECT_START";
b5f4aea68   Steven Rostedt   ktest: Have all v...
2184
      my $check = $bisect_check;
dad987549   Steven Rostedt   ktest: Allow bise...
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
      my $do_check = defined($check) && $check ne "0";
  
      if ( -f $bisect_start_file ) {
  	print "Bisect in progress found
  ";
  	if ($do_check) {
  	    print " If you say yes, then no checks of good or bad will be done
  ";
  	}
  	if (defined($replay)) {
  	    print "** BISECT_REPLAY is defined in config file **";
  	    print " Ignore config option and perform new git bisect log?
  ";
  	    if (read_ync " (yes, no, or cancel) ") {
  		$replay = update_bisect_replay;
  		$do_check = 0;
  	    }
  	} elsif (read_yn "read git log and continue?") {
  	    $replay = update_bisect_replay;
  	    $do_check = 0;
  	}
      }
  
      if ($do_check) {
a75fececf   Steven Rostedt   ktest: Added samp...
2209
2210
  
  	# get current HEAD
a57419b36   Steven Rostedt   ktest: New TEST_S...
2211
  	my $head = get_sha1("HEAD");
a75fececf   Steven Rostedt   ktest: Added samp...
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
  
  	if ($check ne "good") {
  	    doprint "TESTING BISECT BAD [$bad]
  ";
  	    run_command "git checkout $bad" or
  		die "Failed to checkout $bad";
  
  	    $result = run_bisect $type;
  
  	    if ($result ne "bad") {
  		fail "Tested BISECT_BAD [$bad] and it succeeded" and return 0;
  	    }
  	}
  
  	if ($check ne "bad") {
  	    doprint "TESTING BISECT GOOD [$good]
  ";
  	    run_command "git checkout $good" or
  		die "Failed to checkout $good";
  
  	    $result = run_bisect $type;
  
  	    if ($result ne "good") {
  		fail "Tested BISECT_GOOD [$good] and it failed" and return 0;
  	    }
  	}
  
  	# checkout where we started
  	run_command "git checkout $head" or
  	    die "Failed to checkout $head";
      }
3410f6fd5   Steven Rostedt   ktest: Add BISECT...
2243
      run_command "git bisect start$start_files" or
a75fececf   Steven Rostedt   ktest: Added samp...
2244
  	dodie "could not start bisect";
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
2245
2246
  
      run_command "git bisect good $good" or
a75fececf   Steven Rostedt   ktest: Added samp...
2247
  	dodie "could not set bisect good to $good";
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
2248

a75fececf   Steven Rostedt   ktest: Added samp...
2249
2250
      run_git_bisect "git bisect bad $bad" or
  	dodie "could not set bisect bad to $bad";
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
2251

a75fececf   Steven Rostedt   ktest: Added samp...
2252
2253
2254
      if (defined($replay)) {
  	run_command "git bisect replay $replay" or
  	    dodie "failed to run replay";
5a391fbff   Steven Rostedt   ktest: Added bett...
2255
      }
a75fececf   Steven Rostedt   ktest: Added samp...
2256
2257
2258
2259
2260
2261
      if (defined($start)) {
  	run_command "git checkout $start" or
  	    dodie "failed to checkout $start";
      }
  
      my $test;
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
2262
2263
      do {
  	$result = run_bisect $type;
a75fececf   Steven Rostedt   ktest: Added samp...
2264
2265
  	$test = run_git_bisect "git bisect $result";
      } while ($test);
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
2266
2267
2268
2269
2270
2271
  
      run_command "git bisect log" or
  	dodie "could not capture git bisect log";
  
      run_command "git bisect reset" or
  	dodie "could not reset git bisect";
b5f4aea68   Steven Rostedt   ktest: Have all v...
2272
2273
      doprint "Bad commit was [$bisect_bad_commit]
  ";
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
2274

0a05c769a   Steven Rostedt   ktest: Added conf...
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
      success $i;
  }
  
  my %config_ignore;
  my %config_set;
  
  my %config_list;
  my %null_config;
  
  my %dependency;
4c4ab1204   Steven Rostedt   ktest: Add test t...
2285
2286
  sub assign_configs {
      my ($hash, $config) = @_;
0a05c769a   Steven Rostedt   ktest: Added conf...
2287
2288
2289
2290
2291
  
      open (IN, $config)
  	or dodie "Failed to read $config";
  
      while (<IN>) {
9bf717494   Steven Rostedt   ktest: Ignore uns...
2292
  	if (/^((CONFIG\S*)=.*)/) {
4c4ab1204   Steven Rostedt   ktest: Add test t...
2293
  	    ${$hash}{$2} = $1;
0a05c769a   Steven Rostedt   ktest: Added conf...
2294
2295
2296
2297
2298
  	}
      }
  
      close(IN);
  }
4c4ab1204   Steven Rostedt   ktest: Add test t...
2299
2300
2301
2302
2303
  sub process_config_ignore {
      my ($config) = @_;
  
      assign_configs \%config_ignore, $config;
  }
0a05c769a   Steven Rostedt   ktest: Added conf...
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
  sub read_current_config {
      my ($config_ref) = @_;
  
      %{$config_ref} = ();
      undef %{$config_ref};
  
      my @key = keys %{$config_ref};
      if ($#key >= 0) {
  	print "did not delete!
  ";
  	exit;
      }
      open (IN, "$output_config");
  
      while (<IN>) {
  	if (/^(CONFIG\S+)=(.*)/) {
  	    ${$config_ref}{$1} = $2;
  	}
      }
      close(IN);
  }
  
  sub get_dependencies {
      my ($config) = @_;
  
      my $arr = $dependency{$config};
      if (!defined($arr)) {
  	return ();
      }
  
      my @deps = @{$arr};
  
      foreach my $dep (@{$arr}) {
  	print "ADD DEP $dep
  ";
  	@deps = (@deps, get_dependencies $dep);
      }
  
      return @deps;
  }
  
  sub create_config {
      my @configs = @_;
  
      open(OUT, ">$output_config") or dodie "Can not write to $output_config";
  
      foreach my $config (@configs) {
  	print OUT "$config_set{$config}
  ";
  	my @deps = get_dependencies $config;
  	foreach my $dep (@deps) {
  	    print OUT "$config_set{$dep}
  ";
  	}
      }
  
      foreach my $config (keys %config_ignore) {
  	print OUT "$config_ignore{$config}
  ";
      }
      close(OUT);
  
  #    exit;
fcb3f16a4   Steven Rostedt   ktest: Implement ...
2367
      make_oldconfig;
0a05c769a   Steven Rostedt   ktest: Added conf...
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
  }
  
  sub compare_configs {
      my (%a, %b) = @_;
  
      foreach my $item (keys %a) {
  	if (!defined($b{$item})) {
  	    print "diff $item
  ";
  	    return 1;
  	}
  	delete $b{$item};
      }
  
      my @keys = keys %b;
      if ($#keys) {
  	print "diff2 $keys[0]
  ";
      }
      return -1 if ($#keys >= 0);
  
      return 0;
  }
  
  sub run_config_bisect_test {
      my ($type) = @_;
  
      return run_bisect_test $type, "oldconfig";
  }
  
  sub process_passed {
      my (%configs) = @_;
  
      doprint "These configs had no failure: (Enabling them for further compiles)
  ";
      # Passed! All these configs are part of a good compile.
      # Add them to the min options.
      foreach my $config (keys %configs) {
  	if (defined($config_list{$config})) {
  	    doprint " removing $config
  ";
  	    $config_ignore{$config} = $config_list{$config};
  	    delete $config_list{$config};
  	}
      }
f1a278500   Steven Rostedt   ktest: Copy the l...
2413
2414
2415
      doprint "config copied to $outputdir/config_good
  ";
      run_command "cp -f $output_config $outputdir/config_good";
0a05c769a   Steven Rostedt   ktest: Added conf...
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
  }
  
  sub process_failed {
      my ($config) = @_;
  
      doprint "
  
  ***************************************
  ";
      doprint "Found bad config: $config
  ";
      doprint "***************************************
  
  ";
  }
  
  sub run_config_bisect {
  
      my @start_list = keys %config_list;
  
      if ($#start_list < 0) {
  	doprint "No more configs to test!!!
  ";
  	return -1;
      }
  
      doprint "***** RUN TEST ***
  ";
b5f4aea68   Steven Rostedt   ktest: Have all v...
2444
      my $type = $config_bisect_type;
0a05c769a   Steven Rostedt   ktest: Added conf...
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
      my $ret;
      my %current_config;
  
      my $count = $#start_list + 1;
      doprint "  $count configs to test
  ";
  
      my $half = int($#start_list / 2);
  
      do {
  	my @tophalf = @start_list[0 .. $half];
  
  	create_config @tophalf;
  	read_current_config \%current_config;
  
  	$count = $#tophalf + 1;
  	doprint "Testing $count configs
  ";
  	my $found = 0;
  	# make sure we test something
  	foreach my $config (@tophalf) {
  	    if (defined($current_config{$config})) {
  		logit " $config
  ";
  		$found = 1;
  	    }
  	}
  	if (!$found) {
  	    # try the other half
  	    doprint "Top half produced no set configs, trying bottom half
  ";
4c8cc55b3   Steven Rostedt   ktest: Fix off-by...
2476
  	    @tophalf = @start_list[$half + 1 .. $#start_list];
0a05c769a   Steven Rostedt   ktest: Added conf...
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
  	    create_config @tophalf;
  	    read_current_config \%current_config;
  	    foreach my $config (@tophalf) {
  		if (defined($current_config{$config})) {
  		    logit " $config
  ";
  		    $found = 1;
  		}
  	    }
  	    if (!$found) {
  		doprint "Failed: Can't make new config with current configs
  ";
  		foreach my $config (@start_list) {
  		    doprint "  CONFIG: $config
  ";
  		}
  		return -1;
  	    }
  	    $count = $#tophalf + 1;
  	    doprint "Testing $count configs
  ";
  	}
  
  	$ret = run_config_bisect_test $type;
c960bb9f5   Steven Rostedt   ktest: Add manual...
2501
2502
2503
  	if ($bisect_manual) {
  	    $ret = answer_bisect;
  	}
0a05c769a   Steven Rostedt   ktest: Added conf...
2504
2505
2506
2507
2508
2509
2510
2511
2512
  	if ($ret) {
  	    process_passed %current_config;
  	    return 0;
  	}
  
  	doprint "This config had a failure.
  ";
  	doprint "Removing these configs that were not set in this config:
  ";
f1a278500   Steven Rostedt   ktest: Copy the l...
2513
2514
2515
  	doprint "config copied to $outputdir/config_bad
  ";
  	run_command "cp -f $output_config $outputdir/config_bad";
0a05c769a   Steven Rostedt   ktest: Added conf...
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
  
  	# A config exists in this group that was bad.
  	foreach my $config (keys %config_list) {
  	    if (!defined($current_config{$config})) {
  		doprint " removing $config
  ";
  		delete $config_list{$config};
  	    }
  	}
  
  	@start_list = @tophalf;
  
  	if ($#start_list == 0) {
  	    process_failed $start_list[0];
  	    return 1;
  	}
  
  	# remove half the configs we are looking at and see if
  	# they are good.
  	$half = int($#start_list / 2);
4c8cc55b3   Steven Rostedt   ktest: Fix off-by...
2536
      } while ($#start_list > 0);
0a05c769a   Steven Rostedt   ktest: Added conf...
2537

c960bb9f5   Steven Rostedt   ktest: Add manual...
2538
2539
2540
2541
2542
2543
      # we found a single config, try it again unless we are running manually
  
      if ($bisect_manual) {
  	process_failed $start_list[0];
  	return 1;
      }
0a05c769a   Steven Rostedt   ktest: Added conf...
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
      my @tophalf = @start_list[0 .. 0];
  
      $ret = run_config_bisect_test $type;
      if ($ret) {
  	process_passed %current_config;
  	return 0;
      }
  
      process_failed $start_list[0];
      return 1;
  }
  
  sub config_bisect {
      my ($i) = @_;
b5f4aea68   Steven Rostedt   ktest: Have all v...
2558
      my $start_config = $config_bisect;
0a05c769a   Steven Rostedt   ktest: Added conf...
2559
2560
  
      my $tmpconfig = "$tmpdir/use_config";
30f75da5f   Steven Rostedt   ktest: Add CONFIG...
2561
2562
2563
      if (defined($config_bisect_good)) {
  	process_config_ignore $config_bisect_good;
      }
0a05c769a   Steven Rostedt   ktest: Added conf...
2564
2565
2566
2567
2568
2569
2570
2571
      # Make the file with the bad config and the min config
      if (defined($minconfig)) {
  	# read the min config for things to ignore
  	run_command "cp $minconfig $tmpconfig" or
  	    dodie "failed to copy $minconfig to $tmpconfig";
      } else {
  	unlink $tmpconfig;
      }
0a05c769a   Steven Rostedt   ktest: Added conf...
2572
      if (-f $tmpconfig) {
fcb3f16a4   Steven Rostedt   ktest: Implement ...
2573
  	load_force_config($tmpconfig);
0a05c769a   Steven Rostedt   ktest: Added conf...
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
  	process_config_ignore $tmpconfig;
      }
  
      # now process the start config
      run_command "cp $start_config $output_config" or
  	dodie "failed to copy $start_config to $output_config";
  
      # read directly what we want to check
      my %config_check;
      open (IN, $output_config)
  	or dodie "faied to open $output_config";
  
      while (<IN>) {
  	if (/^((CONFIG\S*)=.*)/) {
  	    $config_check{$2} = $1;
  	}
      }
      close(IN);
250bae8be   Steven Rostedt   ktest: Fix bug wh...
2592
      # Now run oldconfig with the minconfig
fcb3f16a4   Steven Rostedt   ktest: Implement ...
2593
      make_oldconfig;
0a05c769a   Steven Rostedt   ktest: Added conf...
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
  
      # check to see what we lost (or gained)
      open (IN, $output_config)
  	or dodie "Failed to read $start_config";
  
      my %removed_configs;
      my %added_configs;
  
      while (<IN>) {
  	if (/^((CONFIG\S*)=.*)/) {
  	    # save off all options
  	    $config_set{$2} = $1;
  	    if (defined($config_check{$2})) {
  		if (defined($config_ignore{$2})) {
  		    $removed_configs{$2} = $1;
  		} else {
  		    $config_list{$2} = $1;
  		}
  	    } elsif (!defined($config_ignore{$2})) {
  		$added_configs{$2} = $1;
  		$config_list{$2} = $1;
  	    }
  	}
      }
      close(IN);
  
      my @confs = keys %removed_configs;
      if ($#confs >= 0) {
  	doprint "Configs overridden by default configs and removed from check:
  ";
  	foreach my $config (@confs) {
  	    doprint " $config
  ";
  	}
      }
      @confs = keys %added_configs;
      if ($#confs >= 0) {
  	doprint "Configs appearing in make oldconfig and added:
  ";
  	foreach my $config (@confs) {
  	    doprint " $config
  ";
  	}
      }
  
      my %config_test;
      my $once = 0;
  
      # Sometimes kconfig does weird things. We must make sure
      # that the config we autocreate has everything we need
      # to test, otherwise we may miss testing configs, or
      # may not be able to create a new config.
      # Here we create a config with everything set.
      create_config (keys %config_list);
      read_current_config \%config_test;
      foreach my $config (keys %config_list) {
  	if (!defined($config_test{$config})) {
  	    if (!$once) {
  		$once = 1;
  		doprint "Configs not produced by kconfig (will not be checked):
  ";
  	    }
  	    doprint "  $config
  ";
  	    delete $config_list{$config};
  	}
      }
      my $ret;
      do {
  	$ret = run_config_bisect;
      } while (!$ret);
  
      return $ret if ($ret < 0);
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
2667
2668
2669
  
      success $i;
  }
27d934b28   Steven Rostedt   ktest: Reboot aft...
2670
2671
2672
  sub patchcheck_reboot {
      doprint "Reboot and sleep $patchcheck_sleep_time seconds
  ";
bc7c58037   Steven Rostedt   ktest: Add option...
2673
      reboot_to_good $patchcheck_sleep_time;
27d934b28   Steven Rostedt   ktest: Reboot aft...
2674
  }
6c5ee0be0   Steven Rostedt   ktest: Added patc...
2675
2676
2677
2678
2679
  sub patchcheck {
      my ($i) = @_;
  
      die "PATCHCHECK_START[$i] not defined
  "
b5f4aea68   Steven Rostedt   ktest: Have all v...
2680
  	if (!defined($patchcheck_start));
6c5ee0be0   Steven Rostedt   ktest: Added patc...
2681
2682
      die "PATCHCHECK_TYPE[$i] not defined
  "
b5f4aea68   Steven Rostedt   ktest: Have all v...
2683
  	if (!defined($patchcheck_type));
6c5ee0be0   Steven Rostedt   ktest: Added patc...
2684

b5f4aea68   Steven Rostedt   ktest: Have all v...
2685
      my $start = $patchcheck_start;
6c5ee0be0   Steven Rostedt   ktest: Added patc...
2686
2687
  
      my $end = "HEAD";
b5f4aea68   Steven Rostedt   ktest: Have all v...
2688
2689
      if (defined($patchcheck_end)) {
  	$end = $patchcheck_end;
6c5ee0be0   Steven Rostedt   ktest: Added patc...
2690
      }
a57419b36   Steven Rostedt   ktest: New TEST_S...
2691
2692
2693
      # Get the true sha1's since we can use things like HEAD~3
      $start = get_sha1($start);
      $end = get_sha1($end);
b5f4aea68   Steven Rostedt   ktest: Have all v...
2694
      my $type = $patchcheck_type;
6c5ee0be0   Steven Rostedt   ktest: Added patc...
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
  
      # Can't have a test without having a test to run
      if ($type eq "test" && !defined($run_test)) {
  	$type = "boot";
      }
  
      open (IN, "git log --pretty=oneline $end|") or
  	dodie "could not get git list";
  
      my @list;
  
      while (<IN>) {
  	chomp;
  	$list[$#list+1] = $_;
  	last if (/^$start/);
      }
      close(IN);
  
      if ($list[$#list] !~ /^$start/) {
2b7d9b214   Steven Rostedt   ktest: Added cont...
2714
  	fail "SHA1 $start not found";
6c5ee0be0   Steven Rostedt   ktest: Added patc...
2715
2716
2717
2718
2719
2720
      }
  
      # go backwards in the list
      @list = reverse @list;
  
      my $save_clean = $noclean;
1990207d5   Steven Rostedt   ktest: Add IGNORE...
2721
2722
2723
2724
2725
2726
2727
      my %ignored_warnings;
  
      if (defined($ignore_warnings)) {
  	foreach my $sha1 (split /\s+/, $ignore_warnings) {
  	    $ignored_warnings{$sha1} = 1;
  	}
      }
6c5ee0be0   Steven Rostedt   ktest: Added patc...
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
  
      $in_patchcheck = 1;
      foreach my $item (@list) {
  	my $sha1 = $item;
  	$sha1 =~ s/^([[:xdigit:]]+).*/$1/;
  
  	doprint "
  Processing commit $item
  
  ";
  
  	run_command "git checkout $sha1" or
  	    die "Failed to checkout $sha1";
  
  	# only clean on the first and last patch
  	if ($item eq $list[0] ||
  	    $item eq $list[$#list]) {
  	    $noclean = $save_clean;
  	} else {
  	    $noclean = 1;
  	}
  
  	if (defined($minconfig)) {
2b7d9b214   Steven Rostedt   ktest: Added cont...
2751
  	    build "useconfig:$minconfig" or return 0;
6c5ee0be0   Steven Rostedt   ktest: Added patc...
2752
2753
  	} else {
  	    # ?? no config to use?
2b7d9b214   Steven Rostedt   ktest: Added cont...
2754
  	    build "oldconfig" or return 0;
6c5ee0be0   Steven Rostedt   ktest: Added patc...
2755
  	}
1990207d5   Steven Rostedt   ktest: Add IGNORE...
2756
2757
2758
2759
  
  	if (!defined($ignored_warnings{$sha1})) {
  	    check_buildlog $sha1 or return 0;
  	}
6c5ee0be0   Steven Rostedt   ktest: Added patc...
2760
2761
  
  	next if ($type eq "build");
7faafbd69   Steven Rostedt   ktest: Add open a...
2762
  	my $failed = 0;
ddf607e5f   Steven Rostedt   ktest: Add helper...
2763
  	start_monitor_and_boot or $failed = 1;
7faafbd69   Steven Rostedt   ktest: Add open a...
2764
2765
2766
2767
2768
2769
  
  	if (!$failed && $type ne "boot"){
  	    do_run_test or $failed = 1;
  	}
  	end_monitor;
  	return 0 if ($failed);
27d934b28   Steven Rostedt   ktest: Reboot aft...
2770
  	patchcheck_reboot;
6c5ee0be0   Steven Rostedt   ktest: Added patc...
2771
2772
2773
      }
      $in_patchcheck = 0;
      success $i;
2b7d9b214   Steven Rostedt   ktest: Added cont...
2774
2775
  
      return 1;
6c5ee0be0   Steven Rostedt   ktest: Added patc...
2776
  }
b9066f6c0   Steven Rostedt   ktest: Use Kconfi...
2777
  my %depends;
ac6974c76   Steven Rostedt   ktest: Sort make_...
2778
  my %depcount;
b9066f6c0   Steven Rostedt   ktest: Use Kconfi...
2779
2780
2781
2782
2783
  my $iflevel = 0;
  my @ifdeps;
  
  # prevent recursion
  my %read_kconfigs;
ac6974c76   Steven Rostedt   ktest: Sort make_...
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
  sub add_dep {
      # $config depends on $dep
      my ($config, $dep) = @_;
  
      if (defined($depends{$config})) {
  	$depends{$config} .= " " . $dep;
      } else {
  	$depends{$config} = $dep;
      }
  
      # record the number of configs depending on $dep
      if (defined $depcount{$dep}) {
  	$depcount{$dep}++;
      } else {
  	$depcount{$dep} = 1;
      } 
  }
b9066f6c0   Steven Rostedt   ktest: Use Kconfi...
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
  # taken from streamline_config.pl
  sub read_kconfig {
      my ($kconfig) = @_;
  
      my $state = "NONE";
      my $config;
      my @kconfigs;
  
      my $cont = 0;
      my $line;
  
  
      if (! -f $kconfig) {
  	doprint "file $kconfig does not exist, skipping
  ";
  	return;
      }
  
      open(KIN, "$kconfig")
  	or die "Can't open $kconfig";
      while (<KIN>) {
  	chomp;
  
  	# Make sure that lines ending with \ continue
  	if ($cont) {
  	    $_ = $line . " " . $_;
  	}
  
  	if (s/\\$//) {
  	    $cont = 1;
  	    $line = $_;
  	    next;
  	}
  
  	$cont = 0;
  
  	# collect any Kconfig sources
  	if (/^source\s*"(.*)"/) {
  	    $kconfigs[$#kconfigs+1] = $1;
  	}
  
  	# configs found
  	if (/^\s*(menu)?config\s+(\S+)\s*$/) {
  	    $state = "NEW";
  	    $config = $2;
  
  	    for (my $i = 0; $i < $iflevel; $i++) {
ac6974c76   Steven Rostedt   ktest: Sort make_...
2848
  		add_dep $config, $ifdeps[$i];
b9066f6c0   Steven Rostedt   ktest: Use Kconfi...
2849
2850
2851
2852
  	    }
  
  	# collect the depends for the config
  	} elsif ($state eq "NEW" && /^\s*depends\s+on\s+(.*)$/) {
ac6974c76   Steven Rostedt   ktest: Sort make_...
2853
  	    add_dep $config, $1;
b9066f6c0   Steven Rostedt   ktest: Use Kconfi...
2854
2855
  
  	# Get the configs that select this config
ac6974c76   Steven Rostedt   ktest: Sort make_...
2856
2857
2858
2859
  	} elsif ($state eq "NEW" && /^\s*select\s+(\S+)/) {
  
  	    # selected by depends on config
  	    add_dep $1, $config;
b9066f6c0   Steven Rostedt   ktest: Use Kconfi...
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
  
  	# Check for if statements
  	} elsif (/^if\s+(.*\S)\s*$/) {
  	    my $deps = $1;
  	    # remove beginning and ending non text
  	    $deps =~ s/^[^a-zA-Z0-9_]*//;
  	    $deps =~ s/[^a-zA-Z0-9_]*$//;
  
  	    my @deps = split /[^a-zA-Z0-9_]+/, $deps;
  
  	    $ifdeps[$iflevel++] = join ':', @deps;
  
  	} elsif (/^endif/) {
  
  	    $iflevel-- if ($iflevel);
  
  	# stop on "help"
  	} elsif (/^\s*help\s*$/) {
  	    $state = "NONE";
  	}
      }
      close(KIN);
  
      # read in any configs that were found.
      foreach $kconfig (@kconfigs) {
  	if (!defined($read_kconfigs{$kconfig})) {
  	    $read_kconfigs{$kconfig} = 1;
  	    read_kconfig("$builddir/$kconfig");
  	}
      }
  }
  
  sub read_depends {
      # find out which arch this is by the kconfig file
      open (IN, $output_config)
  	or dodie "Failed to read $output_config";
      my $arch;
      while (<IN>) {
  	if (m,Linux/(\S+)\s+\S+\s+Kernel Configuration,) {
  	    $arch = $1;
  	    last;
  	}
      }
      close IN;
  
      if (!defined($arch)) {
  	doprint "Could not find arch from config file
  ";
  	doprint "no dependencies used
  ";
  	return;
      }
  
      # arch is really the subarch, we need to know
      # what directory to look at.
      if ($arch eq "i386" || $arch eq "x86_64") {
  	$arch = "x86";
      } elsif ($arch =~ /^tile/) {
  	$arch = "tile";
      }
  
      my $kconfig = "$builddir/arch/$arch/Kconfig";
  
      if (! -f $kconfig && $arch =~ /\d$/) {
  	my $orig = $arch;
   	# some subarchs have numbers, truncate them
  	$arch =~ s/\d*$//;
  	$kconfig = "$builddir/arch/$arch/Kconfig";
  	if (! -f $kconfig) {
  	    doprint "No idea what arch dir $orig is for
  ";
  	    doprint "no dependencies used
  ";
  	    return;
  	}
      }
  
      read_kconfig($kconfig);
  }
4c4ab1204   Steven Rostedt   ktest: Add test t...
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
  sub read_config_list {
      my ($config) = @_;
  
      open (IN, $config)
  	or dodie "Failed to read $config";
  
      while (<IN>) {
  	if (/^((CONFIG\S*)=.*)/) {
  	    if (!defined($config_ignore{$2})) {
  		$config_list{$2} = $1;
  	    }
  	}
      }
  
      close(IN);
  }
  
  sub read_output_config {
      my ($config) = @_;
  
      assign_configs \%config_ignore, $config;
  }
  
  sub make_new_config {
      my @configs = @_;
  
      open (OUT, ">$output_config")
  	or dodie "Failed to write $output_config";
  
      foreach my $config (@configs) {
  	print OUT "$config
  ";
      }
      close OUT;
  }
ac6974c76   Steven Rostedt   ktest: Sort make_...
2974
2975
2976
2977
2978
2979
2980
  sub chomp_config {
      my ($config) = @_;
  
      $config =~ s/CONFIG_//;
  
      return $config;
  }
b9066f6c0   Steven Rostedt   ktest: Use Kconfi...
2981
2982
  sub get_depends {
      my ($dep) = @_;
ac6974c76   Steven Rostedt   ktest: Sort make_...
2983
      my $kconfig = chomp_config $dep;
b9066f6c0   Steven Rostedt   ktest: Use Kconfi...
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
  
      $dep = $depends{"$kconfig"};
  
      # the dep string we have saves the dependencies as they
      # were found, including expressions like ! && ||. We
      # want to split this out into just an array of configs.
  
      my $valid = "A-Za-z_0-9";
  
      my @configs;
  
      while ($dep =~ /[$valid]/) {
  
  	if ($dep =~ /^[^$valid]*([$valid]+)/) {
  	    my $conf = "CONFIG_" . $1;
  
  	    $configs[$#configs + 1] = $conf;
  
  	    $dep =~ s/^[^$valid]*[$valid]+//;
  	} else {
  	    die "this should never happen";
  	}
      }
  
      return @configs;
  }
  
  my %min_configs;
  my %keep_configs;
43d1b6518   Steven Rostedt   ktest: Keep fonud...
3013
  my %save_configs;
b9066f6c0   Steven Rostedt   ktest: Use Kconfi...
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
  my %processed_configs;
  my %nochange_config;
  
  sub test_this_config {
      my ($config) = @_;
  
      my $found;
  
      # if we already processed this config, skip it
      if (defined($processed_configs{$config})) {
  	return undef;
      }
      $processed_configs{$config} = 1;
  
      # if this config failed during this round, skip it
      if (defined($nochange_config{$config})) {
  	return undef;
      }
ac6974c76   Steven Rostedt   ktest: Sort make_...
3032
      my $kconfig = chomp_config $config;
b9066f6c0   Steven Rostedt   ktest: Use Kconfi...
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
  
      # Test dependencies first
      if (defined($depends{"$kconfig"})) {
  	my @parents = get_depends $config;
  	foreach my $parent (@parents) {
  	    # if the parent is in the min config, check it first
  	    next if (!defined($min_configs{$parent}));
  	    $found = test_this_config($parent);
  	    if (defined($found)) {
  		return $found;
  	    }
  	}
      }
  
      # Remove this config from the list of configs
      # do a make oldnoconfig and then read the resulting
      # .config to make sure it is missing the config that
      # we had before
      my %configs = %min_configs;
      delete $configs{$config};
      make_new_config ((values %configs), (values %keep_configs));
      make_oldconfig;
      undef %configs;
      assign_configs \%configs, $output_config;
  
      return $config if (!defined($configs{$config}));
  
      doprint "disabling config $config did not change .config
  ";
  
      $nochange_config{$config} = 1;
  
      return undef;
  }
4c4ab1204   Steven Rostedt   ktest: Add test t...
3067
3068
3069
3070
3071
3072
  sub make_min_config {
      my ($i) = @_;
  
      if (!defined($output_minconfig)) {
  	fail "OUTPUT_MIN_CONFIG not defined" and return;
      }
35ce5952e   Steven Rostedt   ktest: Add prompt...
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
  
      # If output_minconfig exists, and the start_minconfig
      # came from min_config, than ask if we should use
      # that instead.
      if (-f $output_minconfig && !$start_minconfig_defined) {
  	print "$output_minconfig exists
  ";
  	if (read_yn " Use it as minconfig?") {
  	    $start_minconfig = $output_minconfig;
  	}
      }
4c4ab1204   Steven Rostedt   ktest: Add test t...
3084
3085
3086
      if (!defined($start_minconfig)) {
  	fail "START_MIN_CONFIG or MIN_CONFIG not defined" and return;
      }
35ce5952e   Steven Rostedt   ktest: Add prompt...
3087
      my $temp_config = "$tmpdir/temp_config";
4c4ab1204   Steven Rostedt   ktest: Add test t...
3088
3089
3090
3091
3092
3093
3094
3095
      # First things first. We build an allnoconfig to find
      # out what the defaults are that we can't touch.
      # Some are selections, but we really can't handle selections.
  
      my $save_minconfig = $minconfig;
      undef $minconfig;
  
      run_command "$make allnoconfig" or return 0;
b9066f6c0   Steven Rostedt   ktest: Use Kconfi...
3096
      read_depends;
4c4ab1204   Steven Rostedt   ktest: Add test t...
3097
      process_config_ignore $output_config;
b9066f6c0   Steven Rostedt   ktest: Use Kconfi...
3098

43d1b6518   Steven Rostedt   ktest: Keep fonud...
3099
      undef %save_configs;
b9066f6c0   Steven Rostedt   ktest: Use Kconfi...
3100
      undef %min_configs;
4c4ab1204   Steven Rostedt   ktest: Add test t...
3101
3102
3103
3104
  
      if (defined($ignore_config)) {
  	# make sure the file exists
  	`touch $ignore_config`;
43d1b6518   Steven Rostedt   ktest: Keep fonud...
3105
  	assign_configs \%save_configs, $ignore_config;
4c4ab1204   Steven Rostedt   ktest: Add test t...
3106
      }
43d1b6518   Steven Rostedt   ktest: Keep fonud...
3107
      %keep_configs = %save_configs;
4c4ab1204   Steven Rostedt   ktest: Add test t...
3108
3109
3110
3111
3112
      doprint "Load initial configs from $start_minconfig
  ";
  
      # Look at the current min configs, and save off all the
      # ones that were set via the allnoconfig
4c4ab1204   Steven Rostedt   ktest: Add test t...
3113
3114
3115
      assign_configs \%min_configs, $start_minconfig;
  
      my @config_keys = keys %min_configs;
ac6974c76   Steven Rostedt   ktest: Sort make_...
3116
3117
3118
3119
3120
3121
3122
      # All configs need a depcount
      foreach my $config (@config_keys) {
  	my $kconfig = chomp_config $config;
  	if (!defined $depcount{$kconfig}) {
  		$depcount{$kconfig} = 0;
  	}
      }
4c4ab1204   Steven Rostedt   ktest: Add test t...
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
      # Remove anything that was set by the make allnoconfig
      # we shouldn't need them as they get set for us anyway.
      foreach my $config (@config_keys) {
  	# Remove anything in the ignore_config
  	if (defined($keep_configs{$config})) {
  	    my $file = $ignore_config;
  	    $file =~ s,.*/(.*?)$,$1,;
  	    doprint "$config set by $file ... ignored
  ";
  	    delete $min_configs{$config};
  	    next;
  	}
  	# But make sure the settings are the same. If a min config
  	# sets a selection, we do not want to get rid of it if
  	# it is not the same as what we have. Just move it into
  	# the keep configs.
  	if (defined($config_ignore{$config})) {
  	    if ($config_ignore{$config} ne $min_configs{$config}) {
  		doprint "$config is in allnoconfig as '$config_ignore{$config}'";
  		doprint " but it is '$min_configs{$config}' in minconfig .. keeping
  ";
  		$keep_configs{$config} = $min_configs{$config};
  	    } else {
  		doprint "$config set by allnoconfig ... ignored
  ";
  	    }
  	    delete $min_configs{$config};
  	}
      }
4c4ab1204   Steven Rostedt   ktest: Add test t...
3152
      my $done = 0;
b9066f6c0   Steven Rostedt   ktest: Use Kconfi...
3153
      my $take_two = 0;
4c4ab1204   Steven Rostedt   ktest: Add test t...
3154
3155
3156
3157
3158
3159
3160
3161
  
      while (!$done) {
  
  	my $config;
  	my $found;
  
  	# Now disable each config one by one and do a make oldconfig
  	# till we find a config that changes our list.
4c4ab1204   Steven Rostedt   ktest: Add test t...
3162
  	my @test_configs = keys %min_configs;
ac6974c76   Steven Rostedt   ktest: Sort make_...
3163
3164
3165
3166
3167
3168
  
  	# Sort keys by who is most dependent on
  	@test_configs = sort  { $depcount{chomp_config($b)} <=> $depcount{chomp_config($a)} }
  			  @test_configs ;
  
  	# Put configs that did not modify the config at the end.
4c4ab1204   Steven Rostedt   ktest: Add test t...
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
  	my $reset = 1;
  	for (my $i = 0; $i < $#test_configs; $i++) {
  	    if (!defined($nochange_config{$test_configs[0]})) {
  		$reset = 0;
  		last;
  	    }
  	    # This config didn't change the .config last time.
  	    # Place it at the end
  	    my $config = shift @test_configs;
  	    push @test_configs, $config;
  	}
  
  	# if every test config has failed to modify the .config file
  	# in the past, then reset and start over.
  	if ($reset) {
  	    undef %nochange_config;
  	}
b9066f6c0   Steven Rostedt   ktest: Use Kconfi...
3186
  	undef %processed_configs;
4c4ab1204   Steven Rostedt   ktest: Add test t...
3187
  	foreach my $config (@test_configs) {
b9066f6c0   Steven Rostedt   ktest: Use Kconfi...
3188
  	    $found = test_this_config $config;
4c4ab1204   Steven Rostedt   ktest: Add test t...
3189

b9066f6c0   Steven Rostedt   ktest: Use Kconfi...
3190
  	    last if (defined($found));
4c4ab1204   Steven Rostedt   ktest: Add test t...
3191
3192
  
  	    # oh well, try another config
4c4ab1204   Steven Rostedt   ktest: Add test t...
3193
3194
3195
  	}
  
  	if (!defined($found)) {
b9066f6c0   Steven Rostedt   ktest: Use Kconfi...
3196
3197
3198
3199
3200
3201
3202
  	    # we could have failed due to the nochange_config hash
  	    # reset and try again
  	    if (!$take_two) {
  		undef %nochange_config;
  		$take_two = 1;
  		next;
  	    }
4c4ab1204   Steven Rostedt   ktest: Add test t...
3203
3204
3205
3206
3207
  	    doprint "No more configs found that we can disable
  ";
  	    $done = 1;
  	    last;
  	}
b9066f6c0   Steven Rostedt   ktest: Use Kconfi...
3208
  	$take_two = 0;
4c4ab1204   Steven Rostedt   ktest: Add test t...
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
  
  	$config = $found;
  
  	doprint "Test with $config disabled
  ";
  
  	# set in_bisect to keep build and monitor from dieing
  	$in_bisect = 1;
  
  	my $failed = 0;
  	build "oldconfig";
  	start_monitor_and_boot or $failed = 1;
  	end_monitor;
  
  	$in_bisect = 0;
  
  	if ($failed) {
b9066f6c0   Steven Rostedt   ktest: Use Kconfi...
3226
3227
  	    doprint "$min_configs{$config} is needed to boot the box... keeping
  ";
4c4ab1204   Steven Rostedt   ktest: Add test t...
3228
3229
  	    # this config is needed, add it to the ignore list.
  	    $keep_configs{$config} = $min_configs{$config};
43d1b6518   Steven Rostedt   ktest: Keep fonud...
3230
  	    $save_configs{$config} = $min_configs{$config};
4c4ab1204   Steven Rostedt   ktest: Add test t...
3231
  	    delete $min_configs{$config};
35ce5952e   Steven Rostedt   ktest: Add prompt...
3232
3233
3234
3235
3236
  
  	    # update new ignore configs
  	    if (defined($ignore_config)) {
  		open (OUT, ">$temp_config")
  		    or die "Can't write to $temp_config";
43d1b6518   Steven Rostedt   ktest: Keep fonud...
3237
3238
3239
  		foreach my $config (keys %save_configs) {
  		    print OUT "$save_configs{$config}
  ";
35ce5952e   Steven Rostedt   ktest: Add prompt...
3240
3241
3242
3243
3244
  		}
  		close OUT;
  		run_command "mv $temp_config $ignore_config" or
  		    dodie "failed to copy update to $ignore_config";
  	    }
4c4ab1204   Steven Rostedt   ktest: Add test t...
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
  	} else {
  	    # We booted without this config, remove it from the minconfigs.
  	    doprint "$config is not needed, disabling
  ";
  
  	    delete $min_configs{$config};
  
  	    # Also disable anything that is not enabled in this config
  	    my %configs;
  	    assign_configs \%configs, $output_config;
  	    my @config_keys = keys %min_configs;
  	    foreach my $config (@config_keys) {
  		if (!defined($configs{$config})) {
  		    doprint "$config is not set, disabling
  ";
  		    delete $min_configs{$config};
  		}
  	    }
  
  	    # Save off all the current mandidory configs
35ce5952e   Steven Rostedt   ktest: Add prompt...
3265
3266
  	    open (OUT, ">$temp_config")
  		or die "Can't write to $temp_config";
4c4ab1204   Steven Rostedt   ktest: Add test t...
3267
3268
3269
3270
3271
3272
3273
3274
3275
  	    foreach my $config (keys %keep_configs) {
  		print OUT "$keep_configs{$config}
  ";
  	    }
  	    foreach my $config (keys %min_configs) {
  		print OUT "$min_configs{$config}
  ";
  	    }
  	    close OUT;
35ce5952e   Steven Rostedt   ktest: Add prompt...
3276
3277
3278
  
  	    run_command "mv $temp_config $output_minconfig" or
  		dodie "failed to copy update to $output_minconfig";
4c4ab1204   Steven Rostedt   ktest: Add test t...
3279
3280
3281
3282
  	}
  
  	doprint "Reboot and wait $sleep_time seconds
  ";
bc7c58037   Steven Rostedt   ktest: Add option...
3283
  	reboot_to_good $sleep_time;
4c4ab1204   Steven Rostedt   ktest: Add test t...
3284
3285
3286
3287
3288
      }
  
      success $i;
      return 1;
  }
8d1491bae   Steven Rostedt   ktest: Ask for th...
3289
3290
3291
3292
3293
3294
3295
3296
3297
  $#ARGV < 1 or die "ktest.pl version: $VERSION
     usage: ktest.pl config-file
  ";
  
  if ($#ARGV == 0) {
      $ktest_config = $ARGV[0];
      if (! -f $ktest_config) {
  	print "$ktest_config does not exist.
  ";
35ce5952e   Steven Rostedt   ktest: Add prompt...
3298
  	if (!read_yn "Create it?") {
8d1491bae   Steven Rostedt   ktest: Ask for th...
3299
3300
3301
3302
3303
3304
3305
3306
  	    exit 0;
  	}
      }
  } else {
      $ktest_config = "ktest.conf";
  }
  
  if (! -f $ktest_config) {
dbd3783b4   Steven Rostedt   ktest: When creat...
3307
      $newconfig = 1;
c4261d0f6   Steven Rostedt   ktest: Ask for ty...
3308
      get_test_case;
8d1491bae   Steven Rostedt   ktest: Ask for th...
3309
3310
3311
3312
      open(OUT, ">$ktest_config") or die "Can not create $ktest_config";
      print OUT << "EOF"
  # Generated by ktest.pl
  #
0e7a22de2   Steven Rostedt   ktest: When creat...
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
  
  # PWD is a ktest.pl variable that will result in the process working
  # directory that ktest.pl is executed in.
  
  # THIS_DIR is automatically assigned the PWD of the path that generated
  # the config file. It is best to use this variable when assigning other
  # directory paths within this directory. This allows you to easily
  # move the test cases to other locations or to other machines.
  #
  THIS_DIR := $variable{"PWD"}
8d1491bae   Steven Rostedt   ktest: Ask for th...
3323
3324
3325
  # Define each test with TEST_START
  # The config options below it will override the defaults
  TEST_START
c4261d0f6   Steven Rostedt   ktest: Ask for ty...
3326
  TEST_TYPE = $default{"TEST_TYPE"}
8d1491bae   Steven Rostedt   ktest: Ask for th...
3327
3328
3329
3330
3331
3332
3333
  
  DEFAULTS
  EOF
  ;
      close(OUT);
  }
  read_config $ktest_config;
23715c3c9   Steven Rostedt   ktest: Have LOG_F...
3334
3335
3336
  if (defined($opt{"LOG_FILE"})) {
      $opt{"LOG_FILE"} = eval_option($opt{"LOG_FILE"}, -1);
  }
8d1491bae   Steven Rostedt   ktest: Ask for th...
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
  # Append any configs entered in manually to the config file.
  my @new_configs = keys %entered_configs;
  if ($#new_configs >= 0) {
      print "
  Appending entered in configs to $ktest_config
  ";
      open(OUT, ">>$ktest_config") or die "Can not append to $ktest_config";
      foreach my $config (@new_configs) {
  	print OUT "$config = $entered_configs{$config}
  ";
0e7a22de2   Steven Rostedt   ktest: When creat...
3347
  	$opt{$config} = process_variables($entered_configs{$config});
8d1491bae   Steven Rostedt   ktest: Ask for th...
3348
3349
      }
  }
2545eb619   Steven Rostedt   Initial start of ...
3350

2b7d9b214   Steven Rostedt   ktest: Added cont...
3351
3352
3353
  if ($opt{"CLEAR_LOG"} && defined($opt{"LOG_FILE"})) {
      unlink $opt{"LOG_FILE"};
  }
2545eb619   Steven Rostedt   Initial start of ...
3354

2b7d9b214   Steven Rostedt   ktest: Added cont...
3355
3356
3357
3358
3359
  doprint "
  
  STARTING AUTOMATED TESTS
  
  ";
a57419b36   Steven Rostedt   ktest: New TEST_S...
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
  for (my $i = 0, my $repeat = 1; $i <= $opt{"NUM_TESTS"}; $i += $repeat) {
  
      if (!$i) {
  	doprint "DEFAULT OPTIONS:
  ";
      } else {
  	doprint "
  TEST $i OPTIONS";
  	if (defined($repeat_tests{$i})) {
  	    $repeat = $repeat_tests{$i};
  	    doprint " ITERATE $repeat";
  	}
  	doprint "
  ";
      }
  
      foreach my $option (sort keys %opt) {
  
  	if ($option =~ /\[(\d+)\]$/) {
  	    next if ($i != $1);
  	} else {
  	    next if ($i);
  	}
  
  	doprint "$option = $opt{$option}
  ";
      }
2b7d9b214   Steven Rostedt   ktest: Added cont...
3387
  }
2545eb619   Steven Rostedt   Initial start of ...
3388

2a62512bc   Steven Rostedt   ktest: Allow opti...
3389
  sub __set_test_option {
5a391fbff   Steven Rostedt   ktest: Added bett...
3390
      my ($name, $i) = @_;
2545eb619   Steven Rostedt   Initial start of ...
3391

5a391fbff   Steven Rostedt   ktest: Added bett...
3392
      my $option = "$name\[$i\]";
5c42fc5b9   Steven Rostedt   ktest: New featur...
3393

5a391fbff   Steven Rostedt   ktest: Added bett...
3394
3395
      if (defined($opt{$option})) {
  	return $opt{$option};
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
3396
      }
a57419b36   Steven Rostedt   ktest: New TEST_S...
3397
3398
3399
3400
3401
3402
3403
3404
3405
      foreach my $test (keys %repeat_tests) {
  	if ($i >= $test &&
  	    $i < $test + $repeat_tests{$test}) {
  	    $option = "$name\[$test\]";
  	    if (defined($opt{$option})) {
  		return $opt{$option};
  	    }
  	}
      }
5a391fbff   Steven Rostedt   ktest: Added bett...
3406
3407
      if (defined($opt{$name})) {
  	return $opt{$name};
2545eb619   Steven Rostedt   Initial start of ...
3408
      }
5a391fbff   Steven Rostedt   ktest: Added bett...
3409
3410
      return undef;
  }
2a62512bc   Steven Rostedt   ktest: Allow opti...
3411
3412
3413
3414
3415
  sub set_test_option {
      my ($name, $i) = @_;
  
      my $option = __set_test_option($name, $i);
      return $option if (!defined($option));
23715c3c9   Steven Rostedt   ktest: Have LOG_F...
3416
      return eval_option($option, $i);
2a62512bc   Steven Rostedt   ktest: Allow opti...
3417
  }
5a391fbff   Steven Rostedt   ktest: Added bett...
3418
  # First we need to do is the builds
a75fececf   Steven Rostedt   ktest: Added samp...
3419
  for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {
4ab1cce5b   Steven Rostedt   ktest: Do not reb...
3420
3421
      # Do not reboot on failing test options
      $no_reboot = 1;
576f627c8   Steven Rostedt   ktest: Add powero...
3422
      $iteration = $i;
a75fececf   Steven Rostedt   ktest: Added samp...
3423
      my $makecmd = set_test_option("MAKE_CMD", $i);
9cc9e091e   Steven Rostedt   ktest: Detect typ...
3424
3425
3426
3427
      # Load all the options into their mapped variable names
      foreach my $opt (keys %option_map) {
  	${$option_map{$opt}} = set_test_option($opt, $i);
      }
b5f4aea68   Steven Rostedt   ktest: Have all v...
3428

35ce5952e   Steven Rostedt   ktest: Add prompt...
3429
      $start_minconfig_defined = 1;
4c4ab1204   Steven Rostedt   ktest: Add test t...
3430
      if (!defined($start_minconfig)) {
35ce5952e   Steven Rostedt   ktest: Add prompt...
3431
  	$start_minconfig_defined = 0;
4c4ab1204   Steven Rostedt   ktest: Add test t...
3432
3433
  	$start_minconfig = $minconfig;
      }
a75fececf   Steven Rostedt   ktest: Added samp...
3434
      chdir $builddir || die "can't change directory to $builddir";
a908a6659   Andrew Jones   ktest: Create out...
3435
3436
3437
3438
3439
      foreach my $dir ($tmpdir, $outputdir) {
  	if (!-d $dir) {
  	    mkpath($dir) or
  		die "can't create $dir";
  	}
a75fececf   Steven Rostedt   ktest: Added samp...
3440
      }
1a5cfce34   Steven Rostedt   ktest: Added rebo...
3441

e48c5293b   Steven Rostedt   ktest/cleanups: A...
3442
3443
      $ENV{"SSH_USER"} = $ssh_user;
      $ENV{"MACHINE"} = $machine;
a75fececf   Steven Rostedt   ktest: Added samp...
3444
      $buildlog = "$tmpdir/buildlog-$machine";
a9dd5d631   Rabin Vincent   ktest: Save test ...
3445
      $testlog = "$tmpdir/testlog-$machine";
a75fececf   Steven Rostedt   ktest: Added samp...
3446
3447
      $dmesg = "$tmpdir/dmesg-$machine";
      $make = "$makecmd O=$outputdir";
51ad1dd10   Steven Rostedt   ktest: Use $outpu...
3448
      $output_config = "$outputdir/.config";
a75fececf   Steven Rostedt   ktest: Added samp...
3449

bb8474b18   Steven Rostedt   ktest: Do not ask...
3450
3451
3452
3453
      if (!$buildonly) {
  	$target = "$ssh_user\@$machine";
  	if ($reboot_type eq "grub") {
  	    dodie "GRUB_MENU not defined" if (!defined($grub_menu));
bb8474b18   Steven Rostedt   ktest: Do not ask...
3454
  	}
a75fececf   Steven Rostedt   ktest: Added samp...
3455
3456
3457
3458
      }
  
      my $run_type = $build_type;
      if ($test_type eq "patchcheck") {
b5f4aea68   Steven Rostedt   ktest: Have all v...
3459
  	$run_type = $patchcheck_type;
a75fececf   Steven Rostedt   ktest: Added samp...
3460
      } elsif ($test_type eq "bisect") {
b5f4aea68   Steven Rostedt   ktest: Have all v...
3461
  	$run_type = $bisect_type;
0a05c769a   Steven Rostedt   ktest: Added conf...
3462
      } elsif ($test_type eq "config_bisect") {
b5f4aea68   Steven Rostedt   ktest: Have all v...
3463
  	$run_type = $config_bisect_type;
a75fececf   Steven Rostedt   ktest: Added samp...
3464
      }
4c4ab1204   Steven Rostedt   ktest: Add test t...
3465
3466
3467
      if ($test_type eq "make_min_config") {
  	$run_type = "";
      }
a75fececf   Steven Rostedt   ktest: Added samp...
3468
3469
3470
3471
      # mistake in config file?
      if (!defined($run_type)) {
  	$run_type = "ERROR";
      }
5a391fbff   Steven Rostedt   ktest: Added bett...
3472

e0a8742e3   Steven Rostedt   ktest: Add NO_INS...
3473
3474
      my $installme = "";
      $installme = " no_install" if ($no_install);
2545eb619   Steven Rostedt   Initial start of ...
3475
3476
3477
      doprint "
  
  ";
e0a8742e3   Steven Rostedt   ktest: Add NO_INS...
3478
3479
3480
      doprint "RUNNING TEST $i of $opt{NUM_TESTS} with option $test_type $run_type$installme
  
  ";
7faafbd69   Steven Rostedt   ktest: Add open a...
3481
3482
3483
  
      unlink $dmesg;
      unlink $buildlog;
a9dd5d631   Rabin Vincent   ktest: Save test ...
3484
      unlink $testlog;
2545eb619   Steven Rostedt   Initial start of ...
3485

250bae8be   Steven Rostedt   ktest: Fix bug wh...
3486
3487
3488
3489
3490
3491
      if (defined($addconfig)) {
  	my $min = $minconfig;
  	if (!defined($minconfig)) {
  	    $min = "";
  	}
  	run_command "cat $addconfig $min > $tmpdir/add_config" or
2b7d9b214   Steven Rostedt   ktest: Added cont...
3492
  	    dodie "Failed to create temp config";
9be2e6b59   Steven Rostedt   ktest: Use differ...
3493
  	$minconfig = "$tmpdir/add_config";
2b7d9b214   Steven Rostedt   ktest: Added cont...
3494
      }
6c5ee0be0   Steven Rostedt   ktest: Added patc...
3495
3496
3497
3498
      if (defined($checkout)) {
  	run_command "git checkout $checkout" or
  	    die "failed to checkout $checkout";
      }
4ab1cce5b   Steven Rostedt   ktest: Do not reb...
3499
      $no_reboot = 0;
a75fececf   Steven Rostedt   ktest: Added samp...
3500
      if ($test_type eq "bisect") {
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
3501
3502
  	bisect $i;
  	next;
0a05c769a   Steven Rostedt   ktest: Added conf...
3503
3504
3505
      } elsif ($test_type eq "config_bisect") {
  	config_bisect $i;
  	next;
a75fececf   Steven Rostedt   ktest: Added samp...
3506
      } elsif ($test_type eq "patchcheck") {
6c5ee0be0   Steven Rostedt   ktest: Added patc...
3507
3508
  	patchcheck $i;
  	next;
4c4ab1204   Steven Rostedt   ktest: Add test t...
3509
3510
3511
      } elsif ($test_type eq "make_min_config") {
  	make_min_config $i;
  	next;
2545eb619   Steven Rostedt   Initial start of ...
3512
      }
2545eb619   Steven Rostedt   Initial start of ...
3513

7faafbd69   Steven Rostedt   ktest: Add open a...
3514
3515
      if ($build_type ne "nobuild") {
  	build $build_type or next;
2545eb619   Steven Rostedt   Initial start of ...
3516
      }
cd8e368f4   Steven Rostedt   ktest: Add TEST_T...
3517
3518
3519
3520
3521
3522
      if ($test_type eq "install") {
  	get_version;
  	install;
  	success $i;
  	next;
      }
a75fececf   Steven Rostedt   ktest: Added samp...
3523
      if ($test_type ne "build") {
a75fececf   Steven Rostedt   ktest: Added samp...
3524
  	my $failed = 0;
ddf607e5f   Steven Rostedt   ktest: Add helper...
3525
  	start_monitor_and_boot or $failed = 1;
a75fececf   Steven Rostedt   ktest: Added samp...
3526
3527
3528
3529
3530
3531
  
  	if (!$failed && $test_type ne "boot" && defined($run_test)) {
  	    do_run_test or $failed = 1;
  	}
  	end_monitor;
  	next if ($failed);
5a391fbff   Steven Rostedt   ktest: Added bett...
3532
      }
5f9b6ced0   Steven Rostedt   ktest: Bisecting,...
3533
      success $i;
2545eb619   Steven Rostedt   Initial start of ...
3534
  }
5c42fc5b9   Steven Rostedt   ktest: New featur...
3535
  if ($opt{"POWEROFF_ON_SUCCESS"}) {
75c3fda79   Steven Rostedt   ktest: New featur...
3536
      halt;
576f627c8   Steven Rostedt   ktest: Add powero...
3537
  } elsif ($opt{"REBOOT_ON_SUCCESS"} && !do_not_reboot) {
bc7c58037   Steven Rostedt   ktest: Add option...
3538
      reboot_to_good;
5c42fc5b9   Steven Rostedt   ktest: New featur...
3539
  }
75c3fda79   Steven Rostedt   ktest: New featur...
3540

e48c5293b   Steven Rostedt   ktest/cleanups: A...
3541
3542
3543
3544
  doprint "
      $successes of $opt{NUM_TESTS} tests were successful
  
  ";
2545eb619   Steven Rostedt   Initial start of ...
3545
  exit 0;