blob: f3bb5da3193b949850a65fa30215e7418d360c10 [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 Rostedt (Red Hat)4283b162013-01-30 18:37:47 -0500129my $warnings_file;
Steven Rostedt4c4ab122011-07-15 21:16:17 -0400130my $ignore_config;
Steven Rostedtbe405f92012-01-04 21:51:59 -0500131my $ignore_errors;
Steven Rostedt2b7d9b22010-11-02 14:58:15 -0400132my $addconfig;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -0400133my $in_bisect = 0;
Steven Rostedtb5f4aea2011-12-22 21:33:55 -0500134my $bisect_bad_commit = "";
Steven Rostedtd6ce2a02010-11-02 14:58:05 -0400135my $reverse_bisect;
Steven Rostedtc960bb92011-03-08 09:22:39 -0500136my $bisect_manual;
Steven Rostedtc23dca72011-03-08 09:26:31 -0500137my $bisect_skip;
Steven Rostedt30f75da2011-06-13 10:35:35 -0400138my $config_bisect_good;
Steven Rostedtc5dacb82011-12-22 12:43:57 -0500139my $bisect_ret_good;
140my $bisect_ret_bad;
141my $bisect_ret_skip;
142my $bisect_ret_abort;
143my $bisect_ret_default;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -0400144my $in_patchcheck = 0;
Steven Rostedt5a391fb2010-11-02 14:57:43 -0400145my $run_test;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -0400146my $redirect;
Steven Rostedt7faafbd2010-11-02 14:58:22 -0400147my $buildlog;
Rabin Vincenta9dd5d62011-11-18 17:05:29 +0530148my $testlog;
Steven Rostedt7faafbd2010-11-02 14:58:22 -0400149my $dmesg;
150my $monitor_fp;
151my $monitor_pid;
152my $monitor_cnt = 0;
Steven Rostedta75fece2010-11-02 14:58:27 -0400153my $sleep_time;
154my $bisect_sleep_time;
Steven Rostedt27d934b2011-05-20 09:18:18 -0400155my $patchcheck_sleep_time;
Steven Rostedt19902072011-06-14 20:46:25 -0400156my $ignore_warnings;
Steven Rostedta75fece2010-11-02 14:58:27 -0400157my $store_failures;
Rabin Vincentde5b6e32011-11-18 17:05:31 +0530158my $store_successes;
Steven Rostedt9064af52011-06-13 10:38:48 -0400159my $test_name;
Steven Rostedta75fece2010-11-02 14:58:27 -0400160my $timeout;
161my $booted_timeout;
Steven Rostedtf1a5b962011-06-13 10:30:00 -0400162my $detect_triplefault;
Steven Rostedta75fece2010-11-02 14:58:27 -0400163my $console;
Steven Rostedt2b803362011-09-30 18:00:23 -0400164my $reboot_success_line;
Steven Rostedta75fece2010-11-02 14:58:27 -0400165my $success_line;
Steven Rostedt1c8a6172010-11-09 12:55:40 -0500166my $stop_after_success;
167my $stop_after_failure;
Steven Rostedt2d01b262011-03-08 09:47:54 -0500168my $stop_test_after;
Steven Rostedta75fece2010-11-02 14:58:27 -0400169my $build_target;
170my $target_image;
Steven Rostedtb5f4aea2011-12-22 21:33:55 -0500171my $checkout;
Steven Rostedta75fece2010-11-02 14:58:27 -0400172my $localversion;
Steven Rostedt576f6272010-11-02 14:58:38 -0400173my $iteration = 0;
Steven Rostedte48c5292010-11-02 14:35:37 -0400174my $successes = 0;
Steven Rostedt2545eb62010-11-02 15:01:32 -0400175
Steven Rostedtb5f4aea2011-12-22 21:33:55 -0500176my $bisect_good;
177my $bisect_bad;
178my $bisect_type;
179my $bisect_start;
180my $bisect_replay;
181my $bisect_files;
182my $bisect_reverse;
183my $bisect_check;
184
185my $config_bisect;
186my $config_bisect_type;
Steven Rostedtb0918612012-07-19 15:26:00 -0400187my $config_bisect_check;
Steven Rostedtb5f4aea2011-12-22 21:33:55 -0500188
189my $patchcheck_type;
190my $patchcheck_start;
191my $patchcheck_end;
192
Steven Rostedt165708b2011-11-26 20:56:52 -0500193# set when a test is something other that just building or install
Steven Rostedtbb8474b2011-11-23 15:58:00 -0500194# which would require more options.
195my $buildonly = 1;
196
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -0500197# tell build not to worry about warnings, even when WARNINGS_FILE is set
198my $warnings_ok = 0;
199
Steven Rostedtdbd37832011-11-23 16:00:48 -0500200# set when creating a new config
201my $newconfig = 0;
202
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500203my %entered_configs;
204my %config_help;
Steven Rostedt77d942c2011-05-20 13:36:58 -0400205my %variable;
Steven Rostedtcf79fab2012-07-19 15:29:43 -0400206
207# force_config is the list of configs that we force enabled (or disabled)
208# in a .config file. The MIN_CONFIG and ADD_CONFIG configs.
Steven Rostedtfcb3f162011-06-13 10:40:58 -0400209my %force_config;
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500210
Steven Rostedt4ab1cce2011-09-30 18:12:20 -0400211# do not force reboots on config problems
212my $no_reboot = 1;
213
Steven Rostedt759a3cc2012-05-01 08:20:12 -0400214# reboot on success
215my $reboot_success = 0;
216
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500217my %option_map = (
218 "MACHINE" => \$machine,
219 "SSH_USER" => \$ssh_user,
220 "TMP_DIR" => \$tmpdir,
221 "OUTPUT_DIR" => \$outputdir,
222 "BUILD_DIR" => \$builddir,
223 "TEST_TYPE" => \$test_type,
Steven Rostedt921ed4c2012-07-19 15:18:27 -0400224 "PRE_KTEST" => \$pre_ktest,
225 "POST_KTEST" => \$post_ktest,
226 "PRE_TEST" => \$pre_test,
227 "POST_TEST" => \$post_test,
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500228 "BUILD_TYPE" => \$build_type,
229 "BUILD_OPTIONS" => \$build_options,
230 "PRE_BUILD" => \$pre_build,
231 "POST_BUILD" => \$post_build,
232 "PRE_BUILD_DIE" => \$pre_build_die,
233 "POST_BUILD_DIE" => \$post_build_die,
234 "POWER_CYCLE" => \$power_cycle,
235 "REBOOT" => \$reboot,
236 "BUILD_NOCLEAN" => \$noclean,
237 "MIN_CONFIG" => \$minconfig,
238 "OUTPUT_MIN_CONFIG" => \$output_minconfig,
239 "START_MIN_CONFIG" => \$start_minconfig,
Steven Rostedtccc513b2012-05-21 17:13:40 -0400240 "MIN_CONFIG_TYPE" => \$minconfig_type,
Steven Rostedt43de3312012-05-21 23:35:12 -0400241 "USE_OUTPUT_MIN_CONFIG" => \$use_output_minconfig,
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -0500242 "WARNINGS_FILE" => \$warnings_file,
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500243 "IGNORE_CONFIG" => \$ignore_config,
244 "TEST" => \$run_test,
245 "ADD_CONFIG" => \$addconfig,
246 "REBOOT_TYPE" => \$reboot_type,
247 "GRUB_MENU" => \$grub_menu,
Steven Rostedta15ba912012-11-13 14:30:37 -0500248 "GRUB_FILE" => \$grub_file,
249 "GRUB_REBOOT" => \$grub_reboot,
Steven Rostedt77869542012-12-11 17:37:41 -0500250 "SYSLINUX" => \$syslinux,
251 "SYSLINUX_PATH" => \$syslinux_path,
252 "SYSLINUX_LABEL" => \$syslinux_label,
Steven Rostedte5c2ec12012-07-19 15:22:05 -0400253 "PRE_INSTALL" => \$pre_install,
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500254 "POST_INSTALL" => \$post_install,
255 "NO_INSTALL" => \$no_install,
256 "REBOOT_SCRIPT" => \$reboot_script,
257 "REBOOT_ON_ERROR" => \$reboot_on_error,
258 "SWITCH_TO_GOOD" => \$switch_to_good,
259 "SWITCH_TO_TEST" => \$switch_to_test,
260 "POWEROFF_ON_ERROR" => \$poweroff_on_error,
Steven Rostedt648a1822012-03-21 11:18:27 -0400261 "REBOOT_ON_SUCCESS" => \$reboot_on_success,
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500262 "DIE_ON_FAILURE" => \$die_on_failure,
263 "POWER_OFF" => \$power_off,
264 "POWERCYCLE_AFTER_REBOOT" => \$powercycle_after_reboot,
265 "POWEROFF_AFTER_HALT" => \$poweroff_after_halt,
Steven Rostedt407b95b2012-07-19 16:05:42 -0400266 "MAX_MONITOR_WAIT" => \$max_monitor_wait,
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500267 "SLEEP_TIME" => \$sleep_time,
268 "BISECT_SLEEP_TIME" => \$bisect_sleep_time,
269 "PATCHCHECK_SLEEP_TIME" => \$patchcheck_sleep_time,
270 "IGNORE_WARNINGS" => \$ignore_warnings,
Steven Rostedtbe405f92012-01-04 21:51:59 -0500271 "IGNORE_ERRORS" => \$ignore_errors,
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500272 "BISECT_MANUAL" => \$bisect_manual,
273 "BISECT_SKIP" => \$bisect_skip,
274 "CONFIG_BISECT_GOOD" => \$config_bisect_good,
275 "BISECT_RET_GOOD" => \$bisect_ret_good,
276 "BISECT_RET_BAD" => \$bisect_ret_bad,
277 "BISECT_RET_SKIP" => \$bisect_ret_skip,
278 "BISECT_RET_ABORT" => \$bisect_ret_abort,
279 "BISECT_RET_DEFAULT" => \$bisect_ret_default,
280 "STORE_FAILURES" => \$store_failures,
281 "STORE_SUCCESSES" => \$store_successes,
282 "TEST_NAME" => \$test_name,
283 "TIMEOUT" => \$timeout,
284 "BOOTED_TIMEOUT" => \$booted_timeout,
285 "CONSOLE" => \$console,
286 "DETECT_TRIPLE_FAULT" => \$detect_triplefault,
287 "SUCCESS_LINE" => \$success_line,
288 "REBOOT_SUCCESS_LINE" => \$reboot_success_line,
289 "STOP_AFTER_SUCCESS" => \$stop_after_success,
290 "STOP_AFTER_FAILURE" => \$stop_after_failure,
291 "STOP_TEST_AFTER" => \$stop_test_after,
292 "BUILD_TARGET" => \$build_target,
293 "SSH_EXEC" => \$ssh_exec,
294 "SCP_TO_TARGET" => \$scp_to_target,
Steven Rostedt02ad2612012-03-21 08:21:24 -0400295 "SCP_TO_TARGET_INSTALL" => \$scp_to_target_install,
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500296 "CHECKOUT" => \$checkout,
297 "TARGET_IMAGE" => \$target_image,
298 "LOCALVERSION" => \$localversion,
299
300 "BISECT_GOOD" => \$bisect_good,
301 "BISECT_BAD" => \$bisect_bad,
302 "BISECT_TYPE" => \$bisect_type,
303 "BISECT_START" => \$bisect_start,
304 "BISECT_REPLAY" => \$bisect_replay,
305 "BISECT_FILES" => \$bisect_files,
306 "BISECT_REVERSE" => \$bisect_reverse,
307 "BISECT_CHECK" => \$bisect_check,
308
309 "CONFIG_BISECT" => \$config_bisect,
310 "CONFIG_BISECT_TYPE" => \$config_bisect_type,
Steven Rostedtb0918612012-07-19 15:26:00 -0400311 "CONFIG_BISECT_CHECK" => \$config_bisect_check,
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500312
313 "PATCHCHECK_TYPE" => \$patchcheck_type,
314 "PATCHCHECK_START" => \$patchcheck_start,
315 "PATCHCHECK_END" => \$patchcheck_end,
316);
317
318# Options may be used by other options, record them.
319my %used_options;
320
Steven Rostedt7bf51072011-10-22 09:07:03 -0400321# default variables that can be used
322chomp ($variable{"PWD"} = `pwd`);
323
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500324$config_help{"MACHINE"} = << "EOF"
325 The machine hostname that you will test.
Steven Rostedtbb8474b2011-11-23 15:58:00 -0500326 For build only tests, it is still needed to differentiate log files.
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500327EOF
328 ;
329$config_help{"SSH_USER"} = << "EOF"
330 The box is expected to have ssh on normal bootup, provide the user
331 (most likely root, since you need privileged operations)
332EOF
333 ;
334$config_help{"BUILD_DIR"} = << "EOF"
335 The directory that contains the Linux source code (full path).
Steven Rostedt0e7a22d2011-11-21 20:39:33 -0500336 You can use \${PWD} that will be the path where ktest.pl is run, or use
337 \${THIS_DIR} which is assigned \${PWD} but may be changed later.
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500338EOF
339 ;
340$config_help{"OUTPUT_DIR"} = << "EOF"
341 The directory that the objects will be built (full path).
342 (can not be same as BUILD_DIR)
Steven Rostedt0e7a22d2011-11-21 20:39:33 -0500343 You can use \${PWD} that will be the path where ktest.pl is run, or use
344 \${THIS_DIR} which is assigned \${PWD} but may be changed later.
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500345EOF
346 ;
347$config_help{"BUILD_TARGET"} = << "EOF"
348 The location of the compiled file to copy to the target.
349 (relative to OUTPUT_DIR)
350EOF
351 ;
Steven Rostedtdbd37832011-11-23 16:00:48 -0500352$config_help{"BUILD_OPTIONS"} = << "EOF"
353 Options to add to \"make\" when building.
354 i.e. -j20
355EOF
356 ;
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500357$config_help{"TARGET_IMAGE"} = << "EOF"
358 The place to put your image on the test machine.
359EOF
360 ;
361$config_help{"POWER_CYCLE"} = << "EOF"
362 A script or command to reboot the box.
363
364 Here is a digital loggers power switch example
365 POWER_CYCLE = wget --no-proxy -O /dev/null -q --auth-no-challenge 'http://admin:admin\@power/outlet?5=CCL'
366
367 Here is an example to reboot a virtual box on the current host
368 with the name "Guest".
369 POWER_CYCLE = virsh destroy Guest; sleep 5; virsh start Guest
370EOF
371 ;
372$config_help{"CONSOLE"} = << "EOF"
373 The script or command that reads the console
374
375 If you use ttywatch server, something like the following would work.
376CONSOLE = nc -d localhost 3001
377
378 For a virtual machine with guest name "Guest".
379CONSOLE = virsh console Guest
380EOF
381 ;
382$config_help{"LOCALVERSION"} = << "EOF"
383 Required version ending to differentiate the test
384 from other linux builds on the system.
385EOF
386 ;
387$config_help{"REBOOT_TYPE"} = << "EOF"
388 Way to reboot the box to the test kernel.
Steven Rostedt77869542012-12-11 17:37:41 -0500389 Only valid options so far are "grub", "grub2", "syslinux", and "script".
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500390
391 If you specify grub, it will assume grub version 1
392 and will search in /boot/grub/menu.lst for the title \$GRUB_MENU
393 and select that target to reboot to the kernel. If this is not
394 your setup, then specify "script" and have a command or script
395 specified in REBOOT_SCRIPT to boot to the target.
396
397 The entry in /boot/grub/menu.lst must be entered in manually.
398 The test will not modify that file.
Steven Rostedta15ba912012-11-13 14:30:37 -0500399
400 If you specify grub2, then you also need to specify both \$GRUB_MENU
401 and \$GRUB_FILE.
Steven Rostedt77869542012-12-11 17:37:41 -0500402
403 If you specify syslinux, then you may use SYSLINUX to define the syslinux
404 command (defaults to extlinux), and SYSLINUX_PATH to specify the path to
405 the syslinux install (defaults to /boot/extlinux). But you have to specify
406 SYSLINUX_LABEL to define the label to boot to for the test kernel.
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500407EOF
408 ;
409$config_help{"GRUB_MENU"} = << "EOF"
410 The grub title name for the test kernel to boot
Steven Rostedta15ba912012-11-13 14:30:37 -0500411 (Only mandatory if REBOOT_TYPE = grub or grub2)
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500412
413 Note, ktest.pl will not update the grub menu.lst, you need to
414 manually add an option for the test. ktest.pl will search
415 the grub menu.lst for this option to find what kernel to
416 reboot into.
417
418 For example, if in the /boot/grub/menu.lst the test kernel title has:
419 title Test Kernel
420 kernel vmlinuz-test
421 GRUB_MENU = Test Kernel
Steven Rostedta15ba912012-11-13 14:30:37 -0500422
423 For grub2, a search of \$GRUB_FILE is performed for the lines
424 that begin with "menuentry". It will not detect submenus. The
425 menu must be a non-nested menu. Add the quotes used in the menu
426 to guarantee your selection, as the first menuentry with the content
427 of \$GRUB_MENU that is found will be used.
428EOF
429 ;
430$config_help{"GRUB_FILE"} = << "EOF"
431 If grub2 is used, the full path for the grub.cfg file is placed
432 here. Use something like /boot/grub2/grub.cfg to search.
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500433EOF
434 ;
Steven Rostedt77869542012-12-11 17:37:41 -0500435$config_help{"SYSLINUX_LABEL"} = << "EOF"
436 If syslinux is used, the label that boots the target kernel must
437 be specified with SYSLINUX_LABEL.
438EOF
439 ;
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500440$config_help{"REBOOT_SCRIPT"} = << "EOF"
441 A script to reboot the target into the test kernel
442 (Only mandatory if REBOOT_TYPE = script)
443EOF
444 ;
445
Steven Rostedtdad98752011-11-22 20:48:57 -0500446sub read_prompt {
447 my ($cancel, $prompt) = @_;
Steven Rostedt35ce5952011-07-15 21:57:25 -0400448
449 my $ans;
450
451 for (;;) {
Steven Rostedtdad98752011-11-22 20:48:57 -0500452 if ($cancel) {
453 print "$prompt [y/n/C] ";
454 } else {
455 print "$prompt [Y/n] ";
456 }
Steven Rostedt35ce5952011-07-15 21:57:25 -0400457 $ans = <STDIN>;
458 chomp $ans;
459 if ($ans =~ /^\s*$/) {
Steven Rostedtdad98752011-11-22 20:48:57 -0500460 if ($cancel) {
461 $ans = "c";
462 } else {
463 $ans = "y";
464 }
Steven Rostedt35ce5952011-07-15 21:57:25 -0400465 }
466 last if ($ans =~ /^y$/i || $ans =~ /^n$/i);
Steven Rostedtdad98752011-11-22 20:48:57 -0500467 if ($cancel) {
468 last if ($ans =~ /^c$/i);
469 print "Please answer either 'y', 'n' or 'c'.\n";
470 } else {
471 print "Please answer either 'y' or 'n'.\n";
472 }
473 }
474 if ($ans =~ /^c/i) {
475 exit;
Steven Rostedt35ce5952011-07-15 21:57:25 -0400476 }
477 if ($ans !~ /^y$/i) {
478 return 0;
479 }
480 return 1;
481}
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500482
Steven Rostedtdad98752011-11-22 20:48:57 -0500483sub read_yn {
484 my ($prompt) = @_;
485
486 return read_prompt 0, $prompt;
487}
488
489sub read_ync {
490 my ($prompt) = @_;
491
492 return read_prompt 1, $prompt;
493}
494
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500495sub get_ktest_config {
496 my ($config) = @_;
Steven Rostedt815e2bd2011-10-28 07:01:40 -0400497 my $ans;
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500498
499 return if (defined($opt{$config}));
500
501 if (defined($config_help{$config})) {
502 print "\n";
503 print $config_help{$config};
504 }
505
506 for (;;) {
507 print "$config = ";
Steven Rostedtdbd37832011-11-23 16:00:48 -0500508 if (defined($default{$config}) && length($default{$config})) {
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500509 print "\[$default{$config}\] ";
510 }
Steven Rostedt815e2bd2011-10-28 07:01:40 -0400511 $ans = <STDIN>;
512 $ans =~ s/^\s*(.*\S)\s*$/$1/;
513 if ($ans =~ /^\s*$/) {
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500514 if ($default{$config}) {
Steven Rostedt815e2bd2011-10-28 07:01:40 -0400515 $ans = $default{$config};
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500516 } else {
517 print "Your answer can not be blank\n";
518 next;
519 }
520 }
Steven Rostedt0e7a22d2011-11-21 20:39:33 -0500521 $entered_configs{$config} = ${ans};
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500522 last;
523 }
524}
525
526sub get_ktest_configs {
527 get_ktest_config("MACHINE");
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500528 get_ktest_config("BUILD_DIR");
529 get_ktest_config("OUTPUT_DIR");
Steven Rostedtbb8474b2011-11-23 15:58:00 -0500530
Steven Rostedtdbd37832011-11-23 16:00:48 -0500531 if ($newconfig) {
532 get_ktest_config("BUILD_OPTIONS");
533 }
534
Steven Rostedtbb8474b2011-11-23 15:58:00 -0500535 # options required for other than just building a kernel
536 if (!$buildonly) {
Steven Rostedt165708b2011-11-26 20:56:52 -0500537 get_ktest_config("POWER_CYCLE");
538 get_ktest_config("CONSOLE");
539 }
540
541 # options required for install and more
542 if ($buildonly != 1) {
Steven Rostedtbb8474b2011-11-23 15:58:00 -0500543 get_ktest_config("SSH_USER");
544 get_ktest_config("BUILD_TARGET");
545 get_ktest_config("TARGET_IMAGE");
Steven Rostedtbb8474b2011-11-23 15:58:00 -0500546 }
547
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500548 get_ktest_config("LOCALVERSION");
549
Steven Rostedtbb8474b2011-11-23 15:58:00 -0500550 return if ($buildonly);
551
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500552 my $rtype = $opt{"REBOOT_TYPE"};
553
554 if (!defined($rtype)) {
555 if (!defined($opt{"GRUB_MENU"})) {
556 get_ktest_config("REBOOT_TYPE");
557 $rtype = $entered_configs{"REBOOT_TYPE"};
558 } else {
559 $rtype = "grub";
560 }
561 }
562
563 if ($rtype eq "grub") {
564 get_ktest_config("GRUB_MENU");
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500565 }
Steven Rostedta15ba912012-11-13 14:30:37 -0500566
567 if ($rtype eq "grub2") {
568 get_ktest_config("GRUB_MENU");
569 get_ktest_config("GRUB_FILE");
570 }
Steven Rostedt77869542012-12-11 17:37:41 -0500571
572 if ($rtype eq "syslinux") {
573 get_ktest_config("SYSLINUX_LABEL");
574 }
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500575}
576
Steven Rostedt77d942c2011-05-20 13:36:58 -0400577sub process_variables {
Steven Rostedt8d735212011-10-17 11:36:44 -0400578 my ($value, $remove_undef) = @_;
Steven Rostedt77d942c2011-05-20 13:36:58 -0400579 my $retval = "";
580
581 # We want to check for '\', and it is just easier
582 # to check the previous characet of '$' and not need
583 # to worry if '$' is the first character. By adding
584 # a space to $value, we can just check [^\\]\$ and
585 # it will still work.
586 $value = " $value";
587
588 while ($value =~ /(.*?[^\\])\$\{(.*?)\}(.*)/) {
589 my $begin = $1;
590 my $var = $2;
591 my $end = $3;
592 # append beginning of value to retval
593 $retval = "$retval$begin";
594 if (defined($variable{$var})) {
595 $retval = "$retval$variable{$var}";
Steven Rostedt8d735212011-10-17 11:36:44 -0400596 } elsif (defined($remove_undef) && $remove_undef) {
597 # for if statements, any variable that is not defined,
598 # we simple convert to 0
599 $retval = "${retval}0";
Steven Rostedt77d942c2011-05-20 13:36:58 -0400600 } else {
601 # put back the origin piece.
602 $retval = "$retval\$\{$var\}";
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500603 # This could be an option that is used later, save
604 # it so we don't warn if this option is not one of
605 # ktests options.
606 $used_options{$var} = 1;
Steven Rostedt77d942c2011-05-20 13:36:58 -0400607 }
608 $value = $end;
609 }
610 $retval = "$retval$value";
611
612 # remove the space added in the beginning
613 $retval =~ s/ //;
614
615 return "$retval"
616}
617
Steven Rostedta57419b2010-11-02 15:13:54 -0400618sub set_value {
Steven Rostedt3d1cc412011-09-30 22:14:21 -0400619 my ($lvalue, $rvalue, $override, $overrides, $name) = @_;
Steven Rostedta57419b2010-11-02 15:13:54 -0400620
Steven Rostedtcad96662011-12-22 11:32:52 -0500621 my $prvalue = process_variables($rvalue);
622
623 if ($buildonly && $lvalue =~ /^TEST_TYPE(\[.*\])?$/ && $prvalue ne "build") {
Steven Rostedtbb8474b2011-11-23 15:58:00 -0500624 # Note if a test is something other than build, then we
625 # will need other manditory options.
Steven Rostedtcad96662011-12-22 11:32:52 -0500626 if ($prvalue ne "install") {
Steven Rostedt (Red Hat)319ab142013-01-30 12:25:38 -0500627 # for bisect, we need to check BISECT_TYPE
628 if ($prvalue ne "bisect") {
629 $buildonly = 0;
630 }
631 } else {
632 # install still limits some manditory options.
633 $buildonly = 2;
634 }
635 }
636
637 if ($buildonly && $lvalue =~ /^BISECT_TYPE(\[.*\])?$/ && $prvalue ne "build") {
638 if ($prvalue ne "install") {
Steven Rostedt165708b2011-11-26 20:56:52 -0500639 $buildonly = 0;
640 } else {
641 # install still limits some manditory options.
642 $buildonly = 2;
643 }
Steven Rostedtbb8474b2011-11-23 15:58:00 -0500644 }
645
Steven Rostedta57419b2010-11-02 15:13:54 -0400646 if (defined($opt{$lvalue})) {
Steven Rostedt3d1cc412011-09-30 22:14:21 -0400647 if (!$override || defined(${$overrides}{$lvalue})) {
648 my $extra = "";
649 if ($override) {
650 $extra = "In the same override section!\n";
651 }
652 die "$name: $.: Option $lvalue defined more than once!\n$extra";
653 }
Steven Rostedtcad96662011-12-22 11:32:52 -0500654 ${$overrides}{$lvalue} = $prvalue;
Steven Rostedta57419b2010-11-02 15:13:54 -0400655 }
Steven Rostedt21a96792010-11-08 16:45:50 -0500656 if ($rvalue =~ /^\s*$/) {
657 delete $opt{$lvalue};
658 } else {
Steven Rostedtcad96662011-12-22 11:32:52 -0500659 $opt{$lvalue} = $prvalue;
Steven Rostedt21a96792010-11-08 16:45:50 -0500660 }
Steven Rostedta57419b2010-11-02 15:13:54 -0400661}
662
Steven Rostedt77d942c2011-05-20 13:36:58 -0400663sub set_variable {
664 my ($lvalue, $rvalue) = @_;
665
666 if ($rvalue =~ /^\s*$/) {
667 delete $variable{$lvalue};
668 } else {
669 $rvalue = process_variables($rvalue);
670 $variable{$lvalue} = $rvalue;
671 }
672}
673
Steven Rostedtab7a3f52011-09-30 20:24:07 -0400674sub process_compare {
675 my ($lval, $cmp, $rval) = @_;
676
677 # remove whitespace
678
679 $lval =~ s/^\s*//;
680 $lval =~ s/\s*$//;
681
682 $rval =~ s/^\s*//;
683 $rval =~ s/\s*$//;
684
685 if ($cmp eq "==") {
686 return $lval eq $rval;
687 } elsif ($cmp eq "!=") {
688 return $lval ne $rval;
Steven Rostedt8fddbe92012-07-30 14:37:01 -0400689 } elsif ($cmp eq "=~") {
690 return $lval =~ m/$rval/;
691 } elsif ($cmp eq "!~") {
692 return $lval !~ m/$rval/;
Steven Rostedtab7a3f52011-09-30 20:24:07 -0400693 }
694
695 my $statement = "$lval $cmp $rval";
696 my $ret = eval $statement;
697
698 # $@ stores error of eval
699 if ($@) {
700 return -1;
701 }
702
703 return $ret;
704}
705
Steven Rostedt9900b5d2011-09-30 22:41:14 -0400706sub value_defined {
707 my ($val) = @_;
708
709 return defined($variable{$2}) ||
710 defined($opt{$2});
711}
712
Steven Rostedt8d735212011-10-17 11:36:44 -0400713my $d = 0;
714sub process_expression {
715 my ($name, $val) = @_;
Steven Rostedt45d73a52011-09-30 19:44:53 -0400716
Steven Rostedt8d735212011-10-17 11:36:44 -0400717 my $c = $d++;
718
719 while ($val =~ s/\(([^\(]*?)\)/\&\&\&\&VAL\&\&\&\&/) {
720 my $express = $1;
721
722 if (process_expression($name, $express)) {
723 $val =~ s/\&\&\&\&VAL\&\&\&\&/ 1 /;
724 } else {
725 $val =~ s/\&\&\&\&VAL\&\&\&\&/ 0 /;
726 }
727 }
728
729 $d--;
730 my $OR = "\\|\\|";
731 my $AND = "\\&\\&";
732
733 while ($val =~ s/^(.*?)($OR|$AND)//) {
734 my $express = $1;
735 my $op = $2;
736
737 if (process_expression($name, $express)) {
738 if ($op eq "||") {
739 return 1;
740 }
741 } else {
742 if ($op eq "&&") {
743 return 0;
744 }
745 }
746 }
Steven Rostedt45d73a52011-09-30 19:44:53 -0400747
Steven Rostedt8fddbe92012-07-30 14:37:01 -0400748 if ($val =~ /(.*)(==|\!=|>=|<=|>|<|=~|\!~)(.*)/) {
Steven Rostedtab7a3f52011-09-30 20:24:07 -0400749 my $ret = process_compare($1, $2, $3);
750 if ($ret < 0) {
751 die "$name: $.: Unable to process comparison\n";
752 }
753 return $ret;
754 }
755
Steven Rostedt9900b5d2011-09-30 22:41:14 -0400756 if ($val =~ /^\s*(NOT\s*)?DEFINED\s+(\S+)\s*$/) {
757 if (defined $1) {
758 return !value_defined($2);
759 } else {
760 return value_defined($2);
761 }
762 }
763
Steven Rostedt45d73a52011-09-30 19:44:53 -0400764 if ($val =~ /^\s*0\s*$/) {
765 return 0;
766 } elsif ($val =~ /^\s*\d+\s*$/) {
767 return 1;
768 }
769
Steven Rostedt9900b5d2011-09-30 22:41:14 -0400770 die ("$name: $.: Undefined content $val in if statement\n");
Steven Rostedt8d735212011-10-17 11:36:44 -0400771}
772
773sub process_if {
774 my ($name, $value) = @_;
775
776 # Convert variables and replace undefined ones with 0
777 my $val = process_variables($value, 1);
778 my $ret = process_expression $name, $val;
779
780 return $ret;
Steven Rostedt45d73a52011-09-30 19:44:53 -0400781}
782
Steven Rostedt2ed3b162011-09-30 21:00:00 -0400783sub __read_config {
784 my ($config, $current_test_num) = @_;
Steven Rostedt2545eb62010-11-02 15:01:32 -0400785
Steven Rostedt2ed3b162011-09-30 21:00:00 -0400786 my $in;
787 open($in, $config) || die "can't read file $config";
Steven Rostedt2545eb62010-11-02 15:01:32 -0400788
Steven Rostedta57419b2010-11-02 15:13:54 -0400789 my $name = $config;
790 $name =~ s,.*/(.*),$1,;
791
Steven Rostedt2ed3b162011-09-30 21:00:00 -0400792 my $test_num = $$current_test_num;
Steven Rostedta57419b2010-11-02 15:13:54 -0400793 my $default = 1;
794 my $repeat = 1;
795 my $num_tests_set = 0;
796 my $skip = 0;
797 my $rest;
Steven Rostedta9f84422011-10-17 11:06:29 -0400798 my $line;
Steven Rostedt0df213c2011-06-14 20:51:37 -0400799 my $test_case = 0;
Steven Rostedt45d73a52011-09-30 19:44:53 -0400800 my $if = 0;
801 my $if_set = 0;
Steven Rostedt3d1cc412011-09-30 22:14:21 -0400802 my $override = 0;
803
804 my %overrides;
Steven Rostedta57419b2010-11-02 15:13:54 -0400805
Steven Rostedt2ed3b162011-09-30 21:00:00 -0400806 while (<$in>) {
Steven Rostedt2545eb62010-11-02 15:01:32 -0400807
808 # ignore blank lines and comments
809 next if (/^\s*$/ || /\s*\#/);
810
Steven Rostedt0050b6b2011-09-30 21:10:30 -0400811 if (/^\s*(TEST_START|DEFAULTS)\b(.*)/) {
Steven Rostedta57419b2010-11-02 15:13:54 -0400812
Steven Rostedt0050b6b2011-09-30 21:10:30 -0400813 my $type = $1;
814 $rest = $2;
Steven Rostedta9f84422011-10-17 11:06:29 -0400815 $line = $2;
Steven Rostedta57419b2010-11-02 15:13:54 -0400816
Steven Rostedt0050b6b2011-09-30 21:10:30 -0400817 my $old_test_num;
818 my $old_repeat;
Steven Rostedt3d1cc412011-09-30 22:14:21 -0400819 $override = 0;
Steven Rostedt0050b6b2011-09-30 21:10:30 -0400820
821 if ($type eq "TEST_START") {
822
823 if ($num_tests_set) {
824 die "$name: $.: Can not specify both NUM_TESTS and TEST_START\n";
825 }
826
827 $old_test_num = $test_num;
828 $old_repeat = $repeat;
829
830 $test_num += $repeat;
831 $default = 0;
832 $repeat = 1;
833 } else {
834 $default = 1;
Steven Rostedta57419b2010-11-02 15:13:54 -0400835 }
836
Steven Rostedta9f84422011-10-17 11:06:29 -0400837 # If SKIP is anywhere in the line, the command will be skipped
838 if ($rest =~ s/\s+SKIP\b//) {
Steven Rostedta57419b2010-11-02 15:13:54 -0400839 $skip = 1;
840 } else {
Steven Rostedt0df213c2011-06-14 20:51:37 -0400841 $test_case = 1;
Steven Rostedta57419b2010-11-02 15:13:54 -0400842 $skip = 0;
843 }
844
Steven Rostedta9f84422011-10-17 11:06:29 -0400845 if ($rest =~ s/\sELSE\b//) {
846 if (!$if) {
847 die "$name: $.: ELSE found with out matching IF section\n$_";
848 }
849 $if = 0;
850
851 if ($if_set) {
852 $skip = 1;
853 } else {
854 $skip = 0;
Steven Rostedt3d1cc412011-09-30 22:14:21 -0400855 }
Steven Rostedta57419b2010-11-02 15:13:54 -0400856 }
857
Steven Rostedta9f84422011-10-17 11:06:29 -0400858 if ($rest =~ s/\sIF\s+(.*)//) {
Steven Rostedt45d73a52011-09-30 19:44:53 -0400859 if (process_if($name, $1)) {
860 $if_set = 1;
861 } else {
862 $skip = 1;
863 }
864 $if = 1;
865 } else {
866 $if = 0;
Steven Rostedta9f84422011-10-17 11:06:29 -0400867 $if_set = 0;
Steven Rostedta57419b2010-11-02 15:13:54 -0400868 }
869
Steven Rostedta9f84422011-10-17 11:06:29 -0400870 if (!$skip) {
871 if ($type eq "TEST_START") {
872 if ($rest =~ s/\s+ITERATE\s+(\d+)//) {
873 $repeat = $1;
874 $repeat_tests{"$test_num"} = $repeat;
875 }
876 } elsif ($rest =~ s/\sOVERRIDE\b//) {
877 # DEFAULT only
878 $override = 1;
879 # Clear previous overrides
880 %overrides = ();
881 }
882 }
883
884 if (!$skip && $rest !~ /^\s*$/) {
Steven Rostedt0050b6b2011-09-30 21:10:30 -0400885 die "$name: $.: Gargbage found after $type\n$_";
Steven Rostedta57419b2010-11-02 15:13:54 -0400886 }
887
Steven Rostedt0050b6b2011-09-30 21:10:30 -0400888 if ($skip && $type eq "TEST_START") {
Steven Rostedta57419b2010-11-02 15:13:54 -0400889 $test_num = $old_test_num;
Steven Rostedte48c5292010-11-02 14:35:37 -0400890 $repeat = $old_repeat;
Steven Rostedta57419b2010-11-02 15:13:54 -0400891 }
892
Steven Rostedtab7a3f52011-09-30 20:24:07 -0400893 } elsif (/^\s*ELSE\b(.*)$/) {
Steven Rostedt45d73a52011-09-30 19:44:53 -0400894 if (!$if) {
895 die "$name: $.: ELSE found with out matching IF section\n$_";
896 }
897 $rest = $1;
898 if ($if_set) {
899 $skip = 1;
Steven Rostedtab7a3f52011-09-30 20:24:07 -0400900 $rest = "";
Steven Rostedt45d73a52011-09-30 19:44:53 -0400901 } else {
902 $skip = 0;
903
Steven Rostedtab7a3f52011-09-30 20:24:07 -0400904 if ($rest =~ /\sIF\s+(.*)/) {
Steven Rostedt45d73a52011-09-30 19:44:53 -0400905 # May be a ELSE IF section.
Steven Rostedt95f57832012-09-26 14:48:17 -0400906 if (process_if($name, $1)) {
907 $if_set = 1;
908 } else {
Steven Rostedt45d73a52011-09-30 19:44:53 -0400909 $skip = 1;
910 }
Steven Rostedtab7a3f52011-09-30 20:24:07 -0400911 $rest = "";
Steven Rostedt45d73a52011-09-30 19:44:53 -0400912 } else {
913 $if = 0;
914 }
915 }
916
Steven Rostedtab7a3f52011-09-30 20:24:07 -0400917 if ($rest !~ /^\s*$/) {
918 die "$name: $.: Gargbage found after DEFAULTS\n$_";
919 }
920
Steven Rostedt2ed3b162011-09-30 21:00:00 -0400921 } elsif (/^\s*INCLUDE\s+(\S+)/) {
922
923 next if ($skip);
924
925 if (!$default) {
926 die "$name: $.: INCLUDE can only be done in default sections\n$_";
927 }
928
929 my $file = process_variables($1);
930
931 if ($file !~ m,^/,) {
932 # check the path of the config file first
933 if ($config =~ m,(.*)/,) {
934 if (-f "$1/$file") {
935 $file = "$1/$file";
936 }
937 }
938 }
939
940 if ( ! -r $file ) {
941 die "$name: $.: Can't read file $file\n$_";
942 }
943
944 if (__read_config($file, \$test_num)) {
945 $test_case = 1;
946 }
947
Steven Rostedta57419b2010-11-02 15:13:54 -0400948 } elsif (/^\s*([A-Z_\[\]\d]+)\s*=\s*(.*?)\s*$/) {
949
950 next if ($skip);
951
Steven Rostedt2545eb62010-11-02 15:01:32 -0400952 my $lvalue = $1;
953 my $rvalue = $2;
954
Steven Rostedta57419b2010-11-02 15:13:54 -0400955 if (!$default &&
956 ($lvalue eq "NUM_TESTS" ||
957 $lvalue eq "LOG_FILE" ||
958 $lvalue eq "CLEAR_LOG")) {
959 die "$name: $.: $lvalue must be set in DEFAULTS section\n";
Steven Rostedta75fece2010-11-02 14:58:27 -0400960 }
Steven Rostedta57419b2010-11-02 15:13:54 -0400961
962 if ($lvalue eq "NUM_TESTS") {
963 if ($test_num) {
964 die "$name: $.: Can not specify both NUM_TESTS and TEST_START\n";
965 }
966 if (!$default) {
967 die "$name: $.: NUM_TESTS must be set in default section\n";
968 }
969 $num_tests_set = 1;
970 }
971
972 if ($default || $lvalue =~ /\[\d+\]$/) {
Steven Rostedt3d1cc412011-09-30 22:14:21 -0400973 set_value($lvalue, $rvalue, $override, \%overrides, $name);
Steven Rostedta57419b2010-11-02 15:13:54 -0400974 } else {
975 my $val = "$lvalue\[$test_num\]";
Steven Rostedt3d1cc412011-09-30 22:14:21 -0400976 set_value($val, $rvalue, $override, \%overrides, $name);
Steven Rostedta57419b2010-11-02 15:13:54 -0400977
978 if ($repeat > 1) {
979 $repeats{$val} = $repeat;
980 }
981 }
Steven Rostedt77d942c2011-05-20 13:36:58 -0400982 } elsif (/^\s*([A-Z_\[\]\d]+)\s*:=\s*(.*?)\s*$/) {
983 next if ($skip);
984
985 my $lvalue = $1;
986 my $rvalue = $2;
987
988 # process config variables.
989 # Config variables are only active while reading the
990 # config and can be defined anywhere. They also ignore
991 # TEST_START and DEFAULTS, but are skipped if they are in
992 # on of these sections that have SKIP defined.
993 # The save variable can be
994 # defined multiple times and the new one simply overrides
995 # the prevous one.
996 set_variable($lvalue, $rvalue);
997
Steven Rostedta57419b2010-11-02 15:13:54 -0400998 } else {
999 die "$name: $.: Garbage found in config\n$_";
Steven Rostedt2545eb62010-11-02 15:01:32 -04001000 }
1001 }
1002
Steven Rostedta57419b2010-11-02 15:13:54 -04001003 if ($test_num) {
1004 $test_num += $repeat - 1;
1005 $opt{"NUM_TESTS"} = $test_num;
1006 }
1007
Steven Rostedt2ed3b162011-09-30 21:00:00 -04001008 close($in);
1009
1010 $$current_test_num = $test_num;
1011
1012 return $test_case;
1013}
1014
Steven Rostedtc4261d02011-11-23 13:41:18 -05001015sub get_test_case {
1016 print "What test case would you like to run?\n";
1017 print " (build, install or boot)\n";
1018 print " Other tests are available but require editing the config file\n";
1019 my $ans = <STDIN>;
1020 chomp $ans;
1021 $default{"TEST_TYPE"} = $ans;
1022}
1023
Steven Rostedt2ed3b162011-09-30 21:00:00 -04001024sub read_config {
1025 my ($config) = @_;
1026
1027 my $test_case;
1028 my $test_num = 0;
1029
1030 $test_case = __read_config $config, \$test_num;
1031
Steven Rostedt8d1491b2010-11-18 15:39:48 -05001032 # make sure we have all mandatory configs
1033 get_ktest_configs;
1034
Steven Rostedt0df213c2011-06-14 20:51:37 -04001035 # was a test specified?
1036 if (!$test_case) {
1037 print "No test case specified.\n";
Steven Rostedtc4261d02011-11-23 13:41:18 -05001038 get_test_case;
Steven Rostedt0df213c2011-06-14 20:51:37 -04001039 }
1040
Steven Rostedta75fece2010-11-02 14:58:27 -04001041 # set any defaults
1042
1043 foreach my $default (keys %default) {
1044 if (!defined($opt{$default})) {
1045 $opt{$default} = $default{$default};
1046 }
1047 }
Steven Rostedt9cc9e092011-12-22 21:37:22 -05001048
1049 if ($opt{"IGNORE_UNUSED"} == 1) {
1050 return;
1051 }
1052
1053 my %not_used;
1054
1055 # check if there are any stragglers (typos?)
1056 foreach my $option (keys %opt) {
1057 my $op = $option;
1058 # remove per test labels.
1059 $op =~ s/\[.*\]//;
1060 if (!exists($option_map{$op}) &&
1061 !exists($default{$op}) &&
1062 !exists($used_options{$op})) {
1063 $not_used{$op} = 1;
1064 }
1065 }
1066
1067 if (%not_used) {
1068 my $s = "s are";
1069 $s = " is" if (keys %not_used == 1);
1070 print "The following option$s not used; could be a typo:\n";
1071 foreach my $option (keys %not_used) {
1072 print "$option\n";
1073 }
1074 print "Set IGRNORE_UNUSED = 1 to have ktest ignore unused variables\n";
1075 if (!read_yn "Do you want to continue?") {
1076 exit -1;
1077 }
1078 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04001079}
1080
Steven Rostedt23715c3c2011-06-13 11:03:34 -04001081sub __eval_option {
Steven Rostedt (Red Hat)04262be2013-01-31 10:12:20 -05001082 my ($name, $option, $i) = @_;
Steven Rostedt23715c3c2011-06-13 11:03:34 -04001083
1084 # Add space to evaluate the character before $
1085 $option = " $option";
1086 my $retval = "";
Rabin Vincentf9dfb652011-11-18 17:05:30 +05301087 my $repeated = 0;
1088 my $parent = 0;
1089
1090 foreach my $test (keys %repeat_tests) {
1091 if ($i >= $test &&
1092 $i < $test + $repeat_tests{$test}) {
1093
1094 $repeated = 1;
1095 $parent = $test;
1096 last;
1097 }
1098 }
Steven Rostedt23715c3c2011-06-13 11:03:34 -04001099
1100 while ($option =~ /(.*?[^\\])\$\{(.*?)\}(.*)/) {
1101 my $start = $1;
1102 my $var = $2;
1103 my $end = $3;
1104
1105 # Append beginning of line
1106 $retval = "$retval$start";
1107
1108 # If the iteration option OPT[$i] exists, then use that.
1109 # otherwise see if the default OPT (without [$i]) exists.
1110
1111 my $o = "$var\[$i\]";
Rabin Vincentf9dfb652011-11-18 17:05:30 +05301112 my $parento = "$var\[$parent\]";
Steven Rostedt23715c3c2011-06-13 11:03:34 -04001113
Steven Rostedt (Red Hat)04262be2013-01-31 10:12:20 -05001114 # If a variable contains itself, use the default var
1115 if (($var eq $name) && defined($opt{$var})) {
1116 $o = $opt{$var};
1117 $retval = "$retval$o";
1118 } elsif (defined($opt{$o})) {
Steven Rostedt23715c3c2011-06-13 11:03:34 -04001119 $o = $opt{$o};
1120 $retval = "$retval$o";
Rabin Vincentf9dfb652011-11-18 17:05:30 +05301121 } elsif ($repeated && defined($opt{$parento})) {
1122 $o = $opt{$parento};
1123 $retval = "$retval$o";
Steven Rostedt23715c3c2011-06-13 11:03:34 -04001124 } elsif (defined($opt{$var})) {
1125 $o = $opt{$var};
1126 $retval = "$retval$o";
1127 } else {
1128 $retval = "$retval\$\{$var\}";
1129 }
1130
1131 $option = $end;
1132 }
1133
1134 $retval = "$retval$option";
1135
1136 $retval =~ s/^ //;
1137
1138 return $retval;
1139}
1140
1141sub eval_option {
Steven Rostedt (Red Hat)04262be2013-01-31 10:12:20 -05001142 my ($name, $option, $i) = @_;
Steven Rostedt23715c3c2011-06-13 11:03:34 -04001143
1144 my $prev = "";
1145
1146 # Since an option can evaluate to another option,
1147 # keep iterating until we do not evaluate any more
1148 # options.
1149 my $r = 0;
1150 while ($prev ne $option) {
1151 # Check for recursive evaluations.
1152 # 100 deep should be more than enough.
1153 if ($r++ > 100) {
1154 die "Over 100 evaluations accurred with $option\n" .
1155 "Check for recursive variables\n";
1156 }
1157 $prev = $option;
Steven Rostedt (Red Hat)04262be2013-01-31 10:12:20 -05001158 $option = __eval_option($name, $option, $i);
Steven Rostedt23715c3c2011-06-13 11:03:34 -04001159 }
1160
1161 return $option;
1162}
1163
Steven Rostedtd1e2f222010-11-08 16:39:57 -05001164sub _logit {
Steven Rostedt2545eb62010-11-02 15:01:32 -04001165 if (defined($opt{"LOG_FILE"})) {
1166 open(OUT, ">> $opt{LOG_FILE}") or die "Can't write to $opt{LOG_FILE}";
1167 print OUT @_;
1168 close(OUT);
1169 }
1170}
1171
Steven Rostedtd1e2f222010-11-08 16:39:57 -05001172sub logit {
1173 if (defined($opt{"LOG_FILE"})) {
1174 _logit @_;
1175 } else {
1176 print @_;
1177 }
1178}
1179
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001180sub doprint {
1181 print @_;
Steven Rostedtd1e2f222010-11-08 16:39:57 -05001182 _logit @_;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001183}
1184
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001185sub run_command;
Andrew Jones2728be42011-08-12 15:32:05 +02001186sub start_monitor;
1187sub end_monitor;
1188sub wait_for_monitor;
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001189
1190sub reboot {
Andrew Jones2728be42011-08-12 15:32:05 +02001191 my ($time) = @_;
1192
Steven Rostedta4968722012-12-11 14:59:05 -05001193 # Make sure everything has been written to disk
1194 run_ssh("sync");
1195
Steven Rostedt2b803362011-09-30 18:00:23 -04001196 if (defined($time)) {
1197 start_monitor;
1198 # flush out current monitor
1199 # May contain the reboot success line
1200 wait_for_monitor 1;
1201 }
1202
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001203 # try to reboot normally
Steven Rostedte48c5292010-11-02 14:35:37 -04001204 if (run_command $reboot) {
Steven Rostedt576f6272010-11-02 14:58:38 -04001205 if (defined($powercycle_after_reboot)) {
1206 sleep $powercycle_after_reboot;
1207 run_command "$power_cycle";
1208 }
1209 } else {
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001210 # nope? power cycle it.
Steven Rostedta75fece2010-11-02 14:58:27 -04001211 run_command "$power_cycle";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001212 }
Andrew Jones2728be42011-08-12 15:32:05 +02001213
1214 if (defined($time)) {
Steven Rostedt (Red Hat)4c0b67a2013-02-05 09:56:00 -05001215
1216 # We only want to get to the new kernel, don't fail
1217 # if we stumble over a call trace.
1218 my $save_ignore_errors = $ignore_errors;
1219 $ignore_errors = 1;
1220
Steven Rostedt (Red Hat)d6845532013-02-04 23:08:49 -05001221 # Look for the good kernel to boot
1222 if (wait_for_monitor($time, "Linux version")) {
Steven Rostedt407b95b2012-07-19 16:05:42 -04001223 # reboot got stuck?
Steven Rostedt8a80c722012-07-19 16:08:33 -04001224 doprint "Reboot did not finish. Forcing power cycle\n";
Steven Rostedt407b95b2012-07-19 16:05:42 -04001225 run_command "$power_cycle";
1226 }
Steven Rostedt (Red Hat)d6845532013-02-04 23:08:49 -05001227
Steven Rostedt (Red Hat)4c0b67a2013-02-05 09:56:00 -05001228 $ignore_errors = $save_ignore_errors;
1229
Steven Rostedt (Red Hat)d6845532013-02-04 23:08:49 -05001230 # Still need to wait for the reboot to finish
1231 wait_for_monitor($time, $reboot_success_line);
1232
Andrew Jones2728be42011-08-12 15:32:05 +02001233 end_monitor;
1234 }
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001235}
1236
Steven Rostedtbc7c5802011-12-22 16:29:10 -05001237sub reboot_to_good {
1238 my ($time) = @_;
1239
1240 if (defined($switch_to_good)) {
1241 run_command $switch_to_good;
Steven Rostedtbc7c5802011-12-22 16:29:10 -05001242 }
1243
1244 reboot $time;
1245}
1246
Steven Rostedt576f6272010-11-02 14:58:38 -04001247sub do_not_reboot {
1248 my $i = $iteration;
1249
Steven Rostedt4ab1cce2011-09-30 18:12:20 -04001250 return $test_type eq "build" || $no_reboot ||
Steven Rostedt576f6272010-11-02 14:58:38 -04001251 ($test_type eq "patchcheck" && $opt{"PATCHCHECK_TYPE[$i]"} eq "build") ||
1252 ($test_type eq "bisect" && $opt{"BISECT_TYPE[$i]"} eq "build");
1253}
1254
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001255sub dodie {
Steven Rostedt5a391fb2010-11-02 14:57:43 -04001256 doprint "CRITICAL FAILURE... ", @_, "\n";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001257
Steven Rostedt576f6272010-11-02 14:58:38 -04001258 my $i = $iteration;
1259
1260 if ($reboot_on_error && !do_not_reboot) {
1261
Steven Rostedt75c3fda72010-11-02 14:57:21 -04001262 doprint "REBOOTING\n";
Steven Rostedtbc7c5802011-12-22 16:29:10 -05001263 reboot_to_good;
Steven Rostedt75c3fda72010-11-02 14:57:21 -04001264
Steven Rostedta75fece2010-11-02 14:58:27 -04001265 } elsif ($poweroff_on_error && defined($power_off)) {
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001266 doprint "POWERING OFF\n";
Steven Rostedta75fece2010-11-02 14:58:27 -04001267 `$power_off`;
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001268 }
Steven Rostedt75c3fda72010-11-02 14:57:21 -04001269
Steven Rostedtf80802c2011-03-07 13:18:47 -05001270 if (defined($opt{"LOG_FILE"})) {
1271 print " See $opt{LOG_FILE} for more info.\n";
1272 }
1273
Steven Rostedt576f6272010-11-02 14:58:38 -04001274 die @_, "\n";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001275}
1276
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001277sub open_console {
1278 my ($fp) = @_;
1279
1280 my $flags;
1281
Steven Rostedta75fece2010-11-02 14:58:27 -04001282 my $pid = open($fp, "$console|") or
1283 dodie "Can't open console $console";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001284
1285 $flags = fcntl($fp, F_GETFL, 0) or
Steven Rostedt576f6272010-11-02 14:58:38 -04001286 dodie "Can't get flags for the socket: $!";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001287 $flags = fcntl($fp, F_SETFL, $flags | O_NONBLOCK) or
Steven Rostedt576f6272010-11-02 14:58:38 -04001288 dodie "Can't set flags for the socket: $!";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001289
1290 return $pid;
1291}
1292
1293sub close_console {
1294 my ($fp, $pid) = @_;
1295
1296 doprint "kill child process $pid\n";
1297 kill 2, $pid;
1298
1299 print "closing!\n";
1300 close($fp);
1301}
1302
1303sub start_monitor {
1304 if ($monitor_cnt++) {
1305 return;
1306 }
1307 $monitor_fp = \*MONFD;
1308 $monitor_pid = open_console $monitor_fp;
Steven Rostedta75fece2010-11-02 14:58:27 -04001309
1310 return;
1311
1312 open(MONFD, "Stop perl from warning about single use of MONFD");
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001313}
1314
1315sub end_monitor {
Steven Rostedt (Red Hat)319ab142013-01-30 12:25:38 -05001316 return if (!defined $console);
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001317 if (--$monitor_cnt) {
1318 return;
1319 }
1320 close_console($monitor_fp, $monitor_pid);
1321}
1322
1323sub wait_for_monitor {
Steven Rostedt2b803362011-09-30 18:00:23 -04001324 my ($time, $stop) = @_;
1325 my $full_line = "";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001326 my $line;
Steven Rostedt2b803362011-09-30 18:00:23 -04001327 my $booted = 0;
Steven Rostedt407b95b2012-07-19 16:05:42 -04001328 my $start_time = time;
Steven Rostedt8a80c722012-07-19 16:08:33 -04001329 my $skip_call_trace = 0;
1330 my $bug = 0;
1331 my $bug_ignored = 0;
Steven Rostedt407b95b2012-07-19 16:05:42 -04001332 my $now;
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001333
Steven Rostedta75fece2010-11-02 14:58:27 -04001334 doprint "** Wait for monitor to settle down **\n";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001335
1336 # read the monitor and wait for the system to calm down
Steven Rostedt2b803362011-09-30 18:00:23 -04001337 while (!$booted) {
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001338 $line = wait_for_input($monitor_fp, $time);
Steven Rostedt2b803362011-09-30 18:00:23 -04001339 last if (!defined($line));
1340 print "$line";
1341 $full_line .= $line;
1342
1343 if (defined($stop) && $full_line =~ /$stop/) {
1344 doprint "wait for monitor detected $stop\n";
1345 $booted = 1;
1346 }
1347
Steven Rostedt8a80c722012-07-19 16:08:33 -04001348 if ($full_line =~ /\[ backtrace testing \]/) {
1349 $skip_call_trace = 1;
1350 }
1351
1352 if ($full_line =~ /call trace:/i) {
1353 if (!$bug && !$skip_call_trace) {
1354 if ($ignore_errors) {
1355 $bug_ignored = 1;
1356 } else {
1357 $bug = 1;
1358 }
1359 }
1360 }
1361
1362 if ($full_line =~ /\[ end of backtrace testing \]/) {
1363 $skip_call_trace = 0;
1364 }
1365
1366 if ($full_line =~ /Kernel panic -/) {
1367 $bug = 1;
1368 }
1369
Steven Rostedt2b803362011-09-30 18:00:23 -04001370 if ($line =~ /\n/) {
1371 $full_line = "";
1372 }
Steven Rostedt407b95b2012-07-19 16:05:42 -04001373 $now = time;
1374 if ($now - $start_time >= $max_monitor_wait) {
1375 doprint "Exiting monitor flush due to hitting MAX_MONITOR_WAIT\n";
1376 return 1;
1377 }
Steven Rostedt2b803362011-09-30 18:00:23 -04001378 }
Steven Rostedta75fece2010-11-02 14:58:27 -04001379 print "** Monitor flushed **\n";
Steven Rostedt8a80c722012-07-19 16:08:33 -04001380 return $bug;
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001381}
1382
Rabin Vincentde5b6e32011-11-18 17:05:31 +05301383sub save_logs {
1384 my ($result, $basedir) = @_;
1385 my @t = localtime;
1386 my $date = sprintf "%04d%02d%02d%02d%02d%02d",
1387 1900+$t[5],$t[4],$t[3],$t[2],$t[1],$t[0];
1388
1389 my $type = $build_type;
1390 if ($type =~ /useconfig/) {
1391 $type = "useconfig";
1392 }
1393
1394 my $dir = "$machine-$test_type-$type-$result-$date";
1395
1396 $dir = "$basedir/$dir";
1397
1398 if (!-d $dir) {
1399 mkpath($dir) or
1400 die "can't create $dir";
1401 }
1402
1403 my %files = (
1404 "config" => $output_config,
1405 "buildlog" => $buildlog,
1406 "dmesg" => $dmesg,
1407 "testlog" => $testlog,
1408 );
1409
1410 while (my ($name, $source) = each(%files)) {
1411 if (-f "$source") {
1412 cp "$source", "$dir/$name" or
1413 die "failed to copy $source";
1414 }
1415 }
1416
1417 doprint "*** Saved info to $dir ***\n";
1418}
1419
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001420sub fail {
1421
Steven Rostedt921ed4c2012-07-19 15:18:27 -04001422 if (defined($post_test)) {
1423 run_command $post_test;
1424 }
1425
Steven Rostedta75fece2010-11-02 14:58:27 -04001426 if ($die_on_failure) {
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001427 dodie @_;
1428 }
1429
Steven Rostedta75fece2010-11-02 14:58:27 -04001430 doprint "FAILED\n";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001431
Steven Rostedt576f6272010-11-02 14:58:38 -04001432 my $i = $iteration;
1433
Steven Rostedta75fece2010-11-02 14:58:27 -04001434 # no need to reboot for just building.
Steven Rostedt576f6272010-11-02 14:58:38 -04001435 if (!do_not_reboot) {
Steven Rostedta75fece2010-11-02 14:58:27 -04001436 doprint "REBOOTING\n";
Steven Rostedtbc7c5802011-12-22 16:29:10 -05001437 reboot_to_good $sleep_time;
Steven Rostedta75fece2010-11-02 14:58:27 -04001438 }
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001439
Steven Rostedt9064af52011-06-13 10:38:48 -04001440 my $name = "";
1441
1442 if (defined($test_name)) {
1443 $name = " ($test_name)";
1444 }
1445
Steven Rostedt576f6272010-11-02 14:58:38 -04001446 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
1447 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
Steven Rostedt9064af52011-06-13 10:38:48 -04001448 doprint "KTEST RESULT: TEST $i$name Failed: ", @_, "\n";
Steven Rostedt576f6272010-11-02 14:58:38 -04001449 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
1450 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
Steven Rostedta75fece2010-11-02 14:58:27 -04001451
Rabin Vincentde5b6e32011-11-18 17:05:31 +05301452 if (defined($store_failures)) {
1453 save_logs "fail", $store_failures;
1454 }
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001455
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001456 return 1;
1457}
1458
Steven Rostedt2545eb62010-11-02 15:01:32 -04001459sub run_command {
1460 my ($command) = @_;
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001461 my $dolog = 0;
1462 my $dord = 0;
1463 my $pid;
1464
Steven Rostedte48c5292010-11-02 14:35:37 -04001465 $command =~ s/\$SSH_USER/$ssh_user/g;
1466 $command =~ s/\$MACHINE/$machine/g;
1467
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001468 doprint("$command ... ");
1469
1470 $pid = open(CMD, "$command 2>&1 |") or
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001471 (fail "unable to exec $command" and return 0);
Steven Rostedt2545eb62010-11-02 15:01:32 -04001472
1473 if (defined($opt{"LOG_FILE"})) {
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001474 open(LOG, ">>$opt{LOG_FILE}") or
1475 dodie "failed to write to log";
1476 $dolog = 1;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04001477 }
1478
1479 if (defined($redirect)) {
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001480 open (RD, ">$redirect") or
1481 dodie "failed to write to redirect $redirect";
1482 $dord = 1;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001483 }
1484
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001485 while (<CMD>) {
1486 print LOG if ($dolog);
1487 print RD if ($dord);
1488 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04001489
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001490 waitpid($pid, 0);
Steven Rostedt2545eb62010-11-02 15:01:32 -04001491 my $failed = $?;
1492
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001493 close(CMD);
1494 close(LOG) if ($dolog);
1495 close(RD) if ($dord);
1496
Steven Rostedt2545eb62010-11-02 15:01:32 -04001497 if ($failed) {
1498 doprint "FAILED!\n";
1499 } else {
1500 doprint "SUCCESS\n";
1501 }
1502
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001503 return !$failed;
1504}
1505
Steven Rostedte48c5292010-11-02 14:35:37 -04001506sub run_ssh {
1507 my ($cmd) = @_;
1508 my $cp_exec = $ssh_exec;
1509
1510 $cp_exec =~ s/\$SSH_COMMAND/$cmd/g;
1511 return run_command "$cp_exec";
1512}
1513
1514sub run_scp {
Steven Rostedt02ad2612012-03-21 08:21:24 -04001515 my ($src, $dst, $cp_scp) = @_;
Steven Rostedte48c5292010-11-02 14:35:37 -04001516
1517 $cp_scp =~ s/\$SRC_FILE/$src/g;
1518 $cp_scp =~ s/\$DST_FILE/$dst/g;
1519
1520 return run_command "$cp_scp";
1521}
1522
Steven Rostedt02ad2612012-03-21 08:21:24 -04001523sub run_scp_install {
1524 my ($src, $dst) = @_;
1525
1526 my $cp_scp = $scp_to_target_install;
1527
1528 return run_scp($src, $dst, $cp_scp);
1529}
1530
1531sub run_scp_mod {
1532 my ($src, $dst) = @_;
1533
1534 my $cp_scp = $scp_to_target;
1535
1536 return run_scp($src, $dst, $cp_scp);
1537}
1538
Steven Rostedta15ba912012-11-13 14:30:37 -05001539sub get_grub2_index {
1540
1541 return if (defined($grub_number));
1542
1543 doprint "Find grub2 menu ... ";
1544 $grub_number = -1;
1545
1546 my $ssh_grub = $ssh_exec;
1547 $ssh_grub =~ s,\$SSH_COMMAND,cat $grub_file,g;
1548
1549 open(IN, "$ssh_grub |")
1550 or die "unable to get $grub_file";
1551
1552 my $found = 0;
1553
1554 while (<IN>) {
1555 if (/^menuentry.*$grub_menu/) {
1556 $grub_number++;
1557 $found = 1;
1558 last;
1559 } elsif (/^menuentry\s/) {
1560 $grub_number++;
1561 }
1562 }
1563 close(IN);
1564
1565 die "Could not find '$grub_menu' in $grub_file on $machine"
1566 if (!$found);
1567 doprint "$grub_number\n";
1568}
1569
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001570sub get_grub_index {
1571
Steven Rostedta15ba912012-11-13 14:30:37 -05001572 if ($reboot_type eq "grub2") {
1573 get_grub2_index;
1574 return;
1575 }
1576
Steven Rostedta75fece2010-11-02 14:58:27 -04001577 if ($reboot_type ne "grub") {
1578 return;
1579 }
Steven Rostedt5a391fb2010-11-02 14:57:43 -04001580 return if (defined($grub_number));
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001581
1582 doprint "Find grub menu ... ";
1583 $grub_number = -1;
Steven Rostedte48c5292010-11-02 14:35:37 -04001584
1585 my $ssh_grub = $ssh_exec;
1586 $ssh_grub =~ s,\$SSH_COMMAND,cat /boot/grub/menu.lst,g;
1587
1588 open(IN, "$ssh_grub |")
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001589 or die "unable to get menu.lst";
Steven Rostedte48c5292010-11-02 14:35:37 -04001590
Steven Rostedteaa1fe22011-09-14 17:20:39 -04001591 my $found = 0;
1592
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001593 while (<IN>) {
Steven Rostedta75fece2010-11-02 14:58:27 -04001594 if (/^\s*title\s+$grub_menu\s*$/) {
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001595 $grub_number++;
Steven Rostedteaa1fe22011-09-14 17:20:39 -04001596 $found = 1;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001597 last;
1598 } elsif (/^\s*title\s/) {
1599 $grub_number++;
1600 }
1601 }
1602 close(IN);
1603
Steven Rostedta75fece2010-11-02 14:58:27 -04001604 die "Could not find '$grub_menu' in /boot/grub/menu on $machine"
Steven Rostedteaa1fe22011-09-14 17:20:39 -04001605 if (!$found);
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001606 doprint "$grub_number\n";
Steven Rostedt2545eb62010-11-02 15:01:32 -04001607}
1608
Steven Rostedt2545eb62010-11-02 15:01:32 -04001609sub wait_for_input
1610{
1611 my ($fp, $time) = @_;
1612 my $rin;
1613 my $ready;
1614 my $line;
1615 my $ch;
1616
1617 if (!defined($time)) {
1618 $time = $timeout;
1619 }
1620
1621 $rin = '';
1622 vec($rin, fileno($fp), 1) = 1;
Steven Rostedt (Red Hat)319ab142013-01-30 12:25:38 -05001623 ($ready, $time) = select($rin, undef, undef, $time);
Steven Rostedt2545eb62010-11-02 15:01:32 -04001624
1625 $line = "";
1626
1627 # try to read one char at a time
1628 while (sysread $fp, $ch, 1) {
1629 $line .= $ch;
1630 last if ($ch eq "\n");
1631 }
1632
1633 if (!length($line)) {
1634 return undef;
1635 }
1636
1637 return $line;
1638}
1639
Steven Rostedt75c3fda72010-11-02 14:57:21 -04001640sub reboot_to {
Steven Rostedtbc7c5802011-12-22 16:29:10 -05001641 if (defined($switch_to_test)) {
1642 run_command $switch_to_test;
1643 }
1644
Steven Rostedta75fece2010-11-02 14:58:27 -04001645 if ($reboot_type eq "grub") {
Steven Rostedtc54367f2011-10-20 09:56:41 -04001646 run_ssh "'(echo \"savedefault --default=$grub_number --once\" | grub --batch)'";
Steven Rostedta15ba912012-11-13 14:30:37 -05001647 } elsif ($reboot_type eq "grub2") {
1648 run_ssh "$grub_reboot $grub_number";
Steven Rostedt77869542012-12-11 17:37:41 -05001649 } elsif ($reboot_type eq "syslinux") {
1650 run_ssh "$syslinux --once \\\"$syslinux_label\\\" $syslinux_path";
Steven Rostedt96f6a0d2011-12-23 00:24:51 -05001651 } elsif (defined $reboot_script) {
1652 run_command "$reboot_script";
Steven Rostedta75fece2010-11-02 14:58:27 -04001653 }
Steven Rostedt96f6a0d2011-12-23 00:24:51 -05001654 reboot;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001655}
1656
Steven Rostedta57419b2010-11-02 15:13:54 -04001657sub get_sha1 {
1658 my ($commit) = @_;
1659
1660 doprint "git rev-list --max-count=1 $commit ... ";
1661 my $sha1 = `git rev-list --max-count=1 $commit`;
1662 my $ret = $?;
1663
1664 logit $sha1;
1665
1666 if ($ret) {
1667 doprint "FAILED\n";
1668 dodie "Failed to get git $commit";
1669 }
1670
1671 print "SUCCESS\n";
1672
1673 chomp $sha1;
1674
1675 return $sha1;
1676}
1677
Steven Rostedt5a391fb2010-11-02 14:57:43 -04001678sub monitor {
Steven Rostedt2545eb62010-11-02 15:01:32 -04001679 my $booted = 0;
1680 my $bug = 0;
Steven Rostedt6ca996c2012-03-21 08:18:35 -04001681 my $bug_ignored = 0;
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001682 my $skip_call_trace = 0;
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001683 my $loops;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001684
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001685 wait_for_monitor 5;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001686
1687 my $line;
1688 my $full_line = "";
1689
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001690 open(DMESG, "> $dmesg") or
1691 die "unable to write to $dmesg";
Steven Rostedt2545eb62010-11-02 15:01:32 -04001692
Steven Rostedt75c3fda72010-11-02 14:57:21 -04001693 reboot_to;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001694
Steven Rostedt1c8a6172010-11-09 12:55:40 -05001695 my $success_start;
1696 my $failure_start;
Steven Rostedt2d01b262011-03-08 09:47:54 -05001697 my $monitor_start = time;
1698 my $done = 0;
Steven Rostedtf1a5b962011-06-13 10:30:00 -04001699 my $version_found = 0;
Steven Rostedt1c8a6172010-11-09 12:55:40 -05001700
Steven Rostedt2d01b262011-03-08 09:47:54 -05001701 while (!$done) {
Steven Rostedt2545eb62010-11-02 15:01:32 -04001702
Steven Rostedtecaf8e52011-06-13 10:48:10 -04001703 if ($bug && defined($stop_after_failure) &&
1704 $stop_after_failure >= 0) {
1705 my $time = $stop_after_failure - (time - $failure_start);
1706 $line = wait_for_input($monitor_fp, $time);
1707 if (!defined($line)) {
1708 doprint "bug timed out after $booted_timeout seconds\n";
1709 doprint "Test forced to stop after $stop_after_failure seconds after failure\n";
1710 last;
1711 }
1712 } elsif ($booted) {
Steven Rostedta75fece2010-11-02 14:58:27 -04001713 $line = wait_for_input($monitor_fp, $booted_timeout);
Steven Rostedtcd4f1d52011-06-13 10:26:27 -04001714 if (!defined($line)) {
1715 my $s = $booted_timeout == 1 ? "" : "s";
1716 doprint "Successful boot found: break after $booted_timeout second$s\n";
1717 last;
1718 }
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001719 } else {
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001720 $line = wait_for_input($monitor_fp);
Steven Rostedtcd4f1d52011-06-13 10:26:27 -04001721 if (!defined($line)) {
1722 my $s = $timeout == 1 ? "" : "s";
1723 doprint "Timed out after $timeout second$s\n";
1724 last;
1725 }
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001726 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04001727
Steven Rostedt2545eb62010-11-02 15:01:32 -04001728 doprint $line;
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001729 print DMESG $line;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001730
1731 # we are not guaranteed to get a full line
1732 $full_line .= $line;
1733
Steven Rostedta75fece2010-11-02 14:58:27 -04001734 if ($full_line =~ /$success_line/) {
Steven Rostedt2545eb62010-11-02 15:01:32 -04001735 $booted = 1;
Steven Rostedt1c8a6172010-11-09 12:55:40 -05001736 $success_start = time;
1737 }
1738
1739 if ($booted && defined($stop_after_success) &&
1740 $stop_after_success >= 0) {
1741 my $now = time;
1742 if ($now - $success_start >= $stop_after_success) {
1743 doprint "Test forced to stop after $stop_after_success seconds after success\n";
1744 last;
1745 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04001746 }
1747
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001748 if ($full_line =~ /\[ backtrace testing \]/) {
1749 $skip_call_trace = 1;
1750 }
1751
Steven Rostedt2545eb62010-11-02 15:01:32 -04001752 if ($full_line =~ /call trace:/i) {
Steven Rostedt6ca996c2012-03-21 08:18:35 -04001753 if (!$bug && !$skip_call_trace) {
1754 if ($ignore_errors) {
1755 $bug_ignored = 1;
1756 } else {
1757 $bug = 1;
1758 $failure_start = time;
1759 }
Steven Rostedt1c8a6172010-11-09 12:55:40 -05001760 }
1761 }
1762
1763 if ($bug && defined($stop_after_failure) &&
1764 $stop_after_failure >= 0) {
1765 my $now = time;
1766 if ($now - $failure_start >= $stop_after_failure) {
1767 doprint "Test forced to stop after $stop_after_failure seconds after failure\n";
1768 last;
1769 }
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001770 }
1771
1772 if ($full_line =~ /\[ end of backtrace testing \]/) {
1773 $skip_call_trace = 0;
1774 }
1775
1776 if ($full_line =~ /Kernel panic -/) {
Steven Rostedt10abf112011-03-07 13:21:00 -05001777 $failure_start = time;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001778 $bug = 1;
1779 }
1780
Steven Rostedtf1a5b962011-06-13 10:30:00 -04001781 # Detect triple faults by testing the banner
1782 if ($full_line =~ /\bLinux version (\S+).*\n/) {
1783 if ($1 eq $version) {
1784 $version_found = 1;
1785 } elsif ($version_found && $detect_triplefault) {
1786 # We already booted into the kernel we are testing,
1787 # but now we booted into another kernel?
1788 # Consider this a triple fault.
1789 doprint "Aleady booted in Linux kernel $version, but now\n";
1790 doprint "we booted into Linux kernel $1.\n";
1791 doprint "Assuming that this is a triple fault.\n";
1792 doprint "To disable this: set DETECT_TRIPLE_FAULT to 0\n";
1793 last;
1794 }
1795 }
1796
Steven Rostedt2545eb62010-11-02 15:01:32 -04001797 if ($line =~ /\n/) {
1798 $full_line = "";
1799 }
Steven Rostedt2d01b262011-03-08 09:47:54 -05001800
1801 if ($stop_test_after > 0 && !$booted && !$bug) {
1802 if (time - $monitor_start > $stop_test_after) {
Steven Rostedt4d62bf52011-05-20 09:14:35 -04001803 doprint "STOP_TEST_AFTER ($stop_test_after seconds) timed out\n";
Steven Rostedt2d01b262011-03-08 09:47:54 -05001804 $done = 1;
1805 }
1806 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04001807 }
1808
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001809 close(DMESG);
Steven Rostedt2545eb62010-11-02 15:01:32 -04001810
Steven Rostedt2545eb62010-11-02 15:01:32 -04001811 if ($bug) {
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001812 return 0 if ($in_bisect);
Steven Rostedt576f6272010-11-02 14:58:38 -04001813 fail "failed - got a bug report" and return 0;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001814 }
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001815
Steven Rostedta75fece2010-11-02 14:58:27 -04001816 if (!$booted) {
1817 return 0 if ($in_bisect);
Steven Rostedt576f6272010-11-02 14:58:38 -04001818 fail "failed - never got a boot prompt." and return 0;
Steven Rostedta75fece2010-11-02 14:58:27 -04001819 }
1820
Steven Rostedt6ca996c2012-03-21 08:18:35 -04001821 if ($bug_ignored) {
1822 doprint "WARNING: Call Trace detected but ignored due to IGNORE_ERRORS=1\n";
1823 }
1824
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001825 return 1;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001826}
1827
Steven Rostedt2b29b2f2011-12-22 11:25:46 -05001828sub eval_kernel_version {
1829 my ($option) = @_;
1830
1831 $option =~ s/\$KERNEL_VERSION/$version/g;
1832
1833 return $option;
1834}
1835
Steven Rostedtdb05cfe2011-06-13 11:09:22 -04001836sub do_post_install {
1837
1838 return if (!defined($post_install));
1839
Steven Rostedt2b29b2f2011-12-22 11:25:46 -05001840 my $cp_post_install = eval_kernel_version $post_install;
Steven Rostedtdb05cfe2011-06-13 11:09:22 -04001841 run_command "$cp_post_install" or
1842 dodie "Failed to run post install";
1843}
1844
Steven Rostedte1a6c3d2012-12-11 21:19:41 -05001845# Sometimes the reboot fails, and will hang. We try to ssh to the box
1846# and if we fail, we force another reboot, that should powercycle it.
1847sub test_booted {
1848 if (!run_ssh "echo testing connection") {
1849 reboot $sleep_time;
1850 }
1851}
1852
Steven Rostedt2545eb62010-11-02 15:01:32 -04001853sub install {
1854
Steven Rostedte0a87422011-09-30 17:50:48 -04001855 return if ($no_install);
1856
Steven Rostedte5c2ec12012-07-19 15:22:05 -04001857 if (defined($pre_install)) {
1858 my $cp_pre_install = eval_kernel_version $pre_install;
1859 run_command "$cp_pre_install" or
1860 dodie "Failed to run pre install";
1861 }
1862
Steven Rostedt2b29b2f2011-12-22 11:25:46 -05001863 my $cp_target = eval_kernel_version $target_image;
1864
Steven Rostedte1a6c3d2012-12-11 21:19:41 -05001865 test_booted;
1866
Steven Rostedt02ad2612012-03-21 08:21:24 -04001867 run_scp_install "$outputdir/$build_target", "$cp_target" or
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001868 dodie "failed to copy image";
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001869
1870 my $install_mods = 0;
1871
1872 # should we process modules?
1873 $install_mods = 0;
Steven Rostedt51ad1dd2010-11-08 16:43:21 -05001874 open(IN, "$output_config") or dodie("Can't read config file");
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001875 while (<IN>) {
1876 if (/CONFIG_MODULES(=y)?/) {
Steven Rostedt8bc5e4e2012-10-26 00:10:32 -04001877 if (defined($1)) {
1878 $install_mods = 1;
1879 last;
1880 }
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001881 }
1882 }
1883 close(IN);
1884
1885 if (!$install_mods) {
Steven Rostedtdb05cfe2011-06-13 11:09:22 -04001886 do_post_install;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001887 doprint "No modules needed\n";
1888 return;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001889 }
1890
Steven Rostedt627977d2012-03-21 08:16:15 -04001891 run_command "$make INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH=$tmpdir modules_install" or
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001892 dodie "Failed to install modules";
Steven Rostedt2545eb62010-11-02 15:01:32 -04001893
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001894 my $modlib = "/lib/modules/$version";
Steven Rostedta57419b2010-11-02 15:13:54 -04001895 my $modtar = "ktest-mods.tar.bz2";
Steven Rostedt2545eb62010-11-02 15:01:32 -04001896
Steven Rostedte48c5292010-11-02 14:35:37 -04001897 run_ssh "rm -rf $modlib" or
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001898 dodie "failed to remove old mods: $modlib";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001899
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001900 # would be nice if scp -r did not follow symbolic links
Steven Rostedta75fece2010-11-02 14:58:27 -04001901 run_command "cd $tmpdir && tar -cjf $modtar lib/modules/$version" or
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001902 dodie "making tarball";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001903
Steven Rostedt02ad2612012-03-21 08:21:24 -04001904 run_scp_mod "$tmpdir/$modtar", "/tmp" or
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001905 dodie "failed to copy modules";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001906
Steven Rostedta75fece2010-11-02 14:58:27 -04001907 unlink "$tmpdir/$modtar";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001908
Steven Rostedte7b13442011-06-14 20:44:36 -04001909 run_ssh "'(cd / && tar xjf /tmp/$modtar)'" or
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001910 dodie "failed to tar modules";
Steven Rostedt2545eb62010-11-02 15:01:32 -04001911
Steven Rostedte48c5292010-11-02 14:35:37 -04001912 run_ssh "rm -f /tmp/$modtar";
Steven Rostedt8b37ca82010-11-02 14:58:33 -04001913
Steven Rostedtdb05cfe2011-06-13 11:09:22 -04001914 do_post_install;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001915}
1916
Steven Rostedtddf607e2011-06-14 20:49:13 -04001917sub get_version {
1918 # get the release name
Steven Rostedt683a3e62012-05-18 13:34:35 -04001919 return if ($have_version);
Steven Rostedtddf607e2011-06-14 20:49:13 -04001920 doprint "$make kernelrelease ... ";
1921 $version = `$make kernelrelease | tail -1`;
1922 chomp($version);
1923 doprint "$version\n";
Steven Rostedt683a3e62012-05-18 13:34:35 -04001924 $have_version = 1;
Steven Rostedtddf607e2011-06-14 20:49:13 -04001925}
1926
1927sub start_monitor_and_boot {
Steven Rostedt9f7424c2011-10-22 08:58:19 -04001928 # Make sure the stable kernel has finished booting
Steven Rostedt (Red Hat)319ab142013-01-30 12:25:38 -05001929
1930 # Install bisects, don't need console
1931 if (defined $console) {
1932 start_monitor;
1933 wait_for_monitor 5;
1934 end_monitor;
1935 }
Steven Rostedt9f7424c2011-10-22 08:58:19 -04001936
Steven Rostedtddf607e2011-06-14 20:49:13 -04001937 get_grub_index;
1938 get_version;
1939 install;
1940
Steven Rostedt (Red Hat)319ab142013-01-30 12:25:38 -05001941 start_monitor if (defined $console);
Steven Rostedtddf607e2011-06-14 20:49:13 -04001942 return monitor;
1943}
1944
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05001945my $check_build_re = ".*:.*(warning|error|Error):.*";
1946my $utf8_quote = "\\x{e2}\\x{80}(\\x{98}|\\x{99})";
1947
1948# Read buildlog and check against warnings file for any
1949# new warnings.
1950#
1951# Returns 1 if OK
1952# 0 otherwise
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04001953sub check_buildlog {
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05001954 return 1 if (!defined $warnings_file);
1955
1956 my %warnings_list;
1957
1958 # Failed builds should not reboot the target
1959 my $save_no_reboot = $no_reboot;
1960 $no_reboot = 1;
1961
1962 if (-f $warnings_file) {
1963 open(IN, $warnings_file) or
1964 dodie "Error opening $warnings_file";
1965
1966 while (<IN>) {
1967 if (/$check_build_re/) {
1968 chomp;
1969 $warnings_list{$_} = 1;
1970 }
1971 }
1972 close(IN);
1973 }
1974
1975 # If warnings file didn't exist, and WARNINGS_FILE exist,
1976 # then we fail on any warning!
1977
1978 open(IN, $buildlog) or dodie "Can't open $buildlog";
1979 while (<IN>) {
1980 if (/$check_build_re/) {
1981
1982 # Some compilers use UTF-8 extended for quotes
1983 # for distcc heterogeneous systems, this causes issues
1984 s/$utf8_quote/'/g;
1985
1986 chomp;
1987 if (!defined $warnings_list{$_}) {
1988 fail "New warning found (not in $warnings_file)\n$_\n";
1989 $no_reboot = $save_no_reboot;
1990 return 0;
1991 }
1992 }
1993 }
1994 $no_reboot = $save_no_reboot;
1995 close(IN);
1996}
1997
1998sub check_patch_buildlog {
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04001999 my ($patch) = @_;
2000
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04002001 my @files = `git show $patch | diffstat -l`;
2002
Steven Rostedt (Red Hat)35275682013-01-30 12:28:15 -05002003 foreach my $file (@files) {
2004 chomp $file;
2005 }
2006
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04002007 open(IN, "git show $patch |") or
2008 dodie "failed to show $patch";
2009 while (<IN>) {
2010 if (m,^--- a/(.*),) {
2011 chomp $1;
2012 $files[$#files] = $1;
2013 }
2014 }
2015 close(IN);
2016
2017 open(IN, $buildlog) or dodie "Can't open $buildlog";
2018 while (<IN>) {
2019 if (/^\s*(.*?):.*(warning|error)/) {
2020 my $err = $1;
2021 foreach my $file (@files) {
Steven Rostedta75fece2010-11-02 14:58:27 -04002022 my $fullpath = "$builddir/$file";
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04002023 if ($file eq $err || $fullpath eq $err) {
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002024 fail "$file built with warnings" and return 0;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04002025 }
2026 }
2027 }
2028 }
2029 close(IN);
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002030
2031 return 1;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04002032}
2033
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002034sub apply_min_config {
2035 my $outconfig = "$output_config.new";
Steven Rostedt612b9e92011-03-07 13:27:43 -05002036
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002037 # Read the config file and remove anything that
2038 # is in the force_config hash (from minconfig and others)
2039 # then add the force config back.
2040
2041 doprint "Applying minimum configurations into $output_config.new\n";
2042
2043 open (OUT, ">$outconfig") or
2044 dodie "Can't create $outconfig";
2045
2046 if (-f $output_config) {
2047 open (IN, $output_config) or
2048 dodie "Failed to open $output_config";
2049 while (<IN>) {
2050 if (/^(# )?(CONFIG_[^\s=]*)/) {
2051 next if (defined($force_config{$2}));
2052 }
2053 print OUT;
2054 }
2055 close IN;
2056 }
2057 foreach my $config (keys %force_config) {
2058 print OUT "$force_config{$config}\n";
2059 }
2060 close OUT;
2061
2062 run_command "mv $outconfig $output_config";
2063}
2064
2065sub make_oldconfig {
2066
Steven Rostedt4c4ab122011-07-15 21:16:17 -04002067 my @force_list = keys %force_config;
2068
2069 if ($#force_list >= 0) {
2070 apply_min_config;
2071 }
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002072
Adam Leefb16d892012-09-01 01:05:17 +08002073 if (!run_command "$make olddefconfig") {
2074 # Perhaps olddefconfig doesn't exist in this version of the kernel
Steven Rostedt18925172012-12-11 20:16:03 -05002075 # try oldnoconfig
2076 doprint "olddefconfig failed, trying make oldnoconfig\n";
2077 if (!run_command "$make oldnoconfig") {
2078 doprint "oldnoconfig failed, trying yes '' | make oldconfig\n";
2079 # try a yes '' | oldconfig
2080 run_command "yes '' | $make oldconfig" or
2081 dodie "failed make config oldconfig";
2082 }
Steven Rostedt612b9e92011-03-07 13:27:43 -05002083 }
2084}
2085
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002086# read a config file and use this to force new configs.
2087sub load_force_config {
2088 my ($config) = @_;
2089
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002090 doprint "Loading force configs from $config\n";
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002091 open(IN, $config) or
2092 dodie "failed to read $config";
2093 while (<IN>) {
2094 chomp;
2095 if (/^(CONFIG[^\s=]*)(\s*=.*)/) {
2096 $force_config{$1} = $_;
2097 } elsif (/^# (CONFIG_\S*) is not set/) {
2098 $force_config{$1} = $_;
2099 }
2100 }
2101 close IN;
2102}
2103
Steven Rostedt2545eb62010-11-02 15:01:32 -04002104sub build {
2105 my ($type) = @_;
2106
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002107 unlink $buildlog;
2108
Steven Rostedt4ab1cce2011-09-30 18:12:20 -04002109 # Failed builds should not reboot the target
2110 my $save_no_reboot = $no_reboot;
2111 $no_reboot = 1;
2112
Steven Rostedt683a3e62012-05-18 13:34:35 -04002113 # Calculate a new version from here.
2114 $have_version = 0;
2115
Steven Rostedt0bd6c1a2011-06-14 20:39:31 -04002116 if (defined($pre_build)) {
2117 my $ret = run_command $pre_build;
2118 if (!$ret && defined($pre_build_die) &&
2119 $pre_build_die) {
2120 dodie "failed to pre_build\n";
2121 }
2122 }
2123
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002124 if ($type =~ /^useconfig:(.*)/) {
Steven Rostedt51ad1dd2010-11-08 16:43:21 -05002125 run_command "cp $1 $output_config" or
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002126 dodie "could not copy $1 to .config";
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002127
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002128 $type = "oldconfig";
2129 }
2130
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002131 # old config can ask questions
2132 if ($type eq "oldconfig") {
Adam Leefb16d892012-09-01 01:05:17 +08002133 $type = "olddefconfig";
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002134
2135 # allow for empty configs
Steven Rostedt51ad1dd2010-11-08 16:43:21 -05002136 run_command "touch $output_config";
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002137
Andrew Jones13488232011-08-12 15:32:04 +02002138 if (!$noclean) {
2139 run_command "mv $output_config $outputdir/config_temp" or
2140 dodie "moving .config";
Steven Rostedt2545eb62010-11-02 15:01:32 -04002141
Andrew Jones13488232011-08-12 15:32:04 +02002142 run_command "$make mrproper" or dodie "make mrproper";
2143
2144 run_command "mv $outputdir/config_temp $output_config" or
2145 dodie "moving config_temp";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002146 }
2147
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002148 } elsif (!$noclean) {
Steven Rostedt51ad1dd2010-11-08 16:43:21 -05002149 unlink "$output_config";
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002150 run_command "$make mrproper" or
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002151 dodie "make mrproper";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002152 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04002153
2154 # add something to distinguish this build
Steven Rostedta75fece2010-11-02 14:58:27 -04002155 open(OUT, "> $outputdir/localversion") or dodie("Can't make localversion file");
2156 print OUT "$localversion\n";
Steven Rostedt2545eb62010-11-02 15:01:32 -04002157 close(OUT);
2158
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002159 if (defined($minconfig)) {
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002160 load_force_config($minconfig);
Steven Rostedt2545eb62010-11-02 15:01:32 -04002161 }
2162
Adam Leefb16d892012-09-01 01:05:17 +08002163 if ($type ne "olddefconfig") {
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002164 run_command "$make $type" or
Steven Rostedt612b9e92011-03-07 13:27:43 -05002165 dodie "failed make config";
2166 }
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002167 # Run old config regardless, to enforce min configurations
2168 make_oldconfig;
Steven Rostedt2545eb62010-11-02 15:01:32 -04002169
Steven Rostedta75fece2010-11-02 14:58:27 -04002170 $redirect = "$buildlog";
Steven Rostedt0bd6c1a2011-06-14 20:39:31 -04002171 my $build_ret = run_command "$make $build_options";
2172 undef $redirect;
2173
2174 if (defined($post_build)) {
Steven Rostedt683a3e62012-05-18 13:34:35 -04002175 # Because a post build may change the kernel version
2176 # do it now.
2177 get_version;
Steven Rostedt0bd6c1a2011-06-14 20:39:31 -04002178 my $ret = run_command $post_build;
2179 if (!$ret && defined($post_build_die) &&
2180 $post_build_die) {
2181 dodie "failed to post_build\n";
2182 }
2183 }
2184
2185 if (!$build_ret) {
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002186 # bisect may need this to pass
Steven Rostedt4ab1cce2011-09-30 18:12:20 -04002187 if ($in_bisect) {
2188 $no_reboot = $save_no_reboot;
2189 return 0;
2190 }
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002191 fail "failed build" and return 0;
Steven Rostedt2545eb62010-11-02 15:01:32 -04002192 }
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002193
Steven Rostedt4ab1cce2011-09-30 18:12:20 -04002194 $no_reboot = $save_no_reboot;
2195
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002196 return 1;
Steven Rostedt2545eb62010-11-02 15:01:32 -04002197}
2198
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002199sub halt {
Steven Rostedte48c5292010-11-02 14:35:37 -04002200 if (!run_ssh "halt" or defined($power_off)) {
Steven Rostedt576f6272010-11-02 14:58:38 -04002201 if (defined($poweroff_after_halt)) {
2202 sleep $poweroff_after_halt;
2203 run_command "$power_off";
2204 }
2205 } else {
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002206 # nope? the zap it!
Steven Rostedta75fece2010-11-02 14:58:27 -04002207 run_command "$power_off";
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002208 }
2209}
2210
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002211sub success {
2212 my ($i) = @_;
2213
Steven Rostedt921ed4c2012-07-19 15:18:27 -04002214 if (defined($post_test)) {
2215 run_command $post_test;
2216 }
2217
Steven Rostedte48c5292010-11-02 14:35:37 -04002218 $successes++;
2219
Steven Rostedt9064af52011-06-13 10:38:48 -04002220 my $name = "";
2221
2222 if (defined($test_name)) {
2223 $name = " ($test_name)";
2224 }
2225
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002226 doprint "\n\n*******************************************\n";
2227 doprint "*******************************************\n";
Steven Rostedt9064af52011-06-13 10:38:48 -04002228 doprint "KTEST RESULT: TEST $i$name SUCCESS!!!! **\n";
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002229 doprint "*******************************************\n";
2230 doprint "*******************************************\n";
2231
Rabin Vincentde5b6e32011-11-18 17:05:31 +05302232 if (defined($store_successes)) {
2233 save_logs "success", $store_successes;
2234 }
2235
Steven Rostedt576f6272010-11-02 14:58:38 -04002236 if ($i != $opt{"NUM_TESTS"} && !do_not_reboot) {
Steven Rostedta75fece2010-11-02 14:58:27 -04002237 doprint "Reboot and wait $sleep_time seconds\n";
Steven Rostedtbc7c5802011-12-22 16:29:10 -05002238 reboot_to_good $sleep_time;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002239 }
2240}
2241
Steven Rostedtc960bb92011-03-08 09:22:39 -05002242sub answer_bisect {
2243 for (;;) {
2244 doprint "Pass or fail? [p/f]";
2245 my $ans = <STDIN>;
2246 chomp $ans;
2247 if ($ans eq "p" || $ans eq "P") {
2248 return 1;
2249 } elsif ($ans eq "f" || $ans eq "F") {
2250 return 0;
2251 } else {
2252 print "Please answer 'P' or 'F'\n";
2253 }
2254 }
2255}
2256
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002257sub child_run_test {
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002258 my $failed = 0;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002259
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002260 # child should have no power
Steven Rostedta75fece2010-11-02 14:58:27 -04002261 $reboot_on_error = 0;
2262 $poweroff_on_error = 0;
2263 $die_on_failure = 1;
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002264
Rabin Vincenta9dd5d62011-11-18 17:05:29 +05302265 $redirect = "$testlog";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002266 run_command $run_test or $failed = 1;
Rabin Vincenta9dd5d62011-11-18 17:05:29 +05302267 undef $redirect;
2268
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002269 exit $failed;
2270}
2271
2272my $child_done;
2273
2274sub child_finished {
2275 $child_done = 1;
2276}
2277
2278sub do_run_test {
2279 my $child_pid;
2280 my $child_exit;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002281 my $line;
2282 my $full_line;
2283 my $bug = 0;
Steven Rostedt9b1d3672012-07-30 14:30:53 -04002284 my $bug_ignored = 0;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002285
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002286 wait_for_monitor 1;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002287
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002288 doprint "run test $run_test\n";
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002289
2290 $child_done = 0;
2291
2292 $SIG{CHLD} = qw(child_finished);
2293
2294 $child_pid = fork;
2295
2296 child_run_test if (!$child_pid);
2297
2298 $full_line = "";
2299
2300 do {
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002301 $line = wait_for_input($monitor_fp, 1);
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002302 if (defined($line)) {
2303
2304 # we are not guaranteed to get a full line
2305 $full_line .= $line;
Steven Rostedt8ea0e062011-03-08 09:44:35 -05002306 doprint $line;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002307
2308 if ($full_line =~ /call trace:/i) {
Steven Rostedt9b1d3672012-07-30 14:30:53 -04002309 if ($ignore_errors) {
2310 $bug_ignored = 1;
2311 } else {
2312 $bug = 1;
2313 }
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002314 }
2315
2316 if ($full_line =~ /Kernel panic -/) {
2317 $bug = 1;
2318 }
2319
2320 if ($line =~ /\n/) {
2321 $full_line = "";
2322 }
2323 }
2324 } while (!$child_done && !$bug);
2325
Steven Rostedt9b1d3672012-07-30 14:30:53 -04002326 if (!$bug && $bug_ignored) {
2327 doprint "WARNING: Call Trace detected but ignored due to IGNORE_ERRORS=1\n";
2328 }
2329
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002330 if ($bug) {
Steven Rostedt8ea0e062011-03-08 09:44:35 -05002331 my $failure_start = time;
2332 my $now;
2333 do {
2334 $line = wait_for_input($monitor_fp, 1);
2335 if (defined($line)) {
2336 doprint $line;
2337 }
2338 $now = time;
2339 if ($now - $failure_start >= $stop_after_failure) {
2340 last;
2341 }
2342 } while (defined($line));
2343
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002344 doprint "Detected kernel crash!\n";
2345 # kill the child with extreme prejudice
2346 kill 9, $child_pid;
2347 }
2348
2349 waitpid $child_pid, 0;
2350 $child_exit = $?;
2351
Steven Rostedtc5dacb82011-12-22 12:43:57 -05002352 if (!$bug && $in_bisect) {
2353 if (defined($bisect_ret_good)) {
2354 if ($child_exit == $bisect_ret_good) {
2355 return 1;
2356 }
2357 }
2358 if (defined($bisect_ret_skip)) {
2359 if ($child_exit == $bisect_ret_skip) {
2360 return -1;
2361 }
2362 }
2363 if (defined($bisect_ret_abort)) {
2364 if ($child_exit == $bisect_ret_abort) {
2365 fail "test abort" and return -2;
2366 }
2367 }
2368 if (defined($bisect_ret_bad)) {
2369 if ($child_exit == $bisect_ret_skip) {
2370 return 0;
2371 }
2372 }
2373 if (defined($bisect_ret_default)) {
2374 if ($bisect_ret_default eq "good") {
2375 return 1;
2376 } elsif ($bisect_ret_default eq "bad") {
2377 return 0;
2378 } elsif ($bisect_ret_default eq "skip") {
2379 return -1;
2380 } elsif ($bisect_ret_default eq "abort") {
2381 return -2;
2382 } else {
2383 fail "unknown default action: $bisect_ret_default"
2384 and return -2;
2385 }
2386 }
2387 }
2388
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002389 if ($bug || $child_exit) {
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002390 return 0 if $in_bisect;
2391 fail "test failed" and return 0;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002392 }
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002393 return 1;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002394}
2395
Steven Rostedta75fece2010-11-02 14:58:27 -04002396sub run_git_bisect {
2397 my ($command) = @_;
2398
2399 doprint "$command ... ";
2400
2401 my $output = `$command 2>&1`;
2402 my $ret = $?;
2403
2404 logit $output;
2405
2406 if ($ret) {
2407 doprint "FAILED\n";
2408 dodie "Failed to git bisect";
2409 }
2410
2411 doprint "SUCCESS\n";
2412 if ($output =~ m/^(Bisecting: .*\(roughly \d+ steps?\))\s+\[([[:xdigit:]]+)\]/) {
2413 doprint "$1 [$2]\n";
2414 } elsif ($output =~ m/^([[:xdigit:]]+) is the first bad commit/) {
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002415 $bisect_bad_commit = $1;
Steven Rostedta75fece2010-11-02 14:58:27 -04002416 doprint "Found bad commit... $1\n";
2417 return 0;
2418 } else {
2419 # we already logged it, just print it now.
2420 print $output;
2421 }
2422
2423 return 1;
2424}
2425
Steven Rostedtc23dca72011-03-08 09:26:31 -05002426sub bisect_reboot {
2427 doprint "Reboot and sleep $bisect_sleep_time seconds\n";
Steven Rostedtbc7c5802011-12-22 16:29:10 -05002428 reboot_to_good $bisect_sleep_time;
Steven Rostedtc23dca72011-03-08 09:26:31 -05002429}
2430
2431# returns 1 on success, 0 on failure, -1 on skip
Steven Rostedt0a05c762010-11-08 11:14:10 -05002432sub run_bisect_test {
2433 my ($type, $buildtype) = @_;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002434
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002435 my $failed = 0;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002436 my $result;
2437 my $output;
2438 my $ret;
2439
Steven Rostedt0a05c762010-11-08 11:14:10 -05002440 $in_bisect = 1;
2441
2442 build $buildtype or $failed = 1;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002443
2444 if ($type ne "build") {
Steven Rostedtc23dca72011-03-08 09:26:31 -05002445 if ($failed && $bisect_skip) {
2446 $in_bisect = 0;
2447 return -1;
2448 }
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002449 dodie "Failed on build" if $failed;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002450
2451 # Now boot the box
Steven Rostedtddf607e2011-06-14 20:49:13 -04002452 start_monitor_and_boot or $failed = 1;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002453
2454 if ($type ne "boot") {
Steven Rostedtc23dca72011-03-08 09:26:31 -05002455 if ($failed && $bisect_skip) {
2456 end_monitor;
2457 bisect_reboot;
2458 $in_bisect = 0;
2459 return -1;
2460 }
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002461 dodie "Failed on boot" if $failed;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002462
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002463 do_run_test or $failed = 1;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002464 }
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002465 end_monitor;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002466 }
2467
2468 if ($failed) {
Steven Rostedt0a05c762010-11-08 11:14:10 -05002469 $result = 0;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002470 } else {
Steven Rostedt0a05c762010-11-08 11:14:10 -05002471 $result = 1;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002472 }
Steven Rostedt4025bc62011-05-20 09:16:29 -04002473
2474 # reboot the box to a kernel we can ssh to
2475 if ($type ne "build") {
2476 bisect_reboot;
2477 }
Steven Rostedt0a05c762010-11-08 11:14:10 -05002478 $in_bisect = 0;
2479
2480 return $result;
2481}
2482
2483sub run_bisect {
2484 my ($type) = @_;
2485 my $buildtype = "oldconfig";
2486
2487 # We should have a minconfig to use?
2488 if (defined($minconfig)) {
2489 $buildtype = "useconfig:$minconfig";
2490 }
2491
2492 my $ret = run_bisect_test $type, $buildtype;
2493
Steven Rostedtc960bb92011-03-08 09:22:39 -05002494 if ($bisect_manual) {
2495 $ret = answer_bisect;
2496 }
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002497
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04002498 # Are we looking for where it worked, not failed?
Russ Dill5158ba3e2012-04-23 19:43:00 -07002499 if ($reverse_bisect && $ret >= 0) {
Steven Rostedt0a05c762010-11-08 11:14:10 -05002500 $ret = !$ret;
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04002501 }
2502
Steven Rostedtc23dca72011-03-08 09:26:31 -05002503 if ($ret > 0) {
Steven Rostedt0a05c762010-11-08 11:14:10 -05002504 return "good";
Steven Rostedtc23dca72011-03-08 09:26:31 -05002505 } elsif ($ret == 0) {
Steven Rostedt0a05c762010-11-08 11:14:10 -05002506 return "bad";
Steven Rostedtc23dca72011-03-08 09:26:31 -05002507 } elsif ($bisect_skip) {
2508 doprint "HIT A BAD COMMIT ... SKIPPING\n";
2509 return "skip";
Steven Rostedt0a05c762010-11-08 11:14:10 -05002510 }
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002511}
2512
Steven Rostedtdad98752011-11-22 20:48:57 -05002513sub update_bisect_replay {
2514 my $tmp_log = "$tmpdir/ktest_bisect_log";
2515 run_command "git bisect log > $tmp_log" or
2516 die "can't create bisect log";
2517 return $tmp_log;
2518}
2519
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002520sub bisect {
2521 my ($i) = @_;
2522
2523 my $result;
2524
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002525 die "BISECT_GOOD[$i] not defined\n" if (!defined($bisect_good));
2526 die "BISECT_BAD[$i] not defined\n" if (!defined($bisect_bad));
2527 die "BISECT_TYPE[$i] not defined\n" if (!defined($bisect_type));
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002528
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002529 my $good = $bisect_good;
2530 my $bad = $bisect_bad;
2531 my $type = $bisect_type;
2532 my $start = $bisect_start;
2533 my $replay = $bisect_replay;
2534 my $start_files = $bisect_files;
Steven Rostedt3410f6f2011-03-08 09:38:12 -05002535
2536 if (defined($start_files)) {
2537 $start_files = " -- " . $start_files;
2538 } else {
2539 $start_files = "";
2540 }
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002541
Steven Rostedta57419b2010-11-02 15:13:54 -04002542 # convert to true sha1's
2543 $good = get_sha1($good);
2544 $bad = get_sha1($bad);
2545
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002546 if (defined($bisect_reverse) && $bisect_reverse == 1) {
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04002547 doprint "Performing a reverse bisect (bad is good, good is bad!)\n";
2548 $reverse_bisect = 1;
2549 } else {
2550 $reverse_bisect = 0;
2551 }
2552
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002553 # Can't have a test without having a test to run
2554 if ($type eq "test" && !defined($run_test)) {
2555 $type = "boot";
2556 }
2557
Steven Rostedtdad98752011-11-22 20:48:57 -05002558 # Check if a bisect was running
2559 my $bisect_start_file = "$builddir/.git/BISECT_START";
2560
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002561 my $check = $bisect_check;
Steven Rostedtdad98752011-11-22 20:48:57 -05002562 my $do_check = defined($check) && $check ne "0";
2563
2564 if ( -f $bisect_start_file ) {
2565 print "Bisect in progress found\n";
2566 if ($do_check) {
2567 print " If you say yes, then no checks of good or bad will be done\n";
2568 }
2569 if (defined($replay)) {
2570 print "** BISECT_REPLAY is defined in config file **";
2571 print " Ignore config option and perform new git bisect log?\n";
2572 if (read_ync " (yes, no, or cancel) ") {
2573 $replay = update_bisect_replay;
2574 $do_check = 0;
2575 }
2576 } elsif (read_yn "read git log and continue?") {
2577 $replay = update_bisect_replay;
2578 $do_check = 0;
2579 }
2580 }
2581
2582 if ($do_check) {
Steven Rostedta75fece2010-11-02 14:58:27 -04002583
2584 # get current HEAD
Steven Rostedta57419b2010-11-02 15:13:54 -04002585 my $head = get_sha1("HEAD");
Steven Rostedta75fece2010-11-02 14:58:27 -04002586
2587 if ($check ne "good") {
2588 doprint "TESTING BISECT BAD [$bad]\n";
2589 run_command "git checkout $bad" or
2590 die "Failed to checkout $bad";
2591
2592 $result = run_bisect $type;
2593
2594 if ($result ne "bad") {
2595 fail "Tested BISECT_BAD [$bad] and it succeeded" and return 0;
2596 }
2597 }
2598
2599 if ($check ne "bad") {
2600 doprint "TESTING BISECT GOOD [$good]\n";
2601 run_command "git checkout $good" or
2602 die "Failed to checkout $good";
2603
2604 $result = run_bisect $type;
2605
2606 if ($result ne "good") {
2607 fail "Tested BISECT_GOOD [$good] and it failed" and return 0;
2608 }
2609 }
2610
2611 # checkout where we started
2612 run_command "git checkout $head" or
2613 die "Failed to checkout $head";
2614 }
2615
Steven Rostedt3410f6f2011-03-08 09:38:12 -05002616 run_command "git bisect start$start_files" or
Steven Rostedta75fece2010-11-02 14:58:27 -04002617 dodie "could not start bisect";
2618
2619 run_command "git bisect good $good" or
2620 dodie "could not set bisect good to $good";
2621
2622 run_git_bisect "git bisect bad $bad" or
2623 dodie "could not set bisect bad to $bad";
2624
2625 if (defined($replay)) {
2626 run_command "git bisect replay $replay" or
2627 dodie "failed to run replay";
2628 }
2629
2630 if (defined($start)) {
2631 run_command "git checkout $start" or
2632 dodie "failed to checkout $start";
2633 }
2634
2635 my $test;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002636 do {
2637 $result = run_bisect $type;
Steven Rostedta75fece2010-11-02 14:58:27 -04002638 $test = run_git_bisect "git bisect $result";
2639 } while ($test);
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002640
2641 run_command "git bisect log" or
2642 dodie "could not capture git bisect log";
2643
2644 run_command "git bisect reset" or
2645 dodie "could not reset git bisect";
2646
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002647 doprint "Bad commit was [$bisect_bad_commit]\n";
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002648
Steven Rostedt0a05c762010-11-08 11:14:10 -05002649 success $i;
2650}
2651
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002652# config_ignore holds the configs that were set (or unset) for
2653# a good config and we will ignore these configs for the rest
2654# of a config bisect. These configs stay as they were.
Steven Rostedt0a05c762010-11-08 11:14:10 -05002655my %config_ignore;
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002656
2657# config_set holds what all configs were set as.
Steven Rostedt0a05c762010-11-08 11:14:10 -05002658my %config_set;
2659
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002660# config_off holds the set of configs that the bad config had disabled.
2661# We need to record them and set them in the .config when running
Adam Leefb16d892012-09-01 01:05:17 +08002662# olddefconfig, because olddefconfig keeps the defaults.
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002663my %config_off;
2664
2665# config_off_tmp holds a set of configs to turn off for now
2666my @config_off_tmp;
2667
2668# config_list is the set of configs that are being tested
Steven Rostedt0a05c762010-11-08 11:14:10 -05002669my %config_list;
2670my %null_config;
2671
2672my %dependency;
2673
Steven Rostedt4c4ab122011-07-15 21:16:17 -04002674sub assign_configs {
2675 my ($hash, $config) = @_;
Steven Rostedt0a05c762010-11-08 11:14:10 -05002676
2677 open (IN, $config)
2678 or dodie "Failed to read $config";
2679
2680 while (<IN>) {
Steven Rostedt9bf71742011-06-01 23:27:19 -04002681 if (/^((CONFIG\S*)=.*)/) {
Steven Rostedt4c4ab122011-07-15 21:16:17 -04002682 ${$hash}{$2} = $1;
Steven Rostedt0a05c762010-11-08 11:14:10 -05002683 }
2684 }
2685
2686 close(IN);
2687}
2688
Steven Rostedt4c4ab122011-07-15 21:16:17 -04002689sub process_config_ignore {
2690 my ($config) = @_;
2691
2692 assign_configs \%config_ignore, $config;
2693}
2694
Steven Rostedt0a05c762010-11-08 11:14:10 -05002695sub read_current_config {
2696 my ($config_ref) = @_;
2697
2698 %{$config_ref} = ();
2699 undef %{$config_ref};
2700
2701 my @key = keys %{$config_ref};
2702 if ($#key >= 0) {
2703 print "did not delete!\n";
2704 exit;
2705 }
2706 open (IN, "$output_config");
2707
2708 while (<IN>) {
2709 if (/^(CONFIG\S+)=(.*)/) {
2710 ${$config_ref}{$1} = $2;
2711 }
2712 }
2713 close(IN);
2714}
2715
2716sub get_dependencies {
2717 my ($config) = @_;
2718
2719 my $arr = $dependency{$config};
2720 if (!defined($arr)) {
2721 return ();
2722 }
2723
2724 my @deps = @{$arr};
2725
2726 foreach my $dep (@{$arr}) {
2727 print "ADD DEP $dep\n";
2728 @deps = (@deps, get_dependencies $dep);
2729 }
2730
2731 return @deps;
2732}
2733
2734sub create_config {
2735 my @configs = @_;
2736
2737 open(OUT, ">$output_config") or dodie "Can not write to $output_config";
2738
2739 foreach my $config (@configs) {
2740 print OUT "$config_set{$config}\n";
2741 my @deps = get_dependencies $config;
2742 foreach my $dep (@deps) {
2743 print OUT "$config_set{$dep}\n";
2744 }
2745 }
2746
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002747 # turn off configs to keep off
2748 foreach my $config (keys %config_off) {
2749 print OUT "# $config is not set\n";
2750 }
2751
2752 # turn off configs that should be off for now
2753 foreach my $config (@config_off_tmp) {
2754 print OUT "# $config is not set\n";
2755 }
2756
Steven Rostedt0a05c762010-11-08 11:14:10 -05002757 foreach my $config (keys %config_ignore) {
2758 print OUT "$config_ignore{$config}\n";
2759 }
2760 close(OUT);
2761
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002762 make_oldconfig;
Steven Rostedt0a05c762010-11-08 11:14:10 -05002763}
2764
2765sub compare_configs {
2766 my (%a, %b) = @_;
2767
2768 foreach my $item (keys %a) {
2769 if (!defined($b{$item})) {
2770 print "diff $item\n";
2771 return 1;
2772 }
2773 delete $b{$item};
2774 }
2775
2776 my @keys = keys %b;
2777 if ($#keys) {
2778 print "diff2 $keys[0]\n";
2779 }
2780 return -1 if ($#keys >= 0);
2781
2782 return 0;
2783}
2784
2785sub run_config_bisect_test {
2786 my ($type) = @_;
2787
2788 return run_bisect_test $type, "oldconfig";
2789}
2790
2791sub process_passed {
2792 my (%configs) = @_;
2793
2794 doprint "These configs had no failure: (Enabling them for further compiles)\n";
2795 # Passed! All these configs are part of a good compile.
2796 # Add them to the min options.
2797 foreach my $config (keys %configs) {
2798 if (defined($config_list{$config})) {
2799 doprint " removing $config\n";
2800 $config_ignore{$config} = $config_list{$config};
2801 delete $config_list{$config};
2802 }
2803 }
Steven Rostedtf1a27852010-11-11 11:34:38 -05002804 doprint "config copied to $outputdir/config_good\n";
2805 run_command "cp -f $output_config $outputdir/config_good";
Steven Rostedt0a05c762010-11-08 11:14:10 -05002806}
2807
2808sub process_failed {
2809 my ($config) = @_;
2810
2811 doprint "\n\n***************************************\n";
2812 doprint "Found bad config: $config\n";
2813 doprint "***************************************\n\n";
2814}
2815
2816sub run_config_bisect {
2817
2818 my @start_list = keys %config_list;
2819
2820 if ($#start_list < 0) {
2821 doprint "No more configs to test!!!\n";
2822 return -1;
2823 }
2824
2825 doprint "***** RUN TEST ***\n";
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002826 my $type = $config_bisect_type;
Steven Rostedt0a05c762010-11-08 11:14:10 -05002827 my $ret;
2828 my %current_config;
2829
2830 my $count = $#start_list + 1;
2831 doprint " $count configs to test\n";
2832
2833 my $half = int($#start_list / 2);
2834
2835 do {
2836 my @tophalf = @start_list[0 .. $half];
2837
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002838 # keep the bottom half off
2839 if ($half < $#start_list) {
2840 @config_off_tmp = @start_list[$half + 1 .. $#start_list];
2841 } else {
2842 @config_off_tmp = ();
2843 }
2844
Steven Rostedt0a05c762010-11-08 11:14:10 -05002845 create_config @tophalf;
2846 read_current_config \%current_config;
2847
2848 $count = $#tophalf + 1;
2849 doprint "Testing $count configs\n";
2850 my $found = 0;
2851 # make sure we test something
2852 foreach my $config (@tophalf) {
2853 if (defined($current_config{$config})) {
2854 logit " $config\n";
2855 $found = 1;
2856 }
2857 }
2858 if (!$found) {
2859 # try the other half
2860 doprint "Top half produced no set configs, trying bottom half\n";
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002861
2862 # keep the top half off
2863 @config_off_tmp = @tophalf;
Steven Rostedt4c8cc552011-06-01 23:22:30 -04002864 @tophalf = @start_list[$half + 1 .. $#start_list];
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002865
Steven Rostedt0a05c762010-11-08 11:14:10 -05002866 create_config @tophalf;
2867 read_current_config \%current_config;
2868 foreach my $config (@tophalf) {
2869 if (defined($current_config{$config})) {
2870 logit " $config\n";
2871 $found = 1;
2872 }
2873 }
2874 if (!$found) {
2875 doprint "Failed: Can't make new config with current configs\n";
2876 foreach my $config (@start_list) {
2877 doprint " CONFIG: $config\n";
2878 }
2879 return -1;
2880 }
2881 $count = $#tophalf + 1;
2882 doprint "Testing $count configs\n";
2883 }
2884
2885 $ret = run_config_bisect_test $type;
Steven Rostedtc960bb92011-03-08 09:22:39 -05002886 if ($bisect_manual) {
2887 $ret = answer_bisect;
2888 }
Steven Rostedt0a05c762010-11-08 11:14:10 -05002889 if ($ret) {
2890 process_passed %current_config;
2891 return 0;
2892 }
2893
2894 doprint "This config had a failure.\n";
2895 doprint "Removing these configs that were not set in this config:\n";
Steven Rostedtf1a27852010-11-11 11:34:38 -05002896 doprint "config copied to $outputdir/config_bad\n";
2897 run_command "cp -f $output_config $outputdir/config_bad";
Steven Rostedt0a05c762010-11-08 11:14:10 -05002898
2899 # A config exists in this group that was bad.
2900 foreach my $config (keys %config_list) {
2901 if (!defined($current_config{$config})) {
2902 doprint " removing $config\n";
2903 delete $config_list{$config};
2904 }
2905 }
2906
2907 @start_list = @tophalf;
2908
2909 if ($#start_list == 0) {
2910 process_failed $start_list[0];
2911 return 1;
2912 }
2913
2914 # remove half the configs we are looking at and see if
2915 # they are good.
2916 $half = int($#start_list / 2);
Steven Rostedt4c8cc552011-06-01 23:22:30 -04002917 } while ($#start_list > 0);
Steven Rostedt0a05c762010-11-08 11:14:10 -05002918
Steven Rostedtc960bb92011-03-08 09:22:39 -05002919 # we found a single config, try it again unless we are running manually
2920
2921 if ($bisect_manual) {
2922 process_failed $start_list[0];
2923 return 1;
2924 }
2925
Steven Rostedt0a05c762010-11-08 11:14:10 -05002926 my @tophalf = @start_list[0 .. 0];
2927
2928 $ret = run_config_bisect_test $type;
2929 if ($ret) {
2930 process_passed %current_config;
2931 return 0;
2932 }
2933
2934 process_failed $start_list[0];
2935 return 1;
2936}
2937
2938sub config_bisect {
2939 my ($i) = @_;
2940
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002941 my $start_config = $config_bisect;
Steven Rostedt0a05c762010-11-08 11:14:10 -05002942
2943 my $tmpconfig = "$tmpdir/use_config";
2944
Steven Rostedt30f75da2011-06-13 10:35:35 -04002945 if (defined($config_bisect_good)) {
2946 process_config_ignore $config_bisect_good;
2947 }
2948
Steven Rostedt0a05c762010-11-08 11:14:10 -05002949 # Make the file with the bad config and the min config
2950 if (defined($minconfig)) {
2951 # read the min config for things to ignore
2952 run_command "cp $minconfig $tmpconfig" or
2953 dodie "failed to copy $minconfig to $tmpconfig";
2954 } else {
2955 unlink $tmpconfig;
2956 }
2957
Steven Rostedt0a05c762010-11-08 11:14:10 -05002958 if (-f $tmpconfig) {
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002959 load_force_config($tmpconfig);
Steven Rostedt0a05c762010-11-08 11:14:10 -05002960 process_config_ignore $tmpconfig;
2961 }
2962
2963 # now process the start config
2964 run_command "cp $start_config $output_config" or
2965 dodie "failed to copy $start_config to $output_config";
2966
2967 # read directly what we want to check
2968 my %config_check;
2969 open (IN, $output_config)
Masanari Iidaf9dee312012-02-11 21:46:56 +09002970 or dodie "failed to open $output_config";
Steven Rostedt0a05c762010-11-08 11:14:10 -05002971
2972 while (<IN>) {
2973 if (/^((CONFIG\S*)=.*)/) {
2974 $config_check{$2} = $1;
2975 }
2976 }
2977 close(IN);
2978
Steven Rostedt250bae82011-07-15 22:05:59 -04002979 # Now run oldconfig with the minconfig
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002980 make_oldconfig;
Steven Rostedt0a05c762010-11-08 11:14:10 -05002981
2982 # check to see what we lost (or gained)
2983 open (IN, $output_config)
2984 or dodie "Failed to read $start_config";
2985
2986 my %removed_configs;
2987 my %added_configs;
2988
2989 while (<IN>) {
2990 if (/^((CONFIG\S*)=.*)/) {
2991 # save off all options
2992 $config_set{$2} = $1;
2993 if (defined($config_check{$2})) {
2994 if (defined($config_ignore{$2})) {
2995 $removed_configs{$2} = $1;
2996 } else {
2997 $config_list{$2} = $1;
2998 }
2999 } elsif (!defined($config_ignore{$2})) {
3000 $added_configs{$2} = $1;
3001 $config_list{$2} = $1;
3002 }
Steven Rostedtcf79fab2012-07-19 15:29:43 -04003003 } elsif (/^# ((CONFIG\S*).*)/) {
3004 # Keep these configs disabled
3005 $config_set{$2} = $1;
3006 $config_off{$2} = $1;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003007 }
3008 }
3009 close(IN);
3010
3011 my @confs = keys %removed_configs;
3012 if ($#confs >= 0) {
3013 doprint "Configs overridden by default configs and removed from check:\n";
3014 foreach my $config (@confs) {
3015 doprint " $config\n";
3016 }
3017 }
3018 @confs = keys %added_configs;
3019 if ($#confs >= 0) {
3020 doprint "Configs appearing in make oldconfig and added:\n";
3021 foreach my $config (@confs) {
3022 doprint " $config\n";
3023 }
3024 }
3025
3026 my %config_test;
3027 my $once = 0;
3028
Steven Rostedtcf79fab2012-07-19 15:29:43 -04003029 @config_off_tmp = ();
3030
Steven Rostedt0a05c762010-11-08 11:14:10 -05003031 # Sometimes kconfig does weird things. We must make sure
3032 # that the config we autocreate has everything we need
3033 # to test, otherwise we may miss testing configs, or
3034 # may not be able to create a new config.
3035 # Here we create a config with everything set.
3036 create_config (keys %config_list);
3037 read_current_config \%config_test;
3038 foreach my $config (keys %config_list) {
3039 if (!defined($config_test{$config})) {
3040 if (!$once) {
3041 $once = 1;
3042 doprint "Configs not produced by kconfig (will not be checked):\n";
3043 }
3044 doprint " $config\n";
3045 delete $config_list{$config};
3046 }
3047 }
3048 my $ret;
Steven Rostedtb0918612012-07-19 15:26:00 -04003049
3050 if (defined($config_bisect_check) && $config_bisect_check) {
3051 doprint " Checking to make sure bad config with min config fails\n";
3052 create_config keys %config_list;
3053 $ret = run_config_bisect_test $config_bisect_type;
3054 if ($ret) {
3055 doprint " FAILED! Bad config with min config boots fine\n";
3056 return -1;
3057 }
3058 doprint " Bad config with min config fails as expected\n";
3059 }
3060
Steven Rostedt0a05c762010-11-08 11:14:10 -05003061 do {
3062 $ret = run_config_bisect;
3063 } while (!$ret);
3064
3065 return $ret if ($ret < 0);
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04003066
3067 success $i;
3068}
3069
Steven Rostedt27d934b2011-05-20 09:18:18 -04003070sub patchcheck_reboot {
3071 doprint "Reboot and sleep $patchcheck_sleep_time seconds\n";
Steven Rostedtbc7c5802011-12-22 16:29:10 -05003072 reboot_to_good $patchcheck_sleep_time;
Steven Rostedt27d934b2011-05-20 09:18:18 -04003073}
3074
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003075sub patchcheck {
3076 my ($i) = @_;
3077
3078 die "PATCHCHECK_START[$i] not defined\n"
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05003079 if (!defined($patchcheck_start));
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003080 die "PATCHCHECK_TYPE[$i] not defined\n"
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05003081 if (!defined($patchcheck_type));
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003082
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05003083 my $start = $patchcheck_start;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003084
3085 my $end = "HEAD";
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05003086 if (defined($patchcheck_end)) {
3087 $end = $patchcheck_end;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003088 }
3089
Steven Rostedta57419b2010-11-02 15:13:54 -04003090 # Get the true sha1's since we can use things like HEAD~3
3091 $start = get_sha1($start);
3092 $end = get_sha1($end);
3093
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05003094 my $type = $patchcheck_type;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003095
3096 # Can't have a test without having a test to run
3097 if ($type eq "test" && !defined($run_test)) {
3098 $type = "boot";
3099 }
3100
3101 open (IN, "git log --pretty=oneline $end|") or
3102 dodie "could not get git list";
3103
3104 my @list;
3105
3106 while (<IN>) {
3107 chomp;
3108 $list[$#list+1] = $_;
3109 last if (/^$start/);
3110 }
3111 close(IN);
3112
3113 if ($list[$#list] !~ /^$start/) {
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04003114 fail "SHA1 $start not found";
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003115 }
3116
3117 # go backwards in the list
3118 @list = reverse @list;
3119
3120 my $save_clean = $noclean;
Steven Rostedt19902072011-06-14 20:46:25 -04003121 my %ignored_warnings;
3122
3123 if (defined($ignore_warnings)) {
3124 foreach my $sha1 (split /\s+/, $ignore_warnings) {
3125 $ignored_warnings{$sha1} = 1;
3126 }
3127 }
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003128
3129 $in_patchcheck = 1;
3130 foreach my $item (@list) {
3131 my $sha1 = $item;
3132 $sha1 =~ s/^([[:xdigit:]]+).*/$1/;
3133
3134 doprint "\nProcessing commit $item\n\n";
3135
3136 run_command "git checkout $sha1" or
3137 die "Failed to checkout $sha1";
3138
3139 # only clean on the first and last patch
3140 if ($item eq $list[0] ||
3141 $item eq $list[$#list]) {
3142 $noclean = $save_clean;
3143 } else {
3144 $noclean = 1;
3145 }
3146
3147 if (defined($minconfig)) {
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04003148 build "useconfig:$minconfig" or return 0;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003149 } else {
3150 # ?? no config to use?
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04003151 build "oldconfig" or return 0;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003152 }
3153
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05003154 # No need to do per patch checking if warnings file exists
3155 if (!defined($warnings_file) && !defined($ignored_warnings{$sha1})) {
3156 check_patch_buildlog $sha1 or return 0;
Steven Rostedt19902072011-06-14 20:46:25 -04003157 }
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003158
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05003159 check_buildlog or return 0;
3160
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003161 next if ($type eq "build");
3162
Steven Rostedt7faafbd2010-11-02 14:58:22 -04003163 my $failed = 0;
3164
Steven Rostedtddf607e2011-06-14 20:49:13 -04003165 start_monitor_and_boot or $failed = 1;
Steven Rostedt7faafbd2010-11-02 14:58:22 -04003166
3167 if (!$failed && $type ne "boot"){
3168 do_run_test or $failed = 1;
3169 }
3170 end_monitor;
3171 return 0 if ($failed);
3172
Steven Rostedt27d934b2011-05-20 09:18:18 -04003173 patchcheck_reboot;
3174
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003175 }
3176 $in_patchcheck = 0;
3177 success $i;
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04003178
3179 return 1;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003180}
3181
Steven Rostedtb9066f62011-07-15 21:25:24 -04003182my %depends;
Steven Rostedtac6974c2011-10-04 09:40:17 -04003183my %depcount;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003184my $iflevel = 0;
3185my @ifdeps;
3186
3187# prevent recursion
3188my %read_kconfigs;
3189
Steven Rostedtac6974c2011-10-04 09:40:17 -04003190sub add_dep {
3191 # $config depends on $dep
3192 my ($config, $dep) = @_;
3193
3194 if (defined($depends{$config})) {
3195 $depends{$config} .= " " . $dep;
3196 } else {
3197 $depends{$config} = $dep;
3198 }
3199
3200 # record the number of configs depending on $dep
3201 if (defined $depcount{$dep}) {
3202 $depcount{$dep}++;
3203 } else {
3204 $depcount{$dep} = 1;
3205 }
3206}
3207
Steven Rostedtb9066f62011-07-15 21:25:24 -04003208# taken from streamline_config.pl
3209sub read_kconfig {
3210 my ($kconfig) = @_;
3211
3212 my $state = "NONE";
3213 my $config;
3214 my @kconfigs;
3215
3216 my $cont = 0;
3217 my $line;
3218
3219
3220 if (! -f $kconfig) {
3221 doprint "file $kconfig does not exist, skipping\n";
3222 return;
3223 }
3224
3225 open(KIN, "$kconfig")
3226 or die "Can't open $kconfig";
3227 while (<KIN>) {
3228 chomp;
3229
3230 # Make sure that lines ending with \ continue
3231 if ($cont) {
3232 $_ = $line . " " . $_;
3233 }
3234
3235 if (s/\\$//) {
3236 $cont = 1;
3237 $line = $_;
3238 next;
3239 }
3240
3241 $cont = 0;
3242
3243 # collect any Kconfig sources
3244 if (/^source\s*"(.*)"/) {
3245 $kconfigs[$#kconfigs+1] = $1;
3246 }
3247
3248 # configs found
3249 if (/^\s*(menu)?config\s+(\S+)\s*$/) {
3250 $state = "NEW";
3251 $config = $2;
3252
3253 for (my $i = 0; $i < $iflevel; $i++) {
Steven Rostedtac6974c2011-10-04 09:40:17 -04003254 add_dep $config, $ifdeps[$i];
Steven Rostedtb9066f62011-07-15 21:25:24 -04003255 }
3256
3257 # collect the depends for the config
3258 } elsif ($state eq "NEW" && /^\s*depends\s+on\s+(.*)$/) {
3259
Steven Rostedtac6974c2011-10-04 09:40:17 -04003260 add_dep $config, $1;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003261
3262 # Get the configs that select this config
Steven Rostedtac6974c2011-10-04 09:40:17 -04003263 } elsif ($state eq "NEW" && /^\s*select\s+(\S+)/) {
3264
3265 # selected by depends on config
3266 add_dep $1, $config;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003267
3268 # Check for if statements
3269 } elsif (/^if\s+(.*\S)\s*$/) {
3270 my $deps = $1;
3271 # remove beginning and ending non text
3272 $deps =~ s/^[^a-zA-Z0-9_]*//;
3273 $deps =~ s/[^a-zA-Z0-9_]*$//;
3274
3275 my @deps = split /[^a-zA-Z0-9_]+/, $deps;
3276
3277 $ifdeps[$iflevel++] = join ':', @deps;
3278
3279 } elsif (/^endif/) {
3280
3281 $iflevel-- if ($iflevel);
3282
3283 # stop on "help"
3284 } elsif (/^\s*help\s*$/) {
3285 $state = "NONE";
3286 }
3287 }
3288 close(KIN);
3289
3290 # read in any configs that were found.
3291 foreach $kconfig (@kconfigs) {
3292 if (!defined($read_kconfigs{$kconfig})) {
3293 $read_kconfigs{$kconfig} = 1;
3294 read_kconfig("$builddir/$kconfig");
3295 }
3296 }
3297}
3298
3299sub read_depends {
3300 # find out which arch this is by the kconfig file
3301 open (IN, $output_config)
3302 or dodie "Failed to read $output_config";
3303 my $arch;
3304 while (<IN>) {
3305 if (m,Linux/(\S+)\s+\S+\s+Kernel Configuration,) {
3306 $arch = $1;
3307 last;
3308 }
3309 }
3310 close IN;
3311
3312 if (!defined($arch)) {
3313 doprint "Could not find arch from config file\n";
3314 doprint "no dependencies used\n";
3315 return;
3316 }
3317
3318 # arch is really the subarch, we need to know
3319 # what directory to look at.
3320 if ($arch eq "i386" || $arch eq "x86_64") {
3321 $arch = "x86";
3322 } elsif ($arch =~ /^tile/) {
3323 $arch = "tile";
3324 }
3325
3326 my $kconfig = "$builddir/arch/$arch/Kconfig";
3327
3328 if (! -f $kconfig && $arch =~ /\d$/) {
3329 my $orig = $arch;
3330 # some subarchs have numbers, truncate them
3331 $arch =~ s/\d*$//;
3332 $kconfig = "$builddir/arch/$arch/Kconfig";
3333 if (! -f $kconfig) {
3334 doprint "No idea what arch dir $orig is for\n";
3335 doprint "no dependencies used\n";
3336 return;
3337 }
3338 }
3339
3340 read_kconfig($kconfig);
3341}
3342
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003343sub read_config_list {
3344 my ($config) = @_;
3345
3346 open (IN, $config)
3347 or dodie "Failed to read $config";
3348
3349 while (<IN>) {
3350 if (/^((CONFIG\S*)=.*)/) {
3351 if (!defined($config_ignore{$2})) {
3352 $config_list{$2} = $1;
3353 }
3354 }
3355 }
3356
3357 close(IN);
3358}
3359
3360sub read_output_config {
3361 my ($config) = @_;
3362
3363 assign_configs \%config_ignore, $config;
3364}
3365
3366sub make_new_config {
3367 my @configs = @_;
3368
3369 open (OUT, ">$output_config")
3370 or dodie "Failed to write $output_config";
3371
3372 foreach my $config (@configs) {
3373 print OUT "$config\n";
3374 }
3375 close OUT;
3376}
3377
Steven Rostedtac6974c2011-10-04 09:40:17 -04003378sub chomp_config {
3379 my ($config) = @_;
3380
3381 $config =~ s/CONFIG_//;
3382
3383 return $config;
3384}
3385
Steven Rostedtb9066f62011-07-15 21:25:24 -04003386sub get_depends {
3387 my ($dep) = @_;
3388
Steven Rostedtac6974c2011-10-04 09:40:17 -04003389 my $kconfig = chomp_config $dep;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003390
3391 $dep = $depends{"$kconfig"};
3392
3393 # the dep string we have saves the dependencies as they
3394 # were found, including expressions like ! && ||. We
3395 # want to split this out into just an array of configs.
3396
3397 my $valid = "A-Za-z_0-9";
3398
3399 my @configs;
3400
3401 while ($dep =~ /[$valid]/) {
3402
3403 if ($dep =~ /^[^$valid]*([$valid]+)/) {
3404 my $conf = "CONFIG_" . $1;
3405
3406 $configs[$#configs + 1] = $conf;
3407
3408 $dep =~ s/^[^$valid]*[$valid]+//;
3409 } else {
3410 die "this should never happen";
3411 }
3412 }
3413
3414 return @configs;
3415}
3416
3417my %min_configs;
3418my %keep_configs;
Steven Rostedt43d1b652011-07-15 22:01:56 -04003419my %save_configs;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003420my %processed_configs;
3421my %nochange_config;
3422
3423sub test_this_config {
3424 my ($config) = @_;
3425
3426 my $found;
3427
3428 # if we already processed this config, skip it
3429 if (defined($processed_configs{$config})) {
3430 return undef;
3431 }
3432 $processed_configs{$config} = 1;
3433
3434 # if this config failed during this round, skip it
3435 if (defined($nochange_config{$config})) {
3436 return undef;
3437 }
3438
Steven Rostedtac6974c2011-10-04 09:40:17 -04003439 my $kconfig = chomp_config $config;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003440
3441 # Test dependencies first
3442 if (defined($depends{"$kconfig"})) {
3443 my @parents = get_depends $config;
3444 foreach my $parent (@parents) {
3445 # if the parent is in the min config, check it first
3446 next if (!defined($min_configs{$parent}));
3447 $found = test_this_config($parent);
3448 if (defined($found)) {
3449 return $found;
3450 }
3451 }
3452 }
3453
3454 # Remove this config from the list of configs
Adam Leefb16d892012-09-01 01:05:17 +08003455 # do a make olddefconfig and then read the resulting
Steven Rostedtb9066f62011-07-15 21:25:24 -04003456 # .config to make sure it is missing the config that
3457 # we had before
3458 my %configs = %min_configs;
3459 delete $configs{$config};
3460 make_new_config ((values %configs), (values %keep_configs));
3461 make_oldconfig;
3462 undef %configs;
3463 assign_configs \%configs, $output_config;
3464
3465 return $config if (!defined($configs{$config}));
3466
3467 doprint "disabling config $config did not change .config\n";
3468
3469 $nochange_config{$config} = 1;
3470
3471 return undef;
3472}
3473
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003474sub make_min_config {
3475 my ($i) = @_;
3476
Steven Rostedtccc513b2012-05-21 17:13:40 -04003477 my $type = $minconfig_type;
3478 if ($type ne "boot" && $type ne "test") {
3479 fail "Invalid MIN_CONFIG_TYPE '$minconfig_type'\n" .
3480 " make_min_config works only with 'boot' and 'test'\n" and return;
3481 }
3482
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003483 if (!defined($output_minconfig)) {
3484 fail "OUTPUT_MIN_CONFIG not defined" and return;
3485 }
Steven Rostedt35ce5952011-07-15 21:57:25 -04003486
3487 # If output_minconfig exists, and the start_minconfig
3488 # came from min_config, than ask if we should use
3489 # that instead.
3490 if (-f $output_minconfig && !$start_minconfig_defined) {
3491 print "$output_minconfig exists\n";
Steven Rostedt43de3312012-05-21 23:35:12 -04003492 if (!defined($use_output_minconfig)) {
3493 if (read_yn " Use it as minconfig?") {
3494 $start_minconfig = $output_minconfig;
3495 }
3496 } elsif ($use_output_minconfig > 0) {
3497 doprint "Using $output_minconfig as MIN_CONFIG\n";
Steven Rostedt35ce5952011-07-15 21:57:25 -04003498 $start_minconfig = $output_minconfig;
Steven Rostedt43de3312012-05-21 23:35:12 -04003499 } else {
3500 doprint "Set to still use MIN_CONFIG as starting point\n";
Steven Rostedt35ce5952011-07-15 21:57:25 -04003501 }
3502 }
3503
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003504 if (!defined($start_minconfig)) {
3505 fail "START_MIN_CONFIG or MIN_CONFIG not defined" and return;
3506 }
3507
Steven Rostedt35ce5952011-07-15 21:57:25 -04003508 my $temp_config = "$tmpdir/temp_config";
3509
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003510 # First things first. We build an allnoconfig to find
3511 # out what the defaults are that we can't touch.
3512 # Some are selections, but we really can't handle selections.
3513
3514 my $save_minconfig = $minconfig;
3515 undef $minconfig;
3516
3517 run_command "$make allnoconfig" or return 0;
3518
Steven Rostedtb9066f62011-07-15 21:25:24 -04003519 read_depends;
3520
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003521 process_config_ignore $output_config;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003522
Steven Rostedt43d1b652011-07-15 22:01:56 -04003523 undef %save_configs;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003524 undef %min_configs;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003525
3526 if (defined($ignore_config)) {
3527 # make sure the file exists
3528 `touch $ignore_config`;
Steven Rostedt43d1b652011-07-15 22:01:56 -04003529 assign_configs \%save_configs, $ignore_config;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003530 }
3531
Steven Rostedt43d1b652011-07-15 22:01:56 -04003532 %keep_configs = %save_configs;
3533
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003534 doprint "Load initial configs from $start_minconfig\n";
3535
3536 # Look at the current min configs, and save off all the
3537 # ones that were set via the allnoconfig
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003538 assign_configs \%min_configs, $start_minconfig;
3539
3540 my @config_keys = keys %min_configs;
3541
Steven Rostedtac6974c2011-10-04 09:40:17 -04003542 # All configs need a depcount
3543 foreach my $config (@config_keys) {
3544 my $kconfig = chomp_config $config;
3545 if (!defined $depcount{$kconfig}) {
3546 $depcount{$kconfig} = 0;
3547 }
3548 }
3549
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003550 # Remove anything that was set by the make allnoconfig
3551 # we shouldn't need them as they get set for us anyway.
3552 foreach my $config (@config_keys) {
3553 # Remove anything in the ignore_config
3554 if (defined($keep_configs{$config})) {
3555 my $file = $ignore_config;
3556 $file =~ s,.*/(.*?)$,$1,;
3557 doprint "$config set by $file ... ignored\n";
3558 delete $min_configs{$config};
3559 next;
3560 }
3561 # But make sure the settings are the same. If a min config
3562 # sets a selection, we do not want to get rid of it if
3563 # it is not the same as what we have. Just move it into
3564 # the keep configs.
3565 if (defined($config_ignore{$config})) {
3566 if ($config_ignore{$config} ne $min_configs{$config}) {
3567 doprint "$config is in allnoconfig as '$config_ignore{$config}'";
3568 doprint " but it is '$min_configs{$config}' in minconfig .. keeping\n";
3569 $keep_configs{$config} = $min_configs{$config};
3570 } else {
3571 doprint "$config set by allnoconfig ... ignored\n";
3572 }
3573 delete $min_configs{$config};
3574 }
3575 }
3576
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003577 my $done = 0;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003578 my $take_two = 0;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003579
3580 while (!$done) {
3581
3582 my $config;
3583 my $found;
3584
3585 # Now disable each config one by one and do a make oldconfig
3586 # till we find a config that changes our list.
3587
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003588 my @test_configs = keys %min_configs;
Steven Rostedtac6974c2011-10-04 09:40:17 -04003589
3590 # Sort keys by who is most dependent on
3591 @test_configs = sort { $depcount{chomp_config($b)} <=> $depcount{chomp_config($a)} }
3592 @test_configs ;
3593
3594 # Put configs that did not modify the config at the end.
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003595 my $reset = 1;
3596 for (my $i = 0; $i < $#test_configs; $i++) {
3597 if (!defined($nochange_config{$test_configs[0]})) {
3598 $reset = 0;
3599 last;
3600 }
3601 # This config didn't change the .config last time.
3602 # Place it at the end
3603 my $config = shift @test_configs;
3604 push @test_configs, $config;
3605 }
3606
3607 # if every test config has failed to modify the .config file
3608 # in the past, then reset and start over.
3609 if ($reset) {
3610 undef %nochange_config;
3611 }
3612
Steven Rostedtb9066f62011-07-15 21:25:24 -04003613 undef %processed_configs;
3614
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003615 foreach my $config (@test_configs) {
3616
Steven Rostedtb9066f62011-07-15 21:25:24 -04003617 $found = test_this_config $config;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003618
Steven Rostedtb9066f62011-07-15 21:25:24 -04003619 last if (defined($found));
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003620
3621 # oh well, try another config
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003622 }
3623
3624 if (!defined($found)) {
Steven Rostedtb9066f62011-07-15 21:25:24 -04003625 # we could have failed due to the nochange_config hash
3626 # reset and try again
3627 if (!$take_two) {
3628 undef %nochange_config;
3629 $take_two = 1;
3630 next;
3631 }
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003632 doprint "No more configs found that we can disable\n";
3633 $done = 1;
3634 last;
3635 }
Steven Rostedtb9066f62011-07-15 21:25:24 -04003636 $take_two = 0;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003637
3638 $config = $found;
3639
3640 doprint "Test with $config disabled\n";
3641
3642 # set in_bisect to keep build and monitor from dieing
3643 $in_bisect = 1;
3644
3645 my $failed = 0;
Steven Rostedtbf1c95a2012-02-27 13:58:49 -05003646 build "oldconfig" or $failed = 1;
3647 if (!$failed) {
3648 start_monitor_and_boot or $failed = 1;
Steven Rostedtccc513b2012-05-21 17:13:40 -04003649
3650 if ($type eq "test" && !$failed) {
3651 do_run_test or $failed = 1;
3652 }
3653
Steven Rostedtbf1c95a2012-02-27 13:58:49 -05003654 end_monitor;
3655 }
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003656
3657 $in_bisect = 0;
3658
3659 if ($failed) {
Steven Rostedtb9066f62011-07-15 21:25:24 -04003660 doprint "$min_configs{$config} is needed to boot the box... keeping\n";
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003661 # this config is needed, add it to the ignore list.
3662 $keep_configs{$config} = $min_configs{$config};
Steven Rostedt43d1b652011-07-15 22:01:56 -04003663 $save_configs{$config} = $min_configs{$config};
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003664 delete $min_configs{$config};
Steven Rostedt35ce5952011-07-15 21:57:25 -04003665
3666 # update new ignore configs
3667 if (defined($ignore_config)) {
3668 open (OUT, ">$temp_config")
3669 or die "Can't write to $temp_config";
Steven Rostedt43d1b652011-07-15 22:01:56 -04003670 foreach my $config (keys %save_configs) {
3671 print OUT "$save_configs{$config}\n";
Steven Rostedt35ce5952011-07-15 21:57:25 -04003672 }
3673 close OUT;
3674 run_command "mv $temp_config $ignore_config" or
3675 dodie "failed to copy update to $ignore_config";
3676 }
3677
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003678 } else {
3679 # We booted without this config, remove it from the minconfigs.
3680 doprint "$config is not needed, disabling\n";
3681
3682 delete $min_configs{$config};
3683
3684 # Also disable anything that is not enabled in this config
3685 my %configs;
3686 assign_configs \%configs, $output_config;
3687 my @config_keys = keys %min_configs;
3688 foreach my $config (@config_keys) {
3689 if (!defined($configs{$config})) {
3690 doprint "$config is not set, disabling\n";
3691 delete $min_configs{$config};
3692 }
3693 }
3694
3695 # Save off all the current mandidory configs
Steven Rostedt35ce5952011-07-15 21:57:25 -04003696 open (OUT, ">$temp_config")
3697 or die "Can't write to $temp_config";
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003698 foreach my $config (keys %keep_configs) {
3699 print OUT "$keep_configs{$config}\n";
3700 }
3701 foreach my $config (keys %min_configs) {
3702 print OUT "$min_configs{$config}\n";
3703 }
3704 close OUT;
Steven Rostedt35ce5952011-07-15 21:57:25 -04003705
3706 run_command "mv $temp_config $output_minconfig" or
3707 dodie "failed to copy update to $output_minconfig";
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003708 }
3709
3710 doprint "Reboot and wait $sleep_time seconds\n";
Steven Rostedtbc7c5802011-12-22 16:29:10 -05003711 reboot_to_good $sleep_time;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003712 }
3713
3714 success $i;
3715 return 1;
3716}
3717
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05003718sub make_warnings_file {
3719 my ($i) = @_;
3720
3721 if (!defined($warnings_file)) {
3722 dodie "Must define WARNINGS_FILE for make_warnings_file test";
3723 }
3724
3725 if ($build_type eq "nobuild") {
3726 dodie "BUILD_TYPE can not be 'nobuild' for make_warnings_file test";
3727 }
3728
3729 build $build_type or dodie "Failed to build";
3730
3731 open(OUT, ">$warnings_file") or dodie "Can't create $warnings_file";
3732
3733 open(IN, $buildlog) or dodie "Can't open $buildlog";
3734 while (<IN>) {
3735
3736 # Some compilers use UTF-8 extended for quotes
3737 # for distcc heterogeneous systems, this causes issues
3738 s/$utf8_quote/'/g;
3739
3740 if (/$check_build_re/) {
3741 print OUT;
3742 }
3743 }
3744 close(IN);
3745
3746 close(OUT);
3747
3748 success $i;
3749}
3750
Steven Rostedt8d1491b2010-11-18 15:39:48 -05003751$#ARGV < 1 or die "ktest.pl version: $VERSION\n usage: ktest.pl config-file\n";
Steven Rostedt2545eb62010-11-02 15:01:32 -04003752
Steven Rostedt8d1491b2010-11-18 15:39:48 -05003753if ($#ARGV == 0) {
3754 $ktest_config = $ARGV[0];
3755 if (! -f $ktest_config) {
3756 print "$ktest_config does not exist.\n";
Steven Rostedt35ce5952011-07-15 21:57:25 -04003757 if (!read_yn "Create it?") {
Steven Rostedt8d1491b2010-11-18 15:39:48 -05003758 exit 0;
3759 }
3760 }
3761} else {
3762 $ktest_config = "ktest.conf";
3763}
3764
3765if (! -f $ktest_config) {
Steven Rostedtdbd37832011-11-23 16:00:48 -05003766 $newconfig = 1;
Steven Rostedtc4261d02011-11-23 13:41:18 -05003767 get_test_case;
Steven Rostedt8d1491b2010-11-18 15:39:48 -05003768 open(OUT, ">$ktest_config") or die "Can not create $ktest_config";
3769 print OUT << "EOF"
3770# Generated by ktest.pl
3771#
Steven Rostedt0e7a22d2011-11-21 20:39:33 -05003772
3773# PWD is a ktest.pl variable that will result in the process working
3774# directory that ktest.pl is executed in.
3775
3776# THIS_DIR is automatically assigned the PWD of the path that generated
3777# the config file. It is best to use this variable when assigning other
3778# directory paths within this directory. This allows you to easily
3779# move the test cases to other locations or to other machines.
3780#
3781THIS_DIR := $variable{"PWD"}
3782
Steven Rostedt8d1491b2010-11-18 15:39:48 -05003783# Define each test with TEST_START
3784# The config options below it will override the defaults
3785TEST_START
Steven Rostedtc4261d02011-11-23 13:41:18 -05003786TEST_TYPE = $default{"TEST_TYPE"}
Steven Rostedt8d1491b2010-11-18 15:39:48 -05003787
3788DEFAULTS
3789EOF
3790;
3791 close(OUT);
3792}
3793read_config $ktest_config;
3794
Steven Rostedt23715c3c2011-06-13 11:03:34 -04003795if (defined($opt{"LOG_FILE"})) {
Steven Rostedt (Red Hat)04262be2013-01-31 10:12:20 -05003796 $opt{"LOG_FILE"} = eval_option("LOG_FILE", $opt{"LOG_FILE"}, -1);
Steven Rostedt23715c3c2011-06-13 11:03:34 -04003797}
3798
Steven Rostedt8d1491b2010-11-18 15:39:48 -05003799# Append any configs entered in manually to the config file.
3800my @new_configs = keys %entered_configs;
3801if ($#new_configs >= 0) {
3802 print "\nAppending entered in configs to $ktest_config\n";
3803 open(OUT, ">>$ktest_config") or die "Can not append to $ktest_config";
3804 foreach my $config (@new_configs) {
3805 print OUT "$config = $entered_configs{$config}\n";
Steven Rostedt0e7a22d2011-11-21 20:39:33 -05003806 $opt{$config} = process_variables($entered_configs{$config});
Steven Rostedt8d1491b2010-11-18 15:39:48 -05003807 }
3808}
Steven Rostedt2545eb62010-11-02 15:01:32 -04003809
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04003810if ($opt{"CLEAR_LOG"} && defined($opt{"LOG_FILE"})) {
3811 unlink $opt{"LOG_FILE"};
3812}
Steven Rostedt2545eb62010-11-02 15:01:32 -04003813
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04003814doprint "\n\nSTARTING AUTOMATED TESTS\n\n";
3815
Steven Rostedta57419b2010-11-02 15:13:54 -04003816for (my $i = 0, my $repeat = 1; $i <= $opt{"NUM_TESTS"}; $i += $repeat) {
3817
3818 if (!$i) {
3819 doprint "DEFAULT OPTIONS:\n";
3820 } else {
3821 doprint "\nTEST $i OPTIONS";
3822 if (defined($repeat_tests{$i})) {
3823 $repeat = $repeat_tests{$i};
3824 doprint " ITERATE $repeat";
3825 }
3826 doprint "\n";
3827 }
3828
3829 foreach my $option (sort keys %opt) {
3830
3831 if ($option =~ /\[(\d+)\]$/) {
3832 next if ($i != $1);
3833 } else {
3834 next if ($i);
3835 }
3836
3837 doprint "$option = $opt{$option}\n";
3838 }
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04003839}
Steven Rostedt2545eb62010-11-02 15:01:32 -04003840
Steven Rostedt2a625122011-05-20 15:48:59 -04003841sub __set_test_option {
Steven Rostedt5a391fb2010-11-02 14:57:43 -04003842 my ($name, $i) = @_;
3843
3844 my $option = "$name\[$i\]";
3845
3846 if (defined($opt{$option})) {
3847 return $opt{$option};
3848 }
3849
Steven Rostedta57419b2010-11-02 15:13:54 -04003850 foreach my $test (keys %repeat_tests) {
3851 if ($i >= $test &&
3852 $i < $test + $repeat_tests{$test}) {
3853 $option = "$name\[$test\]";
3854 if (defined($opt{$option})) {
3855 return $opt{$option};
3856 }
3857 }
3858 }
3859
Steven Rostedt5a391fb2010-11-02 14:57:43 -04003860 if (defined($opt{$name})) {
3861 return $opt{$name};
3862 }
3863
3864 return undef;
3865}
3866
Steven Rostedt2a625122011-05-20 15:48:59 -04003867sub set_test_option {
3868 my ($name, $i) = @_;
3869
3870 my $option = __set_test_option($name, $i);
3871 return $option if (!defined($option));
3872
Steven Rostedt (Red Hat)04262be2013-01-31 10:12:20 -05003873 return eval_option($name, $option, $i);
Steven Rostedt2a625122011-05-20 15:48:59 -04003874}
3875
Steven Rostedt2545eb62010-11-02 15:01:32 -04003876# First we need to do is the builds
Steven Rostedta75fece2010-11-02 14:58:27 -04003877for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {
Steven Rostedt2545eb62010-11-02 15:01:32 -04003878
Steven Rostedt4ab1cce2011-09-30 18:12:20 -04003879 # Do not reboot on failing test options
3880 $no_reboot = 1;
Steven Rostedt759a3cc2012-05-01 08:20:12 -04003881 $reboot_success = 0;
Steven Rostedt4ab1cce2011-09-30 18:12:20 -04003882
Steven Rostedt683a3e62012-05-18 13:34:35 -04003883 $have_version = 0;
3884
Steven Rostedt576f6272010-11-02 14:58:38 -04003885 $iteration = $i;
3886
Steven Rostedtc1434dc2012-07-20 22:39:16 -04003887 undef %force_config;
3888
Steven Rostedta75fece2010-11-02 14:58:27 -04003889 my $makecmd = set_test_option("MAKE_CMD", $i);
3890
Steven Rostedt9cc9e092011-12-22 21:37:22 -05003891 # Load all the options into their mapped variable names
3892 foreach my $opt (keys %option_map) {
3893 ${$option_map{$opt}} = set_test_option($opt, $i);
3894 }
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05003895
Steven Rostedt35ce5952011-07-15 21:57:25 -04003896 $start_minconfig_defined = 1;
3897
Steven Rostedt921ed4c2012-07-19 15:18:27 -04003898 # The first test may override the PRE_KTEST option
3899 if (defined($pre_ktest) && $i == 1) {
3900 doprint "\n";
3901 run_command $pre_ktest;
3902 }
3903
3904 # Any test can override the POST_KTEST option
3905 # The last test takes precedence.
3906 if (defined($post_ktest)) {
3907 $final_post_ktest = $post_ktest;
3908 }
3909
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003910 if (!defined($start_minconfig)) {
Steven Rostedt35ce5952011-07-15 21:57:25 -04003911 $start_minconfig_defined = 0;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003912 $start_minconfig = $minconfig;
3913 }
3914
Steven Rostedta75fece2010-11-02 14:58:27 -04003915 chdir $builddir || die "can't change directory to $builddir";
3916
Andrew Jonesa908a662011-08-12 15:32:03 +02003917 foreach my $dir ($tmpdir, $outputdir) {
3918 if (!-d $dir) {
3919 mkpath($dir) or
3920 die "can't create $dir";
3921 }
Steven Rostedta75fece2010-11-02 14:58:27 -04003922 }
3923
Steven Rostedte48c5292010-11-02 14:35:37 -04003924 $ENV{"SSH_USER"} = $ssh_user;
3925 $ENV{"MACHINE"} = $machine;
3926
Steven Rostedta75fece2010-11-02 14:58:27 -04003927 $buildlog = "$tmpdir/buildlog-$machine";
Rabin Vincenta9dd5d62011-11-18 17:05:29 +05303928 $testlog = "$tmpdir/testlog-$machine";
Steven Rostedta75fece2010-11-02 14:58:27 -04003929 $dmesg = "$tmpdir/dmesg-$machine";
3930 $make = "$makecmd O=$outputdir";
Steven Rostedt51ad1dd2010-11-08 16:43:21 -05003931 $output_config = "$outputdir/.config";
Steven Rostedta75fece2010-11-02 14:58:27 -04003932
Steven Rostedtbb8474b2011-11-23 15:58:00 -05003933 if (!$buildonly) {
3934 $target = "$ssh_user\@$machine";
3935 if ($reboot_type eq "grub") {
3936 dodie "GRUB_MENU not defined" if (!defined($grub_menu));
Steven Rostedta15ba912012-11-13 14:30:37 -05003937 } elsif ($reboot_type eq "grub2") {
3938 dodie "GRUB_MENU not defined" if (!defined($grub_menu));
3939 dodie "GRUB_FILE not defined" if (!defined($grub_file));
Steven Rostedt77869542012-12-11 17:37:41 -05003940 } elsif ($reboot_type eq "syslinux") {
3941 dodie "SYSLINUX_LABEL not defined" if (!defined($syslinux_label));
Steven Rostedtbb8474b2011-11-23 15:58:00 -05003942 }
Steven Rostedta75fece2010-11-02 14:58:27 -04003943 }
3944
3945 my $run_type = $build_type;
3946 if ($test_type eq "patchcheck") {
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05003947 $run_type = $patchcheck_type;
Steven Rostedta75fece2010-11-02 14:58:27 -04003948 } elsif ($test_type eq "bisect") {
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05003949 $run_type = $bisect_type;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003950 } elsif ($test_type eq "config_bisect") {
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05003951 $run_type = $config_bisect_type;
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05003952 } elsif ($test_type eq "make_min_config") {
3953 $run_type = "";
3954 } elsif ($test_type eq "make_warnings_file") {
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003955 $run_type = "";
3956 }
3957
Steven Rostedta75fece2010-11-02 14:58:27 -04003958 # mistake in config file?
3959 if (!defined($run_type)) {
3960 $run_type = "ERROR";
3961 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04003962
Steven Rostedte0a87422011-09-30 17:50:48 -04003963 my $installme = "";
3964 $installme = " no_install" if ($no_install);
3965
Steven Rostedt2545eb62010-11-02 15:01:32 -04003966 doprint "\n\n";
Steven Rostedte0a87422011-09-30 17:50:48 -04003967 doprint "RUNNING TEST $i of $opt{NUM_TESTS} with option $test_type $run_type$installme\n\n";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04003968
Steven Rostedt921ed4c2012-07-19 15:18:27 -04003969 if (defined($pre_test)) {
3970 run_command $pre_test;
3971 }
3972
Steven Rostedt7faafbd2010-11-02 14:58:22 -04003973 unlink $dmesg;
3974 unlink $buildlog;
Rabin Vincenta9dd5d62011-11-18 17:05:29 +05303975 unlink $testlog;
Steven Rostedt2545eb62010-11-02 15:01:32 -04003976
Steven Rostedt250bae82011-07-15 22:05:59 -04003977 if (defined($addconfig)) {
3978 my $min = $minconfig;
3979 if (!defined($minconfig)) {
3980 $min = "";
3981 }
3982 run_command "cat $addconfig $min > $tmpdir/add_config" or
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04003983 dodie "Failed to create temp config";
Steven Rostedt9be2e6b2010-11-09 12:20:21 -05003984 $minconfig = "$tmpdir/add_config";
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04003985 }
3986
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003987 if (defined($checkout)) {
3988 run_command "git checkout $checkout" or
3989 die "failed to checkout $checkout";
3990 }
3991
Steven Rostedt759a3cc2012-05-01 08:20:12 -04003992 $no_reboot = 0;
3993
Steven Rostedt648a1822012-03-21 11:18:27 -04003994 # A test may opt to not reboot the box
3995 if ($reboot_on_success) {
Steven Rostedt759a3cc2012-05-01 08:20:12 -04003996 $reboot_success = 1;
Steven Rostedt648a1822012-03-21 11:18:27 -04003997 }
Steven Rostedt4ab1cce2011-09-30 18:12:20 -04003998
Steven Rostedta75fece2010-11-02 14:58:27 -04003999 if ($test_type eq "bisect") {
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04004000 bisect $i;
4001 next;
Steven Rostedt0a05c762010-11-08 11:14:10 -05004002 } elsif ($test_type eq "config_bisect") {
4003 config_bisect $i;
4004 next;
Steven Rostedta75fece2010-11-02 14:58:27 -04004005 } elsif ($test_type eq "patchcheck") {
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04004006 patchcheck $i;
4007 next;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04004008 } elsif ($test_type eq "make_min_config") {
4009 make_min_config $i;
4010 next;
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05004011 } elsif ($test_type eq "make_warnings_file") {
4012 $no_reboot = 1;
4013 make_warnings_file $i;
4014 next;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04004015 }
4016
Steven Rostedt7faafbd2010-11-02 14:58:22 -04004017 if ($build_type ne "nobuild") {
4018 build $build_type or next;
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05004019 check_buildlog or next;
Steven Rostedt2545eb62010-11-02 15:01:32 -04004020 }
4021
Steven Rostedtcd8e3682011-08-18 16:35:44 -04004022 if ($test_type eq "install") {
4023 get_version;
4024 install;
4025 success $i;
4026 next;
4027 }
4028
Steven Rostedta75fece2010-11-02 14:58:27 -04004029 if ($test_type ne "build") {
Steven Rostedta75fece2010-11-02 14:58:27 -04004030 my $failed = 0;
Steven Rostedtddf607e2011-06-14 20:49:13 -04004031 start_monitor_and_boot or $failed = 1;
Steven Rostedta75fece2010-11-02 14:58:27 -04004032
4033 if (!$failed && $test_type ne "boot" && defined($run_test)) {
4034 do_run_test or $failed = 1;
4035 }
4036 end_monitor;
4037 next if ($failed);
Steven Rostedt5a391fb2010-11-02 14:57:43 -04004038 }
4039
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04004040 success $i;
Steven Rostedt2545eb62010-11-02 15:01:32 -04004041}
4042
Steven Rostedt921ed4c2012-07-19 15:18:27 -04004043if (defined($final_post_ktest)) {
4044 run_command $final_post_ktest;
4045}
4046
Steven Rostedt5c42fc52010-11-02 14:57:01 -04004047if ($opt{"POWEROFF_ON_SUCCESS"}) {
Steven Rostedt75c3fda72010-11-02 14:57:21 -04004048 halt;
Steven Rostedt759a3cc2012-05-01 08:20:12 -04004049} elsif ($opt{"REBOOT_ON_SUCCESS"} && !do_not_reboot && $reboot_success) {
Steven Rostedtbc7c5802011-12-22 16:29:10 -05004050 reboot_to_good;
Steven Rostedt648a1822012-03-21 11:18:27 -04004051} elsif (defined($switch_to_good)) {
4052 # still need to get to the good kernel
4053 run_command $switch_to_good;
Steven Rostedt5c42fc52010-11-02 14:57:01 -04004054}
Steven Rostedt75c3fda72010-11-02 14:57:21 -04004055
Steven Rostedt648a1822012-03-21 11:18:27 -04004056
Steven Rostedte48c5292010-11-02 14:35:37 -04004057doprint "\n $successes of $opt{NUM_TESTS} tests were successful\n\n";
4058
Steven Rostedt2545eb62010-11-02 15:01:32 -04004059exit 0;