blob: 067337bbce7b3c38232c1b3f9a478442d4627acb [file] [log] [blame]
Steven Rostedt2545eb62010-11-02 15:01:32 -04001#!/usr/bin/perl -w
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04002#
Uwe Kleine-Königcce1dac2011-01-24 21:12:01 +01003# Copyright 2010 - Steven Rostedt <srostedt@redhat.com>, Red Hat Inc.
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04004# Licensed under the terms of the GNU GPL License version 2
5#
Steven Rostedt2545eb62010-11-02 15:01:32 -04006
7use strict;
8use IPC::Open2;
9use Fcntl qw(F_GETFL F_SETFL O_NONBLOCK);
Steven Rostedt7faafbd2010-11-02 14:58:22 -040010use File::Path qw(mkpath);
11use File::Copy qw(cp);
Steven Rostedt2545eb62010-11-02 15:01:32 -040012use FileHandle;
13
Steven Rostedte48c5292010-11-02 14:35:37 -040014my $VERSION = "0.2";
15
Steven Rostedt2545eb62010-11-02 15:01:32 -040016$| = 1;
17
18my %opt;
Steven Rostedta57419b2010-11-02 15:13:54 -040019my %repeat_tests;
20my %repeats;
Steven Rostedt2545eb62010-11-02 15:01:32 -040021
22#default opts
Steven Rostedt4f43e0d2011-12-22 21:32:05 -050023my %default = (
24 "NUM_TESTS" => 1,
25 "TEST_TYPE" => "build",
26 "BUILD_TYPE" => "randconfig",
27 "MAKE_CMD" => "make",
28 "TIMEOUT" => 120,
29 "TMP_DIR" => "/tmp/ktest/\${MACHINE}",
30 "SLEEP_TIME" => 60, # sleep time between tests
31 "BUILD_NOCLEAN" => 0,
32 "REBOOT_ON_ERROR" => 0,
33 "POWEROFF_ON_ERROR" => 0,
34 "REBOOT_ON_SUCCESS" => 1,
35 "POWEROFF_ON_SUCCESS" => 0,
36 "BUILD_OPTIONS" => "",
37 "BISECT_SLEEP_TIME" => 60, # sleep time between bisects
38 "PATCHCHECK_SLEEP_TIME" => 60, # sleep time between patch checks
39 "CLEAR_LOG" => 0,
40 "BISECT_MANUAL" => 0,
41 "BISECT_SKIP" => 1,
Steven Rostedtccc513b2012-05-21 17:13:40 -040042 "MIN_CONFIG_TYPE" => "boot",
Steven Rostedt4f43e0d2011-12-22 21:32:05 -050043 "SUCCESS_LINE" => "login:",
44 "DETECT_TRIPLE_FAULT" => 1,
45 "NO_INSTALL" => 0,
46 "BOOTED_TIMEOUT" => 1,
47 "DIE_ON_FAILURE" => 1,
48 "SSH_EXEC" => "ssh \$SSH_USER\@\$MACHINE \$SSH_COMMAND",
49 "SCP_TO_TARGET" => "scp \$SRC_FILE \$SSH_USER\@\$MACHINE:\$DST_FILE",
Steven Rostedt02ad2612012-03-21 08:21:24 -040050 "SCP_TO_TARGET_INSTALL" => "\${SCP_TO_TARGET}",
Steven Rostedt4f43e0d2011-12-22 21:32:05 -050051 "REBOOT" => "ssh \$SSH_USER\@\$MACHINE reboot",
52 "STOP_AFTER_SUCCESS" => 10,
53 "STOP_AFTER_FAILURE" => 60,
54 "STOP_TEST_AFTER" => 600,
Steven Rostedt407b95b2012-07-19 16:05:42 -040055 "MAX_MONITOR_WAIT" => 1800,
Steven Rostedta15ba912012-11-13 14:30:37 -050056 "GRUB_REBOOT" => "grub2-reboot",
Steven Rostedt77869542012-12-11 17:37:41 -050057 "SYSLINUX" => "extlinux",
58 "SYSLINUX_PATH" => "/boot/extlinux",
Steven Rostedt600bbf02011-11-21 20:12:04 -050059
60# required, and we will ask users if they don't have them but we keep the default
61# value something that is common.
Steven Rostedt4f43e0d2011-12-22 21:32:05 -050062 "REBOOT_TYPE" => "grub",
63 "LOCALVERSION" => "-test",
64 "SSH_USER" => "root",
65 "BUILD_TARGET" => "arch/x86/boot/bzImage",
66 "TARGET_IMAGE" => "/boot/vmlinuz-test",
Steven Rostedt9cc9e092011-12-22 21:37:22 -050067
68 "LOG_FILE" => undef,
69 "IGNORE_UNUSED" => 0,
Steven Rostedt4f43e0d2011-12-22 21:32:05 -050070);
Steven Rostedt2545eb62010-11-02 15:01:32 -040071
Steven Rostedt8d1491b2010-11-18 15:39:48 -050072my $ktest_config;
Steven Rostedt2545eb62010-11-02 15:01:32 -040073my $version;
Steven Rostedt683a3e62012-05-18 13:34:35 -040074my $have_version = 0;
Steven Rostedta75fece2010-11-02 14:58:27 -040075my $machine;
Steven Rostedte48c5292010-11-02 14:35:37 -040076my $ssh_user;
Steven Rostedta75fece2010-11-02 14:58:27 -040077my $tmpdir;
78my $builddir;
79my $outputdir;
Steven Rostedt51ad1dd2010-11-08 16:43:21 -050080my $output_config;
Steven Rostedta75fece2010-11-02 14:58:27 -040081my $test_type;
Steven Rostedt7faafbd2010-11-02 14:58:22 -040082my $build_type;
Steven Rostedta75fece2010-11-02 14:58:27 -040083my $build_options;
Steven Rostedt921ed4c2012-07-19 15:18:27 -040084my $final_post_ktest;
85my $pre_ktest;
86my $post_ktest;
87my $pre_test;
88my $post_test;
Steven Rostedt0bd6c1a2011-06-14 20:39:31 -040089my $pre_build;
90my $post_build;
91my $pre_build_die;
92my $post_build_die;
Steven Rostedta75fece2010-11-02 14:58:27 -040093my $reboot_type;
94my $reboot_script;
95my $power_cycle;
Steven Rostedte48c5292010-11-02 14:35:37 -040096my $reboot;
Steven Rostedta75fece2010-11-02 14:58:27 -040097my $reboot_on_error;
Steven Rostedtbc7c5802011-12-22 16:29:10 -050098my $switch_to_good;
99my $switch_to_test;
Steven Rostedta75fece2010-11-02 14:58:27 -0400100my $poweroff_on_error;
Steven Rostedt648a1822012-03-21 11:18:27 -0400101my $reboot_on_success;
Steven Rostedta75fece2010-11-02 14:58:27 -0400102my $die_on_failure;
Steven Rostedt576f6272010-11-02 14:58:38 -0400103my $powercycle_after_reboot;
104my $poweroff_after_halt;
Steven Rostedt407b95b2012-07-19 16:05:42 -0400105my $max_monitor_wait;
Steven Rostedte48c5292010-11-02 14:35:37 -0400106my $ssh_exec;
107my $scp_to_target;
Steven Rostedt02ad2612012-03-21 08:21:24 -0400108my $scp_to_target_install;
Steven Rostedta75fece2010-11-02 14:58:27 -0400109my $power_off;
110my $grub_menu;
Steven Rostedta15ba912012-11-13 14:30:37 -0500111my $grub_file;
Steven Rostedt2545eb62010-11-02 15:01:32 -0400112my $grub_number;
Steven Rostedta15ba912012-11-13 14:30:37 -0500113my $grub_reboot;
Steven Rostedt77869542012-12-11 17:37:41 -0500114my $syslinux;
115my $syslinux_path;
116my $syslinux_label;
Steven Rostedt2545eb62010-11-02 15:01:32 -0400117my $target;
118my $make;
Steven Rostedte5c2ec12012-07-19 15:22:05 -0400119my $pre_install;
Steven Rostedt8b37ca82010-11-02 14:58:33 -0400120my $post_install;
Steven Rostedte0a87422011-09-30 17:50:48 -0400121my $no_install;
Steven Rostedt5c42fc52010-11-02 14:57:01 -0400122my $noclean;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -0400123my $minconfig;
Steven Rostedt4c4ab122011-07-15 21:16:17 -0400124my $start_minconfig;
Steven Rostedt35ce5952011-07-15 21:57:25 -0400125my $start_minconfig_defined;
Steven Rostedt4c4ab122011-07-15 21:16:17 -0400126my $output_minconfig;
Steven Rostedtccc513b2012-05-21 17:13:40 -0400127my $minconfig_type;
Steven Rostedt43de3312012-05-21 23:35:12 -0400128my $use_output_minconfig;
Steven Rostedt4c4ab122011-07-15 21:16:17 -0400129my $ignore_config;
Steven Rostedtbe405f92012-01-04 21:51:59 -0500130my $ignore_errors;
Steven Rostedt2b7d9b22010-11-02 14:58:15 -0400131my $addconfig;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -0400132my $in_bisect = 0;
Steven Rostedtb5f4aea2011-12-22 21:33:55 -0500133my $bisect_bad_commit = "";
Steven Rostedtd6ce2a02010-11-02 14:58:05 -0400134my $reverse_bisect;
Steven Rostedtc960bb92011-03-08 09:22:39 -0500135my $bisect_manual;
Steven Rostedtc23dca72011-03-08 09:26:31 -0500136my $bisect_skip;
Steven Rostedt30f75da2011-06-13 10:35:35 -0400137my $config_bisect_good;
Steven Rostedtc5dacb82011-12-22 12:43:57 -0500138my $bisect_ret_good;
139my $bisect_ret_bad;
140my $bisect_ret_skip;
141my $bisect_ret_abort;
142my $bisect_ret_default;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -0400143my $in_patchcheck = 0;
Steven Rostedt5a391fb2010-11-02 14:57:43 -0400144my $run_test;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -0400145my $redirect;
Steven Rostedt7faafbd2010-11-02 14:58:22 -0400146my $buildlog;
Rabin Vincenta9dd5d62011-11-18 17:05:29 +0530147my $testlog;
Steven Rostedt7faafbd2010-11-02 14:58:22 -0400148my $dmesg;
149my $monitor_fp;
150my $monitor_pid;
151my $monitor_cnt = 0;
Steven Rostedta75fece2010-11-02 14:58:27 -0400152my $sleep_time;
153my $bisect_sleep_time;
Steven Rostedt27d934b2011-05-20 09:18:18 -0400154my $patchcheck_sleep_time;
Steven Rostedt19902072011-06-14 20:46:25 -0400155my $ignore_warnings;
Steven Rostedta75fece2010-11-02 14:58:27 -0400156my $store_failures;
Rabin Vincentde5b6e32011-11-18 17:05:31 +0530157my $store_successes;
Steven Rostedt9064af52011-06-13 10:38:48 -0400158my $test_name;
Steven Rostedta75fece2010-11-02 14:58:27 -0400159my $timeout;
160my $booted_timeout;
Steven Rostedtf1a5b962011-06-13 10:30:00 -0400161my $detect_triplefault;
Steven Rostedta75fece2010-11-02 14:58:27 -0400162my $console;
Steven Rostedt2b803362011-09-30 18:00:23 -0400163my $reboot_success_line;
Steven Rostedta75fece2010-11-02 14:58:27 -0400164my $success_line;
Steven Rostedt1c8a6172010-11-09 12:55:40 -0500165my $stop_after_success;
166my $stop_after_failure;
Steven Rostedt2d01b262011-03-08 09:47:54 -0500167my $stop_test_after;
Steven Rostedta75fece2010-11-02 14:58:27 -0400168my $build_target;
169my $target_image;
Steven Rostedtb5f4aea2011-12-22 21:33:55 -0500170my $checkout;
Steven Rostedta75fece2010-11-02 14:58:27 -0400171my $localversion;
Steven Rostedt576f6272010-11-02 14:58:38 -0400172my $iteration = 0;
Steven Rostedte48c5292010-11-02 14:35:37 -0400173my $successes = 0;
Steven Rostedt2545eb62010-11-02 15:01:32 -0400174
Steven Rostedtb5f4aea2011-12-22 21:33:55 -0500175my $bisect_good;
176my $bisect_bad;
177my $bisect_type;
178my $bisect_start;
179my $bisect_replay;
180my $bisect_files;
181my $bisect_reverse;
182my $bisect_check;
183
184my $config_bisect;
185my $config_bisect_type;
Steven Rostedtb0918612012-07-19 15:26:00 -0400186my $config_bisect_check;
Steven Rostedtb5f4aea2011-12-22 21:33:55 -0500187
188my $patchcheck_type;
189my $patchcheck_start;
190my $patchcheck_end;
191
Steven Rostedt165708b2011-11-26 20:56:52 -0500192# set when a test is something other that just building or install
Steven Rostedtbb8474b2011-11-23 15:58:00 -0500193# which would require more options.
194my $buildonly = 1;
195
Steven Rostedtdbd37832011-11-23 16:00:48 -0500196# set when creating a new config
197my $newconfig = 0;
198
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500199my %entered_configs;
200my %config_help;
Steven Rostedt77d942c2011-05-20 13:36:58 -0400201my %variable;
Steven Rostedtcf79fab2012-07-19 15:29:43 -0400202
203# force_config is the list of configs that we force enabled (or disabled)
204# in a .config file. The MIN_CONFIG and ADD_CONFIG configs.
Steven Rostedtfcb3f162011-06-13 10:40:58 -0400205my %force_config;
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500206
Steven Rostedt4ab1cce2011-09-30 18:12:20 -0400207# do not force reboots on config problems
208my $no_reboot = 1;
209
Steven Rostedt759a3cc2012-05-01 08:20:12 -0400210# reboot on success
211my $reboot_success = 0;
212
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500213my %option_map = (
214 "MACHINE" => \$machine,
215 "SSH_USER" => \$ssh_user,
216 "TMP_DIR" => \$tmpdir,
217 "OUTPUT_DIR" => \$outputdir,
218 "BUILD_DIR" => \$builddir,
219 "TEST_TYPE" => \$test_type,
Steven Rostedt921ed4c2012-07-19 15:18:27 -0400220 "PRE_KTEST" => \$pre_ktest,
221 "POST_KTEST" => \$post_ktest,
222 "PRE_TEST" => \$pre_test,
223 "POST_TEST" => \$post_test,
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500224 "BUILD_TYPE" => \$build_type,
225 "BUILD_OPTIONS" => \$build_options,
226 "PRE_BUILD" => \$pre_build,
227 "POST_BUILD" => \$post_build,
228 "PRE_BUILD_DIE" => \$pre_build_die,
229 "POST_BUILD_DIE" => \$post_build_die,
230 "POWER_CYCLE" => \$power_cycle,
231 "REBOOT" => \$reboot,
232 "BUILD_NOCLEAN" => \$noclean,
233 "MIN_CONFIG" => \$minconfig,
234 "OUTPUT_MIN_CONFIG" => \$output_minconfig,
235 "START_MIN_CONFIG" => \$start_minconfig,
Steven Rostedtccc513b2012-05-21 17:13:40 -0400236 "MIN_CONFIG_TYPE" => \$minconfig_type,
Steven Rostedt43de3312012-05-21 23:35:12 -0400237 "USE_OUTPUT_MIN_CONFIG" => \$use_output_minconfig,
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500238 "IGNORE_CONFIG" => \$ignore_config,
239 "TEST" => \$run_test,
240 "ADD_CONFIG" => \$addconfig,
241 "REBOOT_TYPE" => \$reboot_type,
242 "GRUB_MENU" => \$grub_menu,
Steven Rostedta15ba912012-11-13 14:30:37 -0500243 "GRUB_FILE" => \$grub_file,
244 "GRUB_REBOOT" => \$grub_reboot,
Steven Rostedt77869542012-12-11 17:37:41 -0500245 "SYSLINUX" => \$syslinux,
246 "SYSLINUX_PATH" => \$syslinux_path,
247 "SYSLINUX_LABEL" => \$syslinux_label,
Steven Rostedte5c2ec12012-07-19 15:22:05 -0400248 "PRE_INSTALL" => \$pre_install,
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500249 "POST_INSTALL" => \$post_install,
250 "NO_INSTALL" => \$no_install,
251 "REBOOT_SCRIPT" => \$reboot_script,
252 "REBOOT_ON_ERROR" => \$reboot_on_error,
253 "SWITCH_TO_GOOD" => \$switch_to_good,
254 "SWITCH_TO_TEST" => \$switch_to_test,
255 "POWEROFF_ON_ERROR" => \$poweroff_on_error,
Steven Rostedt648a1822012-03-21 11:18:27 -0400256 "REBOOT_ON_SUCCESS" => \$reboot_on_success,
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500257 "DIE_ON_FAILURE" => \$die_on_failure,
258 "POWER_OFF" => \$power_off,
259 "POWERCYCLE_AFTER_REBOOT" => \$powercycle_after_reboot,
260 "POWEROFF_AFTER_HALT" => \$poweroff_after_halt,
Steven Rostedt407b95b2012-07-19 16:05:42 -0400261 "MAX_MONITOR_WAIT" => \$max_monitor_wait,
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500262 "SLEEP_TIME" => \$sleep_time,
263 "BISECT_SLEEP_TIME" => \$bisect_sleep_time,
264 "PATCHCHECK_SLEEP_TIME" => \$patchcheck_sleep_time,
265 "IGNORE_WARNINGS" => \$ignore_warnings,
Steven Rostedtbe405f92012-01-04 21:51:59 -0500266 "IGNORE_ERRORS" => \$ignore_errors,
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500267 "BISECT_MANUAL" => \$bisect_manual,
268 "BISECT_SKIP" => \$bisect_skip,
269 "CONFIG_BISECT_GOOD" => \$config_bisect_good,
270 "BISECT_RET_GOOD" => \$bisect_ret_good,
271 "BISECT_RET_BAD" => \$bisect_ret_bad,
272 "BISECT_RET_SKIP" => \$bisect_ret_skip,
273 "BISECT_RET_ABORT" => \$bisect_ret_abort,
274 "BISECT_RET_DEFAULT" => \$bisect_ret_default,
275 "STORE_FAILURES" => \$store_failures,
276 "STORE_SUCCESSES" => \$store_successes,
277 "TEST_NAME" => \$test_name,
278 "TIMEOUT" => \$timeout,
279 "BOOTED_TIMEOUT" => \$booted_timeout,
280 "CONSOLE" => \$console,
281 "DETECT_TRIPLE_FAULT" => \$detect_triplefault,
282 "SUCCESS_LINE" => \$success_line,
283 "REBOOT_SUCCESS_LINE" => \$reboot_success_line,
284 "STOP_AFTER_SUCCESS" => \$stop_after_success,
285 "STOP_AFTER_FAILURE" => \$stop_after_failure,
286 "STOP_TEST_AFTER" => \$stop_test_after,
287 "BUILD_TARGET" => \$build_target,
288 "SSH_EXEC" => \$ssh_exec,
289 "SCP_TO_TARGET" => \$scp_to_target,
Steven Rostedt02ad2612012-03-21 08:21:24 -0400290 "SCP_TO_TARGET_INSTALL" => \$scp_to_target_install,
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500291 "CHECKOUT" => \$checkout,
292 "TARGET_IMAGE" => \$target_image,
293 "LOCALVERSION" => \$localversion,
294
295 "BISECT_GOOD" => \$bisect_good,
296 "BISECT_BAD" => \$bisect_bad,
297 "BISECT_TYPE" => \$bisect_type,
298 "BISECT_START" => \$bisect_start,
299 "BISECT_REPLAY" => \$bisect_replay,
300 "BISECT_FILES" => \$bisect_files,
301 "BISECT_REVERSE" => \$bisect_reverse,
302 "BISECT_CHECK" => \$bisect_check,
303
304 "CONFIG_BISECT" => \$config_bisect,
305 "CONFIG_BISECT_TYPE" => \$config_bisect_type,
Steven Rostedtb0918612012-07-19 15:26:00 -0400306 "CONFIG_BISECT_CHECK" => \$config_bisect_check,
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500307
308 "PATCHCHECK_TYPE" => \$patchcheck_type,
309 "PATCHCHECK_START" => \$patchcheck_start,
310 "PATCHCHECK_END" => \$patchcheck_end,
311);
312
313# Options may be used by other options, record them.
314my %used_options;
315
Steven Rostedt7bf51072011-10-22 09:07:03 -0400316# default variables that can be used
317chomp ($variable{"PWD"} = `pwd`);
318
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500319$config_help{"MACHINE"} = << "EOF"
320 The machine hostname that you will test.
Steven Rostedtbb8474b2011-11-23 15:58:00 -0500321 For build only tests, it is still needed to differentiate log files.
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500322EOF
323 ;
324$config_help{"SSH_USER"} = << "EOF"
325 The box is expected to have ssh on normal bootup, provide the user
326 (most likely root, since you need privileged operations)
327EOF
328 ;
329$config_help{"BUILD_DIR"} = << "EOF"
330 The directory that contains the Linux source code (full path).
Steven Rostedt0e7a22d2011-11-21 20:39:33 -0500331 You can use \${PWD} that will be the path where ktest.pl is run, or use
332 \${THIS_DIR} which is assigned \${PWD} but may be changed later.
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500333EOF
334 ;
335$config_help{"OUTPUT_DIR"} = << "EOF"
336 The directory that the objects will be built (full path).
337 (can not be same as BUILD_DIR)
Steven Rostedt0e7a22d2011-11-21 20:39:33 -0500338 You can use \${PWD} that will be the path where ktest.pl is run, or use
339 \${THIS_DIR} which is assigned \${PWD} but may be changed later.
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500340EOF
341 ;
342$config_help{"BUILD_TARGET"} = << "EOF"
343 The location of the compiled file to copy to the target.
344 (relative to OUTPUT_DIR)
345EOF
346 ;
Steven Rostedtdbd37832011-11-23 16:00:48 -0500347$config_help{"BUILD_OPTIONS"} = << "EOF"
348 Options to add to \"make\" when building.
349 i.e. -j20
350EOF
351 ;
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500352$config_help{"TARGET_IMAGE"} = << "EOF"
353 The place to put your image on the test machine.
354EOF
355 ;
356$config_help{"POWER_CYCLE"} = << "EOF"
357 A script or command to reboot the box.
358
359 Here is a digital loggers power switch example
360 POWER_CYCLE = wget --no-proxy -O /dev/null -q --auth-no-challenge 'http://admin:admin\@power/outlet?5=CCL'
361
362 Here is an example to reboot a virtual box on the current host
363 with the name "Guest".
364 POWER_CYCLE = virsh destroy Guest; sleep 5; virsh start Guest
365EOF
366 ;
367$config_help{"CONSOLE"} = << "EOF"
368 The script or command that reads the console
369
370 If you use ttywatch server, something like the following would work.
371CONSOLE = nc -d localhost 3001
372
373 For a virtual machine with guest name "Guest".
374CONSOLE = virsh console Guest
375EOF
376 ;
377$config_help{"LOCALVERSION"} = << "EOF"
378 Required version ending to differentiate the test
379 from other linux builds on the system.
380EOF
381 ;
382$config_help{"REBOOT_TYPE"} = << "EOF"
383 Way to reboot the box to the test kernel.
Steven Rostedt77869542012-12-11 17:37:41 -0500384 Only valid options so far are "grub", "grub2", "syslinux", and "script".
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500385
386 If you specify grub, it will assume grub version 1
387 and will search in /boot/grub/menu.lst for the title \$GRUB_MENU
388 and select that target to reboot to the kernel. If this is not
389 your setup, then specify "script" and have a command or script
390 specified in REBOOT_SCRIPT to boot to the target.
391
392 The entry in /boot/grub/menu.lst must be entered in manually.
393 The test will not modify that file.
Steven Rostedta15ba912012-11-13 14:30:37 -0500394
395 If you specify grub2, then you also need to specify both \$GRUB_MENU
396 and \$GRUB_FILE.
Steven Rostedt77869542012-12-11 17:37:41 -0500397
398 If you specify syslinux, then you may use SYSLINUX to define the syslinux
399 command (defaults to extlinux), and SYSLINUX_PATH to specify the path to
400 the syslinux install (defaults to /boot/extlinux). But you have to specify
401 SYSLINUX_LABEL to define the label to boot to for the test kernel.
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500402EOF
403 ;
404$config_help{"GRUB_MENU"} = << "EOF"
405 The grub title name for the test kernel to boot
Steven Rostedta15ba912012-11-13 14:30:37 -0500406 (Only mandatory if REBOOT_TYPE = grub or grub2)
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500407
408 Note, ktest.pl will not update the grub menu.lst, you need to
409 manually add an option for the test. ktest.pl will search
410 the grub menu.lst for this option to find what kernel to
411 reboot into.
412
413 For example, if in the /boot/grub/menu.lst the test kernel title has:
414 title Test Kernel
415 kernel vmlinuz-test
416 GRUB_MENU = Test Kernel
Steven Rostedta15ba912012-11-13 14:30:37 -0500417
418 For grub2, a search of \$GRUB_FILE is performed for the lines
419 that begin with "menuentry". It will not detect submenus. The
420 menu must be a non-nested menu. Add the quotes used in the menu
421 to guarantee your selection, as the first menuentry with the content
422 of \$GRUB_MENU that is found will be used.
423EOF
424 ;
425$config_help{"GRUB_FILE"} = << "EOF"
426 If grub2 is used, the full path for the grub.cfg file is placed
427 here. Use something like /boot/grub2/grub.cfg to search.
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500428EOF
429 ;
Steven Rostedt77869542012-12-11 17:37:41 -0500430$config_help{"SYSLINUX_LABEL"} = << "EOF"
431 If syslinux is used, the label that boots the target kernel must
432 be specified with SYSLINUX_LABEL.
433EOF
434 ;
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500435$config_help{"REBOOT_SCRIPT"} = << "EOF"
436 A script to reboot the target into the test kernel
437 (Only mandatory if REBOOT_TYPE = script)
438EOF
439 ;
440
Steven Rostedtdad98752011-11-22 20:48:57 -0500441sub read_prompt {
442 my ($cancel, $prompt) = @_;
Steven Rostedt35ce5952011-07-15 21:57:25 -0400443
444 my $ans;
445
446 for (;;) {
Steven Rostedtdad98752011-11-22 20:48:57 -0500447 if ($cancel) {
448 print "$prompt [y/n/C] ";
449 } else {
450 print "$prompt [Y/n] ";
451 }
Steven Rostedt35ce5952011-07-15 21:57:25 -0400452 $ans = <STDIN>;
453 chomp $ans;
454 if ($ans =~ /^\s*$/) {
Steven Rostedtdad98752011-11-22 20:48:57 -0500455 if ($cancel) {
456 $ans = "c";
457 } else {
458 $ans = "y";
459 }
Steven Rostedt35ce5952011-07-15 21:57:25 -0400460 }
461 last if ($ans =~ /^y$/i || $ans =~ /^n$/i);
Steven Rostedtdad98752011-11-22 20:48:57 -0500462 if ($cancel) {
463 last if ($ans =~ /^c$/i);
464 print "Please answer either 'y', 'n' or 'c'.\n";
465 } else {
466 print "Please answer either 'y' or 'n'.\n";
467 }
468 }
469 if ($ans =~ /^c/i) {
470 exit;
Steven Rostedt35ce5952011-07-15 21:57:25 -0400471 }
472 if ($ans !~ /^y$/i) {
473 return 0;
474 }
475 return 1;
476}
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500477
Steven Rostedtdad98752011-11-22 20:48:57 -0500478sub read_yn {
479 my ($prompt) = @_;
480
481 return read_prompt 0, $prompt;
482}
483
484sub read_ync {
485 my ($prompt) = @_;
486
487 return read_prompt 1, $prompt;
488}
489
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500490sub get_ktest_config {
491 my ($config) = @_;
Steven Rostedt815e2bd2011-10-28 07:01:40 -0400492 my $ans;
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500493
494 return if (defined($opt{$config}));
495
496 if (defined($config_help{$config})) {
497 print "\n";
498 print $config_help{$config};
499 }
500
501 for (;;) {
502 print "$config = ";
Steven Rostedtdbd37832011-11-23 16:00:48 -0500503 if (defined($default{$config}) && length($default{$config})) {
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500504 print "\[$default{$config}\] ";
505 }
Steven Rostedt815e2bd2011-10-28 07:01:40 -0400506 $ans = <STDIN>;
507 $ans =~ s/^\s*(.*\S)\s*$/$1/;
508 if ($ans =~ /^\s*$/) {
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500509 if ($default{$config}) {
Steven Rostedt815e2bd2011-10-28 07:01:40 -0400510 $ans = $default{$config};
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500511 } else {
512 print "Your answer can not be blank\n";
513 next;
514 }
515 }
Steven Rostedt0e7a22d2011-11-21 20:39:33 -0500516 $entered_configs{$config} = ${ans};
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500517 last;
518 }
519}
520
521sub get_ktest_configs {
522 get_ktest_config("MACHINE");
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500523 get_ktest_config("BUILD_DIR");
524 get_ktest_config("OUTPUT_DIR");
Steven Rostedtbb8474b2011-11-23 15:58:00 -0500525
Steven Rostedtdbd37832011-11-23 16:00:48 -0500526 if ($newconfig) {
527 get_ktest_config("BUILD_OPTIONS");
528 }
529
Steven Rostedtbb8474b2011-11-23 15:58:00 -0500530 # options required for other than just building a kernel
531 if (!$buildonly) {
Steven Rostedt165708b2011-11-26 20:56:52 -0500532 get_ktest_config("POWER_CYCLE");
533 get_ktest_config("CONSOLE");
534 }
535
536 # options required for install and more
537 if ($buildonly != 1) {
Steven Rostedtbb8474b2011-11-23 15:58:00 -0500538 get_ktest_config("SSH_USER");
539 get_ktest_config("BUILD_TARGET");
540 get_ktest_config("TARGET_IMAGE");
Steven Rostedtbb8474b2011-11-23 15:58:00 -0500541 }
542
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500543 get_ktest_config("LOCALVERSION");
544
Steven Rostedtbb8474b2011-11-23 15:58:00 -0500545 return if ($buildonly);
546
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500547 my $rtype = $opt{"REBOOT_TYPE"};
548
549 if (!defined($rtype)) {
550 if (!defined($opt{"GRUB_MENU"})) {
551 get_ktest_config("REBOOT_TYPE");
552 $rtype = $entered_configs{"REBOOT_TYPE"};
553 } else {
554 $rtype = "grub";
555 }
556 }
557
558 if ($rtype eq "grub") {
559 get_ktest_config("GRUB_MENU");
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500560 }
Steven Rostedta15ba912012-11-13 14:30:37 -0500561
562 if ($rtype eq "grub2") {
563 get_ktest_config("GRUB_MENU");
564 get_ktest_config("GRUB_FILE");
565 }
Steven Rostedt77869542012-12-11 17:37:41 -0500566
567 if ($rtype eq "syslinux") {
568 get_ktest_config("SYSLINUX_LABEL");
569 }
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500570}
571
Steven Rostedt77d942c2011-05-20 13:36:58 -0400572sub process_variables {
Steven Rostedt8d735212011-10-17 11:36:44 -0400573 my ($value, $remove_undef) = @_;
Steven Rostedt77d942c2011-05-20 13:36:58 -0400574 my $retval = "";
575
576 # We want to check for '\', and it is just easier
577 # to check the previous characet of '$' and not need
578 # to worry if '$' is the first character. By adding
579 # a space to $value, we can just check [^\\]\$ and
580 # it will still work.
581 $value = " $value";
582
583 while ($value =~ /(.*?[^\\])\$\{(.*?)\}(.*)/) {
584 my $begin = $1;
585 my $var = $2;
586 my $end = $3;
587 # append beginning of value to retval
588 $retval = "$retval$begin";
589 if (defined($variable{$var})) {
590 $retval = "$retval$variable{$var}";
Steven Rostedt8d735212011-10-17 11:36:44 -0400591 } elsif (defined($remove_undef) && $remove_undef) {
592 # for if statements, any variable that is not defined,
593 # we simple convert to 0
594 $retval = "${retval}0";
Steven Rostedt77d942c2011-05-20 13:36:58 -0400595 } else {
596 # put back the origin piece.
597 $retval = "$retval\$\{$var\}";
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500598 # This could be an option that is used later, save
599 # it so we don't warn if this option is not one of
600 # ktests options.
601 $used_options{$var} = 1;
Steven Rostedt77d942c2011-05-20 13:36:58 -0400602 }
603 $value = $end;
604 }
605 $retval = "$retval$value";
606
607 # remove the space added in the beginning
608 $retval =~ s/ //;
609
610 return "$retval"
611}
612
Steven Rostedta57419b2010-11-02 15:13:54 -0400613sub set_value {
Steven Rostedt3d1cc412011-09-30 22:14:21 -0400614 my ($lvalue, $rvalue, $override, $overrides, $name) = @_;
Steven Rostedta57419b2010-11-02 15:13:54 -0400615
Steven Rostedtcad96662011-12-22 11:32:52 -0500616 my $prvalue = process_variables($rvalue);
617
618 if ($buildonly && $lvalue =~ /^TEST_TYPE(\[.*\])?$/ && $prvalue ne "build") {
Steven Rostedtbb8474b2011-11-23 15:58:00 -0500619 # Note if a test is something other than build, then we
620 # will need other manditory options.
Steven Rostedtcad96662011-12-22 11:32:52 -0500621 if ($prvalue ne "install") {
Steven Rostedt165708b2011-11-26 20:56:52 -0500622 $buildonly = 0;
623 } else {
624 # install still limits some manditory options.
625 $buildonly = 2;
626 }
Steven Rostedtbb8474b2011-11-23 15:58:00 -0500627 }
628
Steven Rostedta57419b2010-11-02 15:13:54 -0400629 if (defined($opt{$lvalue})) {
Steven Rostedt3d1cc412011-09-30 22:14:21 -0400630 if (!$override || defined(${$overrides}{$lvalue})) {
631 my $extra = "";
632 if ($override) {
633 $extra = "In the same override section!\n";
634 }
635 die "$name: $.: Option $lvalue defined more than once!\n$extra";
636 }
Steven Rostedtcad96662011-12-22 11:32:52 -0500637 ${$overrides}{$lvalue} = $prvalue;
Steven Rostedta57419b2010-11-02 15:13:54 -0400638 }
Steven Rostedt21a96792010-11-08 16:45:50 -0500639 if ($rvalue =~ /^\s*$/) {
640 delete $opt{$lvalue};
641 } else {
Steven Rostedtcad96662011-12-22 11:32:52 -0500642 $opt{$lvalue} = $prvalue;
Steven Rostedt21a96792010-11-08 16:45:50 -0500643 }
Steven Rostedta57419b2010-11-02 15:13:54 -0400644}
645
Steven Rostedt77d942c2011-05-20 13:36:58 -0400646sub set_variable {
647 my ($lvalue, $rvalue) = @_;
648
649 if ($rvalue =~ /^\s*$/) {
650 delete $variable{$lvalue};
651 } else {
652 $rvalue = process_variables($rvalue);
653 $variable{$lvalue} = $rvalue;
654 }
655}
656
Steven Rostedtab7a3f52011-09-30 20:24:07 -0400657sub process_compare {
658 my ($lval, $cmp, $rval) = @_;
659
660 # remove whitespace
661
662 $lval =~ s/^\s*//;
663 $lval =~ s/\s*$//;
664
665 $rval =~ s/^\s*//;
666 $rval =~ s/\s*$//;
667
668 if ($cmp eq "==") {
669 return $lval eq $rval;
670 } elsif ($cmp eq "!=") {
671 return $lval ne $rval;
Steven Rostedt8fddbe92012-07-30 14:37:01 -0400672 } elsif ($cmp eq "=~") {
673 return $lval =~ m/$rval/;
674 } elsif ($cmp eq "!~") {
675 return $lval !~ m/$rval/;
Steven Rostedtab7a3f52011-09-30 20:24:07 -0400676 }
677
678 my $statement = "$lval $cmp $rval";
679 my $ret = eval $statement;
680
681 # $@ stores error of eval
682 if ($@) {
683 return -1;
684 }
685
686 return $ret;
687}
688
Steven Rostedt9900b5d2011-09-30 22:41:14 -0400689sub value_defined {
690 my ($val) = @_;
691
692 return defined($variable{$2}) ||
693 defined($opt{$2});
694}
695
Steven Rostedt8d735212011-10-17 11:36:44 -0400696my $d = 0;
697sub process_expression {
698 my ($name, $val) = @_;
Steven Rostedt45d73a52011-09-30 19:44:53 -0400699
Steven Rostedt8d735212011-10-17 11:36:44 -0400700 my $c = $d++;
701
702 while ($val =~ s/\(([^\(]*?)\)/\&\&\&\&VAL\&\&\&\&/) {
703 my $express = $1;
704
705 if (process_expression($name, $express)) {
706 $val =~ s/\&\&\&\&VAL\&\&\&\&/ 1 /;
707 } else {
708 $val =~ s/\&\&\&\&VAL\&\&\&\&/ 0 /;
709 }
710 }
711
712 $d--;
713 my $OR = "\\|\\|";
714 my $AND = "\\&\\&";
715
716 while ($val =~ s/^(.*?)($OR|$AND)//) {
717 my $express = $1;
718 my $op = $2;
719
720 if (process_expression($name, $express)) {
721 if ($op eq "||") {
722 return 1;
723 }
724 } else {
725 if ($op eq "&&") {
726 return 0;
727 }
728 }
729 }
Steven Rostedt45d73a52011-09-30 19:44:53 -0400730
Steven Rostedt8fddbe92012-07-30 14:37:01 -0400731 if ($val =~ /(.*)(==|\!=|>=|<=|>|<|=~|\!~)(.*)/) {
Steven Rostedtab7a3f52011-09-30 20:24:07 -0400732 my $ret = process_compare($1, $2, $3);
733 if ($ret < 0) {
734 die "$name: $.: Unable to process comparison\n";
735 }
736 return $ret;
737 }
738
Steven Rostedt9900b5d2011-09-30 22:41:14 -0400739 if ($val =~ /^\s*(NOT\s*)?DEFINED\s+(\S+)\s*$/) {
740 if (defined $1) {
741 return !value_defined($2);
742 } else {
743 return value_defined($2);
744 }
745 }
746
Steven Rostedt45d73a52011-09-30 19:44:53 -0400747 if ($val =~ /^\s*0\s*$/) {
748 return 0;
749 } elsif ($val =~ /^\s*\d+\s*$/) {
750 return 1;
751 }
752
Steven Rostedt9900b5d2011-09-30 22:41:14 -0400753 die ("$name: $.: Undefined content $val in if statement\n");
Steven Rostedt8d735212011-10-17 11:36:44 -0400754}
755
756sub process_if {
757 my ($name, $value) = @_;
758
759 # Convert variables and replace undefined ones with 0
760 my $val = process_variables($value, 1);
761 my $ret = process_expression $name, $val;
762
763 return $ret;
Steven Rostedt45d73a52011-09-30 19:44:53 -0400764}
765
Steven Rostedt2ed3b162011-09-30 21:00:00 -0400766sub __read_config {
767 my ($config, $current_test_num) = @_;
Steven Rostedt2545eb62010-11-02 15:01:32 -0400768
Steven Rostedt2ed3b162011-09-30 21:00:00 -0400769 my $in;
770 open($in, $config) || die "can't read file $config";
Steven Rostedt2545eb62010-11-02 15:01:32 -0400771
Steven Rostedta57419b2010-11-02 15:13:54 -0400772 my $name = $config;
773 $name =~ s,.*/(.*),$1,;
774
Steven Rostedt2ed3b162011-09-30 21:00:00 -0400775 my $test_num = $$current_test_num;
Steven Rostedta57419b2010-11-02 15:13:54 -0400776 my $default = 1;
777 my $repeat = 1;
778 my $num_tests_set = 0;
779 my $skip = 0;
780 my $rest;
Steven Rostedta9f84422011-10-17 11:06:29 -0400781 my $line;
Steven Rostedt0df213c2011-06-14 20:51:37 -0400782 my $test_case = 0;
Steven Rostedt45d73a52011-09-30 19:44:53 -0400783 my $if = 0;
784 my $if_set = 0;
Steven Rostedt3d1cc412011-09-30 22:14:21 -0400785 my $override = 0;
786
787 my %overrides;
Steven Rostedta57419b2010-11-02 15:13:54 -0400788
Steven Rostedt2ed3b162011-09-30 21:00:00 -0400789 while (<$in>) {
Steven Rostedt2545eb62010-11-02 15:01:32 -0400790
791 # ignore blank lines and comments
792 next if (/^\s*$/ || /\s*\#/);
793
Steven Rostedt0050b6b2011-09-30 21:10:30 -0400794 if (/^\s*(TEST_START|DEFAULTS)\b(.*)/) {
Steven Rostedta57419b2010-11-02 15:13:54 -0400795
Steven Rostedt0050b6b2011-09-30 21:10:30 -0400796 my $type = $1;
797 $rest = $2;
Steven Rostedta9f84422011-10-17 11:06:29 -0400798 $line = $2;
Steven Rostedta57419b2010-11-02 15:13:54 -0400799
Steven Rostedt0050b6b2011-09-30 21:10:30 -0400800 my $old_test_num;
801 my $old_repeat;
Steven Rostedt3d1cc412011-09-30 22:14:21 -0400802 $override = 0;
Steven Rostedt0050b6b2011-09-30 21:10:30 -0400803
804 if ($type eq "TEST_START") {
805
806 if ($num_tests_set) {
807 die "$name: $.: Can not specify both NUM_TESTS and TEST_START\n";
808 }
809
810 $old_test_num = $test_num;
811 $old_repeat = $repeat;
812
813 $test_num += $repeat;
814 $default = 0;
815 $repeat = 1;
816 } else {
817 $default = 1;
Steven Rostedta57419b2010-11-02 15:13:54 -0400818 }
819
Steven Rostedta9f84422011-10-17 11:06:29 -0400820 # If SKIP is anywhere in the line, the command will be skipped
821 if ($rest =~ s/\s+SKIP\b//) {
Steven Rostedta57419b2010-11-02 15:13:54 -0400822 $skip = 1;
823 } else {
Steven Rostedt0df213c2011-06-14 20:51:37 -0400824 $test_case = 1;
Steven Rostedta57419b2010-11-02 15:13:54 -0400825 $skip = 0;
826 }
827
Steven Rostedta9f84422011-10-17 11:06:29 -0400828 if ($rest =~ s/\sELSE\b//) {
829 if (!$if) {
830 die "$name: $.: ELSE found with out matching IF section\n$_";
831 }
832 $if = 0;
833
834 if ($if_set) {
835 $skip = 1;
836 } else {
837 $skip = 0;
Steven Rostedt3d1cc412011-09-30 22:14:21 -0400838 }
Steven Rostedta57419b2010-11-02 15:13:54 -0400839 }
840
Steven Rostedta9f84422011-10-17 11:06:29 -0400841 if ($rest =~ s/\sIF\s+(.*)//) {
Steven Rostedt45d73a52011-09-30 19:44:53 -0400842 if (process_if($name, $1)) {
843 $if_set = 1;
844 } else {
845 $skip = 1;
846 }
847 $if = 1;
848 } else {
849 $if = 0;
Steven Rostedta9f84422011-10-17 11:06:29 -0400850 $if_set = 0;
Steven Rostedta57419b2010-11-02 15:13:54 -0400851 }
852
Steven Rostedta9f84422011-10-17 11:06:29 -0400853 if (!$skip) {
854 if ($type eq "TEST_START") {
855 if ($rest =~ s/\s+ITERATE\s+(\d+)//) {
856 $repeat = $1;
857 $repeat_tests{"$test_num"} = $repeat;
858 }
859 } elsif ($rest =~ s/\sOVERRIDE\b//) {
860 # DEFAULT only
861 $override = 1;
862 # Clear previous overrides
863 %overrides = ();
864 }
865 }
866
867 if (!$skip && $rest !~ /^\s*$/) {
Steven Rostedt0050b6b2011-09-30 21:10:30 -0400868 die "$name: $.: Gargbage found after $type\n$_";
Steven Rostedta57419b2010-11-02 15:13:54 -0400869 }
870
Steven Rostedt0050b6b2011-09-30 21:10:30 -0400871 if ($skip && $type eq "TEST_START") {
Steven Rostedta57419b2010-11-02 15:13:54 -0400872 $test_num = $old_test_num;
Steven Rostedte48c5292010-11-02 14:35:37 -0400873 $repeat = $old_repeat;
Steven Rostedta57419b2010-11-02 15:13:54 -0400874 }
875
Steven Rostedtab7a3f52011-09-30 20:24:07 -0400876 } elsif (/^\s*ELSE\b(.*)$/) {
Steven Rostedt45d73a52011-09-30 19:44:53 -0400877 if (!$if) {
878 die "$name: $.: ELSE found with out matching IF section\n$_";
879 }
880 $rest = $1;
881 if ($if_set) {
882 $skip = 1;
Steven Rostedtab7a3f52011-09-30 20:24:07 -0400883 $rest = "";
Steven Rostedt45d73a52011-09-30 19:44:53 -0400884 } else {
885 $skip = 0;
886
Steven Rostedtab7a3f52011-09-30 20:24:07 -0400887 if ($rest =~ /\sIF\s+(.*)/) {
Steven Rostedt45d73a52011-09-30 19:44:53 -0400888 # May be a ELSE IF section.
Steven Rostedt95f57832012-09-26 14:48:17 -0400889 if (process_if($name, $1)) {
890 $if_set = 1;
891 } else {
Steven Rostedt45d73a52011-09-30 19:44:53 -0400892 $skip = 1;
893 }
Steven Rostedtab7a3f52011-09-30 20:24:07 -0400894 $rest = "";
Steven Rostedt45d73a52011-09-30 19:44:53 -0400895 } else {
896 $if = 0;
897 }
898 }
899
Steven Rostedtab7a3f52011-09-30 20:24:07 -0400900 if ($rest !~ /^\s*$/) {
901 die "$name: $.: Gargbage found after DEFAULTS\n$_";
902 }
903
Steven Rostedt2ed3b162011-09-30 21:00:00 -0400904 } elsif (/^\s*INCLUDE\s+(\S+)/) {
905
906 next if ($skip);
907
908 if (!$default) {
909 die "$name: $.: INCLUDE can only be done in default sections\n$_";
910 }
911
912 my $file = process_variables($1);
913
914 if ($file !~ m,^/,) {
915 # check the path of the config file first
916 if ($config =~ m,(.*)/,) {
917 if (-f "$1/$file") {
918 $file = "$1/$file";
919 }
920 }
921 }
922
923 if ( ! -r $file ) {
924 die "$name: $.: Can't read file $file\n$_";
925 }
926
927 if (__read_config($file, \$test_num)) {
928 $test_case = 1;
929 }
930
Steven Rostedta57419b2010-11-02 15:13:54 -0400931 } elsif (/^\s*([A-Z_\[\]\d]+)\s*=\s*(.*?)\s*$/) {
932
933 next if ($skip);
934
Steven Rostedt2545eb62010-11-02 15:01:32 -0400935 my $lvalue = $1;
936 my $rvalue = $2;
937
Steven Rostedta57419b2010-11-02 15:13:54 -0400938 if (!$default &&
939 ($lvalue eq "NUM_TESTS" ||
940 $lvalue eq "LOG_FILE" ||
941 $lvalue eq "CLEAR_LOG")) {
942 die "$name: $.: $lvalue must be set in DEFAULTS section\n";
Steven Rostedta75fece2010-11-02 14:58:27 -0400943 }
Steven Rostedta57419b2010-11-02 15:13:54 -0400944
945 if ($lvalue eq "NUM_TESTS") {
946 if ($test_num) {
947 die "$name: $.: Can not specify both NUM_TESTS and TEST_START\n";
948 }
949 if (!$default) {
950 die "$name: $.: NUM_TESTS must be set in default section\n";
951 }
952 $num_tests_set = 1;
953 }
954
955 if ($default || $lvalue =~ /\[\d+\]$/) {
Steven Rostedt3d1cc412011-09-30 22:14:21 -0400956 set_value($lvalue, $rvalue, $override, \%overrides, $name);
Steven Rostedta57419b2010-11-02 15:13:54 -0400957 } else {
958 my $val = "$lvalue\[$test_num\]";
Steven Rostedt3d1cc412011-09-30 22:14:21 -0400959 set_value($val, $rvalue, $override, \%overrides, $name);
Steven Rostedta57419b2010-11-02 15:13:54 -0400960
961 if ($repeat > 1) {
962 $repeats{$val} = $repeat;
963 }
964 }
Steven Rostedt77d942c2011-05-20 13:36:58 -0400965 } elsif (/^\s*([A-Z_\[\]\d]+)\s*:=\s*(.*?)\s*$/) {
966 next if ($skip);
967
968 my $lvalue = $1;
969 my $rvalue = $2;
970
971 # process config variables.
972 # Config variables are only active while reading the
973 # config and can be defined anywhere. They also ignore
974 # TEST_START and DEFAULTS, but are skipped if they are in
975 # on of these sections that have SKIP defined.
976 # The save variable can be
977 # defined multiple times and the new one simply overrides
978 # the prevous one.
979 set_variable($lvalue, $rvalue);
980
Steven Rostedta57419b2010-11-02 15:13:54 -0400981 } else {
982 die "$name: $.: Garbage found in config\n$_";
Steven Rostedt2545eb62010-11-02 15:01:32 -0400983 }
984 }
985
Steven Rostedta57419b2010-11-02 15:13:54 -0400986 if ($test_num) {
987 $test_num += $repeat - 1;
988 $opt{"NUM_TESTS"} = $test_num;
989 }
990
Steven Rostedt2ed3b162011-09-30 21:00:00 -0400991 close($in);
992
993 $$current_test_num = $test_num;
994
995 return $test_case;
996}
997
Steven Rostedtc4261d02011-11-23 13:41:18 -0500998sub get_test_case {
999 print "What test case would you like to run?\n";
1000 print " (build, install or boot)\n";
1001 print " Other tests are available but require editing the config file\n";
1002 my $ans = <STDIN>;
1003 chomp $ans;
1004 $default{"TEST_TYPE"} = $ans;
1005}
1006
Steven Rostedt2ed3b162011-09-30 21:00:00 -04001007sub read_config {
1008 my ($config) = @_;
1009
1010 my $test_case;
1011 my $test_num = 0;
1012
1013 $test_case = __read_config $config, \$test_num;
1014
Steven Rostedt8d1491b2010-11-18 15:39:48 -05001015 # make sure we have all mandatory configs
1016 get_ktest_configs;
1017
Steven Rostedt0df213c2011-06-14 20:51:37 -04001018 # was a test specified?
1019 if (!$test_case) {
1020 print "No test case specified.\n";
Steven Rostedtc4261d02011-11-23 13:41:18 -05001021 get_test_case;
Steven Rostedt0df213c2011-06-14 20:51:37 -04001022 }
1023
Steven Rostedta75fece2010-11-02 14:58:27 -04001024 # set any defaults
1025
1026 foreach my $default (keys %default) {
1027 if (!defined($opt{$default})) {
1028 $opt{$default} = $default{$default};
1029 }
1030 }
Steven Rostedt9cc9e092011-12-22 21:37:22 -05001031
1032 if ($opt{"IGNORE_UNUSED"} == 1) {
1033 return;
1034 }
1035
1036 my %not_used;
1037
1038 # check if there are any stragglers (typos?)
1039 foreach my $option (keys %opt) {
1040 my $op = $option;
1041 # remove per test labels.
1042 $op =~ s/\[.*\]//;
1043 if (!exists($option_map{$op}) &&
1044 !exists($default{$op}) &&
1045 !exists($used_options{$op})) {
1046 $not_used{$op} = 1;
1047 }
1048 }
1049
1050 if (%not_used) {
1051 my $s = "s are";
1052 $s = " is" if (keys %not_used == 1);
1053 print "The following option$s not used; could be a typo:\n";
1054 foreach my $option (keys %not_used) {
1055 print "$option\n";
1056 }
1057 print "Set IGRNORE_UNUSED = 1 to have ktest ignore unused variables\n";
1058 if (!read_yn "Do you want to continue?") {
1059 exit -1;
1060 }
1061 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04001062}
1063
Steven Rostedt23715c3c2011-06-13 11:03:34 -04001064sub __eval_option {
1065 my ($option, $i) = @_;
1066
1067 # Add space to evaluate the character before $
1068 $option = " $option";
1069 my $retval = "";
Rabin Vincentf9dfb652011-11-18 17:05:30 +05301070 my $repeated = 0;
1071 my $parent = 0;
1072
1073 foreach my $test (keys %repeat_tests) {
1074 if ($i >= $test &&
1075 $i < $test + $repeat_tests{$test}) {
1076
1077 $repeated = 1;
1078 $parent = $test;
1079 last;
1080 }
1081 }
Steven Rostedt23715c3c2011-06-13 11:03:34 -04001082
1083 while ($option =~ /(.*?[^\\])\$\{(.*?)\}(.*)/) {
1084 my $start = $1;
1085 my $var = $2;
1086 my $end = $3;
1087
1088 # Append beginning of line
1089 $retval = "$retval$start";
1090
1091 # If the iteration option OPT[$i] exists, then use that.
1092 # otherwise see if the default OPT (without [$i]) exists.
1093
1094 my $o = "$var\[$i\]";
Rabin Vincentf9dfb652011-11-18 17:05:30 +05301095 my $parento = "$var\[$parent\]";
Steven Rostedt23715c3c2011-06-13 11:03:34 -04001096
1097 if (defined($opt{$o})) {
1098 $o = $opt{$o};
1099 $retval = "$retval$o";
Rabin Vincentf9dfb652011-11-18 17:05:30 +05301100 } elsif ($repeated && defined($opt{$parento})) {
1101 $o = $opt{$parento};
1102 $retval = "$retval$o";
Steven Rostedt23715c3c2011-06-13 11:03:34 -04001103 } elsif (defined($opt{$var})) {
1104 $o = $opt{$var};
1105 $retval = "$retval$o";
1106 } else {
1107 $retval = "$retval\$\{$var\}";
1108 }
1109
1110 $option = $end;
1111 }
1112
1113 $retval = "$retval$option";
1114
1115 $retval =~ s/^ //;
1116
1117 return $retval;
1118}
1119
1120sub eval_option {
1121 my ($option, $i) = @_;
1122
1123 my $prev = "";
1124
1125 # Since an option can evaluate to another option,
1126 # keep iterating until we do not evaluate any more
1127 # options.
1128 my $r = 0;
1129 while ($prev ne $option) {
1130 # Check for recursive evaluations.
1131 # 100 deep should be more than enough.
1132 if ($r++ > 100) {
1133 die "Over 100 evaluations accurred with $option\n" .
1134 "Check for recursive variables\n";
1135 }
1136 $prev = $option;
1137 $option = __eval_option($option, $i);
1138 }
1139
1140 return $option;
1141}
1142
Steven Rostedtd1e2f222010-11-08 16:39:57 -05001143sub _logit {
Steven Rostedt2545eb62010-11-02 15:01:32 -04001144 if (defined($opt{"LOG_FILE"})) {
1145 open(OUT, ">> $opt{LOG_FILE}") or die "Can't write to $opt{LOG_FILE}";
1146 print OUT @_;
1147 close(OUT);
1148 }
1149}
1150
Steven Rostedtd1e2f222010-11-08 16:39:57 -05001151sub logit {
1152 if (defined($opt{"LOG_FILE"})) {
1153 _logit @_;
1154 } else {
1155 print @_;
1156 }
1157}
1158
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001159sub doprint {
1160 print @_;
Steven Rostedtd1e2f222010-11-08 16:39:57 -05001161 _logit @_;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001162}
1163
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001164sub run_command;
Andrew Jones2728be42011-08-12 15:32:05 +02001165sub start_monitor;
1166sub end_monitor;
1167sub wait_for_monitor;
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001168
1169sub reboot {
Andrew Jones2728be42011-08-12 15:32:05 +02001170 my ($time) = @_;
1171
Steven Rostedta4968722012-12-11 14:59:05 -05001172 # Make sure everything has been written to disk
1173 run_ssh("sync");
1174
Steven Rostedt2b803362011-09-30 18:00:23 -04001175 if (defined($time)) {
1176 start_monitor;
1177 # flush out current monitor
1178 # May contain the reboot success line
1179 wait_for_monitor 1;
1180 }
1181
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001182 # try to reboot normally
Steven Rostedte48c5292010-11-02 14:35:37 -04001183 if (run_command $reboot) {
Steven Rostedt576f6272010-11-02 14:58:38 -04001184 if (defined($powercycle_after_reboot)) {
1185 sleep $powercycle_after_reboot;
1186 run_command "$power_cycle";
1187 }
1188 } else {
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001189 # nope? power cycle it.
Steven Rostedta75fece2010-11-02 14:58:27 -04001190 run_command "$power_cycle";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001191 }
Andrew Jones2728be42011-08-12 15:32:05 +02001192
1193 if (defined($time)) {
Steven Rostedt407b95b2012-07-19 16:05:42 -04001194 if (wait_for_monitor($time, $reboot_success_line)) {
1195 # reboot got stuck?
Steven Rostedt8a80c722012-07-19 16:08:33 -04001196 doprint "Reboot did not finish. Forcing power cycle\n";
Steven Rostedt407b95b2012-07-19 16:05:42 -04001197 run_command "$power_cycle";
1198 }
Andrew Jones2728be42011-08-12 15:32:05 +02001199 end_monitor;
1200 }
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001201}
1202
Steven Rostedtbc7c5802011-12-22 16:29:10 -05001203sub reboot_to_good {
1204 my ($time) = @_;
1205
1206 if (defined($switch_to_good)) {
1207 run_command $switch_to_good;
Steven Rostedtbc7c5802011-12-22 16:29:10 -05001208 }
1209
1210 reboot $time;
1211}
1212
Steven Rostedt576f6272010-11-02 14:58:38 -04001213sub do_not_reboot {
1214 my $i = $iteration;
1215
Steven Rostedt4ab1cce2011-09-30 18:12:20 -04001216 return $test_type eq "build" || $no_reboot ||
Steven Rostedt576f6272010-11-02 14:58:38 -04001217 ($test_type eq "patchcheck" && $opt{"PATCHCHECK_TYPE[$i]"} eq "build") ||
1218 ($test_type eq "bisect" && $opt{"BISECT_TYPE[$i]"} eq "build");
1219}
1220
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001221sub dodie {
Steven Rostedt5a391fb2010-11-02 14:57:43 -04001222 doprint "CRITICAL FAILURE... ", @_, "\n";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001223
Steven Rostedt576f6272010-11-02 14:58:38 -04001224 my $i = $iteration;
1225
1226 if ($reboot_on_error && !do_not_reboot) {
1227
Steven Rostedt75c3fda72010-11-02 14:57:21 -04001228 doprint "REBOOTING\n";
Steven Rostedtbc7c5802011-12-22 16:29:10 -05001229 reboot_to_good;
Steven Rostedt75c3fda72010-11-02 14:57:21 -04001230
Steven Rostedta75fece2010-11-02 14:58:27 -04001231 } elsif ($poweroff_on_error && defined($power_off)) {
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001232 doprint "POWERING OFF\n";
Steven Rostedta75fece2010-11-02 14:58:27 -04001233 `$power_off`;
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001234 }
Steven Rostedt75c3fda72010-11-02 14:57:21 -04001235
Steven Rostedtf80802c2011-03-07 13:18:47 -05001236 if (defined($opt{"LOG_FILE"})) {
1237 print " See $opt{LOG_FILE} for more info.\n";
1238 }
1239
Steven Rostedt576f6272010-11-02 14:58:38 -04001240 die @_, "\n";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001241}
1242
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001243sub open_console {
1244 my ($fp) = @_;
1245
1246 my $flags;
1247
Steven Rostedta75fece2010-11-02 14:58:27 -04001248 my $pid = open($fp, "$console|") or
1249 dodie "Can't open console $console";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001250
1251 $flags = fcntl($fp, F_GETFL, 0) or
Steven Rostedt576f6272010-11-02 14:58:38 -04001252 dodie "Can't get flags for the socket: $!";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001253 $flags = fcntl($fp, F_SETFL, $flags | O_NONBLOCK) or
Steven Rostedt576f6272010-11-02 14:58:38 -04001254 dodie "Can't set flags for the socket: $!";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001255
1256 return $pid;
1257}
1258
1259sub close_console {
1260 my ($fp, $pid) = @_;
1261
1262 doprint "kill child process $pid\n";
1263 kill 2, $pid;
1264
1265 print "closing!\n";
1266 close($fp);
1267}
1268
1269sub start_monitor {
1270 if ($monitor_cnt++) {
1271 return;
1272 }
1273 $monitor_fp = \*MONFD;
1274 $monitor_pid = open_console $monitor_fp;
Steven Rostedta75fece2010-11-02 14:58:27 -04001275
1276 return;
1277
1278 open(MONFD, "Stop perl from warning about single use of MONFD");
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001279}
1280
1281sub end_monitor {
1282 if (--$monitor_cnt) {
1283 return;
1284 }
1285 close_console($monitor_fp, $monitor_pid);
1286}
1287
1288sub wait_for_monitor {
Steven Rostedt2b803362011-09-30 18:00:23 -04001289 my ($time, $stop) = @_;
1290 my $full_line = "";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001291 my $line;
Steven Rostedt2b803362011-09-30 18:00:23 -04001292 my $booted = 0;
Steven Rostedt407b95b2012-07-19 16:05:42 -04001293 my $start_time = time;
Steven Rostedt8a80c722012-07-19 16:08:33 -04001294 my $skip_call_trace = 0;
1295 my $bug = 0;
1296 my $bug_ignored = 0;
Steven Rostedt407b95b2012-07-19 16:05:42 -04001297 my $now;
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001298
Steven Rostedta75fece2010-11-02 14:58:27 -04001299 doprint "** Wait for monitor to settle down **\n";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001300
1301 # read the monitor and wait for the system to calm down
Steven Rostedt2b803362011-09-30 18:00:23 -04001302 while (!$booted) {
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001303 $line = wait_for_input($monitor_fp, $time);
Steven Rostedt2b803362011-09-30 18:00:23 -04001304 last if (!defined($line));
1305 print "$line";
1306 $full_line .= $line;
1307
1308 if (defined($stop) && $full_line =~ /$stop/) {
1309 doprint "wait for monitor detected $stop\n";
1310 $booted = 1;
1311 }
1312
Steven Rostedt8a80c722012-07-19 16:08:33 -04001313 if ($full_line =~ /\[ backtrace testing \]/) {
1314 $skip_call_trace = 1;
1315 }
1316
1317 if ($full_line =~ /call trace:/i) {
1318 if (!$bug && !$skip_call_trace) {
1319 if ($ignore_errors) {
1320 $bug_ignored = 1;
1321 } else {
1322 $bug = 1;
1323 }
1324 }
1325 }
1326
1327 if ($full_line =~ /\[ end of backtrace testing \]/) {
1328 $skip_call_trace = 0;
1329 }
1330
1331 if ($full_line =~ /Kernel panic -/) {
1332 $bug = 1;
1333 }
1334
Steven Rostedt2b803362011-09-30 18:00:23 -04001335 if ($line =~ /\n/) {
1336 $full_line = "";
1337 }
Steven Rostedt407b95b2012-07-19 16:05:42 -04001338 $now = time;
1339 if ($now - $start_time >= $max_monitor_wait) {
1340 doprint "Exiting monitor flush due to hitting MAX_MONITOR_WAIT\n";
1341 return 1;
1342 }
Steven Rostedt2b803362011-09-30 18:00:23 -04001343 }
Steven Rostedta75fece2010-11-02 14:58:27 -04001344 print "** Monitor flushed **\n";
Steven Rostedt8a80c722012-07-19 16:08:33 -04001345 return $bug;
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001346}
1347
Rabin Vincentde5b6e32011-11-18 17:05:31 +05301348sub save_logs {
1349 my ($result, $basedir) = @_;
1350 my @t = localtime;
1351 my $date = sprintf "%04d%02d%02d%02d%02d%02d",
1352 1900+$t[5],$t[4],$t[3],$t[2],$t[1],$t[0];
1353
1354 my $type = $build_type;
1355 if ($type =~ /useconfig/) {
1356 $type = "useconfig";
1357 }
1358
1359 my $dir = "$machine-$test_type-$type-$result-$date";
1360
1361 $dir = "$basedir/$dir";
1362
1363 if (!-d $dir) {
1364 mkpath($dir) or
1365 die "can't create $dir";
1366 }
1367
1368 my %files = (
1369 "config" => $output_config,
1370 "buildlog" => $buildlog,
1371 "dmesg" => $dmesg,
1372 "testlog" => $testlog,
1373 );
1374
1375 while (my ($name, $source) = each(%files)) {
1376 if (-f "$source") {
1377 cp "$source", "$dir/$name" or
1378 die "failed to copy $source";
1379 }
1380 }
1381
1382 doprint "*** Saved info to $dir ***\n";
1383}
1384
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001385sub fail {
1386
Steven Rostedt921ed4c2012-07-19 15:18:27 -04001387 if (defined($post_test)) {
1388 run_command $post_test;
1389 }
1390
Steven Rostedta75fece2010-11-02 14:58:27 -04001391 if ($die_on_failure) {
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001392 dodie @_;
1393 }
1394
Steven Rostedta75fece2010-11-02 14:58:27 -04001395 doprint "FAILED\n";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001396
Steven Rostedt576f6272010-11-02 14:58:38 -04001397 my $i = $iteration;
1398
Steven Rostedta75fece2010-11-02 14:58:27 -04001399 # no need to reboot for just building.
Steven Rostedt576f6272010-11-02 14:58:38 -04001400 if (!do_not_reboot) {
Steven Rostedta75fece2010-11-02 14:58:27 -04001401 doprint "REBOOTING\n";
Steven Rostedtbc7c5802011-12-22 16:29:10 -05001402 reboot_to_good $sleep_time;
Steven Rostedta75fece2010-11-02 14:58:27 -04001403 }
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001404
Steven Rostedt9064af52011-06-13 10:38:48 -04001405 my $name = "";
1406
1407 if (defined($test_name)) {
1408 $name = " ($test_name)";
1409 }
1410
Steven Rostedt576f6272010-11-02 14:58:38 -04001411 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
1412 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
Steven Rostedt9064af52011-06-13 10:38:48 -04001413 doprint "KTEST RESULT: TEST $i$name Failed: ", @_, "\n";
Steven Rostedt576f6272010-11-02 14:58:38 -04001414 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
1415 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
Steven Rostedta75fece2010-11-02 14:58:27 -04001416
Rabin Vincentde5b6e32011-11-18 17:05:31 +05301417 if (defined($store_failures)) {
1418 save_logs "fail", $store_failures;
1419 }
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001420
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001421 return 1;
1422}
1423
Steven Rostedt2545eb62010-11-02 15:01:32 -04001424sub run_command {
1425 my ($command) = @_;
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001426 my $dolog = 0;
1427 my $dord = 0;
1428 my $pid;
1429
Steven Rostedte48c5292010-11-02 14:35:37 -04001430 $command =~ s/\$SSH_USER/$ssh_user/g;
1431 $command =~ s/\$MACHINE/$machine/g;
1432
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001433 doprint("$command ... ");
1434
1435 $pid = open(CMD, "$command 2>&1 |") or
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001436 (fail "unable to exec $command" and return 0);
Steven Rostedt2545eb62010-11-02 15:01:32 -04001437
1438 if (defined($opt{"LOG_FILE"})) {
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001439 open(LOG, ">>$opt{LOG_FILE}") or
1440 dodie "failed to write to log";
1441 $dolog = 1;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04001442 }
1443
1444 if (defined($redirect)) {
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001445 open (RD, ">$redirect") or
1446 dodie "failed to write to redirect $redirect";
1447 $dord = 1;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001448 }
1449
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001450 while (<CMD>) {
1451 print LOG if ($dolog);
1452 print RD if ($dord);
1453 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04001454
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001455 waitpid($pid, 0);
Steven Rostedt2545eb62010-11-02 15:01:32 -04001456 my $failed = $?;
1457
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001458 close(CMD);
1459 close(LOG) if ($dolog);
1460 close(RD) if ($dord);
1461
Steven Rostedt2545eb62010-11-02 15:01:32 -04001462 if ($failed) {
1463 doprint "FAILED!\n";
1464 } else {
1465 doprint "SUCCESS\n";
1466 }
1467
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001468 return !$failed;
1469}
1470
Steven Rostedte48c5292010-11-02 14:35:37 -04001471sub run_ssh {
1472 my ($cmd) = @_;
1473 my $cp_exec = $ssh_exec;
1474
1475 $cp_exec =~ s/\$SSH_COMMAND/$cmd/g;
1476 return run_command "$cp_exec";
1477}
1478
1479sub run_scp {
Steven Rostedt02ad2612012-03-21 08:21:24 -04001480 my ($src, $dst, $cp_scp) = @_;
Steven Rostedte48c5292010-11-02 14:35:37 -04001481
1482 $cp_scp =~ s/\$SRC_FILE/$src/g;
1483 $cp_scp =~ s/\$DST_FILE/$dst/g;
1484
1485 return run_command "$cp_scp";
1486}
1487
Steven Rostedt02ad2612012-03-21 08:21:24 -04001488sub run_scp_install {
1489 my ($src, $dst) = @_;
1490
1491 my $cp_scp = $scp_to_target_install;
1492
1493 return run_scp($src, $dst, $cp_scp);
1494}
1495
1496sub run_scp_mod {
1497 my ($src, $dst) = @_;
1498
1499 my $cp_scp = $scp_to_target;
1500
1501 return run_scp($src, $dst, $cp_scp);
1502}
1503
Steven Rostedta15ba912012-11-13 14:30:37 -05001504sub get_grub2_index {
1505
1506 return if (defined($grub_number));
1507
1508 doprint "Find grub2 menu ... ";
1509 $grub_number = -1;
1510
1511 my $ssh_grub = $ssh_exec;
1512 $ssh_grub =~ s,\$SSH_COMMAND,cat $grub_file,g;
1513
1514 open(IN, "$ssh_grub |")
1515 or die "unable to get $grub_file";
1516
1517 my $found = 0;
1518
1519 while (<IN>) {
1520 if (/^menuentry.*$grub_menu/) {
1521 $grub_number++;
1522 $found = 1;
1523 last;
1524 } elsif (/^menuentry\s/) {
1525 $grub_number++;
1526 }
1527 }
1528 close(IN);
1529
1530 die "Could not find '$grub_menu' in $grub_file on $machine"
1531 if (!$found);
1532 doprint "$grub_number\n";
1533}
1534
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001535sub get_grub_index {
1536
Steven Rostedta15ba912012-11-13 14:30:37 -05001537 if ($reboot_type eq "grub2") {
1538 get_grub2_index;
1539 return;
1540 }
1541
Steven Rostedta75fece2010-11-02 14:58:27 -04001542 if ($reboot_type ne "grub") {
1543 return;
1544 }
Steven Rostedt5a391fb2010-11-02 14:57:43 -04001545 return if (defined($grub_number));
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001546
1547 doprint "Find grub menu ... ";
1548 $grub_number = -1;
Steven Rostedte48c5292010-11-02 14:35:37 -04001549
1550 my $ssh_grub = $ssh_exec;
1551 $ssh_grub =~ s,\$SSH_COMMAND,cat /boot/grub/menu.lst,g;
1552
1553 open(IN, "$ssh_grub |")
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001554 or die "unable to get menu.lst";
Steven Rostedte48c5292010-11-02 14:35:37 -04001555
Steven Rostedteaa1fe22011-09-14 17:20:39 -04001556 my $found = 0;
1557
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001558 while (<IN>) {
Steven Rostedta75fece2010-11-02 14:58:27 -04001559 if (/^\s*title\s+$grub_menu\s*$/) {
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001560 $grub_number++;
Steven Rostedteaa1fe22011-09-14 17:20:39 -04001561 $found = 1;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001562 last;
1563 } elsif (/^\s*title\s/) {
1564 $grub_number++;
1565 }
1566 }
1567 close(IN);
1568
Steven Rostedta75fece2010-11-02 14:58:27 -04001569 die "Could not find '$grub_menu' in /boot/grub/menu on $machine"
Steven Rostedteaa1fe22011-09-14 17:20:39 -04001570 if (!$found);
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001571 doprint "$grub_number\n";
Steven Rostedt2545eb62010-11-02 15:01:32 -04001572}
1573
Steven Rostedt2545eb62010-11-02 15:01:32 -04001574sub wait_for_input
1575{
1576 my ($fp, $time) = @_;
1577 my $rin;
1578 my $ready;
1579 my $line;
1580 my $ch;
1581
1582 if (!defined($time)) {
1583 $time = $timeout;
1584 }
1585
1586 $rin = '';
1587 vec($rin, fileno($fp), 1) = 1;
1588 $ready = select($rin, undef, undef, $time);
1589
1590 $line = "";
1591
1592 # try to read one char at a time
1593 while (sysread $fp, $ch, 1) {
1594 $line .= $ch;
1595 last if ($ch eq "\n");
1596 }
1597
1598 if (!length($line)) {
1599 return undef;
1600 }
1601
1602 return $line;
1603}
1604
Steven Rostedt75c3fda72010-11-02 14:57:21 -04001605sub reboot_to {
Steven Rostedtbc7c5802011-12-22 16:29:10 -05001606 if (defined($switch_to_test)) {
1607 run_command $switch_to_test;
1608 }
1609
Steven Rostedta75fece2010-11-02 14:58:27 -04001610 if ($reboot_type eq "grub") {
Steven Rostedtc54367f2011-10-20 09:56:41 -04001611 run_ssh "'(echo \"savedefault --default=$grub_number --once\" | grub --batch)'";
Steven Rostedta15ba912012-11-13 14:30:37 -05001612 } elsif ($reboot_type eq "grub2") {
1613 run_ssh "$grub_reboot $grub_number";
Steven Rostedt77869542012-12-11 17:37:41 -05001614 } elsif ($reboot_type eq "syslinux") {
1615 run_ssh "$syslinux --once \\\"$syslinux_label\\\" $syslinux_path";
Steven Rostedt96f6a0d2011-12-23 00:24:51 -05001616 } elsif (defined $reboot_script) {
1617 run_command "$reboot_script";
Steven Rostedta75fece2010-11-02 14:58:27 -04001618 }
Steven Rostedt96f6a0d2011-12-23 00:24:51 -05001619 reboot;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001620}
1621
Steven Rostedta57419b2010-11-02 15:13:54 -04001622sub get_sha1 {
1623 my ($commit) = @_;
1624
1625 doprint "git rev-list --max-count=1 $commit ... ";
1626 my $sha1 = `git rev-list --max-count=1 $commit`;
1627 my $ret = $?;
1628
1629 logit $sha1;
1630
1631 if ($ret) {
1632 doprint "FAILED\n";
1633 dodie "Failed to get git $commit";
1634 }
1635
1636 print "SUCCESS\n";
1637
1638 chomp $sha1;
1639
1640 return $sha1;
1641}
1642
Steven Rostedt5a391fb2010-11-02 14:57:43 -04001643sub monitor {
Steven Rostedt2545eb62010-11-02 15:01:32 -04001644 my $booted = 0;
1645 my $bug = 0;
Steven Rostedt6ca996c2012-03-21 08:18:35 -04001646 my $bug_ignored = 0;
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001647 my $skip_call_trace = 0;
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001648 my $loops;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001649
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001650 wait_for_monitor 5;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001651
1652 my $line;
1653 my $full_line = "";
1654
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001655 open(DMESG, "> $dmesg") or
1656 die "unable to write to $dmesg";
Steven Rostedt2545eb62010-11-02 15:01:32 -04001657
Steven Rostedt75c3fda72010-11-02 14:57:21 -04001658 reboot_to;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001659
Steven Rostedt1c8a6172010-11-09 12:55:40 -05001660 my $success_start;
1661 my $failure_start;
Steven Rostedt2d01b262011-03-08 09:47:54 -05001662 my $monitor_start = time;
1663 my $done = 0;
Steven Rostedtf1a5b962011-06-13 10:30:00 -04001664 my $version_found = 0;
Steven Rostedt1c8a6172010-11-09 12:55:40 -05001665
Steven Rostedt2d01b262011-03-08 09:47:54 -05001666 while (!$done) {
Steven Rostedt2545eb62010-11-02 15:01:32 -04001667
Steven Rostedtecaf8e52011-06-13 10:48:10 -04001668 if ($bug && defined($stop_after_failure) &&
1669 $stop_after_failure >= 0) {
1670 my $time = $stop_after_failure - (time - $failure_start);
1671 $line = wait_for_input($monitor_fp, $time);
1672 if (!defined($line)) {
1673 doprint "bug timed out after $booted_timeout seconds\n";
1674 doprint "Test forced to stop after $stop_after_failure seconds after failure\n";
1675 last;
1676 }
1677 } elsif ($booted) {
Steven Rostedta75fece2010-11-02 14:58:27 -04001678 $line = wait_for_input($monitor_fp, $booted_timeout);
Steven Rostedtcd4f1d52011-06-13 10:26:27 -04001679 if (!defined($line)) {
1680 my $s = $booted_timeout == 1 ? "" : "s";
1681 doprint "Successful boot found: break after $booted_timeout second$s\n";
1682 last;
1683 }
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001684 } else {
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001685 $line = wait_for_input($monitor_fp);
Steven Rostedtcd4f1d52011-06-13 10:26:27 -04001686 if (!defined($line)) {
1687 my $s = $timeout == 1 ? "" : "s";
1688 doprint "Timed out after $timeout second$s\n";
1689 last;
1690 }
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001691 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04001692
Steven Rostedt2545eb62010-11-02 15:01:32 -04001693 doprint $line;
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001694 print DMESG $line;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001695
1696 # we are not guaranteed to get a full line
1697 $full_line .= $line;
1698
Steven Rostedta75fece2010-11-02 14:58:27 -04001699 if ($full_line =~ /$success_line/) {
Steven Rostedt2545eb62010-11-02 15:01:32 -04001700 $booted = 1;
Steven Rostedt1c8a6172010-11-09 12:55:40 -05001701 $success_start = time;
1702 }
1703
1704 if ($booted && defined($stop_after_success) &&
1705 $stop_after_success >= 0) {
1706 my $now = time;
1707 if ($now - $success_start >= $stop_after_success) {
1708 doprint "Test forced to stop after $stop_after_success seconds after success\n";
1709 last;
1710 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04001711 }
1712
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001713 if ($full_line =~ /\[ backtrace testing \]/) {
1714 $skip_call_trace = 1;
1715 }
1716
Steven Rostedt2545eb62010-11-02 15:01:32 -04001717 if ($full_line =~ /call trace:/i) {
Steven Rostedt6ca996c2012-03-21 08:18:35 -04001718 if (!$bug && !$skip_call_trace) {
1719 if ($ignore_errors) {
1720 $bug_ignored = 1;
1721 } else {
1722 $bug = 1;
1723 $failure_start = time;
1724 }
Steven Rostedt1c8a6172010-11-09 12:55:40 -05001725 }
1726 }
1727
1728 if ($bug && defined($stop_after_failure) &&
1729 $stop_after_failure >= 0) {
1730 my $now = time;
1731 if ($now - $failure_start >= $stop_after_failure) {
1732 doprint "Test forced to stop after $stop_after_failure seconds after failure\n";
1733 last;
1734 }
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001735 }
1736
1737 if ($full_line =~ /\[ end of backtrace testing \]/) {
1738 $skip_call_trace = 0;
1739 }
1740
1741 if ($full_line =~ /Kernel panic -/) {
Steven Rostedt10abf112011-03-07 13:21:00 -05001742 $failure_start = time;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001743 $bug = 1;
1744 }
1745
Steven Rostedtf1a5b962011-06-13 10:30:00 -04001746 # Detect triple faults by testing the banner
1747 if ($full_line =~ /\bLinux version (\S+).*\n/) {
1748 if ($1 eq $version) {
1749 $version_found = 1;
1750 } elsif ($version_found && $detect_triplefault) {
1751 # We already booted into the kernel we are testing,
1752 # but now we booted into another kernel?
1753 # Consider this a triple fault.
1754 doprint "Aleady booted in Linux kernel $version, but now\n";
1755 doprint "we booted into Linux kernel $1.\n";
1756 doprint "Assuming that this is a triple fault.\n";
1757 doprint "To disable this: set DETECT_TRIPLE_FAULT to 0\n";
1758 last;
1759 }
1760 }
1761
Steven Rostedt2545eb62010-11-02 15:01:32 -04001762 if ($line =~ /\n/) {
1763 $full_line = "";
1764 }
Steven Rostedt2d01b262011-03-08 09:47:54 -05001765
1766 if ($stop_test_after > 0 && !$booted && !$bug) {
1767 if (time - $monitor_start > $stop_test_after) {
Steven Rostedt4d62bf52011-05-20 09:14:35 -04001768 doprint "STOP_TEST_AFTER ($stop_test_after seconds) timed out\n";
Steven Rostedt2d01b262011-03-08 09:47:54 -05001769 $done = 1;
1770 }
1771 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04001772 }
1773
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001774 close(DMESG);
Steven Rostedt2545eb62010-11-02 15:01:32 -04001775
Steven Rostedt2545eb62010-11-02 15:01:32 -04001776 if ($bug) {
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001777 return 0 if ($in_bisect);
Steven Rostedt576f6272010-11-02 14:58:38 -04001778 fail "failed - got a bug report" and return 0;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001779 }
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001780
Steven Rostedta75fece2010-11-02 14:58:27 -04001781 if (!$booted) {
1782 return 0 if ($in_bisect);
Steven Rostedt576f6272010-11-02 14:58:38 -04001783 fail "failed - never got a boot prompt." and return 0;
Steven Rostedta75fece2010-11-02 14:58:27 -04001784 }
1785
Steven Rostedt6ca996c2012-03-21 08:18:35 -04001786 if ($bug_ignored) {
1787 doprint "WARNING: Call Trace detected but ignored due to IGNORE_ERRORS=1\n";
1788 }
1789
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001790 return 1;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001791}
1792
Steven Rostedt2b29b2f2011-12-22 11:25:46 -05001793sub eval_kernel_version {
1794 my ($option) = @_;
1795
1796 $option =~ s/\$KERNEL_VERSION/$version/g;
1797
1798 return $option;
1799}
1800
Steven Rostedtdb05cfe2011-06-13 11:09:22 -04001801sub do_post_install {
1802
1803 return if (!defined($post_install));
1804
Steven Rostedt2b29b2f2011-12-22 11:25:46 -05001805 my $cp_post_install = eval_kernel_version $post_install;
Steven Rostedtdb05cfe2011-06-13 11:09:22 -04001806 run_command "$cp_post_install" or
1807 dodie "Failed to run post install";
1808}
1809
Steven Rostedt2545eb62010-11-02 15:01:32 -04001810sub install {
1811
Steven Rostedte0a87422011-09-30 17:50:48 -04001812 return if ($no_install);
1813
Steven Rostedte5c2ec12012-07-19 15:22:05 -04001814 if (defined($pre_install)) {
1815 my $cp_pre_install = eval_kernel_version $pre_install;
1816 run_command "$cp_pre_install" or
1817 dodie "Failed to run pre install";
1818 }
1819
Steven Rostedt2b29b2f2011-12-22 11:25:46 -05001820 my $cp_target = eval_kernel_version $target_image;
1821
Steven Rostedt02ad2612012-03-21 08:21:24 -04001822 run_scp_install "$outputdir/$build_target", "$cp_target" or
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001823 dodie "failed to copy image";
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001824
1825 my $install_mods = 0;
1826
1827 # should we process modules?
1828 $install_mods = 0;
Steven Rostedt51ad1dd2010-11-08 16:43:21 -05001829 open(IN, "$output_config") or dodie("Can't read config file");
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001830 while (<IN>) {
1831 if (/CONFIG_MODULES(=y)?/) {
Steven Rostedt8bc5e4e2012-10-26 00:10:32 -04001832 if (defined($1)) {
1833 $install_mods = 1;
1834 last;
1835 }
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001836 }
1837 }
1838 close(IN);
1839
1840 if (!$install_mods) {
Steven Rostedtdb05cfe2011-06-13 11:09:22 -04001841 do_post_install;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001842 doprint "No modules needed\n";
1843 return;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001844 }
1845
Steven Rostedt627977d2012-03-21 08:16:15 -04001846 run_command "$make INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH=$tmpdir modules_install" or
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001847 dodie "Failed to install modules";
Steven Rostedt2545eb62010-11-02 15:01:32 -04001848
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001849 my $modlib = "/lib/modules/$version";
Steven Rostedta57419b2010-11-02 15:13:54 -04001850 my $modtar = "ktest-mods.tar.bz2";
Steven Rostedt2545eb62010-11-02 15:01:32 -04001851
Steven Rostedte48c5292010-11-02 14:35:37 -04001852 run_ssh "rm -rf $modlib" or
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001853 dodie "failed to remove old mods: $modlib";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001854
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001855 # would be nice if scp -r did not follow symbolic links
Steven Rostedta75fece2010-11-02 14:58:27 -04001856 run_command "cd $tmpdir && tar -cjf $modtar lib/modules/$version" or
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001857 dodie "making tarball";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001858
Steven Rostedt02ad2612012-03-21 08:21:24 -04001859 run_scp_mod "$tmpdir/$modtar", "/tmp" or
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001860 dodie "failed to copy modules";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001861
Steven Rostedta75fece2010-11-02 14:58:27 -04001862 unlink "$tmpdir/$modtar";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001863
Steven Rostedte7b13442011-06-14 20:44:36 -04001864 run_ssh "'(cd / && tar xjf /tmp/$modtar)'" or
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001865 dodie "failed to tar modules";
Steven Rostedt2545eb62010-11-02 15:01:32 -04001866
Steven Rostedte48c5292010-11-02 14:35:37 -04001867 run_ssh "rm -f /tmp/$modtar";
Steven Rostedt8b37ca82010-11-02 14:58:33 -04001868
Steven Rostedtdb05cfe2011-06-13 11:09:22 -04001869 do_post_install;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001870}
1871
Steven Rostedtddf607e2011-06-14 20:49:13 -04001872sub get_version {
1873 # get the release name
Steven Rostedt683a3e62012-05-18 13:34:35 -04001874 return if ($have_version);
Steven Rostedtddf607e2011-06-14 20:49:13 -04001875 doprint "$make kernelrelease ... ";
1876 $version = `$make kernelrelease | tail -1`;
1877 chomp($version);
1878 doprint "$version\n";
Steven Rostedt683a3e62012-05-18 13:34:35 -04001879 $have_version = 1;
Steven Rostedtddf607e2011-06-14 20:49:13 -04001880}
1881
1882sub start_monitor_and_boot {
Steven Rostedt9f7424c2011-10-22 08:58:19 -04001883 # Make sure the stable kernel has finished booting
1884 start_monitor;
1885 wait_for_monitor 5;
1886 end_monitor;
1887
Steven Rostedtddf607e2011-06-14 20:49:13 -04001888 get_grub_index;
1889 get_version;
1890 install;
1891
1892 start_monitor;
1893 return monitor;
1894}
1895
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04001896sub check_buildlog {
1897 my ($patch) = @_;
1898
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04001899 my @files = `git show $patch | diffstat -l`;
1900
1901 open(IN, "git show $patch |") or
1902 dodie "failed to show $patch";
1903 while (<IN>) {
1904 if (m,^--- a/(.*),) {
1905 chomp $1;
1906 $files[$#files] = $1;
1907 }
1908 }
1909 close(IN);
1910
1911 open(IN, $buildlog) or dodie "Can't open $buildlog";
1912 while (<IN>) {
1913 if (/^\s*(.*?):.*(warning|error)/) {
1914 my $err = $1;
1915 foreach my $file (@files) {
Steven Rostedta75fece2010-11-02 14:58:27 -04001916 my $fullpath = "$builddir/$file";
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04001917 if ($file eq $err || $fullpath eq $err) {
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001918 fail "$file built with warnings" and return 0;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04001919 }
1920 }
1921 }
1922 }
1923 close(IN);
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001924
1925 return 1;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04001926}
1927
Steven Rostedtfcb3f162011-06-13 10:40:58 -04001928sub apply_min_config {
1929 my $outconfig = "$output_config.new";
Steven Rostedt612b9e92011-03-07 13:27:43 -05001930
Steven Rostedtfcb3f162011-06-13 10:40:58 -04001931 # Read the config file and remove anything that
1932 # is in the force_config hash (from minconfig and others)
1933 # then add the force config back.
1934
1935 doprint "Applying minimum configurations into $output_config.new\n";
1936
1937 open (OUT, ">$outconfig") or
1938 dodie "Can't create $outconfig";
1939
1940 if (-f $output_config) {
1941 open (IN, $output_config) or
1942 dodie "Failed to open $output_config";
1943 while (<IN>) {
1944 if (/^(# )?(CONFIG_[^\s=]*)/) {
1945 next if (defined($force_config{$2}));
1946 }
1947 print OUT;
1948 }
1949 close IN;
1950 }
1951 foreach my $config (keys %force_config) {
1952 print OUT "$force_config{$config}\n";
1953 }
1954 close OUT;
1955
1956 run_command "mv $outconfig $output_config";
1957}
1958
1959sub make_oldconfig {
1960
Steven Rostedt4c4ab122011-07-15 21:16:17 -04001961 my @force_list = keys %force_config;
1962
1963 if ($#force_list >= 0) {
1964 apply_min_config;
1965 }
Steven Rostedtfcb3f162011-06-13 10:40:58 -04001966
Adam Leefb16d892012-09-01 01:05:17 +08001967 if (!run_command "$make olddefconfig") {
1968 # Perhaps olddefconfig doesn't exist in this version of the kernel
Steven Rostedt612b9e92011-03-07 13:27:43 -05001969 # try a yes '' | oldconfig
Adam Leefb16d892012-09-01 01:05:17 +08001970 doprint "olddefconfig failed, trying yes '' | make oldconfig\n";
Steven Rostedtfcb3f162011-06-13 10:40:58 -04001971 run_command "yes '' | $make oldconfig" or
Steven Rostedt612b9e92011-03-07 13:27:43 -05001972 dodie "failed make config oldconfig";
1973 }
1974}
1975
Steven Rostedtfcb3f162011-06-13 10:40:58 -04001976# read a config file and use this to force new configs.
1977sub load_force_config {
1978 my ($config) = @_;
1979
Steven Rostedtcf79fab2012-07-19 15:29:43 -04001980 doprint "Loading force configs from $config\n";
Steven Rostedtfcb3f162011-06-13 10:40:58 -04001981 open(IN, $config) or
1982 dodie "failed to read $config";
1983 while (<IN>) {
1984 chomp;
1985 if (/^(CONFIG[^\s=]*)(\s*=.*)/) {
1986 $force_config{$1} = $_;
1987 } elsif (/^# (CONFIG_\S*) is not set/) {
1988 $force_config{$1} = $_;
1989 }
1990 }
1991 close IN;
1992}
1993
Steven Rostedt2545eb62010-11-02 15:01:32 -04001994sub build {
1995 my ($type) = @_;
1996
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001997 unlink $buildlog;
1998
Steven Rostedt4ab1cce2011-09-30 18:12:20 -04001999 # Failed builds should not reboot the target
2000 my $save_no_reboot = $no_reboot;
2001 $no_reboot = 1;
2002
Steven Rostedt683a3e62012-05-18 13:34:35 -04002003 # Calculate a new version from here.
2004 $have_version = 0;
2005
Steven Rostedt0bd6c1a2011-06-14 20:39:31 -04002006 if (defined($pre_build)) {
2007 my $ret = run_command $pre_build;
2008 if (!$ret && defined($pre_build_die) &&
2009 $pre_build_die) {
2010 dodie "failed to pre_build\n";
2011 }
2012 }
2013
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002014 if ($type =~ /^useconfig:(.*)/) {
Steven Rostedt51ad1dd2010-11-08 16:43:21 -05002015 run_command "cp $1 $output_config" or
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002016 dodie "could not copy $1 to .config";
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002017
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002018 $type = "oldconfig";
2019 }
2020
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002021 # old config can ask questions
2022 if ($type eq "oldconfig") {
Adam Leefb16d892012-09-01 01:05:17 +08002023 $type = "olddefconfig";
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002024
2025 # allow for empty configs
Steven Rostedt51ad1dd2010-11-08 16:43:21 -05002026 run_command "touch $output_config";
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002027
Andrew Jones13488232011-08-12 15:32:04 +02002028 if (!$noclean) {
2029 run_command "mv $output_config $outputdir/config_temp" or
2030 dodie "moving .config";
Steven Rostedt2545eb62010-11-02 15:01:32 -04002031
Andrew Jones13488232011-08-12 15:32:04 +02002032 run_command "$make mrproper" or dodie "make mrproper";
2033
2034 run_command "mv $outputdir/config_temp $output_config" or
2035 dodie "moving config_temp";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002036 }
2037
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002038 } elsif (!$noclean) {
Steven Rostedt51ad1dd2010-11-08 16:43:21 -05002039 unlink "$output_config";
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002040 run_command "$make mrproper" or
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002041 dodie "make mrproper";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002042 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04002043
2044 # add something to distinguish this build
Steven Rostedta75fece2010-11-02 14:58:27 -04002045 open(OUT, "> $outputdir/localversion") or dodie("Can't make localversion file");
2046 print OUT "$localversion\n";
Steven Rostedt2545eb62010-11-02 15:01:32 -04002047 close(OUT);
2048
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002049 if (defined($minconfig)) {
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002050 load_force_config($minconfig);
Steven Rostedt2545eb62010-11-02 15:01:32 -04002051 }
2052
Adam Leefb16d892012-09-01 01:05:17 +08002053 if ($type ne "olddefconfig") {
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002054 run_command "$make $type" or
Steven Rostedt612b9e92011-03-07 13:27:43 -05002055 dodie "failed make config";
2056 }
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002057 # Run old config regardless, to enforce min configurations
2058 make_oldconfig;
Steven Rostedt2545eb62010-11-02 15:01:32 -04002059
Steven Rostedta75fece2010-11-02 14:58:27 -04002060 $redirect = "$buildlog";
Steven Rostedt0bd6c1a2011-06-14 20:39:31 -04002061 my $build_ret = run_command "$make $build_options";
2062 undef $redirect;
2063
2064 if (defined($post_build)) {
Steven Rostedt683a3e62012-05-18 13:34:35 -04002065 # Because a post build may change the kernel version
2066 # do it now.
2067 get_version;
Steven Rostedt0bd6c1a2011-06-14 20:39:31 -04002068 my $ret = run_command $post_build;
2069 if (!$ret && defined($post_build_die) &&
2070 $post_build_die) {
2071 dodie "failed to post_build\n";
2072 }
2073 }
2074
2075 if (!$build_ret) {
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002076 # bisect may need this to pass
Steven Rostedt4ab1cce2011-09-30 18:12:20 -04002077 if ($in_bisect) {
2078 $no_reboot = $save_no_reboot;
2079 return 0;
2080 }
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002081 fail "failed build" and return 0;
Steven Rostedt2545eb62010-11-02 15:01:32 -04002082 }
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002083
Steven Rostedt4ab1cce2011-09-30 18:12:20 -04002084 $no_reboot = $save_no_reboot;
2085
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002086 return 1;
Steven Rostedt2545eb62010-11-02 15:01:32 -04002087}
2088
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002089sub halt {
Steven Rostedte48c5292010-11-02 14:35:37 -04002090 if (!run_ssh "halt" or defined($power_off)) {
Steven Rostedt576f6272010-11-02 14:58:38 -04002091 if (defined($poweroff_after_halt)) {
2092 sleep $poweroff_after_halt;
2093 run_command "$power_off";
2094 }
2095 } else {
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002096 # nope? the zap it!
Steven Rostedta75fece2010-11-02 14:58:27 -04002097 run_command "$power_off";
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002098 }
2099}
2100
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002101sub success {
2102 my ($i) = @_;
2103
Steven Rostedt921ed4c2012-07-19 15:18:27 -04002104 if (defined($post_test)) {
2105 run_command $post_test;
2106 }
2107
Steven Rostedte48c5292010-11-02 14:35:37 -04002108 $successes++;
2109
Steven Rostedt9064af52011-06-13 10:38:48 -04002110 my $name = "";
2111
2112 if (defined($test_name)) {
2113 $name = " ($test_name)";
2114 }
2115
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002116 doprint "\n\n*******************************************\n";
2117 doprint "*******************************************\n";
Steven Rostedt9064af52011-06-13 10:38:48 -04002118 doprint "KTEST RESULT: TEST $i$name SUCCESS!!!! **\n";
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002119 doprint "*******************************************\n";
2120 doprint "*******************************************\n";
2121
Rabin Vincentde5b6e32011-11-18 17:05:31 +05302122 if (defined($store_successes)) {
2123 save_logs "success", $store_successes;
2124 }
2125
Steven Rostedt576f6272010-11-02 14:58:38 -04002126 if ($i != $opt{"NUM_TESTS"} && !do_not_reboot) {
Steven Rostedta75fece2010-11-02 14:58:27 -04002127 doprint "Reboot and wait $sleep_time seconds\n";
Steven Rostedtbc7c5802011-12-22 16:29:10 -05002128 reboot_to_good $sleep_time;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002129 }
2130}
2131
Steven Rostedtc960bb92011-03-08 09:22:39 -05002132sub answer_bisect {
2133 for (;;) {
2134 doprint "Pass or fail? [p/f]";
2135 my $ans = <STDIN>;
2136 chomp $ans;
2137 if ($ans eq "p" || $ans eq "P") {
2138 return 1;
2139 } elsif ($ans eq "f" || $ans eq "F") {
2140 return 0;
2141 } else {
2142 print "Please answer 'P' or 'F'\n";
2143 }
2144 }
2145}
2146
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002147sub child_run_test {
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002148 my $failed = 0;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002149
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002150 # child should have no power
Steven Rostedta75fece2010-11-02 14:58:27 -04002151 $reboot_on_error = 0;
2152 $poweroff_on_error = 0;
2153 $die_on_failure = 1;
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002154
Rabin Vincenta9dd5d62011-11-18 17:05:29 +05302155 $redirect = "$testlog";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002156 run_command $run_test or $failed = 1;
Rabin Vincenta9dd5d62011-11-18 17:05:29 +05302157 undef $redirect;
2158
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002159 exit $failed;
2160}
2161
2162my $child_done;
2163
2164sub child_finished {
2165 $child_done = 1;
2166}
2167
2168sub do_run_test {
2169 my $child_pid;
2170 my $child_exit;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002171 my $line;
2172 my $full_line;
2173 my $bug = 0;
Steven Rostedt9b1d3672012-07-30 14:30:53 -04002174 my $bug_ignored = 0;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002175
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002176 wait_for_monitor 1;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002177
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002178 doprint "run test $run_test\n";
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002179
2180 $child_done = 0;
2181
2182 $SIG{CHLD} = qw(child_finished);
2183
2184 $child_pid = fork;
2185
2186 child_run_test if (!$child_pid);
2187
2188 $full_line = "";
2189
2190 do {
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002191 $line = wait_for_input($monitor_fp, 1);
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002192 if (defined($line)) {
2193
2194 # we are not guaranteed to get a full line
2195 $full_line .= $line;
Steven Rostedt8ea0e062011-03-08 09:44:35 -05002196 doprint $line;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002197
2198 if ($full_line =~ /call trace:/i) {
Steven Rostedt9b1d3672012-07-30 14:30:53 -04002199 if ($ignore_errors) {
2200 $bug_ignored = 1;
2201 } else {
2202 $bug = 1;
2203 }
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002204 }
2205
2206 if ($full_line =~ /Kernel panic -/) {
2207 $bug = 1;
2208 }
2209
2210 if ($line =~ /\n/) {
2211 $full_line = "";
2212 }
2213 }
2214 } while (!$child_done && !$bug);
2215
Steven Rostedt9b1d3672012-07-30 14:30:53 -04002216 if (!$bug && $bug_ignored) {
2217 doprint "WARNING: Call Trace detected but ignored due to IGNORE_ERRORS=1\n";
2218 }
2219
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002220 if ($bug) {
Steven Rostedt8ea0e062011-03-08 09:44:35 -05002221 my $failure_start = time;
2222 my $now;
2223 do {
2224 $line = wait_for_input($monitor_fp, 1);
2225 if (defined($line)) {
2226 doprint $line;
2227 }
2228 $now = time;
2229 if ($now - $failure_start >= $stop_after_failure) {
2230 last;
2231 }
2232 } while (defined($line));
2233
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002234 doprint "Detected kernel crash!\n";
2235 # kill the child with extreme prejudice
2236 kill 9, $child_pid;
2237 }
2238
2239 waitpid $child_pid, 0;
2240 $child_exit = $?;
2241
Steven Rostedtc5dacb82011-12-22 12:43:57 -05002242 if (!$bug && $in_bisect) {
2243 if (defined($bisect_ret_good)) {
2244 if ($child_exit == $bisect_ret_good) {
2245 return 1;
2246 }
2247 }
2248 if (defined($bisect_ret_skip)) {
2249 if ($child_exit == $bisect_ret_skip) {
2250 return -1;
2251 }
2252 }
2253 if (defined($bisect_ret_abort)) {
2254 if ($child_exit == $bisect_ret_abort) {
2255 fail "test abort" and return -2;
2256 }
2257 }
2258 if (defined($bisect_ret_bad)) {
2259 if ($child_exit == $bisect_ret_skip) {
2260 return 0;
2261 }
2262 }
2263 if (defined($bisect_ret_default)) {
2264 if ($bisect_ret_default eq "good") {
2265 return 1;
2266 } elsif ($bisect_ret_default eq "bad") {
2267 return 0;
2268 } elsif ($bisect_ret_default eq "skip") {
2269 return -1;
2270 } elsif ($bisect_ret_default eq "abort") {
2271 return -2;
2272 } else {
2273 fail "unknown default action: $bisect_ret_default"
2274 and return -2;
2275 }
2276 }
2277 }
2278
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002279 if ($bug || $child_exit) {
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002280 return 0 if $in_bisect;
2281 fail "test failed" and return 0;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002282 }
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002283 return 1;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002284}
2285
Steven Rostedta75fece2010-11-02 14:58:27 -04002286sub run_git_bisect {
2287 my ($command) = @_;
2288
2289 doprint "$command ... ";
2290
2291 my $output = `$command 2>&1`;
2292 my $ret = $?;
2293
2294 logit $output;
2295
2296 if ($ret) {
2297 doprint "FAILED\n";
2298 dodie "Failed to git bisect";
2299 }
2300
2301 doprint "SUCCESS\n";
2302 if ($output =~ m/^(Bisecting: .*\(roughly \d+ steps?\))\s+\[([[:xdigit:]]+)\]/) {
2303 doprint "$1 [$2]\n";
2304 } elsif ($output =~ m/^([[:xdigit:]]+) is the first bad commit/) {
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002305 $bisect_bad_commit = $1;
Steven Rostedta75fece2010-11-02 14:58:27 -04002306 doprint "Found bad commit... $1\n";
2307 return 0;
2308 } else {
2309 # we already logged it, just print it now.
2310 print $output;
2311 }
2312
2313 return 1;
2314}
2315
Steven Rostedtc23dca72011-03-08 09:26:31 -05002316sub bisect_reboot {
2317 doprint "Reboot and sleep $bisect_sleep_time seconds\n";
Steven Rostedtbc7c5802011-12-22 16:29:10 -05002318 reboot_to_good $bisect_sleep_time;
Steven Rostedtc23dca72011-03-08 09:26:31 -05002319}
2320
2321# returns 1 on success, 0 on failure, -1 on skip
Steven Rostedt0a05c762010-11-08 11:14:10 -05002322sub run_bisect_test {
2323 my ($type, $buildtype) = @_;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002324
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002325 my $failed = 0;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002326 my $result;
2327 my $output;
2328 my $ret;
2329
Steven Rostedt0a05c762010-11-08 11:14:10 -05002330 $in_bisect = 1;
2331
2332 build $buildtype or $failed = 1;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002333
2334 if ($type ne "build") {
Steven Rostedtc23dca72011-03-08 09:26:31 -05002335 if ($failed && $bisect_skip) {
2336 $in_bisect = 0;
2337 return -1;
2338 }
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002339 dodie "Failed on build" if $failed;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002340
2341 # Now boot the box
Steven Rostedtddf607e2011-06-14 20:49:13 -04002342 start_monitor_and_boot or $failed = 1;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002343
2344 if ($type ne "boot") {
Steven Rostedtc23dca72011-03-08 09:26:31 -05002345 if ($failed && $bisect_skip) {
2346 end_monitor;
2347 bisect_reboot;
2348 $in_bisect = 0;
2349 return -1;
2350 }
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002351 dodie "Failed on boot" if $failed;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002352
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002353 do_run_test or $failed = 1;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002354 }
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002355 end_monitor;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002356 }
2357
2358 if ($failed) {
Steven Rostedt0a05c762010-11-08 11:14:10 -05002359 $result = 0;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002360 } else {
Steven Rostedt0a05c762010-11-08 11:14:10 -05002361 $result = 1;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002362 }
Steven Rostedt4025bc62011-05-20 09:16:29 -04002363
2364 # reboot the box to a kernel we can ssh to
2365 if ($type ne "build") {
2366 bisect_reboot;
2367 }
Steven Rostedt0a05c762010-11-08 11:14:10 -05002368 $in_bisect = 0;
2369
2370 return $result;
2371}
2372
2373sub run_bisect {
2374 my ($type) = @_;
2375 my $buildtype = "oldconfig";
2376
2377 # We should have a minconfig to use?
2378 if (defined($minconfig)) {
2379 $buildtype = "useconfig:$minconfig";
2380 }
2381
2382 my $ret = run_bisect_test $type, $buildtype;
2383
Steven Rostedtc960bb92011-03-08 09:22:39 -05002384 if ($bisect_manual) {
2385 $ret = answer_bisect;
2386 }
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002387
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04002388 # Are we looking for where it worked, not failed?
Russ Dill5158ba3e2012-04-23 19:43:00 -07002389 if ($reverse_bisect && $ret >= 0) {
Steven Rostedt0a05c762010-11-08 11:14:10 -05002390 $ret = !$ret;
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04002391 }
2392
Steven Rostedtc23dca72011-03-08 09:26:31 -05002393 if ($ret > 0) {
Steven Rostedt0a05c762010-11-08 11:14:10 -05002394 return "good";
Steven Rostedtc23dca72011-03-08 09:26:31 -05002395 } elsif ($ret == 0) {
Steven Rostedt0a05c762010-11-08 11:14:10 -05002396 return "bad";
Steven Rostedtc23dca72011-03-08 09:26:31 -05002397 } elsif ($bisect_skip) {
2398 doprint "HIT A BAD COMMIT ... SKIPPING\n";
2399 return "skip";
Steven Rostedt0a05c762010-11-08 11:14:10 -05002400 }
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002401}
2402
Steven Rostedtdad98752011-11-22 20:48:57 -05002403sub update_bisect_replay {
2404 my $tmp_log = "$tmpdir/ktest_bisect_log";
2405 run_command "git bisect log > $tmp_log" or
2406 die "can't create bisect log";
2407 return $tmp_log;
2408}
2409
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002410sub bisect {
2411 my ($i) = @_;
2412
2413 my $result;
2414
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002415 die "BISECT_GOOD[$i] not defined\n" if (!defined($bisect_good));
2416 die "BISECT_BAD[$i] not defined\n" if (!defined($bisect_bad));
2417 die "BISECT_TYPE[$i] not defined\n" if (!defined($bisect_type));
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002418
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002419 my $good = $bisect_good;
2420 my $bad = $bisect_bad;
2421 my $type = $bisect_type;
2422 my $start = $bisect_start;
2423 my $replay = $bisect_replay;
2424 my $start_files = $bisect_files;
Steven Rostedt3410f6f2011-03-08 09:38:12 -05002425
2426 if (defined($start_files)) {
2427 $start_files = " -- " . $start_files;
2428 } else {
2429 $start_files = "";
2430 }
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002431
Steven Rostedta57419b2010-11-02 15:13:54 -04002432 # convert to true sha1's
2433 $good = get_sha1($good);
2434 $bad = get_sha1($bad);
2435
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002436 if (defined($bisect_reverse) && $bisect_reverse == 1) {
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04002437 doprint "Performing a reverse bisect (bad is good, good is bad!)\n";
2438 $reverse_bisect = 1;
2439 } else {
2440 $reverse_bisect = 0;
2441 }
2442
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002443 # Can't have a test without having a test to run
2444 if ($type eq "test" && !defined($run_test)) {
2445 $type = "boot";
2446 }
2447
Steven Rostedtdad98752011-11-22 20:48:57 -05002448 # Check if a bisect was running
2449 my $bisect_start_file = "$builddir/.git/BISECT_START";
2450
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002451 my $check = $bisect_check;
Steven Rostedtdad98752011-11-22 20:48:57 -05002452 my $do_check = defined($check) && $check ne "0";
2453
2454 if ( -f $bisect_start_file ) {
2455 print "Bisect in progress found\n";
2456 if ($do_check) {
2457 print " If you say yes, then no checks of good or bad will be done\n";
2458 }
2459 if (defined($replay)) {
2460 print "** BISECT_REPLAY is defined in config file **";
2461 print " Ignore config option and perform new git bisect log?\n";
2462 if (read_ync " (yes, no, or cancel) ") {
2463 $replay = update_bisect_replay;
2464 $do_check = 0;
2465 }
2466 } elsif (read_yn "read git log and continue?") {
2467 $replay = update_bisect_replay;
2468 $do_check = 0;
2469 }
2470 }
2471
2472 if ($do_check) {
Steven Rostedta75fece2010-11-02 14:58:27 -04002473
2474 # get current HEAD
Steven Rostedta57419b2010-11-02 15:13:54 -04002475 my $head = get_sha1("HEAD");
Steven Rostedta75fece2010-11-02 14:58:27 -04002476
2477 if ($check ne "good") {
2478 doprint "TESTING BISECT BAD [$bad]\n";
2479 run_command "git checkout $bad" or
2480 die "Failed to checkout $bad";
2481
2482 $result = run_bisect $type;
2483
2484 if ($result ne "bad") {
2485 fail "Tested BISECT_BAD [$bad] and it succeeded" and return 0;
2486 }
2487 }
2488
2489 if ($check ne "bad") {
2490 doprint "TESTING BISECT GOOD [$good]\n";
2491 run_command "git checkout $good" or
2492 die "Failed to checkout $good";
2493
2494 $result = run_bisect $type;
2495
2496 if ($result ne "good") {
2497 fail "Tested BISECT_GOOD [$good] and it failed" and return 0;
2498 }
2499 }
2500
2501 # checkout where we started
2502 run_command "git checkout $head" or
2503 die "Failed to checkout $head";
2504 }
2505
Steven Rostedt3410f6f2011-03-08 09:38:12 -05002506 run_command "git bisect start$start_files" or
Steven Rostedta75fece2010-11-02 14:58:27 -04002507 dodie "could not start bisect";
2508
2509 run_command "git bisect good $good" or
2510 dodie "could not set bisect good to $good";
2511
2512 run_git_bisect "git bisect bad $bad" or
2513 dodie "could not set bisect bad to $bad";
2514
2515 if (defined($replay)) {
2516 run_command "git bisect replay $replay" or
2517 dodie "failed to run replay";
2518 }
2519
2520 if (defined($start)) {
2521 run_command "git checkout $start" or
2522 dodie "failed to checkout $start";
2523 }
2524
2525 my $test;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002526 do {
2527 $result = run_bisect $type;
Steven Rostedta75fece2010-11-02 14:58:27 -04002528 $test = run_git_bisect "git bisect $result";
2529 } while ($test);
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002530
2531 run_command "git bisect log" or
2532 dodie "could not capture git bisect log";
2533
2534 run_command "git bisect reset" or
2535 dodie "could not reset git bisect";
2536
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002537 doprint "Bad commit was [$bisect_bad_commit]\n";
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002538
Steven Rostedt0a05c762010-11-08 11:14:10 -05002539 success $i;
2540}
2541
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002542# config_ignore holds the configs that were set (or unset) for
2543# a good config and we will ignore these configs for the rest
2544# of a config bisect. These configs stay as they were.
Steven Rostedt0a05c762010-11-08 11:14:10 -05002545my %config_ignore;
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002546
2547# config_set holds what all configs were set as.
Steven Rostedt0a05c762010-11-08 11:14:10 -05002548my %config_set;
2549
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002550# config_off holds the set of configs that the bad config had disabled.
2551# We need to record them and set them in the .config when running
Adam Leefb16d892012-09-01 01:05:17 +08002552# olddefconfig, because olddefconfig keeps the defaults.
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002553my %config_off;
2554
2555# config_off_tmp holds a set of configs to turn off for now
2556my @config_off_tmp;
2557
2558# config_list is the set of configs that are being tested
Steven Rostedt0a05c762010-11-08 11:14:10 -05002559my %config_list;
2560my %null_config;
2561
2562my %dependency;
2563
Steven Rostedt4c4ab122011-07-15 21:16:17 -04002564sub assign_configs {
2565 my ($hash, $config) = @_;
Steven Rostedt0a05c762010-11-08 11:14:10 -05002566
2567 open (IN, $config)
2568 or dodie "Failed to read $config";
2569
2570 while (<IN>) {
Steven Rostedt9bf71742011-06-01 23:27:19 -04002571 if (/^((CONFIG\S*)=.*)/) {
Steven Rostedt4c4ab122011-07-15 21:16:17 -04002572 ${$hash}{$2} = $1;
Steven Rostedt0a05c762010-11-08 11:14:10 -05002573 }
2574 }
2575
2576 close(IN);
2577}
2578
Steven Rostedt4c4ab122011-07-15 21:16:17 -04002579sub process_config_ignore {
2580 my ($config) = @_;
2581
2582 assign_configs \%config_ignore, $config;
2583}
2584
Steven Rostedt0a05c762010-11-08 11:14:10 -05002585sub read_current_config {
2586 my ($config_ref) = @_;
2587
2588 %{$config_ref} = ();
2589 undef %{$config_ref};
2590
2591 my @key = keys %{$config_ref};
2592 if ($#key >= 0) {
2593 print "did not delete!\n";
2594 exit;
2595 }
2596 open (IN, "$output_config");
2597
2598 while (<IN>) {
2599 if (/^(CONFIG\S+)=(.*)/) {
2600 ${$config_ref}{$1} = $2;
2601 }
2602 }
2603 close(IN);
2604}
2605
2606sub get_dependencies {
2607 my ($config) = @_;
2608
2609 my $arr = $dependency{$config};
2610 if (!defined($arr)) {
2611 return ();
2612 }
2613
2614 my @deps = @{$arr};
2615
2616 foreach my $dep (@{$arr}) {
2617 print "ADD DEP $dep\n";
2618 @deps = (@deps, get_dependencies $dep);
2619 }
2620
2621 return @deps;
2622}
2623
2624sub create_config {
2625 my @configs = @_;
2626
2627 open(OUT, ">$output_config") or dodie "Can not write to $output_config";
2628
2629 foreach my $config (@configs) {
2630 print OUT "$config_set{$config}\n";
2631 my @deps = get_dependencies $config;
2632 foreach my $dep (@deps) {
2633 print OUT "$config_set{$dep}\n";
2634 }
2635 }
2636
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002637 # turn off configs to keep off
2638 foreach my $config (keys %config_off) {
2639 print OUT "# $config is not set\n";
2640 }
2641
2642 # turn off configs that should be off for now
2643 foreach my $config (@config_off_tmp) {
2644 print OUT "# $config is not set\n";
2645 }
2646
Steven Rostedt0a05c762010-11-08 11:14:10 -05002647 foreach my $config (keys %config_ignore) {
2648 print OUT "$config_ignore{$config}\n";
2649 }
2650 close(OUT);
2651
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002652 make_oldconfig;
Steven Rostedt0a05c762010-11-08 11:14:10 -05002653}
2654
2655sub compare_configs {
2656 my (%a, %b) = @_;
2657
2658 foreach my $item (keys %a) {
2659 if (!defined($b{$item})) {
2660 print "diff $item\n";
2661 return 1;
2662 }
2663 delete $b{$item};
2664 }
2665
2666 my @keys = keys %b;
2667 if ($#keys) {
2668 print "diff2 $keys[0]\n";
2669 }
2670 return -1 if ($#keys >= 0);
2671
2672 return 0;
2673}
2674
2675sub run_config_bisect_test {
2676 my ($type) = @_;
2677
2678 return run_bisect_test $type, "oldconfig";
2679}
2680
2681sub process_passed {
2682 my (%configs) = @_;
2683
2684 doprint "These configs had no failure: (Enabling them for further compiles)\n";
2685 # Passed! All these configs are part of a good compile.
2686 # Add them to the min options.
2687 foreach my $config (keys %configs) {
2688 if (defined($config_list{$config})) {
2689 doprint " removing $config\n";
2690 $config_ignore{$config} = $config_list{$config};
2691 delete $config_list{$config};
2692 }
2693 }
Steven Rostedtf1a27852010-11-11 11:34:38 -05002694 doprint "config copied to $outputdir/config_good\n";
2695 run_command "cp -f $output_config $outputdir/config_good";
Steven Rostedt0a05c762010-11-08 11:14:10 -05002696}
2697
2698sub process_failed {
2699 my ($config) = @_;
2700
2701 doprint "\n\n***************************************\n";
2702 doprint "Found bad config: $config\n";
2703 doprint "***************************************\n\n";
2704}
2705
2706sub run_config_bisect {
2707
2708 my @start_list = keys %config_list;
2709
2710 if ($#start_list < 0) {
2711 doprint "No more configs to test!!!\n";
2712 return -1;
2713 }
2714
2715 doprint "***** RUN TEST ***\n";
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002716 my $type = $config_bisect_type;
Steven Rostedt0a05c762010-11-08 11:14:10 -05002717 my $ret;
2718 my %current_config;
2719
2720 my $count = $#start_list + 1;
2721 doprint " $count configs to test\n";
2722
2723 my $half = int($#start_list / 2);
2724
2725 do {
2726 my @tophalf = @start_list[0 .. $half];
2727
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002728 # keep the bottom half off
2729 if ($half < $#start_list) {
2730 @config_off_tmp = @start_list[$half + 1 .. $#start_list];
2731 } else {
2732 @config_off_tmp = ();
2733 }
2734
Steven Rostedt0a05c762010-11-08 11:14:10 -05002735 create_config @tophalf;
2736 read_current_config \%current_config;
2737
2738 $count = $#tophalf + 1;
2739 doprint "Testing $count configs\n";
2740 my $found = 0;
2741 # make sure we test something
2742 foreach my $config (@tophalf) {
2743 if (defined($current_config{$config})) {
2744 logit " $config\n";
2745 $found = 1;
2746 }
2747 }
2748 if (!$found) {
2749 # try the other half
2750 doprint "Top half produced no set configs, trying bottom half\n";
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002751
2752 # keep the top half off
2753 @config_off_tmp = @tophalf;
Steven Rostedt4c8cc552011-06-01 23:22:30 -04002754 @tophalf = @start_list[$half + 1 .. $#start_list];
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002755
Steven Rostedt0a05c762010-11-08 11:14:10 -05002756 create_config @tophalf;
2757 read_current_config \%current_config;
2758 foreach my $config (@tophalf) {
2759 if (defined($current_config{$config})) {
2760 logit " $config\n";
2761 $found = 1;
2762 }
2763 }
2764 if (!$found) {
2765 doprint "Failed: Can't make new config with current configs\n";
2766 foreach my $config (@start_list) {
2767 doprint " CONFIG: $config\n";
2768 }
2769 return -1;
2770 }
2771 $count = $#tophalf + 1;
2772 doprint "Testing $count configs\n";
2773 }
2774
2775 $ret = run_config_bisect_test $type;
Steven Rostedtc960bb92011-03-08 09:22:39 -05002776 if ($bisect_manual) {
2777 $ret = answer_bisect;
2778 }
Steven Rostedt0a05c762010-11-08 11:14:10 -05002779 if ($ret) {
2780 process_passed %current_config;
2781 return 0;
2782 }
2783
2784 doprint "This config had a failure.\n";
2785 doprint "Removing these configs that were not set in this config:\n";
Steven Rostedtf1a27852010-11-11 11:34:38 -05002786 doprint "config copied to $outputdir/config_bad\n";
2787 run_command "cp -f $output_config $outputdir/config_bad";
Steven Rostedt0a05c762010-11-08 11:14:10 -05002788
2789 # A config exists in this group that was bad.
2790 foreach my $config (keys %config_list) {
2791 if (!defined($current_config{$config})) {
2792 doprint " removing $config\n";
2793 delete $config_list{$config};
2794 }
2795 }
2796
2797 @start_list = @tophalf;
2798
2799 if ($#start_list == 0) {
2800 process_failed $start_list[0];
2801 return 1;
2802 }
2803
2804 # remove half the configs we are looking at and see if
2805 # they are good.
2806 $half = int($#start_list / 2);
Steven Rostedt4c8cc552011-06-01 23:22:30 -04002807 } while ($#start_list > 0);
Steven Rostedt0a05c762010-11-08 11:14:10 -05002808
Steven Rostedtc960bb92011-03-08 09:22:39 -05002809 # we found a single config, try it again unless we are running manually
2810
2811 if ($bisect_manual) {
2812 process_failed $start_list[0];
2813 return 1;
2814 }
2815
Steven Rostedt0a05c762010-11-08 11:14:10 -05002816 my @tophalf = @start_list[0 .. 0];
2817
2818 $ret = run_config_bisect_test $type;
2819 if ($ret) {
2820 process_passed %current_config;
2821 return 0;
2822 }
2823
2824 process_failed $start_list[0];
2825 return 1;
2826}
2827
2828sub config_bisect {
2829 my ($i) = @_;
2830
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002831 my $start_config = $config_bisect;
Steven Rostedt0a05c762010-11-08 11:14:10 -05002832
2833 my $tmpconfig = "$tmpdir/use_config";
2834
Steven Rostedt30f75da2011-06-13 10:35:35 -04002835 if (defined($config_bisect_good)) {
2836 process_config_ignore $config_bisect_good;
2837 }
2838
Steven Rostedt0a05c762010-11-08 11:14:10 -05002839 # Make the file with the bad config and the min config
2840 if (defined($minconfig)) {
2841 # read the min config for things to ignore
2842 run_command "cp $minconfig $tmpconfig" or
2843 dodie "failed to copy $minconfig to $tmpconfig";
2844 } else {
2845 unlink $tmpconfig;
2846 }
2847
Steven Rostedt0a05c762010-11-08 11:14:10 -05002848 if (-f $tmpconfig) {
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002849 load_force_config($tmpconfig);
Steven Rostedt0a05c762010-11-08 11:14:10 -05002850 process_config_ignore $tmpconfig;
2851 }
2852
2853 # now process the start config
2854 run_command "cp $start_config $output_config" or
2855 dodie "failed to copy $start_config to $output_config";
2856
2857 # read directly what we want to check
2858 my %config_check;
2859 open (IN, $output_config)
Masanari Iidaf9dee312012-02-11 21:46:56 +09002860 or dodie "failed to open $output_config";
Steven Rostedt0a05c762010-11-08 11:14:10 -05002861
2862 while (<IN>) {
2863 if (/^((CONFIG\S*)=.*)/) {
2864 $config_check{$2} = $1;
2865 }
2866 }
2867 close(IN);
2868
Steven Rostedt250bae82011-07-15 22:05:59 -04002869 # Now run oldconfig with the minconfig
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002870 make_oldconfig;
Steven Rostedt0a05c762010-11-08 11:14:10 -05002871
2872 # check to see what we lost (or gained)
2873 open (IN, $output_config)
2874 or dodie "Failed to read $start_config";
2875
2876 my %removed_configs;
2877 my %added_configs;
2878
2879 while (<IN>) {
2880 if (/^((CONFIG\S*)=.*)/) {
2881 # save off all options
2882 $config_set{$2} = $1;
2883 if (defined($config_check{$2})) {
2884 if (defined($config_ignore{$2})) {
2885 $removed_configs{$2} = $1;
2886 } else {
2887 $config_list{$2} = $1;
2888 }
2889 } elsif (!defined($config_ignore{$2})) {
2890 $added_configs{$2} = $1;
2891 $config_list{$2} = $1;
2892 }
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002893 } elsif (/^# ((CONFIG\S*).*)/) {
2894 # Keep these configs disabled
2895 $config_set{$2} = $1;
2896 $config_off{$2} = $1;
Steven Rostedt0a05c762010-11-08 11:14:10 -05002897 }
2898 }
2899 close(IN);
2900
2901 my @confs = keys %removed_configs;
2902 if ($#confs >= 0) {
2903 doprint "Configs overridden by default configs and removed from check:\n";
2904 foreach my $config (@confs) {
2905 doprint " $config\n";
2906 }
2907 }
2908 @confs = keys %added_configs;
2909 if ($#confs >= 0) {
2910 doprint "Configs appearing in make oldconfig and added:\n";
2911 foreach my $config (@confs) {
2912 doprint " $config\n";
2913 }
2914 }
2915
2916 my %config_test;
2917 my $once = 0;
2918
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002919 @config_off_tmp = ();
2920
Steven Rostedt0a05c762010-11-08 11:14:10 -05002921 # Sometimes kconfig does weird things. We must make sure
2922 # that the config we autocreate has everything we need
2923 # to test, otherwise we may miss testing configs, or
2924 # may not be able to create a new config.
2925 # Here we create a config with everything set.
2926 create_config (keys %config_list);
2927 read_current_config \%config_test;
2928 foreach my $config (keys %config_list) {
2929 if (!defined($config_test{$config})) {
2930 if (!$once) {
2931 $once = 1;
2932 doprint "Configs not produced by kconfig (will not be checked):\n";
2933 }
2934 doprint " $config\n";
2935 delete $config_list{$config};
2936 }
2937 }
2938 my $ret;
Steven Rostedtb0918612012-07-19 15:26:00 -04002939
2940 if (defined($config_bisect_check) && $config_bisect_check) {
2941 doprint " Checking to make sure bad config with min config fails\n";
2942 create_config keys %config_list;
2943 $ret = run_config_bisect_test $config_bisect_type;
2944 if ($ret) {
2945 doprint " FAILED! Bad config with min config boots fine\n";
2946 return -1;
2947 }
2948 doprint " Bad config with min config fails as expected\n";
2949 }
2950
Steven Rostedt0a05c762010-11-08 11:14:10 -05002951 do {
2952 $ret = run_config_bisect;
2953 } while (!$ret);
2954
2955 return $ret if ($ret < 0);
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002956
2957 success $i;
2958}
2959
Steven Rostedt27d934b2011-05-20 09:18:18 -04002960sub patchcheck_reboot {
2961 doprint "Reboot and sleep $patchcheck_sleep_time seconds\n";
Steven Rostedtbc7c5802011-12-22 16:29:10 -05002962 reboot_to_good $patchcheck_sleep_time;
Steven Rostedt27d934b2011-05-20 09:18:18 -04002963}
2964
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04002965sub patchcheck {
2966 my ($i) = @_;
2967
2968 die "PATCHCHECK_START[$i] not defined\n"
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002969 if (!defined($patchcheck_start));
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04002970 die "PATCHCHECK_TYPE[$i] not defined\n"
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002971 if (!defined($patchcheck_type));
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04002972
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002973 my $start = $patchcheck_start;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04002974
2975 my $end = "HEAD";
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002976 if (defined($patchcheck_end)) {
2977 $end = $patchcheck_end;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04002978 }
2979
Steven Rostedta57419b2010-11-02 15:13:54 -04002980 # Get the true sha1's since we can use things like HEAD~3
2981 $start = get_sha1($start);
2982 $end = get_sha1($end);
2983
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002984 my $type = $patchcheck_type;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04002985
2986 # Can't have a test without having a test to run
2987 if ($type eq "test" && !defined($run_test)) {
2988 $type = "boot";
2989 }
2990
2991 open (IN, "git log --pretty=oneline $end|") or
2992 dodie "could not get git list";
2993
2994 my @list;
2995
2996 while (<IN>) {
2997 chomp;
2998 $list[$#list+1] = $_;
2999 last if (/^$start/);
3000 }
3001 close(IN);
3002
3003 if ($list[$#list] !~ /^$start/) {
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04003004 fail "SHA1 $start not found";
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003005 }
3006
3007 # go backwards in the list
3008 @list = reverse @list;
3009
3010 my $save_clean = $noclean;
Steven Rostedt19902072011-06-14 20:46:25 -04003011 my %ignored_warnings;
3012
3013 if (defined($ignore_warnings)) {
3014 foreach my $sha1 (split /\s+/, $ignore_warnings) {
3015 $ignored_warnings{$sha1} = 1;
3016 }
3017 }
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003018
3019 $in_patchcheck = 1;
3020 foreach my $item (@list) {
3021 my $sha1 = $item;
3022 $sha1 =~ s/^([[:xdigit:]]+).*/$1/;
3023
3024 doprint "\nProcessing commit $item\n\n";
3025
3026 run_command "git checkout $sha1" or
3027 die "Failed to checkout $sha1";
3028
3029 # only clean on the first and last patch
3030 if ($item eq $list[0] ||
3031 $item eq $list[$#list]) {
3032 $noclean = $save_clean;
3033 } else {
3034 $noclean = 1;
3035 }
3036
3037 if (defined($minconfig)) {
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04003038 build "useconfig:$minconfig" or return 0;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003039 } else {
3040 # ?? no config to use?
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04003041 build "oldconfig" or return 0;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003042 }
3043
Steven Rostedt19902072011-06-14 20:46:25 -04003044
3045 if (!defined($ignored_warnings{$sha1})) {
3046 check_buildlog $sha1 or return 0;
3047 }
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003048
3049 next if ($type eq "build");
3050
Steven Rostedt7faafbd2010-11-02 14:58:22 -04003051 my $failed = 0;
3052
Steven Rostedtddf607e2011-06-14 20:49:13 -04003053 start_monitor_and_boot or $failed = 1;
Steven Rostedt7faafbd2010-11-02 14:58:22 -04003054
3055 if (!$failed && $type ne "boot"){
3056 do_run_test or $failed = 1;
3057 }
3058 end_monitor;
3059 return 0 if ($failed);
3060
Steven Rostedt27d934b2011-05-20 09:18:18 -04003061 patchcheck_reboot;
3062
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003063 }
3064 $in_patchcheck = 0;
3065 success $i;
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04003066
3067 return 1;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003068}
3069
Steven Rostedtb9066f62011-07-15 21:25:24 -04003070my %depends;
Steven Rostedtac6974c2011-10-04 09:40:17 -04003071my %depcount;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003072my $iflevel = 0;
3073my @ifdeps;
3074
3075# prevent recursion
3076my %read_kconfigs;
3077
Steven Rostedtac6974c2011-10-04 09:40:17 -04003078sub add_dep {
3079 # $config depends on $dep
3080 my ($config, $dep) = @_;
3081
3082 if (defined($depends{$config})) {
3083 $depends{$config} .= " " . $dep;
3084 } else {
3085 $depends{$config} = $dep;
3086 }
3087
3088 # record the number of configs depending on $dep
3089 if (defined $depcount{$dep}) {
3090 $depcount{$dep}++;
3091 } else {
3092 $depcount{$dep} = 1;
3093 }
3094}
3095
Steven Rostedtb9066f62011-07-15 21:25:24 -04003096# taken from streamline_config.pl
3097sub read_kconfig {
3098 my ($kconfig) = @_;
3099
3100 my $state = "NONE";
3101 my $config;
3102 my @kconfigs;
3103
3104 my $cont = 0;
3105 my $line;
3106
3107
3108 if (! -f $kconfig) {
3109 doprint "file $kconfig does not exist, skipping\n";
3110 return;
3111 }
3112
3113 open(KIN, "$kconfig")
3114 or die "Can't open $kconfig";
3115 while (<KIN>) {
3116 chomp;
3117
3118 # Make sure that lines ending with \ continue
3119 if ($cont) {
3120 $_ = $line . " " . $_;
3121 }
3122
3123 if (s/\\$//) {
3124 $cont = 1;
3125 $line = $_;
3126 next;
3127 }
3128
3129 $cont = 0;
3130
3131 # collect any Kconfig sources
3132 if (/^source\s*"(.*)"/) {
3133 $kconfigs[$#kconfigs+1] = $1;
3134 }
3135
3136 # configs found
3137 if (/^\s*(menu)?config\s+(\S+)\s*$/) {
3138 $state = "NEW";
3139 $config = $2;
3140
3141 for (my $i = 0; $i < $iflevel; $i++) {
Steven Rostedtac6974c2011-10-04 09:40:17 -04003142 add_dep $config, $ifdeps[$i];
Steven Rostedtb9066f62011-07-15 21:25:24 -04003143 }
3144
3145 # collect the depends for the config
3146 } elsif ($state eq "NEW" && /^\s*depends\s+on\s+(.*)$/) {
3147
Steven Rostedtac6974c2011-10-04 09:40:17 -04003148 add_dep $config, $1;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003149
3150 # Get the configs that select this config
Steven Rostedtac6974c2011-10-04 09:40:17 -04003151 } elsif ($state eq "NEW" && /^\s*select\s+(\S+)/) {
3152
3153 # selected by depends on config
3154 add_dep $1, $config;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003155
3156 # Check for if statements
3157 } elsif (/^if\s+(.*\S)\s*$/) {
3158 my $deps = $1;
3159 # remove beginning and ending non text
3160 $deps =~ s/^[^a-zA-Z0-9_]*//;
3161 $deps =~ s/[^a-zA-Z0-9_]*$//;
3162
3163 my @deps = split /[^a-zA-Z0-9_]+/, $deps;
3164
3165 $ifdeps[$iflevel++] = join ':', @deps;
3166
3167 } elsif (/^endif/) {
3168
3169 $iflevel-- if ($iflevel);
3170
3171 # stop on "help"
3172 } elsif (/^\s*help\s*$/) {
3173 $state = "NONE";
3174 }
3175 }
3176 close(KIN);
3177
3178 # read in any configs that were found.
3179 foreach $kconfig (@kconfigs) {
3180 if (!defined($read_kconfigs{$kconfig})) {
3181 $read_kconfigs{$kconfig} = 1;
3182 read_kconfig("$builddir/$kconfig");
3183 }
3184 }
3185}
3186
3187sub read_depends {
3188 # find out which arch this is by the kconfig file
3189 open (IN, $output_config)
3190 or dodie "Failed to read $output_config";
3191 my $arch;
3192 while (<IN>) {
3193 if (m,Linux/(\S+)\s+\S+\s+Kernel Configuration,) {
3194 $arch = $1;
3195 last;
3196 }
3197 }
3198 close IN;
3199
3200 if (!defined($arch)) {
3201 doprint "Could not find arch from config file\n";
3202 doprint "no dependencies used\n";
3203 return;
3204 }
3205
3206 # arch is really the subarch, we need to know
3207 # what directory to look at.
3208 if ($arch eq "i386" || $arch eq "x86_64") {
3209 $arch = "x86";
3210 } elsif ($arch =~ /^tile/) {
3211 $arch = "tile";
3212 }
3213
3214 my $kconfig = "$builddir/arch/$arch/Kconfig";
3215
3216 if (! -f $kconfig && $arch =~ /\d$/) {
3217 my $orig = $arch;
3218 # some subarchs have numbers, truncate them
3219 $arch =~ s/\d*$//;
3220 $kconfig = "$builddir/arch/$arch/Kconfig";
3221 if (! -f $kconfig) {
3222 doprint "No idea what arch dir $orig is for\n";
3223 doprint "no dependencies used\n";
3224 return;
3225 }
3226 }
3227
3228 read_kconfig($kconfig);
3229}
3230
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003231sub read_config_list {
3232 my ($config) = @_;
3233
3234 open (IN, $config)
3235 or dodie "Failed to read $config";
3236
3237 while (<IN>) {
3238 if (/^((CONFIG\S*)=.*)/) {
3239 if (!defined($config_ignore{$2})) {
3240 $config_list{$2} = $1;
3241 }
3242 }
3243 }
3244
3245 close(IN);
3246}
3247
3248sub read_output_config {
3249 my ($config) = @_;
3250
3251 assign_configs \%config_ignore, $config;
3252}
3253
3254sub make_new_config {
3255 my @configs = @_;
3256
3257 open (OUT, ">$output_config")
3258 or dodie "Failed to write $output_config";
3259
3260 foreach my $config (@configs) {
3261 print OUT "$config\n";
3262 }
3263 close OUT;
3264}
3265
Steven Rostedtac6974c2011-10-04 09:40:17 -04003266sub chomp_config {
3267 my ($config) = @_;
3268
3269 $config =~ s/CONFIG_//;
3270
3271 return $config;
3272}
3273
Steven Rostedtb9066f62011-07-15 21:25:24 -04003274sub get_depends {
3275 my ($dep) = @_;
3276
Steven Rostedtac6974c2011-10-04 09:40:17 -04003277 my $kconfig = chomp_config $dep;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003278
3279 $dep = $depends{"$kconfig"};
3280
3281 # the dep string we have saves the dependencies as they
3282 # were found, including expressions like ! && ||. We
3283 # want to split this out into just an array of configs.
3284
3285 my $valid = "A-Za-z_0-9";
3286
3287 my @configs;
3288
3289 while ($dep =~ /[$valid]/) {
3290
3291 if ($dep =~ /^[^$valid]*([$valid]+)/) {
3292 my $conf = "CONFIG_" . $1;
3293
3294 $configs[$#configs + 1] = $conf;
3295
3296 $dep =~ s/^[^$valid]*[$valid]+//;
3297 } else {
3298 die "this should never happen";
3299 }
3300 }
3301
3302 return @configs;
3303}
3304
3305my %min_configs;
3306my %keep_configs;
Steven Rostedt43d1b652011-07-15 22:01:56 -04003307my %save_configs;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003308my %processed_configs;
3309my %nochange_config;
3310
3311sub test_this_config {
3312 my ($config) = @_;
3313
3314 my $found;
3315
3316 # if we already processed this config, skip it
3317 if (defined($processed_configs{$config})) {
3318 return undef;
3319 }
3320 $processed_configs{$config} = 1;
3321
3322 # if this config failed during this round, skip it
3323 if (defined($nochange_config{$config})) {
3324 return undef;
3325 }
3326
Steven Rostedtac6974c2011-10-04 09:40:17 -04003327 my $kconfig = chomp_config $config;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003328
3329 # Test dependencies first
3330 if (defined($depends{"$kconfig"})) {
3331 my @parents = get_depends $config;
3332 foreach my $parent (@parents) {
3333 # if the parent is in the min config, check it first
3334 next if (!defined($min_configs{$parent}));
3335 $found = test_this_config($parent);
3336 if (defined($found)) {
3337 return $found;
3338 }
3339 }
3340 }
3341
3342 # Remove this config from the list of configs
Adam Leefb16d892012-09-01 01:05:17 +08003343 # do a make olddefconfig and then read the resulting
Steven Rostedtb9066f62011-07-15 21:25:24 -04003344 # .config to make sure it is missing the config that
3345 # we had before
3346 my %configs = %min_configs;
3347 delete $configs{$config};
3348 make_new_config ((values %configs), (values %keep_configs));
3349 make_oldconfig;
3350 undef %configs;
3351 assign_configs \%configs, $output_config;
3352
3353 return $config if (!defined($configs{$config}));
3354
3355 doprint "disabling config $config did not change .config\n";
3356
3357 $nochange_config{$config} = 1;
3358
3359 return undef;
3360}
3361
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003362sub make_min_config {
3363 my ($i) = @_;
3364
Steven Rostedtccc513b2012-05-21 17:13:40 -04003365 my $type = $minconfig_type;
3366 if ($type ne "boot" && $type ne "test") {
3367 fail "Invalid MIN_CONFIG_TYPE '$minconfig_type'\n" .
3368 " make_min_config works only with 'boot' and 'test'\n" and return;
3369 }
3370
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003371 if (!defined($output_minconfig)) {
3372 fail "OUTPUT_MIN_CONFIG not defined" and return;
3373 }
Steven Rostedt35ce5952011-07-15 21:57:25 -04003374
3375 # If output_minconfig exists, and the start_minconfig
3376 # came from min_config, than ask if we should use
3377 # that instead.
3378 if (-f $output_minconfig && !$start_minconfig_defined) {
3379 print "$output_minconfig exists\n";
Steven Rostedt43de3312012-05-21 23:35:12 -04003380 if (!defined($use_output_minconfig)) {
3381 if (read_yn " Use it as minconfig?") {
3382 $start_minconfig = $output_minconfig;
3383 }
3384 } elsif ($use_output_minconfig > 0) {
3385 doprint "Using $output_minconfig as MIN_CONFIG\n";
Steven Rostedt35ce5952011-07-15 21:57:25 -04003386 $start_minconfig = $output_minconfig;
Steven Rostedt43de3312012-05-21 23:35:12 -04003387 } else {
3388 doprint "Set to still use MIN_CONFIG as starting point\n";
Steven Rostedt35ce5952011-07-15 21:57:25 -04003389 }
3390 }
3391
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003392 if (!defined($start_minconfig)) {
3393 fail "START_MIN_CONFIG or MIN_CONFIG not defined" and return;
3394 }
3395
Steven Rostedt35ce5952011-07-15 21:57:25 -04003396 my $temp_config = "$tmpdir/temp_config";
3397
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003398 # First things first. We build an allnoconfig to find
3399 # out what the defaults are that we can't touch.
3400 # Some are selections, but we really can't handle selections.
3401
3402 my $save_minconfig = $minconfig;
3403 undef $minconfig;
3404
3405 run_command "$make allnoconfig" or return 0;
3406
Steven Rostedtb9066f62011-07-15 21:25:24 -04003407 read_depends;
3408
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003409 process_config_ignore $output_config;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003410
Steven Rostedt43d1b652011-07-15 22:01:56 -04003411 undef %save_configs;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003412 undef %min_configs;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003413
3414 if (defined($ignore_config)) {
3415 # make sure the file exists
3416 `touch $ignore_config`;
Steven Rostedt43d1b652011-07-15 22:01:56 -04003417 assign_configs \%save_configs, $ignore_config;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003418 }
3419
Steven Rostedt43d1b652011-07-15 22:01:56 -04003420 %keep_configs = %save_configs;
3421
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003422 doprint "Load initial configs from $start_minconfig\n";
3423
3424 # Look at the current min configs, and save off all the
3425 # ones that were set via the allnoconfig
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003426 assign_configs \%min_configs, $start_minconfig;
3427
3428 my @config_keys = keys %min_configs;
3429
Steven Rostedtac6974c2011-10-04 09:40:17 -04003430 # All configs need a depcount
3431 foreach my $config (@config_keys) {
3432 my $kconfig = chomp_config $config;
3433 if (!defined $depcount{$kconfig}) {
3434 $depcount{$kconfig} = 0;
3435 }
3436 }
3437
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003438 # Remove anything that was set by the make allnoconfig
3439 # we shouldn't need them as they get set for us anyway.
3440 foreach my $config (@config_keys) {
3441 # Remove anything in the ignore_config
3442 if (defined($keep_configs{$config})) {
3443 my $file = $ignore_config;
3444 $file =~ s,.*/(.*?)$,$1,;
3445 doprint "$config set by $file ... ignored\n";
3446 delete $min_configs{$config};
3447 next;
3448 }
3449 # But make sure the settings are the same. If a min config
3450 # sets a selection, we do not want to get rid of it if
3451 # it is not the same as what we have. Just move it into
3452 # the keep configs.
3453 if (defined($config_ignore{$config})) {
3454 if ($config_ignore{$config} ne $min_configs{$config}) {
3455 doprint "$config is in allnoconfig as '$config_ignore{$config}'";
3456 doprint " but it is '$min_configs{$config}' in minconfig .. keeping\n";
3457 $keep_configs{$config} = $min_configs{$config};
3458 } else {
3459 doprint "$config set by allnoconfig ... ignored\n";
3460 }
3461 delete $min_configs{$config};
3462 }
3463 }
3464
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003465 my $done = 0;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003466 my $take_two = 0;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003467
3468 while (!$done) {
3469
3470 my $config;
3471 my $found;
3472
3473 # Now disable each config one by one and do a make oldconfig
3474 # till we find a config that changes our list.
3475
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003476 my @test_configs = keys %min_configs;
Steven Rostedtac6974c2011-10-04 09:40:17 -04003477
3478 # Sort keys by who is most dependent on
3479 @test_configs = sort { $depcount{chomp_config($b)} <=> $depcount{chomp_config($a)} }
3480 @test_configs ;
3481
3482 # Put configs that did not modify the config at the end.
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003483 my $reset = 1;
3484 for (my $i = 0; $i < $#test_configs; $i++) {
3485 if (!defined($nochange_config{$test_configs[0]})) {
3486 $reset = 0;
3487 last;
3488 }
3489 # This config didn't change the .config last time.
3490 # Place it at the end
3491 my $config = shift @test_configs;
3492 push @test_configs, $config;
3493 }
3494
3495 # if every test config has failed to modify the .config file
3496 # in the past, then reset and start over.
3497 if ($reset) {
3498 undef %nochange_config;
3499 }
3500
Steven Rostedtb9066f62011-07-15 21:25:24 -04003501 undef %processed_configs;
3502
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003503 foreach my $config (@test_configs) {
3504
Steven Rostedtb9066f62011-07-15 21:25:24 -04003505 $found = test_this_config $config;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003506
Steven Rostedtb9066f62011-07-15 21:25:24 -04003507 last if (defined($found));
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003508
3509 # oh well, try another config
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003510 }
3511
3512 if (!defined($found)) {
Steven Rostedtb9066f62011-07-15 21:25:24 -04003513 # we could have failed due to the nochange_config hash
3514 # reset and try again
3515 if (!$take_two) {
3516 undef %nochange_config;
3517 $take_two = 1;
3518 next;
3519 }
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003520 doprint "No more configs found that we can disable\n";
3521 $done = 1;
3522 last;
3523 }
Steven Rostedtb9066f62011-07-15 21:25:24 -04003524 $take_two = 0;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003525
3526 $config = $found;
3527
3528 doprint "Test with $config disabled\n";
3529
3530 # set in_bisect to keep build and monitor from dieing
3531 $in_bisect = 1;
3532
3533 my $failed = 0;
Steven Rostedtbf1c95a2012-02-27 13:58:49 -05003534 build "oldconfig" or $failed = 1;
3535 if (!$failed) {
3536 start_monitor_and_boot or $failed = 1;
Steven Rostedtccc513b2012-05-21 17:13:40 -04003537
3538 if ($type eq "test" && !$failed) {
3539 do_run_test or $failed = 1;
3540 }
3541
Steven Rostedtbf1c95a2012-02-27 13:58:49 -05003542 end_monitor;
3543 }
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003544
3545 $in_bisect = 0;
3546
3547 if ($failed) {
Steven Rostedtb9066f62011-07-15 21:25:24 -04003548 doprint "$min_configs{$config} is needed to boot the box... keeping\n";
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003549 # this config is needed, add it to the ignore list.
3550 $keep_configs{$config} = $min_configs{$config};
Steven Rostedt43d1b652011-07-15 22:01:56 -04003551 $save_configs{$config} = $min_configs{$config};
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003552 delete $min_configs{$config};
Steven Rostedt35ce5952011-07-15 21:57:25 -04003553
3554 # update new ignore configs
3555 if (defined($ignore_config)) {
3556 open (OUT, ">$temp_config")
3557 or die "Can't write to $temp_config";
Steven Rostedt43d1b652011-07-15 22:01:56 -04003558 foreach my $config (keys %save_configs) {
3559 print OUT "$save_configs{$config}\n";
Steven Rostedt35ce5952011-07-15 21:57:25 -04003560 }
3561 close OUT;
3562 run_command "mv $temp_config $ignore_config" or
3563 dodie "failed to copy update to $ignore_config";
3564 }
3565
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003566 } else {
3567 # We booted without this config, remove it from the minconfigs.
3568 doprint "$config is not needed, disabling\n";
3569
3570 delete $min_configs{$config};
3571
3572 # Also disable anything that is not enabled in this config
3573 my %configs;
3574 assign_configs \%configs, $output_config;
3575 my @config_keys = keys %min_configs;
3576 foreach my $config (@config_keys) {
3577 if (!defined($configs{$config})) {
3578 doprint "$config is not set, disabling\n";
3579 delete $min_configs{$config};
3580 }
3581 }
3582
3583 # Save off all the current mandidory configs
Steven Rostedt35ce5952011-07-15 21:57:25 -04003584 open (OUT, ">$temp_config")
3585 or die "Can't write to $temp_config";
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003586 foreach my $config (keys %keep_configs) {
3587 print OUT "$keep_configs{$config}\n";
3588 }
3589 foreach my $config (keys %min_configs) {
3590 print OUT "$min_configs{$config}\n";
3591 }
3592 close OUT;
Steven Rostedt35ce5952011-07-15 21:57:25 -04003593
3594 run_command "mv $temp_config $output_minconfig" or
3595 dodie "failed to copy update to $output_minconfig";
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003596 }
3597
3598 doprint "Reboot and wait $sleep_time seconds\n";
Steven Rostedtbc7c5802011-12-22 16:29:10 -05003599 reboot_to_good $sleep_time;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003600 }
3601
3602 success $i;
3603 return 1;
3604}
3605
Steven Rostedt8d1491b2010-11-18 15:39:48 -05003606$#ARGV < 1 or die "ktest.pl version: $VERSION\n usage: ktest.pl config-file\n";
Steven Rostedt2545eb62010-11-02 15:01:32 -04003607
Steven Rostedt8d1491b2010-11-18 15:39:48 -05003608if ($#ARGV == 0) {
3609 $ktest_config = $ARGV[0];
3610 if (! -f $ktest_config) {
3611 print "$ktest_config does not exist.\n";
Steven Rostedt35ce5952011-07-15 21:57:25 -04003612 if (!read_yn "Create it?") {
Steven Rostedt8d1491b2010-11-18 15:39:48 -05003613 exit 0;
3614 }
3615 }
3616} else {
3617 $ktest_config = "ktest.conf";
3618}
3619
3620if (! -f $ktest_config) {
Steven Rostedtdbd37832011-11-23 16:00:48 -05003621 $newconfig = 1;
Steven Rostedtc4261d02011-11-23 13:41:18 -05003622 get_test_case;
Steven Rostedt8d1491b2010-11-18 15:39:48 -05003623 open(OUT, ">$ktest_config") or die "Can not create $ktest_config";
3624 print OUT << "EOF"
3625# Generated by ktest.pl
3626#
Steven Rostedt0e7a22d2011-11-21 20:39:33 -05003627
3628# PWD is a ktest.pl variable that will result in the process working
3629# directory that ktest.pl is executed in.
3630
3631# THIS_DIR is automatically assigned the PWD of the path that generated
3632# the config file. It is best to use this variable when assigning other
3633# directory paths within this directory. This allows you to easily
3634# move the test cases to other locations or to other machines.
3635#
3636THIS_DIR := $variable{"PWD"}
3637
Steven Rostedt8d1491b2010-11-18 15:39:48 -05003638# Define each test with TEST_START
3639# The config options below it will override the defaults
3640TEST_START
Steven Rostedtc4261d02011-11-23 13:41:18 -05003641TEST_TYPE = $default{"TEST_TYPE"}
Steven Rostedt8d1491b2010-11-18 15:39:48 -05003642
3643DEFAULTS
3644EOF
3645;
3646 close(OUT);
3647}
3648read_config $ktest_config;
3649
Steven Rostedt23715c3c2011-06-13 11:03:34 -04003650if (defined($opt{"LOG_FILE"})) {
3651 $opt{"LOG_FILE"} = eval_option($opt{"LOG_FILE"}, -1);
3652}
3653
Steven Rostedt8d1491b2010-11-18 15:39:48 -05003654# Append any configs entered in manually to the config file.
3655my @new_configs = keys %entered_configs;
3656if ($#new_configs >= 0) {
3657 print "\nAppending entered in configs to $ktest_config\n";
3658 open(OUT, ">>$ktest_config") or die "Can not append to $ktest_config";
3659 foreach my $config (@new_configs) {
3660 print OUT "$config = $entered_configs{$config}\n";
Steven Rostedt0e7a22d2011-11-21 20:39:33 -05003661 $opt{$config} = process_variables($entered_configs{$config});
Steven Rostedt8d1491b2010-11-18 15:39:48 -05003662 }
3663}
Steven Rostedt2545eb62010-11-02 15:01:32 -04003664
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04003665if ($opt{"CLEAR_LOG"} && defined($opt{"LOG_FILE"})) {
3666 unlink $opt{"LOG_FILE"};
3667}
Steven Rostedt2545eb62010-11-02 15:01:32 -04003668
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04003669doprint "\n\nSTARTING AUTOMATED TESTS\n\n";
3670
Steven Rostedta57419b2010-11-02 15:13:54 -04003671for (my $i = 0, my $repeat = 1; $i <= $opt{"NUM_TESTS"}; $i += $repeat) {
3672
3673 if (!$i) {
3674 doprint "DEFAULT OPTIONS:\n";
3675 } else {
3676 doprint "\nTEST $i OPTIONS";
3677 if (defined($repeat_tests{$i})) {
3678 $repeat = $repeat_tests{$i};
3679 doprint " ITERATE $repeat";
3680 }
3681 doprint "\n";
3682 }
3683
3684 foreach my $option (sort keys %opt) {
3685
3686 if ($option =~ /\[(\d+)\]$/) {
3687 next if ($i != $1);
3688 } else {
3689 next if ($i);
3690 }
3691
3692 doprint "$option = $opt{$option}\n";
3693 }
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04003694}
Steven Rostedt2545eb62010-11-02 15:01:32 -04003695
Steven Rostedt2a625122011-05-20 15:48:59 -04003696sub __set_test_option {
Steven Rostedt5a391fb2010-11-02 14:57:43 -04003697 my ($name, $i) = @_;
3698
3699 my $option = "$name\[$i\]";
3700
3701 if (defined($opt{$option})) {
3702 return $opt{$option};
3703 }
3704
Steven Rostedta57419b2010-11-02 15:13:54 -04003705 foreach my $test (keys %repeat_tests) {
3706 if ($i >= $test &&
3707 $i < $test + $repeat_tests{$test}) {
3708 $option = "$name\[$test\]";
3709 if (defined($opt{$option})) {
3710 return $opt{$option};
3711 }
3712 }
3713 }
3714
Steven Rostedt5a391fb2010-11-02 14:57:43 -04003715 if (defined($opt{$name})) {
3716 return $opt{$name};
3717 }
3718
3719 return undef;
3720}
3721
Steven Rostedt2a625122011-05-20 15:48:59 -04003722sub set_test_option {
3723 my ($name, $i) = @_;
3724
3725 my $option = __set_test_option($name, $i);
3726 return $option if (!defined($option));
3727
Steven Rostedt23715c3c2011-06-13 11:03:34 -04003728 return eval_option($option, $i);
Steven Rostedt2a625122011-05-20 15:48:59 -04003729}
3730
Steven Rostedt2545eb62010-11-02 15:01:32 -04003731# First we need to do is the builds
Steven Rostedta75fece2010-11-02 14:58:27 -04003732for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {
Steven Rostedt2545eb62010-11-02 15:01:32 -04003733
Steven Rostedt4ab1cce2011-09-30 18:12:20 -04003734 # Do not reboot on failing test options
3735 $no_reboot = 1;
Steven Rostedt759a3cc2012-05-01 08:20:12 -04003736 $reboot_success = 0;
Steven Rostedt4ab1cce2011-09-30 18:12:20 -04003737
Steven Rostedt683a3e62012-05-18 13:34:35 -04003738 $have_version = 0;
3739
Steven Rostedt576f6272010-11-02 14:58:38 -04003740 $iteration = $i;
3741
Steven Rostedtc1434dc2012-07-20 22:39:16 -04003742 undef %force_config;
3743
Steven Rostedta75fece2010-11-02 14:58:27 -04003744 my $makecmd = set_test_option("MAKE_CMD", $i);
3745
Steven Rostedt9cc9e092011-12-22 21:37:22 -05003746 # Load all the options into their mapped variable names
3747 foreach my $opt (keys %option_map) {
3748 ${$option_map{$opt}} = set_test_option($opt, $i);
3749 }
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05003750
Steven Rostedt35ce5952011-07-15 21:57:25 -04003751 $start_minconfig_defined = 1;
3752
Steven Rostedt921ed4c2012-07-19 15:18:27 -04003753 # The first test may override the PRE_KTEST option
3754 if (defined($pre_ktest) && $i == 1) {
3755 doprint "\n";
3756 run_command $pre_ktest;
3757 }
3758
3759 # Any test can override the POST_KTEST option
3760 # The last test takes precedence.
3761 if (defined($post_ktest)) {
3762 $final_post_ktest = $post_ktest;
3763 }
3764
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003765 if (!defined($start_minconfig)) {
Steven Rostedt35ce5952011-07-15 21:57:25 -04003766 $start_minconfig_defined = 0;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003767 $start_minconfig = $minconfig;
3768 }
3769
Steven Rostedta75fece2010-11-02 14:58:27 -04003770 chdir $builddir || die "can't change directory to $builddir";
3771
Andrew Jonesa908a662011-08-12 15:32:03 +02003772 foreach my $dir ($tmpdir, $outputdir) {
3773 if (!-d $dir) {
3774 mkpath($dir) or
3775 die "can't create $dir";
3776 }
Steven Rostedta75fece2010-11-02 14:58:27 -04003777 }
3778
Steven Rostedte48c5292010-11-02 14:35:37 -04003779 $ENV{"SSH_USER"} = $ssh_user;
3780 $ENV{"MACHINE"} = $machine;
3781
Steven Rostedta75fece2010-11-02 14:58:27 -04003782 $buildlog = "$tmpdir/buildlog-$machine";
Rabin Vincenta9dd5d62011-11-18 17:05:29 +05303783 $testlog = "$tmpdir/testlog-$machine";
Steven Rostedta75fece2010-11-02 14:58:27 -04003784 $dmesg = "$tmpdir/dmesg-$machine";
3785 $make = "$makecmd O=$outputdir";
Steven Rostedt51ad1dd2010-11-08 16:43:21 -05003786 $output_config = "$outputdir/.config";
Steven Rostedta75fece2010-11-02 14:58:27 -04003787
Steven Rostedtbb8474b2011-11-23 15:58:00 -05003788 if (!$buildonly) {
3789 $target = "$ssh_user\@$machine";
3790 if ($reboot_type eq "grub") {
3791 dodie "GRUB_MENU not defined" if (!defined($grub_menu));
Steven Rostedta15ba912012-11-13 14:30:37 -05003792 } elsif ($reboot_type eq "grub2") {
3793 dodie "GRUB_MENU not defined" if (!defined($grub_menu));
3794 dodie "GRUB_FILE not defined" if (!defined($grub_file));
Steven Rostedt77869542012-12-11 17:37:41 -05003795 } elsif ($reboot_type eq "syslinux") {
3796 dodie "SYSLINUX_LABEL not defined" if (!defined($syslinux_label));
Steven Rostedtbb8474b2011-11-23 15:58:00 -05003797 }
Steven Rostedta75fece2010-11-02 14:58:27 -04003798 }
3799
3800 my $run_type = $build_type;
3801 if ($test_type eq "patchcheck") {
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05003802 $run_type = $patchcheck_type;
Steven Rostedta75fece2010-11-02 14:58:27 -04003803 } elsif ($test_type eq "bisect") {
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05003804 $run_type = $bisect_type;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003805 } elsif ($test_type eq "config_bisect") {
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05003806 $run_type = $config_bisect_type;
Steven Rostedta75fece2010-11-02 14:58:27 -04003807 }
3808
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003809 if ($test_type eq "make_min_config") {
3810 $run_type = "";
3811 }
3812
Steven Rostedta75fece2010-11-02 14:58:27 -04003813 # mistake in config file?
3814 if (!defined($run_type)) {
3815 $run_type = "ERROR";
3816 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04003817
Steven Rostedte0a87422011-09-30 17:50:48 -04003818 my $installme = "";
3819 $installme = " no_install" if ($no_install);
3820
Steven Rostedt2545eb62010-11-02 15:01:32 -04003821 doprint "\n\n";
Steven Rostedte0a87422011-09-30 17:50:48 -04003822 doprint "RUNNING TEST $i of $opt{NUM_TESTS} with option $test_type $run_type$installme\n\n";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04003823
Steven Rostedt921ed4c2012-07-19 15:18:27 -04003824 if (defined($pre_test)) {
3825 run_command $pre_test;
3826 }
3827
Steven Rostedt7faafbd2010-11-02 14:58:22 -04003828 unlink $dmesg;
3829 unlink $buildlog;
Rabin Vincenta9dd5d62011-11-18 17:05:29 +05303830 unlink $testlog;
Steven Rostedt2545eb62010-11-02 15:01:32 -04003831
Steven Rostedt250bae82011-07-15 22:05:59 -04003832 if (defined($addconfig)) {
3833 my $min = $minconfig;
3834 if (!defined($minconfig)) {
3835 $min = "";
3836 }
3837 run_command "cat $addconfig $min > $tmpdir/add_config" or
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04003838 dodie "Failed to create temp config";
Steven Rostedt9be2e6b2010-11-09 12:20:21 -05003839 $minconfig = "$tmpdir/add_config";
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04003840 }
3841
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003842 if (defined($checkout)) {
3843 run_command "git checkout $checkout" or
3844 die "failed to checkout $checkout";
3845 }
3846
Steven Rostedt759a3cc2012-05-01 08:20:12 -04003847 $no_reboot = 0;
3848
Steven Rostedt648a1822012-03-21 11:18:27 -04003849 # A test may opt to not reboot the box
3850 if ($reboot_on_success) {
Steven Rostedt759a3cc2012-05-01 08:20:12 -04003851 $reboot_success = 1;
Steven Rostedt648a1822012-03-21 11:18:27 -04003852 }
Steven Rostedt4ab1cce2011-09-30 18:12:20 -04003853
Steven Rostedta75fece2010-11-02 14:58:27 -04003854 if ($test_type eq "bisect") {
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04003855 bisect $i;
3856 next;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003857 } elsif ($test_type eq "config_bisect") {
3858 config_bisect $i;
3859 next;
Steven Rostedta75fece2010-11-02 14:58:27 -04003860 } elsif ($test_type eq "patchcheck") {
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003861 patchcheck $i;
3862 next;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003863 } elsif ($test_type eq "make_min_config") {
3864 make_min_config $i;
3865 next;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04003866 }
3867
Steven Rostedt7faafbd2010-11-02 14:58:22 -04003868 if ($build_type ne "nobuild") {
3869 build $build_type or next;
Steven Rostedt2545eb62010-11-02 15:01:32 -04003870 }
3871
Steven Rostedtcd8e3682011-08-18 16:35:44 -04003872 if ($test_type eq "install") {
3873 get_version;
3874 install;
3875 success $i;
3876 next;
3877 }
3878
Steven Rostedta75fece2010-11-02 14:58:27 -04003879 if ($test_type ne "build") {
Steven Rostedta75fece2010-11-02 14:58:27 -04003880 my $failed = 0;
Steven Rostedtddf607e2011-06-14 20:49:13 -04003881 start_monitor_and_boot or $failed = 1;
Steven Rostedta75fece2010-11-02 14:58:27 -04003882
3883 if (!$failed && $test_type ne "boot" && defined($run_test)) {
3884 do_run_test or $failed = 1;
3885 }
3886 end_monitor;
3887 next if ($failed);
Steven Rostedt5a391fb2010-11-02 14:57:43 -04003888 }
3889
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04003890 success $i;
Steven Rostedt2545eb62010-11-02 15:01:32 -04003891}
3892
Steven Rostedt921ed4c2012-07-19 15:18:27 -04003893if (defined($final_post_ktest)) {
3894 run_command $final_post_ktest;
3895}
3896
Steven Rostedt5c42fc52010-11-02 14:57:01 -04003897if ($opt{"POWEROFF_ON_SUCCESS"}) {
Steven Rostedt75c3fda72010-11-02 14:57:21 -04003898 halt;
Steven Rostedt759a3cc2012-05-01 08:20:12 -04003899} elsif ($opt{"REBOOT_ON_SUCCESS"} && !do_not_reboot && $reboot_success) {
Steven Rostedtbc7c5802011-12-22 16:29:10 -05003900 reboot_to_good;
Steven Rostedt648a1822012-03-21 11:18:27 -04003901} elsif (defined($switch_to_good)) {
3902 # still need to get to the good kernel
3903 run_command $switch_to_good;
Steven Rostedt5c42fc52010-11-02 14:57:01 -04003904}
Steven Rostedt75c3fda72010-11-02 14:57:21 -04003905
Steven Rostedt648a1822012-03-21 11:18:27 -04003906
Steven Rostedte48c5292010-11-02 14:35:37 -04003907doprint "\n $successes of $opt{NUM_TESTS} tests were successful\n\n";
3908
Steven Rostedt2545eb62010-11-02 15:01:32 -04003909exit 0;