blob: 177319822401f03662a824a3b24453dfc5518eb7 [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 Rostedt (Red Hat)c75d22d2013-12-11 21:16:59 -050021my %evals;
Steven Rostedt2545eb62010-11-02 15:01:32 -040022
23#default opts
Steven Rostedt4f43e0d2011-12-22 21:32:05 -050024my %default = (
25 "NUM_TESTS" => 1,
26 "TEST_TYPE" => "build",
27 "BUILD_TYPE" => "randconfig",
28 "MAKE_CMD" => "make",
Satoru Takeuchi5a5d8e42013-12-01 07:57:58 +090029 "CLOSE_CONSOLE_SIGNAL" => "INT",
Steven Rostedt4f43e0d2011-12-22 21:32:05 -050030 "TIMEOUT" => 120,
31 "TMP_DIR" => "/tmp/ktest/\${MACHINE}",
32 "SLEEP_TIME" => 60, # sleep time between tests
33 "BUILD_NOCLEAN" => 0,
34 "REBOOT_ON_ERROR" => 0,
35 "POWEROFF_ON_ERROR" => 0,
36 "REBOOT_ON_SUCCESS" => 1,
37 "POWEROFF_ON_SUCCESS" => 0,
38 "BUILD_OPTIONS" => "",
39 "BISECT_SLEEP_TIME" => 60, # sleep time between bisects
40 "PATCHCHECK_SLEEP_TIME" => 60, # sleep time between patch checks
41 "CLEAR_LOG" => 0,
42 "BISECT_MANUAL" => 0,
43 "BISECT_SKIP" => 1,
Steven Rostedt (Red Hat)961d9ca2014-01-18 19:52:13 -050044 "BISECT_TRIES" => 1,
Steven Rostedtccc513b2012-05-21 17:13:40 -040045 "MIN_CONFIG_TYPE" => "boot",
Steven Rostedt4f43e0d2011-12-22 21:32:05 -050046 "SUCCESS_LINE" => "login:",
47 "DETECT_TRIPLE_FAULT" => 1,
48 "NO_INSTALL" => 0,
49 "BOOTED_TIMEOUT" => 1,
50 "DIE_ON_FAILURE" => 1,
51 "SSH_EXEC" => "ssh \$SSH_USER\@\$MACHINE \$SSH_COMMAND",
52 "SCP_TO_TARGET" => "scp \$SRC_FILE \$SSH_USER\@\$MACHINE:\$DST_FILE",
Steven Rostedt02ad2612012-03-21 08:21:24 -040053 "SCP_TO_TARGET_INSTALL" => "\${SCP_TO_TARGET}",
Steven Rostedt4f43e0d2011-12-22 21:32:05 -050054 "REBOOT" => "ssh \$SSH_USER\@\$MACHINE reboot",
55 "STOP_AFTER_SUCCESS" => 10,
56 "STOP_AFTER_FAILURE" => 60,
57 "STOP_TEST_AFTER" => 600,
Steven Rostedt407b95b2012-07-19 16:05:42 -040058 "MAX_MONITOR_WAIT" => 1800,
Steven Rostedta15ba912012-11-13 14:30:37 -050059 "GRUB_REBOOT" => "grub2-reboot",
Steven Rostedt77869542012-12-11 17:37:41 -050060 "SYSLINUX" => "extlinux",
61 "SYSLINUX_PATH" => "/boot/extlinux",
Steven Rostedt600bbf02011-11-21 20:12:04 -050062
63# required, and we will ask users if they don't have them but we keep the default
64# value something that is common.
Steven Rostedt4f43e0d2011-12-22 21:32:05 -050065 "REBOOT_TYPE" => "grub",
66 "LOCALVERSION" => "-test",
67 "SSH_USER" => "root",
68 "BUILD_TARGET" => "arch/x86/boot/bzImage",
69 "TARGET_IMAGE" => "/boot/vmlinuz-test",
Steven Rostedt9cc9e092011-12-22 21:37:22 -050070
71 "LOG_FILE" => undef,
72 "IGNORE_UNUSED" => 0,
Steven Rostedt4f43e0d2011-12-22 21:32:05 -050073);
Steven Rostedt2545eb62010-11-02 15:01:32 -040074
Satoru Takeuchi5269faa2014-03-09 23:32:04 +090075my $ktest_config = "ktest.conf";
Steven Rostedt2545eb62010-11-02 15:01:32 -040076my $version;
Steven Rostedt683a3e62012-05-18 13:34:35 -040077my $have_version = 0;
Steven Rostedta75fece2010-11-02 14:58:27 -040078my $machine;
Steven Rostedt (Red Hat)df5f7c62013-04-24 16:03:30 -040079my $last_machine;
Steven Rostedte48c5292010-11-02 14:35:37 -040080my $ssh_user;
Steven Rostedta75fece2010-11-02 14:58:27 -040081my $tmpdir;
82my $builddir;
83my $outputdir;
Steven Rostedt51ad1dd2010-11-08 16:43:21 -050084my $output_config;
Steven Rostedta75fece2010-11-02 14:58:27 -040085my $test_type;
Steven Rostedt7faafbd2010-11-02 14:58:22 -040086my $build_type;
Steven Rostedta75fece2010-11-02 14:58:27 -040087my $build_options;
Steven Rostedt921ed4c2012-07-19 15:18:27 -040088my $final_post_ktest;
89my $pre_ktest;
90my $post_ktest;
91my $pre_test;
92my $post_test;
Steven Rostedt0bd6c1a2011-06-14 20:39:31 -040093my $pre_build;
94my $post_build;
95my $pre_build_die;
96my $post_build_die;
Steven Rostedta75fece2010-11-02 14:58:27 -040097my $reboot_type;
98my $reboot_script;
99my $power_cycle;
Steven Rostedte48c5292010-11-02 14:35:37 -0400100my $reboot;
Steven Rostedta75fece2010-11-02 14:58:27 -0400101my $reboot_on_error;
Steven Rostedtbc7c5802011-12-22 16:29:10 -0500102my $switch_to_good;
103my $switch_to_test;
Steven Rostedta75fece2010-11-02 14:58:27 -0400104my $poweroff_on_error;
Steven Rostedt648a1822012-03-21 11:18:27 -0400105my $reboot_on_success;
Steven Rostedta75fece2010-11-02 14:58:27 -0400106my $die_on_failure;
Steven Rostedt576f6272010-11-02 14:58:38 -0400107my $powercycle_after_reboot;
108my $poweroff_after_halt;
Steven Rostedt407b95b2012-07-19 16:05:42 -0400109my $max_monitor_wait;
Steven Rostedte48c5292010-11-02 14:35:37 -0400110my $ssh_exec;
111my $scp_to_target;
Steven Rostedt02ad2612012-03-21 08:21:24 -0400112my $scp_to_target_install;
Steven Rostedta75fece2010-11-02 14:58:27 -0400113my $power_off;
114my $grub_menu;
Steven Rostedt (Red Hat)752d9662013-03-08 09:33:35 -0500115my $last_grub_menu;
Steven Rostedta15ba912012-11-13 14:30:37 -0500116my $grub_file;
Steven Rostedt2545eb62010-11-02 15:01:32 -0400117my $grub_number;
Steven Rostedta15ba912012-11-13 14:30:37 -0500118my $grub_reboot;
Steven Rostedt77869542012-12-11 17:37:41 -0500119my $syslinux;
120my $syslinux_path;
121my $syslinux_label;
Steven Rostedt2545eb62010-11-02 15:01:32 -0400122my $target;
123my $make;
Steven Rostedte5c2ec12012-07-19 15:22:05 -0400124my $pre_install;
Steven Rostedt8b37ca82010-11-02 14:58:33 -0400125my $post_install;
Steven Rostedte0a87422011-09-30 17:50:48 -0400126my $no_install;
Steven Rostedt5c42fc52010-11-02 14:57:01 -0400127my $noclean;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -0400128my $minconfig;
Steven Rostedt4c4ab122011-07-15 21:16:17 -0400129my $start_minconfig;
Steven Rostedt35ce5952011-07-15 21:57:25 -0400130my $start_minconfig_defined;
Steven Rostedt4c4ab122011-07-15 21:16:17 -0400131my $output_minconfig;
Steven Rostedtccc513b2012-05-21 17:13:40 -0400132my $minconfig_type;
Steven Rostedt43de3312012-05-21 23:35:12 -0400133my $use_output_minconfig;
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -0500134my $warnings_file;
Steven Rostedt4c4ab122011-07-15 21:16:17 -0400135my $ignore_config;
Steven Rostedtbe405f92012-01-04 21:51:59 -0500136my $ignore_errors;
Steven Rostedt2b7d9b22010-11-02 14:58:15 -0400137my $addconfig;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -0400138my $in_bisect = 0;
Steven Rostedtb5f4aea2011-12-22 21:33:55 -0500139my $bisect_bad_commit = "";
Steven Rostedtd6ce2a02010-11-02 14:58:05 -0400140my $reverse_bisect;
Steven Rostedtc960bb92011-03-08 09:22:39 -0500141my $bisect_manual;
Steven Rostedtc23dca72011-03-08 09:26:31 -0500142my $bisect_skip;
Steven Rostedt (Red Hat)961d9ca2014-01-18 19:52:13 -0500143my $bisect_tries;
Steven Rostedt30f75da2011-06-13 10:35:35 -0400144my $config_bisect_good;
Steven Rostedtc5dacb82011-12-22 12:43:57 -0500145my $bisect_ret_good;
146my $bisect_ret_bad;
147my $bisect_ret_skip;
148my $bisect_ret_abort;
149my $bisect_ret_default;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -0400150my $in_patchcheck = 0;
Steven Rostedt5a391fb2010-11-02 14:57:43 -0400151my $run_test;
Steven Rostedt7faafbd2010-11-02 14:58:22 -0400152my $buildlog;
Rabin Vincenta9dd5d62011-11-18 17:05:29 +0530153my $testlog;
Steven Rostedt7faafbd2010-11-02 14:58:22 -0400154my $dmesg;
155my $monitor_fp;
156my $monitor_pid;
157my $monitor_cnt = 0;
Steven Rostedta75fece2010-11-02 14:58:27 -0400158my $sleep_time;
159my $bisect_sleep_time;
Steven Rostedt27d934b2011-05-20 09:18:18 -0400160my $patchcheck_sleep_time;
Steven Rostedt19902072011-06-14 20:46:25 -0400161my $ignore_warnings;
Steven Rostedta75fece2010-11-02 14:58:27 -0400162my $store_failures;
Rabin Vincentde5b6e32011-11-18 17:05:31 +0530163my $store_successes;
Steven Rostedt9064af52011-06-13 10:38:48 -0400164my $test_name;
Steven Rostedta75fece2010-11-02 14:58:27 -0400165my $timeout;
166my $booted_timeout;
Steven Rostedtf1a5b962011-06-13 10:30:00 -0400167my $detect_triplefault;
Steven Rostedta75fece2010-11-02 14:58:27 -0400168my $console;
Satoru Takeuchi5a5d8e42013-12-01 07:57:58 +0900169my $close_console_signal;
Steven Rostedt2b803362011-09-30 18:00:23 -0400170my $reboot_success_line;
Steven Rostedta75fece2010-11-02 14:58:27 -0400171my $success_line;
Steven Rostedt1c8a6172010-11-09 12:55:40 -0500172my $stop_after_success;
173my $stop_after_failure;
Steven Rostedt2d01b262011-03-08 09:47:54 -0500174my $stop_test_after;
Steven Rostedta75fece2010-11-02 14:58:27 -0400175my $build_target;
176my $target_image;
Steven Rostedtb5f4aea2011-12-22 21:33:55 -0500177my $checkout;
Steven Rostedta75fece2010-11-02 14:58:27 -0400178my $localversion;
Steven Rostedt576f6272010-11-02 14:58:38 -0400179my $iteration = 0;
Steven Rostedte48c5292010-11-02 14:35:37 -0400180my $successes = 0;
Josh Poimboeuf98842782015-01-27 12:10:04 -0600181my $stty;
Steven Rostedt2545eb62010-11-02 15:01:32 -0400182
Steven Rostedtb5f4aea2011-12-22 21:33:55 -0500183my $bisect_good;
184my $bisect_bad;
185my $bisect_type;
186my $bisect_start;
187my $bisect_replay;
188my $bisect_files;
189my $bisect_reverse;
190my $bisect_check;
191
192my $config_bisect;
193my $config_bisect_type;
Steven Rostedtb0918612012-07-19 15:26:00 -0400194my $config_bisect_check;
Steven Rostedtb5f4aea2011-12-22 21:33:55 -0500195
196my $patchcheck_type;
197my $patchcheck_start;
Steven Rostedt (Red Hat)23a0e162014-09-19 20:10:39 -0400198my $patchcheck_cherry;
Steven Rostedtb5f4aea2011-12-22 21:33:55 -0500199my $patchcheck_end;
200
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -0500201my $build_time;
202my $install_time;
203my $reboot_time;
204my $test_time;
205
Steven Rostedt165708b2011-11-26 20:56:52 -0500206# set when a test is something other that just building or install
Steven Rostedtbb8474b2011-11-23 15:58:00 -0500207# which would require more options.
208my $buildonly = 1;
209
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -0500210# tell build not to worry about warnings, even when WARNINGS_FILE is set
211my $warnings_ok = 0;
212
Steven Rostedtdbd37832011-11-23 16:00:48 -0500213# set when creating a new config
214my $newconfig = 0;
215
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500216my %entered_configs;
217my %config_help;
Steven Rostedt77d942c2011-05-20 13:36:58 -0400218my %variable;
Steven Rostedtcf79fab2012-07-19 15:29:43 -0400219
220# force_config is the list of configs that we force enabled (or disabled)
221# in a .config file. The MIN_CONFIG and ADD_CONFIG configs.
Steven Rostedtfcb3f162011-06-13 10:40:58 -0400222my %force_config;
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500223
Steven Rostedt4ab1cce2011-09-30 18:12:20 -0400224# do not force reboots on config problems
225my $no_reboot = 1;
226
Steven Rostedt759a3cc2012-05-01 08:20:12 -0400227# reboot on success
228my $reboot_success = 0;
229
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500230my %option_map = (
231 "MACHINE" => \$machine,
232 "SSH_USER" => \$ssh_user,
233 "TMP_DIR" => \$tmpdir,
234 "OUTPUT_DIR" => \$outputdir,
235 "BUILD_DIR" => \$builddir,
236 "TEST_TYPE" => \$test_type,
Steven Rostedt921ed4c2012-07-19 15:18:27 -0400237 "PRE_KTEST" => \$pre_ktest,
238 "POST_KTEST" => \$post_ktest,
239 "PRE_TEST" => \$pre_test,
240 "POST_TEST" => \$post_test,
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500241 "BUILD_TYPE" => \$build_type,
242 "BUILD_OPTIONS" => \$build_options,
243 "PRE_BUILD" => \$pre_build,
244 "POST_BUILD" => \$post_build,
245 "PRE_BUILD_DIE" => \$pre_build_die,
246 "POST_BUILD_DIE" => \$post_build_die,
247 "POWER_CYCLE" => \$power_cycle,
248 "REBOOT" => \$reboot,
249 "BUILD_NOCLEAN" => \$noclean,
250 "MIN_CONFIG" => \$minconfig,
251 "OUTPUT_MIN_CONFIG" => \$output_minconfig,
252 "START_MIN_CONFIG" => \$start_minconfig,
Steven Rostedtccc513b2012-05-21 17:13:40 -0400253 "MIN_CONFIG_TYPE" => \$minconfig_type,
Steven Rostedt43de3312012-05-21 23:35:12 -0400254 "USE_OUTPUT_MIN_CONFIG" => \$use_output_minconfig,
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -0500255 "WARNINGS_FILE" => \$warnings_file,
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500256 "IGNORE_CONFIG" => \$ignore_config,
257 "TEST" => \$run_test,
258 "ADD_CONFIG" => \$addconfig,
259 "REBOOT_TYPE" => \$reboot_type,
260 "GRUB_MENU" => \$grub_menu,
Steven Rostedta15ba912012-11-13 14:30:37 -0500261 "GRUB_FILE" => \$grub_file,
262 "GRUB_REBOOT" => \$grub_reboot,
Steven Rostedt77869542012-12-11 17:37:41 -0500263 "SYSLINUX" => \$syslinux,
264 "SYSLINUX_PATH" => \$syslinux_path,
265 "SYSLINUX_LABEL" => \$syslinux_label,
Steven Rostedte5c2ec12012-07-19 15:22:05 -0400266 "PRE_INSTALL" => \$pre_install,
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500267 "POST_INSTALL" => \$post_install,
268 "NO_INSTALL" => \$no_install,
269 "REBOOT_SCRIPT" => \$reboot_script,
270 "REBOOT_ON_ERROR" => \$reboot_on_error,
271 "SWITCH_TO_GOOD" => \$switch_to_good,
272 "SWITCH_TO_TEST" => \$switch_to_test,
273 "POWEROFF_ON_ERROR" => \$poweroff_on_error,
Steven Rostedt648a1822012-03-21 11:18:27 -0400274 "REBOOT_ON_SUCCESS" => \$reboot_on_success,
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500275 "DIE_ON_FAILURE" => \$die_on_failure,
276 "POWER_OFF" => \$power_off,
277 "POWERCYCLE_AFTER_REBOOT" => \$powercycle_after_reboot,
278 "POWEROFF_AFTER_HALT" => \$poweroff_after_halt,
Steven Rostedt407b95b2012-07-19 16:05:42 -0400279 "MAX_MONITOR_WAIT" => \$max_monitor_wait,
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500280 "SLEEP_TIME" => \$sleep_time,
281 "BISECT_SLEEP_TIME" => \$bisect_sleep_time,
282 "PATCHCHECK_SLEEP_TIME" => \$patchcheck_sleep_time,
283 "IGNORE_WARNINGS" => \$ignore_warnings,
Steven Rostedtbe405f92012-01-04 21:51:59 -0500284 "IGNORE_ERRORS" => \$ignore_errors,
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500285 "BISECT_MANUAL" => \$bisect_manual,
286 "BISECT_SKIP" => \$bisect_skip,
Steven Rostedt (Red Hat)961d9ca2014-01-18 19:52:13 -0500287 "BISECT_TRIES" => \$bisect_tries,
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500288 "CONFIG_BISECT_GOOD" => \$config_bisect_good,
289 "BISECT_RET_GOOD" => \$bisect_ret_good,
290 "BISECT_RET_BAD" => \$bisect_ret_bad,
291 "BISECT_RET_SKIP" => \$bisect_ret_skip,
292 "BISECT_RET_ABORT" => \$bisect_ret_abort,
293 "BISECT_RET_DEFAULT" => \$bisect_ret_default,
294 "STORE_FAILURES" => \$store_failures,
295 "STORE_SUCCESSES" => \$store_successes,
296 "TEST_NAME" => \$test_name,
297 "TIMEOUT" => \$timeout,
298 "BOOTED_TIMEOUT" => \$booted_timeout,
299 "CONSOLE" => \$console,
Satoru Takeuchi5a5d8e42013-12-01 07:57:58 +0900300 "CLOSE_CONSOLE_SIGNAL" => \$close_console_signal,
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500301 "DETECT_TRIPLE_FAULT" => \$detect_triplefault,
302 "SUCCESS_LINE" => \$success_line,
303 "REBOOT_SUCCESS_LINE" => \$reboot_success_line,
304 "STOP_AFTER_SUCCESS" => \$stop_after_success,
305 "STOP_AFTER_FAILURE" => \$stop_after_failure,
306 "STOP_TEST_AFTER" => \$stop_test_after,
307 "BUILD_TARGET" => \$build_target,
308 "SSH_EXEC" => \$ssh_exec,
309 "SCP_TO_TARGET" => \$scp_to_target,
Steven Rostedt02ad2612012-03-21 08:21:24 -0400310 "SCP_TO_TARGET_INSTALL" => \$scp_to_target_install,
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500311 "CHECKOUT" => \$checkout,
312 "TARGET_IMAGE" => \$target_image,
313 "LOCALVERSION" => \$localversion,
314
315 "BISECT_GOOD" => \$bisect_good,
316 "BISECT_BAD" => \$bisect_bad,
317 "BISECT_TYPE" => \$bisect_type,
318 "BISECT_START" => \$bisect_start,
319 "BISECT_REPLAY" => \$bisect_replay,
320 "BISECT_FILES" => \$bisect_files,
321 "BISECT_REVERSE" => \$bisect_reverse,
322 "BISECT_CHECK" => \$bisect_check,
323
324 "CONFIG_BISECT" => \$config_bisect,
325 "CONFIG_BISECT_TYPE" => \$config_bisect_type,
Steven Rostedtb0918612012-07-19 15:26:00 -0400326 "CONFIG_BISECT_CHECK" => \$config_bisect_check,
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500327
328 "PATCHCHECK_TYPE" => \$patchcheck_type,
329 "PATCHCHECK_START" => \$patchcheck_start,
Steven Rostedt (Red Hat)23a0e162014-09-19 20:10:39 -0400330 "PATCHCHECK_CHERRY" => \$patchcheck_cherry,
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500331 "PATCHCHECK_END" => \$patchcheck_end,
332);
333
334# Options may be used by other options, record them.
335my %used_options;
336
Steven Rostedt7bf51072011-10-22 09:07:03 -0400337# default variables that can be used
338chomp ($variable{"PWD"} = `pwd`);
339
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500340$config_help{"MACHINE"} = << "EOF"
341 The machine hostname that you will test.
Steven Rostedtbb8474b2011-11-23 15:58:00 -0500342 For build only tests, it is still needed to differentiate log files.
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500343EOF
344 ;
345$config_help{"SSH_USER"} = << "EOF"
346 The box is expected to have ssh on normal bootup, provide the user
347 (most likely root, since you need privileged operations)
348EOF
349 ;
350$config_help{"BUILD_DIR"} = << "EOF"
351 The directory that contains the Linux source code (full path).
Steven Rostedt0e7a22d2011-11-21 20:39:33 -0500352 You can use \${PWD} that will be the path where ktest.pl is run, or use
353 \${THIS_DIR} which is assigned \${PWD} but may be changed later.
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500354EOF
355 ;
356$config_help{"OUTPUT_DIR"} = << "EOF"
357 The directory that the objects will be built (full path).
358 (can not be same as BUILD_DIR)
Steven Rostedt0e7a22d2011-11-21 20:39:33 -0500359 You can use \${PWD} that will be the path where ktest.pl is run, or use
360 \${THIS_DIR} which is assigned \${PWD} but may be changed later.
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500361EOF
362 ;
363$config_help{"BUILD_TARGET"} = << "EOF"
364 The location of the compiled file to copy to the target.
365 (relative to OUTPUT_DIR)
366EOF
367 ;
Steven Rostedtdbd37832011-11-23 16:00:48 -0500368$config_help{"BUILD_OPTIONS"} = << "EOF"
369 Options to add to \"make\" when building.
370 i.e. -j20
371EOF
372 ;
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500373$config_help{"TARGET_IMAGE"} = << "EOF"
374 The place to put your image on the test machine.
375EOF
376 ;
377$config_help{"POWER_CYCLE"} = << "EOF"
378 A script or command to reboot the box.
379
380 Here is a digital loggers power switch example
381 POWER_CYCLE = wget --no-proxy -O /dev/null -q --auth-no-challenge 'http://admin:admin\@power/outlet?5=CCL'
382
383 Here is an example to reboot a virtual box on the current host
384 with the name "Guest".
385 POWER_CYCLE = virsh destroy Guest; sleep 5; virsh start Guest
386EOF
387 ;
388$config_help{"CONSOLE"} = << "EOF"
389 The script or command that reads the console
390
391 If you use ttywatch server, something like the following would work.
392CONSOLE = nc -d localhost 3001
393
394 For a virtual machine with guest name "Guest".
395CONSOLE = virsh console Guest
396EOF
397 ;
398$config_help{"LOCALVERSION"} = << "EOF"
399 Required version ending to differentiate the test
400 from other linux builds on the system.
401EOF
402 ;
403$config_help{"REBOOT_TYPE"} = << "EOF"
404 Way to reboot the box to the test kernel.
Steven Rostedt77869542012-12-11 17:37:41 -0500405 Only valid options so far are "grub", "grub2", "syslinux", and "script".
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500406
407 If you specify grub, it will assume grub version 1
408 and will search in /boot/grub/menu.lst for the title \$GRUB_MENU
409 and select that target to reboot to the kernel. If this is not
410 your setup, then specify "script" and have a command or script
411 specified in REBOOT_SCRIPT to boot to the target.
412
413 The entry in /boot/grub/menu.lst must be entered in manually.
414 The test will not modify that file.
Steven Rostedta15ba912012-11-13 14:30:37 -0500415
416 If you specify grub2, then you also need to specify both \$GRUB_MENU
417 and \$GRUB_FILE.
Steven Rostedt77869542012-12-11 17:37:41 -0500418
419 If you specify syslinux, then you may use SYSLINUX to define the syslinux
420 command (defaults to extlinux), and SYSLINUX_PATH to specify the path to
421 the syslinux install (defaults to /boot/extlinux). But you have to specify
422 SYSLINUX_LABEL to define the label to boot to for the test kernel.
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500423EOF
424 ;
425$config_help{"GRUB_MENU"} = << "EOF"
426 The grub title name for the test kernel to boot
Steven Rostedta15ba912012-11-13 14:30:37 -0500427 (Only mandatory if REBOOT_TYPE = grub or grub2)
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500428
429 Note, ktest.pl will not update the grub menu.lst, you need to
430 manually add an option for the test. ktest.pl will search
431 the grub menu.lst for this option to find what kernel to
432 reboot into.
433
434 For example, if in the /boot/grub/menu.lst the test kernel title has:
435 title Test Kernel
436 kernel vmlinuz-test
437 GRUB_MENU = Test Kernel
Steven Rostedta15ba912012-11-13 14:30:37 -0500438
439 For grub2, a search of \$GRUB_FILE is performed for the lines
440 that begin with "menuentry". It will not detect submenus. The
441 menu must be a non-nested menu. Add the quotes used in the menu
442 to guarantee your selection, as the first menuentry with the content
443 of \$GRUB_MENU that is found will be used.
444EOF
445 ;
446$config_help{"GRUB_FILE"} = << "EOF"
447 If grub2 is used, the full path for the grub.cfg file is placed
448 here. Use something like /boot/grub2/grub.cfg to search.
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500449EOF
450 ;
Steven Rostedt77869542012-12-11 17:37:41 -0500451$config_help{"SYSLINUX_LABEL"} = << "EOF"
452 If syslinux is used, the label that boots the target kernel must
453 be specified with SYSLINUX_LABEL.
454EOF
455 ;
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500456$config_help{"REBOOT_SCRIPT"} = << "EOF"
457 A script to reboot the target into the test kernel
458 (Only mandatory if REBOOT_TYPE = script)
459EOF
460 ;
461
Steven Rostedt (Red Hat)c75d22d2013-12-11 21:16:59 -0500462sub _logit {
463 if (defined($opt{"LOG_FILE"})) {
464 open(OUT, ">> $opt{LOG_FILE}") or die "Can't write to $opt{LOG_FILE}";
465 print OUT @_;
466 close(OUT);
467 }
468}
469
470sub logit {
471 if (defined($opt{"LOG_FILE"})) {
472 _logit @_;
473 } else {
474 print @_;
475 }
476}
477
478sub doprint {
479 print @_;
480 _logit @_;
481}
482
Steven Rostedtdad98752011-11-22 20:48:57 -0500483sub read_prompt {
484 my ($cancel, $prompt) = @_;
Steven Rostedt35ce5952011-07-15 21:57:25 -0400485
486 my $ans;
487
488 for (;;) {
Steven Rostedtdad98752011-11-22 20:48:57 -0500489 if ($cancel) {
490 print "$prompt [y/n/C] ";
491 } else {
492 print "$prompt [Y/n] ";
493 }
Steven Rostedt35ce5952011-07-15 21:57:25 -0400494 $ans = <STDIN>;
495 chomp $ans;
496 if ($ans =~ /^\s*$/) {
Steven Rostedtdad98752011-11-22 20:48:57 -0500497 if ($cancel) {
498 $ans = "c";
499 } else {
500 $ans = "y";
501 }
Steven Rostedt35ce5952011-07-15 21:57:25 -0400502 }
503 last if ($ans =~ /^y$/i || $ans =~ /^n$/i);
Steven Rostedtdad98752011-11-22 20:48:57 -0500504 if ($cancel) {
505 last if ($ans =~ /^c$/i);
506 print "Please answer either 'y', 'n' or 'c'.\n";
507 } else {
508 print "Please answer either 'y' or 'n'.\n";
509 }
510 }
511 if ($ans =~ /^c/i) {
512 exit;
Steven Rostedt35ce5952011-07-15 21:57:25 -0400513 }
514 if ($ans !~ /^y$/i) {
515 return 0;
516 }
517 return 1;
518}
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500519
Steven Rostedtdad98752011-11-22 20:48:57 -0500520sub read_yn {
521 my ($prompt) = @_;
522
523 return read_prompt 0, $prompt;
524}
525
526sub read_ync {
527 my ($prompt) = @_;
528
529 return read_prompt 1, $prompt;
530}
531
Satoru Takeuchi5269faa2014-03-09 23:32:04 +0900532sub get_mandatory_config {
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500533 my ($config) = @_;
Steven Rostedt815e2bd2011-10-28 07:01:40 -0400534 my $ans;
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500535
536 return if (defined($opt{$config}));
537
538 if (defined($config_help{$config})) {
539 print "\n";
540 print $config_help{$config};
541 }
542
543 for (;;) {
544 print "$config = ";
Steven Rostedtdbd37832011-11-23 16:00:48 -0500545 if (defined($default{$config}) && length($default{$config})) {
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500546 print "\[$default{$config}\] ";
547 }
Steven Rostedt815e2bd2011-10-28 07:01:40 -0400548 $ans = <STDIN>;
549 $ans =~ s/^\s*(.*\S)\s*$/$1/;
550 if ($ans =~ /^\s*$/) {
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500551 if ($default{$config}) {
Steven Rostedt815e2bd2011-10-28 07:01:40 -0400552 $ans = $default{$config};
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500553 } else {
554 print "Your answer can not be blank\n";
555 next;
556 }
557 }
Steven Rostedt0e7a22d2011-11-21 20:39:33 -0500558 $entered_configs{$config} = ${ans};
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500559 last;
560 }
561}
562
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -0500563sub show_time {
564 my ($time) = @_;
565
566 my $hours = 0;
567 my $minutes = 0;
568
569 if ($time > 3600) {
570 $hours = int($time / 3600);
571 $time -= $hours * 3600;
572 }
573 if ($time > 60) {
574 $minutes = int($time / 60);
575 $time -= $minutes * 60;
576 }
577
578 if ($hours > 0) {
579 doprint "$hours hour";
580 doprint "s" if ($hours > 1);
581 doprint " ";
582 }
583
584 if ($minutes > 0) {
585 doprint "$minutes minute";
586 doprint "s" if ($minutes > 1);
587 doprint " ";
588 }
589
590 doprint "$time second";
591 doprint "s" if ($time != 1);
592}
593
594sub print_times {
595 doprint "\n";
596 if ($build_time) {
597 doprint "Build time: ";
598 show_time($build_time);
599 doprint "\n";
600 }
601 if ($install_time) {
602 doprint "Install time: ";
603 show_time($install_time);
604 doprint "\n";
605 }
606 if ($reboot_time) {
607 doprint "Reboot time: ";
608 show_time($reboot_time);
609 doprint "\n";
610 }
611 if ($test_time) {
612 doprint "Test time: ";
613 show_time($test_time);
614 doprint "\n";
615 }
616 # reset for iterations like bisect
617 $build_time = 0;
618 $install_time = 0;
619 $reboot_time = 0;
620 $test_time = 0;
621}
622
Satoru Takeuchi5269faa2014-03-09 23:32:04 +0900623sub get_mandatory_configs {
624 get_mandatory_config("MACHINE");
625 get_mandatory_config("BUILD_DIR");
626 get_mandatory_config("OUTPUT_DIR");
Steven Rostedtbb8474b2011-11-23 15:58:00 -0500627
Steven Rostedtdbd37832011-11-23 16:00:48 -0500628 if ($newconfig) {
Satoru Takeuchi5269faa2014-03-09 23:32:04 +0900629 get_mandatory_config("BUILD_OPTIONS");
Steven Rostedtdbd37832011-11-23 16:00:48 -0500630 }
631
Steven Rostedtbb8474b2011-11-23 15:58:00 -0500632 # options required for other than just building a kernel
633 if (!$buildonly) {
Satoru Takeuchi5269faa2014-03-09 23:32:04 +0900634 get_mandatory_config("POWER_CYCLE");
635 get_mandatory_config("CONSOLE");
Steven Rostedt165708b2011-11-26 20:56:52 -0500636 }
637
638 # options required for install and more
639 if ($buildonly != 1) {
Satoru Takeuchi5269faa2014-03-09 23:32:04 +0900640 get_mandatory_config("SSH_USER");
641 get_mandatory_config("BUILD_TARGET");
642 get_mandatory_config("TARGET_IMAGE");
Steven Rostedtbb8474b2011-11-23 15:58:00 -0500643 }
644
Satoru Takeuchi5269faa2014-03-09 23:32:04 +0900645 get_mandatory_config("LOCALVERSION");
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500646
Steven Rostedtbb8474b2011-11-23 15:58:00 -0500647 return if ($buildonly);
648
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500649 my $rtype = $opt{"REBOOT_TYPE"};
650
651 if (!defined($rtype)) {
652 if (!defined($opt{"GRUB_MENU"})) {
Satoru Takeuchi5269faa2014-03-09 23:32:04 +0900653 get_mandatory_config("REBOOT_TYPE");
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500654 $rtype = $entered_configs{"REBOOT_TYPE"};
655 } else {
656 $rtype = "grub";
657 }
658 }
659
660 if ($rtype eq "grub") {
Satoru Takeuchi5269faa2014-03-09 23:32:04 +0900661 get_mandatory_config("GRUB_MENU");
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500662 }
Steven Rostedta15ba912012-11-13 14:30:37 -0500663
664 if ($rtype eq "grub2") {
Satoru Takeuchi5269faa2014-03-09 23:32:04 +0900665 get_mandatory_config("GRUB_MENU");
666 get_mandatory_config("GRUB_FILE");
Steven Rostedta15ba912012-11-13 14:30:37 -0500667 }
Steven Rostedt77869542012-12-11 17:37:41 -0500668
669 if ($rtype eq "syslinux") {
Satoru Takeuchi5269faa2014-03-09 23:32:04 +0900670 get_mandatory_config("SYSLINUX_LABEL");
Steven Rostedt77869542012-12-11 17:37:41 -0500671 }
Steven Rostedt8d1491b2010-11-18 15:39:48 -0500672}
673
Steven Rostedt77d942c2011-05-20 13:36:58 -0400674sub process_variables {
Steven Rostedt8d735212011-10-17 11:36:44 -0400675 my ($value, $remove_undef) = @_;
Steven Rostedt77d942c2011-05-20 13:36:58 -0400676 my $retval = "";
677
678 # We want to check for '\', and it is just easier
679 # to check the previous characet of '$' and not need
680 # to worry if '$' is the first character. By adding
681 # a space to $value, we can just check [^\\]\$ and
682 # it will still work.
683 $value = " $value";
684
685 while ($value =~ /(.*?[^\\])\$\{(.*?)\}(.*)/) {
686 my $begin = $1;
687 my $var = $2;
688 my $end = $3;
689 # append beginning of value to retval
690 $retval = "$retval$begin";
691 if (defined($variable{$var})) {
692 $retval = "$retval$variable{$var}";
Steven Rostedt8d735212011-10-17 11:36:44 -0400693 } elsif (defined($remove_undef) && $remove_undef) {
694 # for if statements, any variable that is not defined,
695 # we simple convert to 0
696 $retval = "${retval}0";
Steven Rostedt77d942c2011-05-20 13:36:58 -0400697 } else {
698 # put back the origin piece.
699 $retval = "$retval\$\{$var\}";
Steven Rostedt9cc9e092011-12-22 21:37:22 -0500700 # This could be an option that is used later, save
701 # it so we don't warn if this option is not one of
702 # ktests options.
703 $used_options{$var} = 1;
Steven Rostedt77d942c2011-05-20 13:36:58 -0400704 }
705 $value = $end;
706 }
707 $retval = "$retval$value";
708
709 # remove the space added in the beginning
710 $retval =~ s/ //;
711
712 return "$retval"
713}
714
Steven Rostedta57419b2010-11-02 15:13:54 -0400715sub set_value {
Steven Rostedt3d1cc412011-09-30 22:14:21 -0400716 my ($lvalue, $rvalue, $override, $overrides, $name) = @_;
Steven Rostedta57419b2010-11-02 15:13:54 -0400717
Steven Rostedtcad96662011-12-22 11:32:52 -0500718 my $prvalue = process_variables($rvalue);
719
720 if ($buildonly && $lvalue =~ /^TEST_TYPE(\[.*\])?$/ && $prvalue ne "build") {
Steven Rostedtbb8474b2011-11-23 15:58:00 -0500721 # Note if a test is something other than build, then we
722 # will need other manditory options.
Steven Rostedtcad96662011-12-22 11:32:52 -0500723 if ($prvalue ne "install") {
Steven Rostedt (Red Hat)319ab142013-01-30 12:25:38 -0500724 # for bisect, we need to check BISECT_TYPE
725 if ($prvalue ne "bisect") {
726 $buildonly = 0;
727 }
728 } else {
729 # install still limits some manditory options.
730 $buildonly = 2;
731 }
732 }
733
734 if ($buildonly && $lvalue =~ /^BISECT_TYPE(\[.*\])?$/ && $prvalue ne "build") {
735 if ($prvalue ne "install") {
Steven Rostedt165708b2011-11-26 20:56:52 -0500736 $buildonly = 0;
737 } else {
738 # install still limits some manditory options.
739 $buildonly = 2;
740 }
Steven Rostedtbb8474b2011-11-23 15:58:00 -0500741 }
742
Steven Rostedta57419b2010-11-02 15:13:54 -0400743 if (defined($opt{$lvalue})) {
Steven Rostedt3d1cc412011-09-30 22:14:21 -0400744 if (!$override || defined(${$overrides}{$lvalue})) {
745 my $extra = "";
746 if ($override) {
747 $extra = "In the same override section!\n";
748 }
749 die "$name: $.: Option $lvalue defined more than once!\n$extra";
750 }
Steven Rostedtcad96662011-12-22 11:32:52 -0500751 ${$overrides}{$lvalue} = $prvalue;
Steven Rostedta57419b2010-11-02 15:13:54 -0400752 }
Steven Rostedt (Red Hat)22c37a92014-11-21 16:21:25 -0500753
754 $opt{$lvalue} = $prvalue;
Steven Rostedta57419b2010-11-02 15:13:54 -0400755}
756
Steven Rostedt (Red Hat)c75d22d2013-12-11 21:16:59 -0500757sub set_eval {
758 my ($lvalue, $rvalue, $name) = @_;
759
760 my $prvalue = process_variables($rvalue);
761 my $arr;
762
763 if (defined($evals{$lvalue})) {
764 $arr = $evals{$lvalue};
765 } else {
766 $arr = [];
767 $evals{$lvalue} = $arr;
768 }
769
770 push @{$arr}, $rvalue;
771}
772
Steven Rostedt77d942c2011-05-20 13:36:58 -0400773sub set_variable {
774 my ($lvalue, $rvalue) = @_;
775
776 if ($rvalue =~ /^\s*$/) {
777 delete $variable{$lvalue};
778 } else {
779 $rvalue = process_variables($rvalue);
780 $variable{$lvalue} = $rvalue;
781 }
782}
783
Steven Rostedtab7a3f52011-09-30 20:24:07 -0400784sub process_compare {
785 my ($lval, $cmp, $rval) = @_;
786
787 # remove whitespace
788
789 $lval =~ s/^\s*//;
790 $lval =~ s/\s*$//;
791
792 $rval =~ s/^\s*//;
793 $rval =~ s/\s*$//;
794
795 if ($cmp eq "==") {
796 return $lval eq $rval;
797 } elsif ($cmp eq "!=") {
798 return $lval ne $rval;
Steven Rostedt8fddbe92012-07-30 14:37:01 -0400799 } elsif ($cmp eq "=~") {
800 return $lval =~ m/$rval/;
801 } elsif ($cmp eq "!~") {
802 return $lval !~ m/$rval/;
Steven Rostedtab7a3f52011-09-30 20:24:07 -0400803 }
804
805 my $statement = "$lval $cmp $rval";
806 my $ret = eval $statement;
807
808 # $@ stores error of eval
809 if ($@) {
810 return -1;
811 }
812
813 return $ret;
814}
815
Steven Rostedt9900b5d2011-09-30 22:41:14 -0400816sub value_defined {
817 my ($val) = @_;
818
819 return defined($variable{$2}) ||
820 defined($opt{$2});
821}
822
Steven Rostedt8d735212011-10-17 11:36:44 -0400823my $d = 0;
824sub process_expression {
825 my ($name, $val) = @_;
Steven Rostedt45d73a52011-09-30 19:44:53 -0400826
Steven Rostedt8d735212011-10-17 11:36:44 -0400827 my $c = $d++;
828
829 while ($val =~ s/\(([^\(]*?)\)/\&\&\&\&VAL\&\&\&\&/) {
830 my $express = $1;
831
832 if (process_expression($name, $express)) {
833 $val =~ s/\&\&\&\&VAL\&\&\&\&/ 1 /;
834 } else {
835 $val =~ s/\&\&\&\&VAL\&\&\&\&/ 0 /;
836 }
837 }
838
839 $d--;
840 my $OR = "\\|\\|";
841 my $AND = "\\&\\&";
842
843 while ($val =~ s/^(.*?)($OR|$AND)//) {
844 my $express = $1;
845 my $op = $2;
846
847 if (process_expression($name, $express)) {
848 if ($op eq "||") {
849 return 1;
850 }
851 } else {
852 if ($op eq "&&") {
853 return 0;
854 }
855 }
856 }
Steven Rostedt45d73a52011-09-30 19:44:53 -0400857
Steven Rostedt8fddbe92012-07-30 14:37:01 -0400858 if ($val =~ /(.*)(==|\!=|>=|<=|>|<|=~|\!~)(.*)/) {
Steven Rostedtab7a3f52011-09-30 20:24:07 -0400859 my $ret = process_compare($1, $2, $3);
860 if ($ret < 0) {
861 die "$name: $.: Unable to process comparison\n";
862 }
863 return $ret;
864 }
865
Steven Rostedt9900b5d2011-09-30 22:41:14 -0400866 if ($val =~ /^\s*(NOT\s*)?DEFINED\s+(\S+)\s*$/) {
867 if (defined $1) {
868 return !value_defined($2);
869 } else {
870 return value_defined($2);
871 }
872 }
873
Steven Rostedt45d73a52011-09-30 19:44:53 -0400874 if ($val =~ /^\s*0\s*$/) {
875 return 0;
876 } elsif ($val =~ /^\s*\d+\s*$/) {
877 return 1;
878 }
879
Steven Rostedt9900b5d2011-09-30 22:41:14 -0400880 die ("$name: $.: Undefined content $val in if statement\n");
Steven Rostedt8d735212011-10-17 11:36:44 -0400881}
882
883sub process_if {
884 my ($name, $value) = @_;
885
886 # Convert variables and replace undefined ones with 0
887 my $val = process_variables($value, 1);
888 my $ret = process_expression $name, $val;
889
890 return $ret;
Steven Rostedt45d73a52011-09-30 19:44:53 -0400891}
892
Steven Rostedt2ed3b162011-09-30 21:00:00 -0400893sub __read_config {
894 my ($config, $current_test_num) = @_;
Steven Rostedt2545eb62010-11-02 15:01:32 -0400895
Steven Rostedt2ed3b162011-09-30 21:00:00 -0400896 my $in;
897 open($in, $config) || die "can't read file $config";
Steven Rostedt2545eb62010-11-02 15:01:32 -0400898
Steven Rostedta57419b2010-11-02 15:13:54 -0400899 my $name = $config;
900 $name =~ s,.*/(.*),$1,;
901
Steven Rostedt2ed3b162011-09-30 21:00:00 -0400902 my $test_num = $$current_test_num;
Steven Rostedta57419b2010-11-02 15:13:54 -0400903 my $default = 1;
904 my $repeat = 1;
905 my $num_tests_set = 0;
906 my $skip = 0;
907 my $rest;
Steven Rostedta9f84422011-10-17 11:06:29 -0400908 my $line;
Steven Rostedt0df213c2011-06-14 20:51:37 -0400909 my $test_case = 0;
Steven Rostedt45d73a52011-09-30 19:44:53 -0400910 my $if = 0;
911 my $if_set = 0;
Steven Rostedt3d1cc412011-09-30 22:14:21 -0400912 my $override = 0;
913
914 my %overrides;
Steven Rostedta57419b2010-11-02 15:13:54 -0400915
Steven Rostedt2ed3b162011-09-30 21:00:00 -0400916 while (<$in>) {
Steven Rostedt2545eb62010-11-02 15:01:32 -0400917
918 # ignore blank lines and comments
919 next if (/^\s*$/ || /\s*\#/);
920
Steven Rostedt0050b6b2011-09-30 21:10:30 -0400921 if (/^\s*(TEST_START|DEFAULTS)\b(.*)/) {
Steven Rostedta57419b2010-11-02 15:13:54 -0400922
Steven Rostedt0050b6b2011-09-30 21:10:30 -0400923 my $type = $1;
924 $rest = $2;
Steven Rostedta9f84422011-10-17 11:06:29 -0400925 $line = $2;
Steven Rostedta57419b2010-11-02 15:13:54 -0400926
Steven Rostedt0050b6b2011-09-30 21:10:30 -0400927 my $old_test_num;
928 my $old_repeat;
Steven Rostedt3d1cc412011-09-30 22:14:21 -0400929 $override = 0;
Steven Rostedt0050b6b2011-09-30 21:10:30 -0400930
931 if ($type eq "TEST_START") {
932
933 if ($num_tests_set) {
934 die "$name: $.: Can not specify both NUM_TESTS and TEST_START\n";
935 }
936
937 $old_test_num = $test_num;
938 $old_repeat = $repeat;
939
940 $test_num += $repeat;
941 $default = 0;
942 $repeat = 1;
943 } else {
944 $default = 1;
Steven Rostedta57419b2010-11-02 15:13:54 -0400945 }
946
Steven Rostedta9f84422011-10-17 11:06:29 -0400947 # If SKIP is anywhere in the line, the command will be skipped
948 if ($rest =~ s/\s+SKIP\b//) {
Steven Rostedta57419b2010-11-02 15:13:54 -0400949 $skip = 1;
950 } else {
Steven Rostedt0df213c2011-06-14 20:51:37 -0400951 $test_case = 1;
Steven Rostedta57419b2010-11-02 15:13:54 -0400952 $skip = 0;
953 }
954
Steven Rostedta9f84422011-10-17 11:06:29 -0400955 if ($rest =~ s/\sELSE\b//) {
956 if (!$if) {
957 die "$name: $.: ELSE found with out matching IF section\n$_";
958 }
959 $if = 0;
960
961 if ($if_set) {
962 $skip = 1;
963 } else {
964 $skip = 0;
Steven Rostedt3d1cc412011-09-30 22:14:21 -0400965 }
Steven Rostedta57419b2010-11-02 15:13:54 -0400966 }
967
Steven Rostedta9f84422011-10-17 11:06:29 -0400968 if ($rest =~ s/\sIF\s+(.*)//) {
Steven Rostedt45d73a52011-09-30 19:44:53 -0400969 if (process_if($name, $1)) {
970 $if_set = 1;
971 } else {
972 $skip = 1;
973 }
974 $if = 1;
975 } else {
976 $if = 0;
Steven Rostedta9f84422011-10-17 11:06:29 -0400977 $if_set = 0;
Steven Rostedta57419b2010-11-02 15:13:54 -0400978 }
979
Steven Rostedta9f84422011-10-17 11:06:29 -0400980 if (!$skip) {
981 if ($type eq "TEST_START") {
982 if ($rest =~ s/\s+ITERATE\s+(\d+)//) {
983 $repeat = $1;
984 $repeat_tests{"$test_num"} = $repeat;
985 }
986 } elsif ($rest =~ s/\sOVERRIDE\b//) {
987 # DEFAULT only
988 $override = 1;
989 # Clear previous overrides
990 %overrides = ();
991 }
992 }
993
994 if (!$skip && $rest !~ /^\s*$/) {
Steven Rostedt0050b6b2011-09-30 21:10:30 -0400995 die "$name: $.: Gargbage found after $type\n$_";
Steven Rostedta57419b2010-11-02 15:13:54 -0400996 }
997
Steven Rostedt0050b6b2011-09-30 21:10:30 -0400998 if ($skip && $type eq "TEST_START") {
Steven Rostedta57419b2010-11-02 15:13:54 -0400999 $test_num = $old_test_num;
Steven Rostedte48c5292010-11-02 14:35:37 -04001000 $repeat = $old_repeat;
Steven Rostedta57419b2010-11-02 15:13:54 -04001001 }
1002
Steven Rostedtab7a3f52011-09-30 20:24:07 -04001003 } elsif (/^\s*ELSE\b(.*)$/) {
Steven Rostedt45d73a52011-09-30 19:44:53 -04001004 if (!$if) {
1005 die "$name: $.: ELSE found with out matching IF section\n$_";
1006 }
1007 $rest = $1;
1008 if ($if_set) {
1009 $skip = 1;
Steven Rostedtab7a3f52011-09-30 20:24:07 -04001010 $rest = "";
Steven Rostedt45d73a52011-09-30 19:44:53 -04001011 } else {
1012 $skip = 0;
1013
Steven Rostedtab7a3f52011-09-30 20:24:07 -04001014 if ($rest =~ /\sIF\s+(.*)/) {
Steven Rostedt45d73a52011-09-30 19:44:53 -04001015 # May be a ELSE IF section.
Steven Rostedt95f57832012-09-26 14:48:17 -04001016 if (process_if($name, $1)) {
1017 $if_set = 1;
1018 } else {
Steven Rostedt45d73a52011-09-30 19:44:53 -04001019 $skip = 1;
1020 }
Steven Rostedtab7a3f52011-09-30 20:24:07 -04001021 $rest = "";
Steven Rostedt45d73a52011-09-30 19:44:53 -04001022 } else {
1023 $if = 0;
1024 }
1025 }
1026
Steven Rostedtab7a3f52011-09-30 20:24:07 -04001027 if ($rest !~ /^\s*$/) {
1028 die "$name: $.: Gargbage found after DEFAULTS\n$_";
1029 }
1030
Steven Rostedt2ed3b162011-09-30 21:00:00 -04001031 } elsif (/^\s*INCLUDE\s+(\S+)/) {
1032
1033 next if ($skip);
1034
1035 if (!$default) {
1036 die "$name: $.: INCLUDE can only be done in default sections\n$_";
1037 }
1038
1039 my $file = process_variables($1);
1040
1041 if ($file !~ m,^/,) {
1042 # check the path of the config file first
1043 if ($config =~ m,(.*)/,) {
1044 if (-f "$1/$file") {
1045 $file = "$1/$file";
1046 }
1047 }
1048 }
1049
1050 if ( ! -r $file ) {
1051 die "$name: $.: Can't read file $file\n$_";
1052 }
1053
1054 if (__read_config($file, \$test_num)) {
1055 $test_case = 1;
1056 }
1057
Steven Rostedt (Red Hat)c75d22d2013-12-11 21:16:59 -05001058 } elsif (/^\s*([A-Z_\[\]\d]+)\s*=~\s*(.*?)\s*$/) {
1059
1060 next if ($skip);
1061
1062 my $lvalue = $1;
1063 my $rvalue = $2;
1064
1065 if ($default || $lvalue =~ /\[\d+\]$/) {
1066 set_eval($lvalue, $rvalue, $name);
1067 } else {
1068 my $val = "$lvalue\[$test_num\]";
1069 set_eval($val, $rvalue, $name);
1070 }
1071
Steven Rostedta57419b2010-11-02 15:13:54 -04001072 } elsif (/^\s*([A-Z_\[\]\d]+)\s*=\s*(.*?)\s*$/) {
1073
1074 next if ($skip);
1075
Steven Rostedt2545eb62010-11-02 15:01:32 -04001076 my $lvalue = $1;
1077 my $rvalue = $2;
1078
Steven Rostedta57419b2010-11-02 15:13:54 -04001079 if (!$default &&
1080 ($lvalue eq "NUM_TESTS" ||
1081 $lvalue eq "LOG_FILE" ||
1082 $lvalue eq "CLEAR_LOG")) {
1083 die "$name: $.: $lvalue must be set in DEFAULTS section\n";
Steven Rostedta75fece2010-11-02 14:58:27 -04001084 }
Steven Rostedta57419b2010-11-02 15:13:54 -04001085
1086 if ($lvalue eq "NUM_TESTS") {
1087 if ($test_num) {
1088 die "$name: $.: Can not specify both NUM_TESTS and TEST_START\n";
1089 }
1090 if (!$default) {
1091 die "$name: $.: NUM_TESTS must be set in default section\n";
1092 }
1093 $num_tests_set = 1;
1094 }
1095
1096 if ($default || $lvalue =~ /\[\d+\]$/) {
Steven Rostedt3d1cc412011-09-30 22:14:21 -04001097 set_value($lvalue, $rvalue, $override, \%overrides, $name);
Steven Rostedta57419b2010-11-02 15:13:54 -04001098 } else {
1099 my $val = "$lvalue\[$test_num\]";
Steven Rostedt3d1cc412011-09-30 22:14:21 -04001100 set_value($val, $rvalue, $override, \%overrides, $name);
Steven Rostedta57419b2010-11-02 15:13:54 -04001101
1102 if ($repeat > 1) {
1103 $repeats{$val} = $repeat;
1104 }
1105 }
Steven Rostedt77d942c2011-05-20 13:36:58 -04001106 } elsif (/^\s*([A-Z_\[\]\d]+)\s*:=\s*(.*?)\s*$/) {
1107 next if ($skip);
1108
1109 my $lvalue = $1;
1110 my $rvalue = $2;
1111
1112 # process config variables.
1113 # Config variables are only active while reading the
1114 # config and can be defined anywhere. They also ignore
1115 # TEST_START and DEFAULTS, but are skipped if they are in
1116 # on of these sections that have SKIP defined.
1117 # The save variable can be
1118 # defined multiple times and the new one simply overrides
1119 # the prevous one.
1120 set_variable($lvalue, $rvalue);
1121
Steven Rostedta57419b2010-11-02 15:13:54 -04001122 } else {
1123 die "$name: $.: Garbage found in config\n$_";
Steven Rostedt2545eb62010-11-02 15:01:32 -04001124 }
1125 }
1126
Steven Rostedta57419b2010-11-02 15:13:54 -04001127 if ($test_num) {
1128 $test_num += $repeat - 1;
1129 $opt{"NUM_TESTS"} = $test_num;
1130 }
1131
Steven Rostedt2ed3b162011-09-30 21:00:00 -04001132 close($in);
1133
1134 $$current_test_num = $test_num;
1135
1136 return $test_case;
1137}
1138
Steven Rostedtc4261d02011-11-23 13:41:18 -05001139sub get_test_case {
1140 print "What test case would you like to run?\n";
1141 print " (build, install or boot)\n";
1142 print " Other tests are available but require editing the config file\n";
1143 my $ans = <STDIN>;
1144 chomp $ans;
1145 $default{"TEST_TYPE"} = $ans;
1146}
1147
Steven Rostedt2ed3b162011-09-30 21:00:00 -04001148sub read_config {
1149 my ($config) = @_;
1150
1151 my $test_case;
1152 my $test_num = 0;
1153
1154 $test_case = __read_config $config, \$test_num;
1155
Steven Rostedt8d1491b2010-11-18 15:39:48 -05001156 # make sure we have all mandatory configs
Satoru Takeuchi5269faa2014-03-09 23:32:04 +09001157 get_mandatory_configs;
Steven Rostedt8d1491b2010-11-18 15:39:48 -05001158
Steven Rostedt0df213c2011-06-14 20:51:37 -04001159 # was a test specified?
1160 if (!$test_case) {
1161 print "No test case specified.\n";
Steven Rostedtc4261d02011-11-23 13:41:18 -05001162 get_test_case;
Steven Rostedt0df213c2011-06-14 20:51:37 -04001163 }
1164
Steven Rostedta75fece2010-11-02 14:58:27 -04001165 # set any defaults
1166
1167 foreach my $default (keys %default) {
1168 if (!defined($opt{$default})) {
1169 $opt{$default} = $default{$default};
1170 }
1171 }
Steven Rostedt9cc9e092011-12-22 21:37:22 -05001172
1173 if ($opt{"IGNORE_UNUSED"} == 1) {
1174 return;
1175 }
1176
1177 my %not_used;
1178
1179 # check if there are any stragglers (typos?)
1180 foreach my $option (keys %opt) {
1181 my $op = $option;
1182 # remove per test labels.
1183 $op =~ s/\[.*\]//;
1184 if (!exists($option_map{$op}) &&
1185 !exists($default{$op}) &&
1186 !exists($used_options{$op})) {
1187 $not_used{$op} = 1;
1188 }
1189 }
1190
1191 if (%not_used) {
1192 my $s = "s are";
1193 $s = " is" if (keys %not_used == 1);
1194 print "The following option$s not used; could be a typo:\n";
1195 foreach my $option (keys %not_used) {
1196 print "$option\n";
1197 }
1198 print "Set IGRNORE_UNUSED = 1 to have ktest ignore unused variables\n";
1199 if (!read_yn "Do you want to continue?") {
1200 exit -1;
1201 }
1202 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04001203}
1204
Steven Rostedt23715c3c2011-06-13 11:03:34 -04001205sub __eval_option {
Steven Rostedt (Red Hat)04262be2013-01-31 10:12:20 -05001206 my ($name, $option, $i) = @_;
Steven Rostedt23715c3c2011-06-13 11:03:34 -04001207
1208 # Add space to evaluate the character before $
1209 $option = " $option";
1210 my $retval = "";
Rabin Vincentf9dfb652011-11-18 17:05:30 +05301211 my $repeated = 0;
1212 my $parent = 0;
1213
1214 foreach my $test (keys %repeat_tests) {
1215 if ($i >= $test &&
1216 $i < $test + $repeat_tests{$test}) {
1217
1218 $repeated = 1;
1219 $parent = $test;
1220 last;
1221 }
1222 }
Steven Rostedt23715c3c2011-06-13 11:03:34 -04001223
1224 while ($option =~ /(.*?[^\\])\$\{(.*?)\}(.*)/) {
1225 my $start = $1;
1226 my $var = $2;
1227 my $end = $3;
1228
1229 # Append beginning of line
1230 $retval = "$retval$start";
1231
1232 # If the iteration option OPT[$i] exists, then use that.
1233 # otherwise see if the default OPT (without [$i]) exists.
1234
1235 my $o = "$var\[$i\]";
Rabin Vincentf9dfb652011-11-18 17:05:30 +05301236 my $parento = "$var\[$parent\]";
Steven Rostedt23715c3c2011-06-13 11:03:34 -04001237
Steven Rostedt (Red Hat)04262be2013-01-31 10:12:20 -05001238 # If a variable contains itself, use the default var
1239 if (($var eq $name) && defined($opt{$var})) {
1240 $o = $opt{$var};
1241 $retval = "$retval$o";
1242 } elsif (defined($opt{$o})) {
Steven Rostedt23715c3c2011-06-13 11:03:34 -04001243 $o = $opt{$o};
1244 $retval = "$retval$o";
Rabin Vincentf9dfb652011-11-18 17:05:30 +05301245 } elsif ($repeated && defined($opt{$parento})) {
1246 $o = $opt{$parento};
1247 $retval = "$retval$o";
Steven Rostedt23715c3c2011-06-13 11:03:34 -04001248 } elsif (defined($opt{$var})) {
1249 $o = $opt{$var};
1250 $retval = "$retval$o";
Steven Rostedt (Red Hat)8e80bf02013-12-11 15:40:46 -05001251 } elsif ($var eq "KERNEL_VERSION" && defined($make)) {
1252 # special option KERNEL_VERSION uses kernel version
1253 get_version();
1254 $retval = "$retval$version";
Steven Rostedt23715c3c2011-06-13 11:03:34 -04001255 } else {
1256 $retval = "$retval\$\{$var\}";
1257 }
1258
1259 $option = $end;
1260 }
1261
1262 $retval = "$retval$option";
1263
1264 $retval =~ s/^ //;
1265
1266 return $retval;
1267}
1268
Steven Rostedt (Red Hat)c75d22d2013-12-11 21:16:59 -05001269sub process_evals {
1270 my ($name, $option, $i) = @_;
1271
1272 my $option_name = "$name\[$i\]";
1273 my $ev;
1274
1275 my $old_option = $option;
1276
1277 if (defined($evals{$option_name})) {
1278 $ev = $evals{$option_name};
1279 } elsif (defined($evals{$name})) {
1280 $ev = $evals{$name};
1281 } else {
1282 return $option;
1283 }
1284
1285 for my $e (@{$ev}) {
1286 eval "\$option =~ $e";
1287 }
1288
1289 if ($option ne $old_option) {
1290 doprint("$name changed from '$old_option' to '$option'\n");
1291 }
1292
1293 return $option;
1294}
1295
Steven Rostedt23715c3c2011-06-13 11:03:34 -04001296sub eval_option {
Steven Rostedt (Red Hat)04262be2013-01-31 10:12:20 -05001297 my ($name, $option, $i) = @_;
Steven Rostedt23715c3c2011-06-13 11:03:34 -04001298
1299 my $prev = "";
1300
1301 # Since an option can evaluate to another option,
1302 # keep iterating until we do not evaluate any more
1303 # options.
1304 my $r = 0;
1305 while ($prev ne $option) {
1306 # Check for recursive evaluations.
1307 # 100 deep should be more than enough.
1308 if ($r++ > 100) {
1309 die "Over 100 evaluations accurred with $option\n" .
1310 "Check for recursive variables\n";
1311 }
1312 $prev = $option;
Steven Rostedt (Red Hat)04262be2013-01-31 10:12:20 -05001313 $option = __eval_option($name, $option, $i);
Steven Rostedt23715c3c2011-06-13 11:03:34 -04001314 }
1315
Steven Rostedt (Red Hat)c75d22d2013-12-11 21:16:59 -05001316 $option = process_evals($name, $option, $i);
1317
Steven Rostedt23715c3c2011-06-13 11:03:34 -04001318 return $option;
1319}
1320
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001321sub run_command;
Andrew Jones2728be42011-08-12 15:32:05 +02001322sub start_monitor;
1323sub end_monitor;
1324sub wait_for_monitor;
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001325
1326sub reboot {
Andrew Jones2728be42011-08-12 15:32:05 +02001327 my ($time) = @_;
1328
Steven Rostedta4968722012-12-11 14:59:05 -05001329 # Make sure everything has been written to disk
1330 run_ssh("sync");
1331
Steven Rostedt2b803362011-09-30 18:00:23 -04001332 if (defined($time)) {
1333 start_monitor;
1334 # flush out current monitor
1335 # May contain the reboot success line
1336 wait_for_monitor 1;
1337 }
1338
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001339 # try to reboot normally
Steven Rostedte48c5292010-11-02 14:35:37 -04001340 if (run_command $reboot) {
Steven Rostedt576f6272010-11-02 14:58:38 -04001341 if (defined($powercycle_after_reboot)) {
1342 sleep $powercycle_after_reboot;
1343 run_command "$power_cycle";
1344 }
1345 } else {
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001346 # nope? power cycle it.
Steven Rostedta75fece2010-11-02 14:58:27 -04001347 run_command "$power_cycle";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001348 }
Andrew Jones2728be42011-08-12 15:32:05 +02001349
1350 if (defined($time)) {
Steven Rostedt (Red Hat)4c0b67a2013-02-05 09:56:00 -05001351
1352 # We only want to get to the new kernel, don't fail
1353 # if we stumble over a call trace.
1354 my $save_ignore_errors = $ignore_errors;
1355 $ignore_errors = 1;
1356
Steven Rostedt (Red Hat)d6845532013-02-04 23:08:49 -05001357 # Look for the good kernel to boot
1358 if (wait_for_monitor($time, "Linux version")) {
Steven Rostedt407b95b2012-07-19 16:05:42 -04001359 # reboot got stuck?
Steven Rostedt8a80c722012-07-19 16:08:33 -04001360 doprint "Reboot did not finish. Forcing power cycle\n";
Steven Rostedt407b95b2012-07-19 16:05:42 -04001361 run_command "$power_cycle";
1362 }
Steven Rostedt (Red Hat)d6845532013-02-04 23:08:49 -05001363
Steven Rostedt (Red Hat)4c0b67a2013-02-05 09:56:00 -05001364 $ignore_errors = $save_ignore_errors;
1365
Steven Rostedt (Red Hat)d6845532013-02-04 23:08:49 -05001366 # Still need to wait for the reboot to finish
1367 wait_for_monitor($time, $reboot_success_line);
1368
Andrew Jones2728be42011-08-12 15:32:05 +02001369 end_monitor;
1370 }
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001371}
1372
Steven Rostedtbc7c5802011-12-22 16:29:10 -05001373sub reboot_to_good {
1374 my ($time) = @_;
1375
1376 if (defined($switch_to_good)) {
1377 run_command $switch_to_good;
Steven Rostedtbc7c5802011-12-22 16:29:10 -05001378 }
1379
1380 reboot $time;
1381}
1382
Steven Rostedt576f6272010-11-02 14:58:38 -04001383sub do_not_reboot {
1384 my $i = $iteration;
1385
Steven Rostedt4ab1cce2011-09-30 18:12:20 -04001386 return $test_type eq "build" || $no_reboot ||
Steven Rostedt576f6272010-11-02 14:58:38 -04001387 ($test_type eq "patchcheck" && $opt{"PATCHCHECK_TYPE[$i]"} eq "build") ||
1388 ($test_type eq "bisect" && $opt{"BISECT_TYPE[$i]"} eq "build");
1389}
1390
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001391sub dodie {
Steven Rostedt5a391fb2010-11-02 14:57:43 -04001392 doprint "CRITICAL FAILURE... ", @_, "\n";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001393
Steven Rostedt576f6272010-11-02 14:58:38 -04001394 my $i = $iteration;
1395
1396 if ($reboot_on_error && !do_not_reboot) {
1397
Steven Rostedt75c3fda72010-11-02 14:57:21 -04001398 doprint "REBOOTING\n";
Steven Rostedtbc7c5802011-12-22 16:29:10 -05001399 reboot_to_good;
Steven Rostedt75c3fda72010-11-02 14:57:21 -04001400
Steven Rostedta75fece2010-11-02 14:58:27 -04001401 } elsif ($poweroff_on_error && defined($power_off)) {
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001402 doprint "POWERING OFF\n";
Steven Rostedta75fece2010-11-02 14:58:27 -04001403 `$power_off`;
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001404 }
Steven Rostedt75c3fda72010-11-02 14:57:21 -04001405
Steven Rostedtf80802c2011-03-07 13:18:47 -05001406 if (defined($opt{"LOG_FILE"})) {
1407 print " See $opt{LOG_FILE} for more info.\n";
1408 }
1409
Steven Rostedt576f6272010-11-02 14:58:38 -04001410 die @_, "\n";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001411}
1412
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001413sub open_console {
1414 my ($fp) = @_;
1415
1416 my $flags;
1417
Josh Poimboeuf98842782015-01-27 12:10:04 -06001418 # save terminal settings
1419 $stty = `stty -g`;
1420
Steven Rostedta75fece2010-11-02 14:58:27 -04001421 my $pid = open($fp, "$console|") or
1422 dodie "Can't open console $console";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001423
1424 $flags = fcntl($fp, F_GETFL, 0) or
Steven Rostedt576f6272010-11-02 14:58:38 -04001425 dodie "Can't get flags for the socket: $!";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001426 $flags = fcntl($fp, F_SETFL, $flags | O_NONBLOCK) or
Steven Rostedt576f6272010-11-02 14:58:38 -04001427 dodie "Can't set flags for the socket: $!";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001428
1429 return $pid;
1430}
1431
1432sub close_console {
1433 my ($fp, $pid) = @_;
1434
1435 doprint "kill child process $pid\n";
Satoru Takeuchi5a5d8e42013-12-01 07:57:58 +09001436 kill $close_console_signal, $pid;
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001437
1438 print "closing!\n";
1439 close($fp);
Josh Poimboeuf98842782015-01-27 12:10:04 -06001440
1441 # restore terminal settings
1442 system("stty $stty");
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001443}
1444
1445sub start_monitor {
1446 if ($monitor_cnt++) {
1447 return;
1448 }
1449 $monitor_fp = \*MONFD;
1450 $monitor_pid = open_console $monitor_fp;
Steven Rostedta75fece2010-11-02 14:58:27 -04001451
1452 return;
1453
1454 open(MONFD, "Stop perl from warning about single use of MONFD");
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001455}
1456
1457sub end_monitor {
Steven Rostedt (Red Hat)319ab142013-01-30 12:25:38 -05001458 return if (!defined $console);
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001459 if (--$monitor_cnt) {
1460 return;
1461 }
1462 close_console($monitor_fp, $monitor_pid);
1463}
1464
1465sub wait_for_monitor {
Steven Rostedt2b803362011-09-30 18:00:23 -04001466 my ($time, $stop) = @_;
1467 my $full_line = "";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001468 my $line;
Steven Rostedt2b803362011-09-30 18:00:23 -04001469 my $booted = 0;
Steven Rostedt407b95b2012-07-19 16:05:42 -04001470 my $start_time = time;
Steven Rostedt8a80c722012-07-19 16:08:33 -04001471 my $skip_call_trace = 0;
1472 my $bug = 0;
1473 my $bug_ignored = 0;
Steven Rostedt407b95b2012-07-19 16:05:42 -04001474 my $now;
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001475
Steven Rostedta75fece2010-11-02 14:58:27 -04001476 doprint "** Wait for monitor to settle down **\n";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001477
1478 # read the monitor and wait for the system to calm down
Steven Rostedt2b803362011-09-30 18:00:23 -04001479 while (!$booted) {
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001480 $line = wait_for_input($monitor_fp, $time);
Steven Rostedt2b803362011-09-30 18:00:23 -04001481 last if (!defined($line));
1482 print "$line";
1483 $full_line .= $line;
1484
1485 if (defined($stop) && $full_line =~ /$stop/) {
1486 doprint "wait for monitor detected $stop\n";
1487 $booted = 1;
1488 }
1489
Steven Rostedt8a80c722012-07-19 16:08:33 -04001490 if ($full_line =~ /\[ backtrace testing \]/) {
1491 $skip_call_trace = 1;
1492 }
1493
1494 if ($full_line =~ /call trace:/i) {
1495 if (!$bug && !$skip_call_trace) {
1496 if ($ignore_errors) {
1497 $bug_ignored = 1;
1498 } else {
1499 $bug = 1;
1500 }
1501 }
1502 }
1503
1504 if ($full_line =~ /\[ end of backtrace testing \]/) {
1505 $skip_call_trace = 0;
1506 }
1507
1508 if ($full_line =~ /Kernel panic -/) {
1509 $bug = 1;
1510 }
1511
Steven Rostedt2b803362011-09-30 18:00:23 -04001512 if ($line =~ /\n/) {
1513 $full_line = "";
1514 }
Steven Rostedt407b95b2012-07-19 16:05:42 -04001515 $now = time;
1516 if ($now - $start_time >= $max_monitor_wait) {
1517 doprint "Exiting monitor flush due to hitting MAX_MONITOR_WAIT\n";
1518 return 1;
1519 }
Steven Rostedt2b803362011-09-30 18:00:23 -04001520 }
Steven Rostedta75fece2010-11-02 14:58:27 -04001521 print "** Monitor flushed **\n";
Steven Rostedt (Red Hat)995bc432014-10-07 16:31:07 -04001522
1523 # if stop is defined but wasn't hit, return error
1524 # used by reboot (which wants to see a reboot)
1525 if (defined($stop) && !$booted) {
1526 $bug = 1;
1527 }
Steven Rostedt8a80c722012-07-19 16:08:33 -04001528 return $bug;
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001529}
1530
Rabin Vincentde5b6e32011-11-18 17:05:31 +05301531sub save_logs {
1532 my ($result, $basedir) = @_;
1533 my @t = localtime;
1534 my $date = sprintf "%04d%02d%02d%02d%02d%02d",
1535 1900+$t[5],$t[4],$t[3],$t[2],$t[1],$t[0];
1536
1537 my $type = $build_type;
1538 if ($type =~ /useconfig/) {
1539 $type = "useconfig";
1540 }
1541
1542 my $dir = "$machine-$test_type-$type-$result-$date";
1543
1544 $dir = "$basedir/$dir";
1545
1546 if (!-d $dir) {
1547 mkpath($dir) or
1548 die "can't create $dir";
1549 }
1550
1551 my %files = (
1552 "config" => $output_config,
1553 "buildlog" => $buildlog,
1554 "dmesg" => $dmesg,
1555 "testlog" => $testlog,
1556 );
1557
1558 while (my ($name, $source) = each(%files)) {
1559 if (-f "$source") {
1560 cp "$source", "$dir/$name" or
1561 die "failed to copy $source";
1562 }
1563 }
1564
1565 doprint "*** Saved info to $dir ***\n";
1566}
1567
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001568sub fail {
1569
Steven Rostedt921ed4c2012-07-19 15:18:27 -04001570 if (defined($post_test)) {
1571 run_command $post_test;
1572 }
1573
Steven Rostedta75fece2010-11-02 14:58:27 -04001574 if ($die_on_failure) {
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001575 dodie @_;
1576 }
1577
Steven Rostedta75fece2010-11-02 14:58:27 -04001578 doprint "FAILED\n";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001579
Steven Rostedt576f6272010-11-02 14:58:38 -04001580 my $i = $iteration;
1581
Steven Rostedta75fece2010-11-02 14:58:27 -04001582 # no need to reboot for just building.
Steven Rostedt576f6272010-11-02 14:58:38 -04001583 if (!do_not_reboot) {
Steven Rostedta75fece2010-11-02 14:58:27 -04001584 doprint "REBOOTING\n";
Steven Rostedtbc7c5802011-12-22 16:29:10 -05001585 reboot_to_good $sleep_time;
Steven Rostedta75fece2010-11-02 14:58:27 -04001586 }
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001587
Steven Rostedt9064af52011-06-13 10:38:48 -04001588 my $name = "";
1589
1590 if (defined($test_name)) {
1591 $name = " ($test_name)";
1592 }
1593
Steven Rostedt576f6272010-11-02 14:58:38 -04001594 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
1595 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
Steven Rostedt9064af52011-06-13 10:38:48 -04001596 doprint "KTEST RESULT: TEST $i$name Failed: ", @_, "\n";
Steven Rostedt576f6272010-11-02 14:58:38 -04001597 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
1598 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
Steven Rostedta75fece2010-11-02 14:58:27 -04001599
Rabin Vincentde5b6e32011-11-18 17:05:31 +05301600 if (defined($store_failures)) {
1601 save_logs "fail", $store_failures;
1602 }
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001603
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001604 return 1;
1605}
1606
Steven Rostedt2545eb62010-11-02 15:01:32 -04001607sub run_command {
Satoru Takeuchif983a2b2014-03-02 21:20:31 +09001608 my ($command, $redirect) = @_;
Steven Rostedt (Red Hat)b53486e2015-01-27 17:02:02 -05001609 my $start_time;
1610 my $end_time;
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001611 my $dolog = 0;
1612 my $dord = 0;
1613 my $pid;
1614
Steven Rostedt (Red Hat)b53486e2015-01-27 17:02:02 -05001615 $start_time = time;
1616
Steven Rostedte48c5292010-11-02 14:35:37 -04001617 $command =~ s/\$SSH_USER/$ssh_user/g;
1618 $command =~ s/\$MACHINE/$machine/g;
1619
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001620 doprint("$command ... ");
1621
1622 $pid = open(CMD, "$command 2>&1 |") or
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001623 (fail "unable to exec $command" and return 0);
Steven Rostedt2545eb62010-11-02 15:01:32 -04001624
1625 if (defined($opt{"LOG_FILE"})) {
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001626 open(LOG, ">>$opt{LOG_FILE}") or
1627 dodie "failed to write to log";
1628 $dolog = 1;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04001629 }
1630
1631 if (defined($redirect)) {
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001632 open (RD, ">$redirect") or
1633 dodie "failed to write to redirect $redirect";
1634 $dord = 1;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001635 }
1636
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001637 while (<CMD>) {
1638 print LOG if ($dolog);
1639 print RD if ($dord);
1640 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04001641
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001642 waitpid($pid, 0);
Steven Rostedt2545eb62010-11-02 15:01:32 -04001643 my $failed = $?;
1644
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001645 close(CMD);
1646 close(LOG) if ($dolog);
1647 close(RD) if ($dord);
1648
Steven Rostedt (Red Hat)b53486e2015-01-27 17:02:02 -05001649 $end_time = time;
1650 my $delta = $end_time - $start_time;
1651
1652 if ($delta == 1) {
1653 doprint "[1 second] ";
1654 } else {
1655 doprint "[$delta seconds] ";
1656 }
1657
Steven Rostedt2545eb62010-11-02 15:01:32 -04001658 if ($failed) {
1659 doprint "FAILED!\n";
1660 } else {
1661 doprint "SUCCESS\n";
1662 }
1663
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001664 return !$failed;
1665}
1666
Steven Rostedte48c5292010-11-02 14:35:37 -04001667sub run_ssh {
1668 my ($cmd) = @_;
1669 my $cp_exec = $ssh_exec;
1670
1671 $cp_exec =~ s/\$SSH_COMMAND/$cmd/g;
1672 return run_command "$cp_exec";
1673}
1674
1675sub run_scp {
Steven Rostedt02ad2612012-03-21 08:21:24 -04001676 my ($src, $dst, $cp_scp) = @_;
Steven Rostedte48c5292010-11-02 14:35:37 -04001677
1678 $cp_scp =~ s/\$SRC_FILE/$src/g;
1679 $cp_scp =~ s/\$DST_FILE/$dst/g;
1680
1681 return run_command "$cp_scp";
1682}
1683
Steven Rostedt02ad2612012-03-21 08:21:24 -04001684sub run_scp_install {
1685 my ($src, $dst) = @_;
1686
1687 my $cp_scp = $scp_to_target_install;
1688
1689 return run_scp($src, $dst, $cp_scp);
1690}
1691
1692sub run_scp_mod {
1693 my ($src, $dst) = @_;
1694
1695 my $cp_scp = $scp_to_target;
1696
1697 return run_scp($src, $dst, $cp_scp);
1698}
1699
Steven Rostedta15ba912012-11-13 14:30:37 -05001700sub get_grub2_index {
1701
Steven Rostedt (Red Hat)752d9662013-03-08 09:33:35 -05001702 return if (defined($grub_number) && defined($last_grub_menu) &&
Steven Rostedt (Red Hat)df5f7c62013-04-24 16:03:30 -04001703 $last_grub_menu eq $grub_menu && defined($last_machine) &&
1704 $last_machine eq $machine);
Steven Rostedta15ba912012-11-13 14:30:37 -05001705
1706 doprint "Find grub2 menu ... ";
1707 $grub_number = -1;
1708
1709 my $ssh_grub = $ssh_exec;
1710 $ssh_grub =~ s,\$SSH_COMMAND,cat $grub_file,g;
1711
1712 open(IN, "$ssh_grub |")
1713 or die "unable to get $grub_file";
1714
1715 my $found = 0;
1716
1717 while (<IN>) {
1718 if (/^menuentry.*$grub_menu/) {
1719 $grub_number++;
1720 $found = 1;
1721 last;
1722 } elsif (/^menuentry\s/) {
1723 $grub_number++;
1724 }
1725 }
1726 close(IN);
1727
1728 die "Could not find '$grub_menu' in $grub_file on $machine"
1729 if (!$found);
1730 doprint "$grub_number\n";
Steven Rostedt (Red Hat)752d9662013-03-08 09:33:35 -05001731 $last_grub_menu = $grub_menu;
Steven Rostedt (Red Hat)df5f7c62013-04-24 16:03:30 -04001732 $last_machine = $machine;
Steven Rostedta15ba912012-11-13 14:30:37 -05001733}
1734
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001735sub get_grub_index {
1736
Steven Rostedta15ba912012-11-13 14:30:37 -05001737 if ($reboot_type eq "grub2") {
1738 get_grub2_index;
1739 return;
1740 }
1741
Steven Rostedta75fece2010-11-02 14:58:27 -04001742 if ($reboot_type ne "grub") {
1743 return;
1744 }
Steven Rostedt (Red Hat)752d9662013-03-08 09:33:35 -05001745 return if (defined($grub_number) && defined($last_grub_menu) &&
Steven Rostedt (Red Hat)df5f7c62013-04-24 16:03:30 -04001746 $last_grub_menu eq $grub_menu && defined($last_machine) &&
1747 $last_machine eq $machine);
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001748
1749 doprint "Find grub menu ... ";
1750 $grub_number = -1;
Steven Rostedte48c5292010-11-02 14:35:37 -04001751
1752 my $ssh_grub = $ssh_exec;
1753 $ssh_grub =~ s,\$SSH_COMMAND,cat /boot/grub/menu.lst,g;
1754
1755 open(IN, "$ssh_grub |")
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001756 or die "unable to get menu.lst";
Steven Rostedte48c5292010-11-02 14:35:37 -04001757
Steven Rostedteaa1fe22011-09-14 17:20:39 -04001758 my $found = 0;
1759
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001760 while (<IN>) {
Steven Rostedta75fece2010-11-02 14:58:27 -04001761 if (/^\s*title\s+$grub_menu\s*$/) {
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001762 $grub_number++;
Steven Rostedteaa1fe22011-09-14 17:20:39 -04001763 $found = 1;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001764 last;
1765 } elsif (/^\s*title\s/) {
1766 $grub_number++;
1767 }
1768 }
1769 close(IN);
1770
Steven Rostedta75fece2010-11-02 14:58:27 -04001771 die "Could not find '$grub_menu' in /boot/grub/menu on $machine"
Steven Rostedteaa1fe22011-09-14 17:20:39 -04001772 if (!$found);
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001773 doprint "$grub_number\n";
Steven Rostedt (Red Hat)752d9662013-03-08 09:33:35 -05001774 $last_grub_menu = $grub_menu;
Steven Rostedt (Red Hat)df5f7c62013-04-24 16:03:30 -04001775 $last_machine = $machine;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001776}
1777
Steven Rostedt2545eb62010-11-02 15:01:32 -04001778sub wait_for_input
1779{
1780 my ($fp, $time) = @_;
1781 my $rin;
1782 my $ready;
1783 my $line;
1784 my $ch;
1785
1786 if (!defined($time)) {
1787 $time = $timeout;
1788 }
1789
1790 $rin = '';
1791 vec($rin, fileno($fp), 1) = 1;
Steven Rostedt (Red Hat)319ab142013-01-30 12:25:38 -05001792 ($ready, $time) = select($rin, undef, undef, $time);
Steven Rostedt2545eb62010-11-02 15:01:32 -04001793
1794 $line = "";
1795
1796 # try to read one char at a time
1797 while (sysread $fp, $ch, 1) {
1798 $line .= $ch;
1799 last if ($ch eq "\n");
1800 }
1801
1802 if (!length($line)) {
1803 return undef;
1804 }
1805
1806 return $line;
1807}
1808
Steven Rostedt75c3fda72010-11-02 14:57:21 -04001809sub reboot_to {
Steven Rostedtbc7c5802011-12-22 16:29:10 -05001810 if (defined($switch_to_test)) {
1811 run_command $switch_to_test;
1812 }
1813
Steven Rostedta75fece2010-11-02 14:58:27 -04001814 if ($reboot_type eq "grub") {
Steven Rostedtc54367f2011-10-20 09:56:41 -04001815 run_ssh "'(echo \"savedefault --default=$grub_number --once\" | grub --batch)'";
Steven Rostedta15ba912012-11-13 14:30:37 -05001816 } elsif ($reboot_type eq "grub2") {
1817 run_ssh "$grub_reboot $grub_number";
Steven Rostedt77869542012-12-11 17:37:41 -05001818 } elsif ($reboot_type eq "syslinux") {
1819 run_ssh "$syslinux --once \\\"$syslinux_label\\\" $syslinux_path";
Steven Rostedt96f6a0d2011-12-23 00:24:51 -05001820 } elsif (defined $reboot_script) {
1821 run_command "$reboot_script";
Steven Rostedta75fece2010-11-02 14:58:27 -04001822 }
Steven Rostedt96f6a0d2011-12-23 00:24:51 -05001823 reboot;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001824}
1825
Steven Rostedta57419b2010-11-02 15:13:54 -04001826sub get_sha1 {
1827 my ($commit) = @_;
1828
1829 doprint "git rev-list --max-count=1 $commit ... ";
1830 my $sha1 = `git rev-list --max-count=1 $commit`;
1831 my $ret = $?;
1832
1833 logit $sha1;
1834
1835 if ($ret) {
1836 doprint "FAILED\n";
1837 dodie "Failed to get git $commit";
1838 }
1839
1840 print "SUCCESS\n";
1841
1842 chomp $sha1;
1843
1844 return $sha1;
1845}
1846
Steven Rostedt5a391fb2010-11-02 14:57:43 -04001847sub monitor {
Steven Rostedt2545eb62010-11-02 15:01:32 -04001848 my $booted = 0;
1849 my $bug = 0;
Steven Rostedt6ca996c2012-03-21 08:18:35 -04001850 my $bug_ignored = 0;
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001851 my $skip_call_trace = 0;
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001852 my $loops;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001853
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05001854 my $start_time = time;
1855
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001856 wait_for_monitor 5;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001857
1858 my $line;
1859 my $full_line = "";
1860
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001861 open(DMESG, "> $dmesg") or
1862 die "unable to write to $dmesg";
Steven Rostedt2545eb62010-11-02 15:01:32 -04001863
Steven Rostedt75c3fda72010-11-02 14:57:21 -04001864 reboot_to;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001865
Steven Rostedt1c8a6172010-11-09 12:55:40 -05001866 my $success_start;
1867 my $failure_start;
Steven Rostedt2d01b262011-03-08 09:47:54 -05001868 my $monitor_start = time;
1869 my $done = 0;
Steven Rostedtf1a5b962011-06-13 10:30:00 -04001870 my $version_found = 0;
Steven Rostedt1c8a6172010-11-09 12:55:40 -05001871
Steven Rostedt2d01b262011-03-08 09:47:54 -05001872 while (!$done) {
Steven Rostedt2545eb62010-11-02 15:01:32 -04001873
Steven Rostedtecaf8e52011-06-13 10:48:10 -04001874 if ($bug && defined($stop_after_failure) &&
1875 $stop_after_failure >= 0) {
1876 my $time = $stop_after_failure - (time - $failure_start);
1877 $line = wait_for_input($monitor_fp, $time);
1878 if (!defined($line)) {
1879 doprint "bug timed out after $booted_timeout seconds\n";
1880 doprint "Test forced to stop after $stop_after_failure seconds after failure\n";
1881 last;
1882 }
1883 } elsif ($booted) {
Steven Rostedta75fece2010-11-02 14:58:27 -04001884 $line = wait_for_input($monitor_fp, $booted_timeout);
Steven Rostedtcd4f1d52011-06-13 10:26:27 -04001885 if (!defined($line)) {
1886 my $s = $booted_timeout == 1 ? "" : "s";
1887 doprint "Successful boot found: break after $booted_timeout second$s\n";
1888 last;
1889 }
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001890 } else {
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001891 $line = wait_for_input($monitor_fp);
Steven Rostedtcd4f1d52011-06-13 10:26:27 -04001892 if (!defined($line)) {
1893 my $s = $timeout == 1 ? "" : "s";
1894 doprint "Timed out after $timeout second$s\n";
1895 last;
1896 }
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001897 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04001898
Steven Rostedt2545eb62010-11-02 15:01:32 -04001899 doprint $line;
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001900 print DMESG $line;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001901
1902 # we are not guaranteed to get a full line
1903 $full_line .= $line;
1904
Steven Rostedta75fece2010-11-02 14:58:27 -04001905 if ($full_line =~ /$success_line/) {
Steven Rostedt2545eb62010-11-02 15:01:32 -04001906 $booted = 1;
Steven Rostedt1c8a6172010-11-09 12:55:40 -05001907 $success_start = time;
1908 }
1909
1910 if ($booted && defined($stop_after_success) &&
1911 $stop_after_success >= 0) {
1912 my $now = time;
1913 if ($now - $success_start >= $stop_after_success) {
1914 doprint "Test forced to stop after $stop_after_success seconds after success\n";
1915 last;
1916 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04001917 }
1918
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001919 if ($full_line =~ /\[ backtrace testing \]/) {
1920 $skip_call_trace = 1;
1921 }
1922
Steven Rostedt2545eb62010-11-02 15:01:32 -04001923 if ($full_line =~ /call trace:/i) {
Steven Rostedt6ca996c2012-03-21 08:18:35 -04001924 if (!$bug && !$skip_call_trace) {
1925 if ($ignore_errors) {
1926 $bug_ignored = 1;
1927 } else {
1928 $bug = 1;
1929 $failure_start = time;
1930 }
Steven Rostedt1c8a6172010-11-09 12:55:40 -05001931 }
1932 }
1933
1934 if ($bug && defined($stop_after_failure) &&
1935 $stop_after_failure >= 0) {
1936 my $now = time;
1937 if ($now - $failure_start >= $stop_after_failure) {
1938 doprint "Test forced to stop after $stop_after_failure seconds after failure\n";
1939 last;
1940 }
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001941 }
1942
1943 if ($full_line =~ /\[ end of backtrace testing \]/) {
1944 $skip_call_trace = 0;
1945 }
1946
1947 if ($full_line =~ /Kernel panic -/) {
Steven Rostedt10abf112011-03-07 13:21:00 -05001948 $failure_start = time;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001949 $bug = 1;
1950 }
1951
Steven Rostedtf1a5b962011-06-13 10:30:00 -04001952 # Detect triple faults by testing the banner
1953 if ($full_line =~ /\bLinux version (\S+).*\n/) {
1954 if ($1 eq $version) {
1955 $version_found = 1;
1956 } elsif ($version_found && $detect_triplefault) {
1957 # We already booted into the kernel we are testing,
1958 # but now we booted into another kernel?
1959 # Consider this a triple fault.
Masanari Iida8b513d02013-05-21 23:13:12 +09001960 doprint "Already booted in Linux kernel $version, but now\n";
Steven Rostedtf1a5b962011-06-13 10:30:00 -04001961 doprint "we booted into Linux kernel $1.\n";
1962 doprint "Assuming that this is a triple fault.\n";
1963 doprint "To disable this: set DETECT_TRIPLE_FAULT to 0\n";
1964 last;
1965 }
1966 }
1967
Steven Rostedt2545eb62010-11-02 15:01:32 -04001968 if ($line =~ /\n/) {
1969 $full_line = "";
1970 }
Steven Rostedt2d01b262011-03-08 09:47:54 -05001971
1972 if ($stop_test_after > 0 && !$booted && !$bug) {
1973 if (time - $monitor_start > $stop_test_after) {
Steven Rostedt4d62bf52011-05-20 09:14:35 -04001974 doprint "STOP_TEST_AFTER ($stop_test_after seconds) timed out\n";
Steven Rostedt2d01b262011-03-08 09:47:54 -05001975 $done = 1;
1976 }
1977 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04001978 }
1979
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05001980 my $end_time = time;
1981 $reboot_time = $end_time - $start_time;
1982
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001983 close(DMESG);
Steven Rostedt2545eb62010-11-02 15:01:32 -04001984
Steven Rostedt2545eb62010-11-02 15:01:32 -04001985 if ($bug) {
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001986 return 0 if ($in_bisect);
Steven Rostedt576f6272010-11-02 14:58:38 -04001987 fail "failed - got a bug report" and return 0;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001988 }
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001989
Steven Rostedta75fece2010-11-02 14:58:27 -04001990 if (!$booted) {
1991 return 0 if ($in_bisect);
Steven Rostedt576f6272010-11-02 14:58:38 -04001992 fail "failed - never got a boot prompt." and return 0;
Steven Rostedta75fece2010-11-02 14:58:27 -04001993 }
1994
Steven Rostedt6ca996c2012-03-21 08:18:35 -04001995 if ($bug_ignored) {
1996 doprint "WARNING: Call Trace detected but ignored due to IGNORE_ERRORS=1\n";
1997 }
1998
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001999 return 1;
Steven Rostedt2545eb62010-11-02 15:01:32 -04002000}
2001
Steven Rostedt2b29b2f2011-12-22 11:25:46 -05002002sub eval_kernel_version {
2003 my ($option) = @_;
2004
2005 $option =~ s/\$KERNEL_VERSION/$version/g;
2006
2007 return $option;
2008}
2009
Steven Rostedtdb05cfe2011-06-13 11:09:22 -04002010sub do_post_install {
2011
2012 return if (!defined($post_install));
2013
Steven Rostedt2b29b2f2011-12-22 11:25:46 -05002014 my $cp_post_install = eval_kernel_version $post_install;
Steven Rostedtdb05cfe2011-06-13 11:09:22 -04002015 run_command "$cp_post_install" or
2016 dodie "Failed to run post install";
2017}
2018
Steven Rostedte1a6c3d2012-12-11 21:19:41 -05002019# Sometimes the reboot fails, and will hang. We try to ssh to the box
2020# and if we fail, we force another reboot, that should powercycle it.
2021sub test_booted {
2022 if (!run_ssh "echo testing connection") {
2023 reboot $sleep_time;
2024 }
2025}
2026
Steven Rostedt2545eb62010-11-02 15:01:32 -04002027sub install {
2028
Steven Rostedte0a87422011-09-30 17:50:48 -04002029 return if ($no_install);
2030
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05002031 my $start_time = time;
2032
Steven Rostedte5c2ec12012-07-19 15:22:05 -04002033 if (defined($pre_install)) {
2034 my $cp_pre_install = eval_kernel_version $pre_install;
2035 run_command "$cp_pre_install" or
2036 dodie "Failed to run pre install";
2037 }
2038
Steven Rostedt2b29b2f2011-12-22 11:25:46 -05002039 my $cp_target = eval_kernel_version $target_image;
2040
Steven Rostedte1a6c3d2012-12-11 21:19:41 -05002041 test_booted;
2042
Steven Rostedt02ad2612012-03-21 08:21:24 -04002043 run_scp_install "$outputdir/$build_target", "$cp_target" or
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002044 dodie "failed to copy image";
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002045
2046 my $install_mods = 0;
2047
2048 # should we process modules?
2049 $install_mods = 0;
Steven Rostedt51ad1dd2010-11-08 16:43:21 -05002050 open(IN, "$output_config") or dodie("Can't read config file");
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002051 while (<IN>) {
2052 if (/CONFIG_MODULES(=y)?/) {
Steven Rostedt8bc5e4e2012-10-26 00:10:32 -04002053 if (defined($1)) {
2054 $install_mods = 1;
2055 last;
2056 }
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002057 }
2058 }
2059 close(IN);
2060
2061 if (!$install_mods) {
Steven Rostedtdb05cfe2011-06-13 11:09:22 -04002062 do_post_install;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002063 doprint "No modules needed\n";
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05002064 my $end_time = time;
2065 $install_time = $end_time - $start_time;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002066 return;
Steven Rostedt2545eb62010-11-02 15:01:32 -04002067 }
2068
Steven Rostedt627977d2012-03-21 08:16:15 -04002069 run_command "$make INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH=$tmpdir modules_install" or
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002070 dodie "Failed to install modules";
Steven Rostedt2545eb62010-11-02 15:01:32 -04002071
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002072 my $modlib = "/lib/modules/$version";
Steven Rostedta57419b2010-11-02 15:13:54 -04002073 my $modtar = "ktest-mods.tar.bz2";
Steven Rostedt2545eb62010-11-02 15:01:32 -04002074
Steven Rostedte48c5292010-11-02 14:35:37 -04002075 run_ssh "rm -rf $modlib" or
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002076 dodie "failed to remove old mods: $modlib";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002077
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002078 # would be nice if scp -r did not follow symbolic links
Steven Rostedta75fece2010-11-02 14:58:27 -04002079 run_command "cd $tmpdir && tar -cjf $modtar lib/modules/$version" or
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002080 dodie "making tarball";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002081
Steven Rostedt02ad2612012-03-21 08:21:24 -04002082 run_scp_mod "$tmpdir/$modtar", "/tmp" or
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002083 dodie "failed to copy modules";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002084
Steven Rostedta75fece2010-11-02 14:58:27 -04002085 unlink "$tmpdir/$modtar";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002086
Steven Rostedte7b13442011-06-14 20:44:36 -04002087 run_ssh "'(cd / && tar xjf /tmp/$modtar)'" or
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002088 dodie "failed to tar modules";
Steven Rostedt2545eb62010-11-02 15:01:32 -04002089
Steven Rostedte48c5292010-11-02 14:35:37 -04002090 run_ssh "rm -f /tmp/$modtar";
Steven Rostedt8b37ca82010-11-02 14:58:33 -04002091
Steven Rostedtdb05cfe2011-06-13 11:09:22 -04002092 do_post_install;
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05002093
2094 my $end_time = time;
2095 $install_time = $end_time - $start_time;
Steven Rostedt2545eb62010-11-02 15:01:32 -04002096}
2097
Steven Rostedtddf607e2011-06-14 20:49:13 -04002098sub get_version {
2099 # get the release name
Steven Rostedt683a3e62012-05-18 13:34:35 -04002100 return if ($have_version);
Steven Rostedtddf607e2011-06-14 20:49:13 -04002101 doprint "$make kernelrelease ... ";
Steven Rostedt (Red Hat)17150fe2014-11-23 15:13:44 -05002102 $version = `$make -s kernelrelease | tail -1`;
Steven Rostedtddf607e2011-06-14 20:49:13 -04002103 chomp($version);
2104 doprint "$version\n";
Steven Rostedt683a3e62012-05-18 13:34:35 -04002105 $have_version = 1;
Steven Rostedtddf607e2011-06-14 20:49:13 -04002106}
2107
2108sub start_monitor_and_boot {
Steven Rostedt9f7424c2011-10-22 08:58:19 -04002109 # Make sure the stable kernel has finished booting
Steven Rostedt (Red Hat)319ab142013-01-30 12:25:38 -05002110
2111 # Install bisects, don't need console
2112 if (defined $console) {
2113 start_monitor;
2114 wait_for_monitor 5;
2115 end_monitor;
2116 }
Steven Rostedt9f7424c2011-10-22 08:58:19 -04002117
Steven Rostedtddf607e2011-06-14 20:49:13 -04002118 get_grub_index;
2119 get_version;
2120 install;
2121
Steven Rostedt (Red Hat)319ab142013-01-30 12:25:38 -05002122 start_monitor if (defined $console);
Steven Rostedtddf607e2011-06-14 20:49:13 -04002123 return monitor;
2124}
2125
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05002126my $check_build_re = ".*:.*(warning|error|Error):.*";
2127my $utf8_quote = "\\x{e2}\\x{80}(\\x{98}|\\x{99})";
2128
Steven Rostedt (Red Hat)73287352013-02-18 09:35:49 -05002129sub process_warning_line {
2130 my ($line) = @_;
2131
2132 chomp $line;
2133
2134 # for distcc heterogeneous systems, some compilers
2135 # do things differently causing warning lines
2136 # to be slightly different. This makes an attempt
2137 # to fixe those issues.
2138
2139 # chop off the index into the line
2140 # using distcc, some compilers give different indexes
2141 # depending on white space
2142 $line =~ s/^(\s*\S+:\d+:)\d+/$1/;
2143
2144 # Some compilers use UTF-8 extended for quotes and some don't.
2145 $line =~ s/$utf8_quote/'/g;
2146
2147 return $line;
2148}
2149
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05002150# Read buildlog and check against warnings file for any
2151# new warnings.
2152#
2153# Returns 1 if OK
2154# 0 otherwise
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04002155sub check_buildlog {
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05002156 return 1 if (!defined $warnings_file);
2157
2158 my %warnings_list;
2159
2160 # Failed builds should not reboot the target
2161 my $save_no_reboot = $no_reboot;
2162 $no_reboot = 1;
2163
2164 if (-f $warnings_file) {
2165 open(IN, $warnings_file) or
2166 dodie "Error opening $warnings_file";
2167
2168 while (<IN>) {
2169 if (/$check_build_re/) {
Steven Rostedt (Red Hat)73287352013-02-18 09:35:49 -05002170 my $warning = process_warning_line $_;
2171
2172 $warnings_list{$warning} = 1;
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05002173 }
2174 }
2175 close(IN);
2176 }
2177
2178 # If warnings file didn't exist, and WARNINGS_FILE exist,
2179 # then we fail on any warning!
2180
2181 open(IN, $buildlog) or dodie "Can't open $buildlog";
2182 while (<IN>) {
2183 if (/$check_build_re/) {
Steven Rostedt (Red Hat)73287352013-02-18 09:35:49 -05002184 my $warning = process_warning_line $_;
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05002185
Steven Rostedt (Red Hat)73287352013-02-18 09:35:49 -05002186 if (!defined $warnings_list{$warning}) {
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05002187 fail "New warning found (not in $warnings_file)\n$_\n";
2188 $no_reboot = $save_no_reboot;
2189 return 0;
2190 }
2191 }
2192 }
2193 $no_reboot = $save_no_reboot;
2194 close(IN);
2195}
2196
2197sub check_patch_buildlog {
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04002198 my ($patch) = @_;
2199
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04002200 my @files = `git show $patch | diffstat -l`;
2201
Steven Rostedt (Red Hat)35275682013-01-30 12:28:15 -05002202 foreach my $file (@files) {
2203 chomp $file;
2204 }
2205
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04002206 open(IN, "git show $patch |") or
2207 dodie "failed to show $patch";
2208 while (<IN>) {
2209 if (m,^--- a/(.*),) {
2210 chomp $1;
2211 $files[$#files] = $1;
2212 }
2213 }
2214 close(IN);
2215
2216 open(IN, $buildlog) or dodie "Can't open $buildlog";
2217 while (<IN>) {
2218 if (/^\s*(.*?):.*(warning|error)/) {
2219 my $err = $1;
2220 foreach my $file (@files) {
Steven Rostedta75fece2010-11-02 14:58:27 -04002221 my $fullpath = "$builddir/$file";
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04002222 if ($file eq $err || $fullpath eq $err) {
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002223 fail "$file built with warnings" and return 0;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04002224 }
2225 }
2226 }
2227 }
2228 close(IN);
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002229
2230 return 1;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04002231}
2232
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002233sub apply_min_config {
2234 my $outconfig = "$output_config.new";
Steven Rostedt612b9e92011-03-07 13:27:43 -05002235
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002236 # Read the config file and remove anything that
2237 # is in the force_config hash (from minconfig and others)
2238 # then add the force config back.
2239
2240 doprint "Applying minimum configurations into $output_config.new\n";
2241
2242 open (OUT, ">$outconfig") or
2243 dodie "Can't create $outconfig";
2244
2245 if (-f $output_config) {
2246 open (IN, $output_config) or
2247 dodie "Failed to open $output_config";
2248 while (<IN>) {
2249 if (/^(# )?(CONFIG_[^\s=]*)/) {
2250 next if (defined($force_config{$2}));
2251 }
2252 print OUT;
2253 }
2254 close IN;
2255 }
2256 foreach my $config (keys %force_config) {
2257 print OUT "$force_config{$config}\n";
2258 }
2259 close OUT;
2260
2261 run_command "mv $outconfig $output_config";
2262}
2263
2264sub make_oldconfig {
2265
Steven Rostedt4c4ab122011-07-15 21:16:17 -04002266 my @force_list = keys %force_config;
2267
2268 if ($#force_list >= 0) {
2269 apply_min_config;
2270 }
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002271
Adam Leefb16d892012-09-01 01:05:17 +08002272 if (!run_command "$make olddefconfig") {
2273 # Perhaps olddefconfig doesn't exist in this version of the kernel
Steven Rostedt18925172012-12-11 20:16:03 -05002274 # try oldnoconfig
2275 doprint "olddefconfig failed, trying make oldnoconfig\n";
2276 if (!run_command "$make oldnoconfig") {
2277 doprint "oldnoconfig failed, trying yes '' | make oldconfig\n";
2278 # try a yes '' | oldconfig
2279 run_command "yes '' | $make oldconfig" or
2280 dodie "failed make config oldconfig";
2281 }
Steven Rostedt612b9e92011-03-07 13:27:43 -05002282 }
2283}
2284
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002285# read a config file and use this to force new configs.
2286sub load_force_config {
2287 my ($config) = @_;
2288
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002289 doprint "Loading force configs from $config\n";
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002290 open(IN, $config) or
2291 dodie "failed to read $config";
2292 while (<IN>) {
2293 chomp;
2294 if (/^(CONFIG[^\s=]*)(\s*=.*)/) {
2295 $force_config{$1} = $_;
2296 } elsif (/^# (CONFIG_\S*) is not set/) {
2297 $force_config{$1} = $_;
2298 }
2299 }
2300 close IN;
2301}
2302
Steven Rostedt2545eb62010-11-02 15:01:32 -04002303sub build {
2304 my ($type) = @_;
2305
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002306 unlink $buildlog;
2307
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05002308 my $start_time = time;
2309
Steven Rostedt4ab1cce2011-09-30 18:12:20 -04002310 # Failed builds should not reboot the target
2311 my $save_no_reboot = $no_reboot;
2312 $no_reboot = 1;
2313
Steven Rostedt683a3e62012-05-18 13:34:35 -04002314 # Calculate a new version from here.
2315 $have_version = 0;
2316
Steven Rostedt0bd6c1a2011-06-14 20:39:31 -04002317 if (defined($pre_build)) {
2318 my $ret = run_command $pre_build;
2319 if (!$ret && defined($pre_build_die) &&
2320 $pre_build_die) {
2321 dodie "failed to pre_build\n";
2322 }
2323 }
2324
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002325 if ($type =~ /^useconfig:(.*)/) {
Steven Rostedt51ad1dd2010-11-08 16:43:21 -05002326 run_command "cp $1 $output_config" or
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002327 dodie "could not copy $1 to .config";
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002328
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002329 $type = "oldconfig";
2330 }
2331
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002332 # old config can ask questions
2333 if ($type eq "oldconfig") {
Adam Leefb16d892012-09-01 01:05:17 +08002334 $type = "olddefconfig";
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002335
2336 # allow for empty configs
Steven Rostedt51ad1dd2010-11-08 16:43:21 -05002337 run_command "touch $output_config";
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002338
Andrew Jones13488232011-08-12 15:32:04 +02002339 if (!$noclean) {
2340 run_command "mv $output_config $outputdir/config_temp" or
2341 dodie "moving .config";
Steven Rostedt2545eb62010-11-02 15:01:32 -04002342
Andrew Jones13488232011-08-12 15:32:04 +02002343 run_command "$make mrproper" or dodie "make mrproper";
2344
2345 run_command "mv $outputdir/config_temp $output_config" or
2346 dodie "moving config_temp";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002347 }
2348
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002349 } elsif (!$noclean) {
Steven Rostedt51ad1dd2010-11-08 16:43:21 -05002350 unlink "$output_config";
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002351 run_command "$make mrproper" or
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002352 dodie "make mrproper";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002353 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04002354
2355 # add something to distinguish this build
Steven Rostedta75fece2010-11-02 14:58:27 -04002356 open(OUT, "> $outputdir/localversion") or dodie("Can't make localversion file");
2357 print OUT "$localversion\n";
Steven Rostedt2545eb62010-11-02 15:01:32 -04002358 close(OUT);
2359
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002360 if (defined($minconfig)) {
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002361 load_force_config($minconfig);
Steven Rostedt2545eb62010-11-02 15:01:32 -04002362 }
2363
Adam Leefb16d892012-09-01 01:05:17 +08002364 if ($type ne "olddefconfig") {
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002365 run_command "$make $type" or
Steven Rostedt612b9e92011-03-07 13:27:43 -05002366 dodie "failed make config";
2367 }
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002368 # Run old config regardless, to enforce min configurations
2369 make_oldconfig;
Steven Rostedt2545eb62010-11-02 15:01:32 -04002370
Satoru Takeuchif983a2b2014-03-02 21:20:31 +09002371 my $build_ret = run_command "$make $build_options", $buildlog;
Steven Rostedt0bd6c1a2011-06-14 20:39:31 -04002372
2373 if (defined($post_build)) {
Steven Rostedt683a3e62012-05-18 13:34:35 -04002374 # Because a post build may change the kernel version
2375 # do it now.
2376 get_version;
Steven Rostedt0bd6c1a2011-06-14 20:39:31 -04002377 my $ret = run_command $post_build;
2378 if (!$ret && defined($post_build_die) &&
2379 $post_build_die) {
2380 dodie "failed to post_build\n";
2381 }
2382 }
2383
2384 if (!$build_ret) {
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002385 # bisect may need this to pass
Steven Rostedt4ab1cce2011-09-30 18:12:20 -04002386 if ($in_bisect) {
2387 $no_reboot = $save_no_reboot;
2388 return 0;
2389 }
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002390 fail "failed build" and return 0;
Steven Rostedt2545eb62010-11-02 15:01:32 -04002391 }
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002392
Steven Rostedt4ab1cce2011-09-30 18:12:20 -04002393 $no_reboot = $save_no_reboot;
2394
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05002395 my $end_time = time;
2396 $build_time = $end_time - $start_time;
2397
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002398 return 1;
Steven Rostedt2545eb62010-11-02 15:01:32 -04002399}
2400
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002401sub halt {
Steven Rostedte48c5292010-11-02 14:35:37 -04002402 if (!run_ssh "halt" or defined($power_off)) {
Steven Rostedt576f6272010-11-02 14:58:38 -04002403 if (defined($poweroff_after_halt)) {
2404 sleep $poweroff_after_halt;
2405 run_command "$power_off";
2406 }
2407 } else {
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002408 # nope? the zap it!
Steven Rostedta75fece2010-11-02 14:58:27 -04002409 run_command "$power_off";
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002410 }
2411}
2412
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002413sub success {
2414 my ($i) = @_;
2415
Steven Rostedt921ed4c2012-07-19 15:18:27 -04002416 if (defined($post_test)) {
2417 run_command $post_test;
2418 }
2419
Steven Rostedte48c5292010-11-02 14:35:37 -04002420 $successes++;
2421
Steven Rostedt9064af52011-06-13 10:38:48 -04002422 my $name = "";
2423
2424 if (defined($test_name)) {
2425 $name = " ($test_name)";
2426 }
2427
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002428 doprint "\n\n*******************************************\n";
2429 doprint "*******************************************\n";
Steven Rostedt9064af52011-06-13 10:38:48 -04002430 doprint "KTEST RESULT: TEST $i$name SUCCESS!!!! **\n";
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002431 doprint "*******************************************\n";
2432 doprint "*******************************************\n";
2433
Rabin Vincentde5b6e32011-11-18 17:05:31 +05302434 if (defined($store_successes)) {
2435 save_logs "success", $store_successes;
2436 }
2437
Steven Rostedt576f6272010-11-02 14:58:38 -04002438 if ($i != $opt{"NUM_TESTS"} && !do_not_reboot) {
Steven Rostedta75fece2010-11-02 14:58:27 -04002439 doprint "Reboot and wait $sleep_time seconds\n";
Steven Rostedtbc7c5802011-12-22 16:29:10 -05002440 reboot_to_good $sleep_time;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002441 }
2442}
2443
Steven Rostedtc960bb92011-03-08 09:22:39 -05002444sub answer_bisect {
2445 for (;;) {
Chris J Argesfee9d3e2014-08-27 13:26:53 -05002446 doprint "Pass, fail, or skip? [p/f/s]";
Steven Rostedtc960bb92011-03-08 09:22:39 -05002447 my $ans = <STDIN>;
2448 chomp $ans;
2449 if ($ans eq "p" || $ans eq "P") {
2450 return 1;
2451 } elsif ($ans eq "f" || $ans eq "F") {
2452 return 0;
Chris J Argesfee9d3e2014-08-27 13:26:53 -05002453 } elsif ($ans eq "s" || $ans eq "S") {
2454 return -1;
Steven Rostedtc960bb92011-03-08 09:22:39 -05002455 } else {
Chris J Argesfee9d3e2014-08-27 13:26:53 -05002456 print "Please answer 'p', 'f', or 's'\n";
Steven Rostedtc960bb92011-03-08 09:22:39 -05002457 }
2458 }
2459}
2460
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002461sub child_run_test {
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002462 my $failed = 0;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002463
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002464 # child should have no power
Steven Rostedta75fece2010-11-02 14:58:27 -04002465 $reboot_on_error = 0;
2466 $poweroff_on_error = 0;
2467 $die_on_failure = 1;
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002468
Satoru Takeuchif983a2b2014-03-02 21:20:31 +09002469 run_command $run_test, $testlog or $failed = 1;
Rabin Vincenta9dd5d62011-11-18 17:05:29 +05302470
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002471 exit $failed;
2472}
2473
2474my $child_done;
2475
2476sub child_finished {
2477 $child_done = 1;
2478}
2479
2480sub do_run_test {
2481 my $child_pid;
2482 my $child_exit;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002483 my $line;
2484 my $full_line;
2485 my $bug = 0;
Steven Rostedt9b1d3672012-07-30 14:30:53 -04002486 my $bug_ignored = 0;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002487
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05002488 my $start_time = time;
2489
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002490 wait_for_monitor 1;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002491
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002492 doprint "run test $run_test\n";
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002493
2494 $child_done = 0;
2495
2496 $SIG{CHLD} = qw(child_finished);
2497
2498 $child_pid = fork;
2499
2500 child_run_test if (!$child_pid);
2501
2502 $full_line = "";
2503
2504 do {
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002505 $line = wait_for_input($monitor_fp, 1);
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002506 if (defined($line)) {
2507
2508 # we are not guaranteed to get a full line
2509 $full_line .= $line;
Steven Rostedt8ea0e062011-03-08 09:44:35 -05002510 doprint $line;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002511
2512 if ($full_line =~ /call trace:/i) {
Steven Rostedt9b1d3672012-07-30 14:30:53 -04002513 if ($ignore_errors) {
2514 $bug_ignored = 1;
2515 } else {
2516 $bug = 1;
2517 }
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002518 }
2519
2520 if ($full_line =~ /Kernel panic -/) {
2521 $bug = 1;
2522 }
2523
2524 if ($line =~ /\n/) {
2525 $full_line = "";
2526 }
2527 }
2528 } while (!$child_done && !$bug);
2529
Steven Rostedt9b1d3672012-07-30 14:30:53 -04002530 if (!$bug && $bug_ignored) {
2531 doprint "WARNING: Call Trace detected but ignored due to IGNORE_ERRORS=1\n";
2532 }
2533
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002534 if ($bug) {
Steven Rostedt8ea0e062011-03-08 09:44:35 -05002535 my $failure_start = time;
2536 my $now;
2537 do {
2538 $line = wait_for_input($monitor_fp, 1);
2539 if (defined($line)) {
2540 doprint $line;
2541 }
2542 $now = time;
2543 if ($now - $failure_start >= $stop_after_failure) {
2544 last;
2545 }
2546 } while (defined($line));
2547
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002548 doprint "Detected kernel crash!\n";
2549 # kill the child with extreme prejudice
2550 kill 9, $child_pid;
2551 }
2552
2553 waitpid $child_pid, 0;
2554 $child_exit = $?;
2555
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05002556 my $end_time = time;
2557 $test_time = $end_time - $start_time;
2558
Steven Rostedtc5dacb82011-12-22 12:43:57 -05002559 if (!$bug && $in_bisect) {
2560 if (defined($bisect_ret_good)) {
2561 if ($child_exit == $bisect_ret_good) {
2562 return 1;
2563 }
2564 }
2565 if (defined($bisect_ret_skip)) {
2566 if ($child_exit == $bisect_ret_skip) {
2567 return -1;
2568 }
2569 }
2570 if (defined($bisect_ret_abort)) {
2571 if ($child_exit == $bisect_ret_abort) {
2572 fail "test abort" and return -2;
2573 }
2574 }
2575 if (defined($bisect_ret_bad)) {
2576 if ($child_exit == $bisect_ret_skip) {
2577 return 0;
2578 }
2579 }
2580 if (defined($bisect_ret_default)) {
2581 if ($bisect_ret_default eq "good") {
2582 return 1;
2583 } elsif ($bisect_ret_default eq "bad") {
2584 return 0;
2585 } elsif ($bisect_ret_default eq "skip") {
2586 return -1;
2587 } elsif ($bisect_ret_default eq "abort") {
2588 return -2;
2589 } else {
2590 fail "unknown default action: $bisect_ret_default"
2591 and return -2;
2592 }
2593 }
2594 }
2595
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002596 if ($bug || $child_exit) {
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002597 return 0 if $in_bisect;
2598 fail "test failed" and return 0;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002599 }
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002600 return 1;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002601}
2602
Steven Rostedta75fece2010-11-02 14:58:27 -04002603sub run_git_bisect {
2604 my ($command) = @_;
2605
2606 doprint "$command ... ";
2607
2608 my $output = `$command 2>&1`;
2609 my $ret = $?;
2610
2611 logit $output;
2612
2613 if ($ret) {
2614 doprint "FAILED\n";
2615 dodie "Failed to git bisect";
2616 }
2617
2618 doprint "SUCCESS\n";
2619 if ($output =~ m/^(Bisecting: .*\(roughly \d+ steps?\))\s+\[([[:xdigit:]]+)\]/) {
2620 doprint "$1 [$2]\n";
2621 } elsif ($output =~ m/^([[:xdigit:]]+) is the first bad commit/) {
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002622 $bisect_bad_commit = $1;
Steven Rostedta75fece2010-11-02 14:58:27 -04002623 doprint "Found bad commit... $1\n";
2624 return 0;
2625 } else {
2626 # we already logged it, just print it now.
2627 print $output;
2628 }
2629
2630 return 1;
2631}
2632
Steven Rostedtc23dca72011-03-08 09:26:31 -05002633sub bisect_reboot {
2634 doprint "Reboot and sleep $bisect_sleep_time seconds\n";
Steven Rostedtbc7c5802011-12-22 16:29:10 -05002635 reboot_to_good $bisect_sleep_time;
Steven Rostedtc23dca72011-03-08 09:26:31 -05002636}
2637
2638# returns 1 on success, 0 on failure, -1 on skip
Steven Rostedt0a05c762010-11-08 11:14:10 -05002639sub run_bisect_test {
2640 my ($type, $buildtype) = @_;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002641
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002642 my $failed = 0;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002643 my $result;
2644 my $output;
2645 my $ret;
2646
Steven Rostedt0a05c762010-11-08 11:14:10 -05002647 $in_bisect = 1;
2648
2649 build $buildtype or $failed = 1;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002650
2651 if ($type ne "build") {
Steven Rostedtc23dca72011-03-08 09:26:31 -05002652 if ($failed && $bisect_skip) {
2653 $in_bisect = 0;
2654 return -1;
2655 }
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002656 dodie "Failed on build" if $failed;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002657
2658 # Now boot the box
Steven Rostedtddf607e2011-06-14 20:49:13 -04002659 start_monitor_and_boot or $failed = 1;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002660
2661 if ($type ne "boot") {
Steven Rostedtc23dca72011-03-08 09:26:31 -05002662 if ($failed && $bisect_skip) {
2663 end_monitor;
2664 bisect_reboot;
2665 $in_bisect = 0;
2666 return -1;
2667 }
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002668 dodie "Failed on boot" if $failed;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002669
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002670 do_run_test or $failed = 1;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002671 }
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002672 end_monitor;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002673 }
2674
2675 if ($failed) {
Steven Rostedt0a05c762010-11-08 11:14:10 -05002676 $result = 0;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002677 } else {
Steven Rostedt0a05c762010-11-08 11:14:10 -05002678 $result = 1;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002679 }
Steven Rostedt4025bc62011-05-20 09:16:29 -04002680
2681 # reboot the box to a kernel we can ssh to
2682 if ($type ne "build") {
2683 bisect_reboot;
2684 }
Steven Rostedt0a05c762010-11-08 11:14:10 -05002685 $in_bisect = 0;
2686
2687 return $result;
2688}
2689
2690sub run_bisect {
2691 my ($type) = @_;
2692 my $buildtype = "oldconfig";
2693
2694 # We should have a minconfig to use?
2695 if (defined($minconfig)) {
2696 $buildtype = "useconfig:$minconfig";
2697 }
2698
Steven Rostedt (Red Hat)961d9ca2014-01-18 19:52:13 -05002699 # If the user sets bisect_tries to less than 1, then no tries
2700 # is a success.
2701 my $ret = 1;
Steven Rostedt0a05c762010-11-08 11:14:10 -05002702
Steven Rostedt (Red Hat)961d9ca2014-01-18 19:52:13 -05002703 # Still let the user manually decide that though.
2704 if ($bisect_tries < 1 && $bisect_manual) {
Steven Rostedtc960bb92011-03-08 09:22:39 -05002705 $ret = answer_bisect;
2706 }
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002707
Steven Rostedt (Red Hat)961d9ca2014-01-18 19:52:13 -05002708 for (my $i = 0; $i < $bisect_tries; $i++) {
2709 if ($bisect_tries > 1) {
2710 my $t = $i + 1;
2711 doprint("Running bisect trial $t of $bisect_tries:\n");
2712 }
2713 $ret = run_bisect_test $type, $buildtype;
2714
2715 if ($bisect_manual) {
2716 $ret = answer_bisect;
2717 }
2718
2719 last if (!$ret);
2720 }
2721
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04002722 # Are we looking for where it worked, not failed?
Russ Dill5158ba3e2012-04-23 19:43:00 -07002723 if ($reverse_bisect && $ret >= 0) {
Steven Rostedt0a05c762010-11-08 11:14:10 -05002724 $ret = !$ret;
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04002725 }
2726
Steven Rostedtc23dca72011-03-08 09:26:31 -05002727 if ($ret > 0) {
Steven Rostedt0a05c762010-11-08 11:14:10 -05002728 return "good";
Steven Rostedtc23dca72011-03-08 09:26:31 -05002729 } elsif ($ret == 0) {
Steven Rostedt0a05c762010-11-08 11:14:10 -05002730 return "bad";
Steven Rostedtc23dca72011-03-08 09:26:31 -05002731 } elsif ($bisect_skip) {
2732 doprint "HIT A BAD COMMIT ... SKIPPING\n";
2733 return "skip";
Steven Rostedt0a05c762010-11-08 11:14:10 -05002734 }
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002735}
2736
Steven Rostedtdad98752011-11-22 20:48:57 -05002737sub update_bisect_replay {
2738 my $tmp_log = "$tmpdir/ktest_bisect_log";
2739 run_command "git bisect log > $tmp_log" or
2740 die "can't create bisect log";
2741 return $tmp_log;
2742}
2743
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002744sub bisect {
2745 my ($i) = @_;
2746
2747 my $result;
2748
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002749 die "BISECT_GOOD[$i] not defined\n" if (!defined($bisect_good));
2750 die "BISECT_BAD[$i] not defined\n" if (!defined($bisect_bad));
2751 die "BISECT_TYPE[$i] not defined\n" if (!defined($bisect_type));
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002752
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002753 my $good = $bisect_good;
2754 my $bad = $bisect_bad;
2755 my $type = $bisect_type;
2756 my $start = $bisect_start;
2757 my $replay = $bisect_replay;
2758 my $start_files = $bisect_files;
Steven Rostedt3410f6f2011-03-08 09:38:12 -05002759
2760 if (defined($start_files)) {
2761 $start_files = " -- " . $start_files;
2762 } else {
2763 $start_files = "";
2764 }
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002765
Steven Rostedta57419b2010-11-02 15:13:54 -04002766 # convert to true sha1's
2767 $good = get_sha1($good);
2768 $bad = get_sha1($bad);
2769
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002770 if (defined($bisect_reverse) && $bisect_reverse == 1) {
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04002771 doprint "Performing a reverse bisect (bad is good, good is bad!)\n";
2772 $reverse_bisect = 1;
2773 } else {
2774 $reverse_bisect = 0;
2775 }
2776
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002777 # Can't have a test without having a test to run
2778 if ($type eq "test" && !defined($run_test)) {
2779 $type = "boot";
2780 }
2781
Steven Rostedtdad98752011-11-22 20:48:57 -05002782 # Check if a bisect was running
2783 my $bisect_start_file = "$builddir/.git/BISECT_START";
2784
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002785 my $check = $bisect_check;
Steven Rostedtdad98752011-11-22 20:48:57 -05002786 my $do_check = defined($check) && $check ne "0";
2787
2788 if ( -f $bisect_start_file ) {
2789 print "Bisect in progress found\n";
2790 if ($do_check) {
2791 print " If you say yes, then no checks of good or bad will be done\n";
2792 }
2793 if (defined($replay)) {
2794 print "** BISECT_REPLAY is defined in config file **";
2795 print " Ignore config option and perform new git bisect log?\n";
2796 if (read_ync " (yes, no, or cancel) ") {
2797 $replay = update_bisect_replay;
2798 $do_check = 0;
2799 }
2800 } elsif (read_yn "read git log and continue?") {
2801 $replay = update_bisect_replay;
2802 $do_check = 0;
2803 }
2804 }
2805
2806 if ($do_check) {
Steven Rostedta75fece2010-11-02 14:58:27 -04002807
2808 # get current HEAD
Steven Rostedta57419b2010-11-02 15:13:54 -04002809 my $head = get_sha1("HEAD");
Steven Rostedta75fece2010-11-02 14:58:27 -04002810
2811 if ($check ne "good") {
2812 doprint "TESTING BISECT BAD [$bad]\n";
2813 run_command "git checkout $bad" or
2814 die "Failed to checkout $bad";
2815
2816 $result = run_bisect $type;
2817
2818 if ($result ne "bad") {
2819 fail "Tested BISECT_BAD [$bad] and it succeeded" and return 0;
2820 }
2821 }
2822
2823 if ($check ne "bad") {
2824 doprint "TESTING BISECT GOOD [$good]\n";
2825 run_command "git checkout $good" or
2826 die "Failed to checkout $good";
2827
2828 $result = run_bisect $type;
2829
2830 if ($result ne "good") {
2831 fail "Tested BISECT_GOOD [$good] and it failed" and return 0;
2832 }
2833 }
2834
2835 # checkout where we started
2836 run_command "git checkout $head" or
2837 die "Failed to checkout $head";
2838 }
2839
Steven Rostedt3410f6f2011-03-08 09:38:12 -05002840 run_command "git bisect start$start_files" or
Steven Rostedta75fece2010-11-02 14:58:27 -04002841 dodie "could not start bisect";
2842
Steven Rostedta75fece2010-11-02 14:58:27 -04002843 if (defined($replay)) {
2844 run_command "git bisect replay $replay" or
2845 dodie "failed to run replay";
Steven Rostedt (Red Hat)d832d742014-10-07 16:34:25 -04002846 } else {
2847
2848 run_command "git bisect good $good" or
2849 dodie "could not set bisect good to $good";
2850
2851 run_git_bisect "git bisect bad $bad" or
2852 dodie "could not set bisect bad to $bad";
2853
Steven Rostedta75fece2010-11-02 14:58:27 -04002854 }
2855
2856 if (defined($start)) {
2857 run_command "git checkout $start" or
2858 dodie "failed to checkout $start";
2859 }
2860
2861 my $test;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002862 do {
2863 $result = run_bisect $type;
Steven Rostedta75fece2010-11-02 14:58:27 -04002864 $test = run_git_bisect "git bisect $result";
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05002865 print_times;
Steven Rostedta75fece2010-11-02 14:58:27 -04002866 } while ($test);
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002867
2868 run_command "git bisect log" or
2869 dodie "could not capture git bisect log";
2870
2871 run_command "git bisect reset" or
2872 dodie "could not reset git bisect";
2873
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002874 doprint "Bad commit was [$bisect_bad_commit]\n";
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002875
Steven Rostedt0a05c762010-11-08 11:14:10 -05002876 success $i;
2877}
2878
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002879# config_ignore holds the configs that were set (or unset) for
2880# a good config and we will ignore these configs for the rest
2881# of a config bisect. These configs stay as they were.
Steven Rostedt0a05c762010-11-08 11:14:10 -05002882my %config_ignore;
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002883
2884# config_set holds what all configs were set as.
Steven Rostedt0a05c762010-11-08 11:14:10 -05002885my %config_set;
2886
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002887# config_off holds the set of configs that the bad config had disabled.
2888# We need to record them and set them in the .config when running
Adam Leefb16d892012-09-01 01:05:17 +08002889# olddefconfig, because olddefconfig keeps the defaults.
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002890my %config_off;
2891
2892# config_off_tmp holds a set of configs to turn off for now
2893my @config_off_tmp;
2894
2895# config_list is the set of configs that are being tested
Steven Rostedt0a05c762010-11-08 11:14:10 -05002896my %config_list;
2897my %null_config;
2898
2899my %dependency;
2900
Steven Rostedt4c4ab122011-07-15 21:16:17 -04002901sub assign_configs {
2902 my ($hash, $config) = @_;
Steven Rostedt0a05c762010-11-08 11:14:10 -05002903
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04002904 doprint "Reading configs from $config\n";
2905
Steven Rostedt0a05c762010-11-08 11:14:10 -05002906 open (IN, $config)
2907 or dodie "Failed to read $config";
2908
2909 while (<IN>) {
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04002910 chomp;
Steven Rostedt9bf71742011-06-01 23:27:19 -04002911 if (/^((CONFIG\S*)=.*)/) {
Steven Rostedt4c4ab122011-07-15 21:16:17 -04002912 ${$hash}{$2} = $1;
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04002913 } elsif (/^(# (CONFIG\S*) is not set)/) {
2914 ${$hash}{$2} = $1;
Steven Rostedt0a05c762010-11-08 11:14:10 -05002915 }
2916 }
2917
2918 close(IN);
2919}
2920
Steven Rostedt4c4ab122011-07-15 21:16:17 -04002921sub process_config_ignore {
2922 my ($config) = @_;
2923
2924 assign_configs \%config_ignore, $config;
2925}
2926
Steven Rostedt0a05c762010-11-08 11:14:10 -05002927sub get_dependencies {
2928 my ($config) = @_;
2929
2930 my $arr = $dependency{$config};
2931 if (!defined($arr)) {
2932 return ();
2933 }
2934
2935 my @deps = @{$arr};
2936
2937 foreach my $dep (@{$arr}) {
2938 print "ADD DEP $dep\n";
2939 @deps = (@deps, get_dependencies $dep);
2940 }
2941
2942 return @deps;
2943}
2944
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04002945sub save_config {
2946 my ($pc, $file) = @_;
Steven Rostedt0a05c762010-11-08 11:14:10 -05002947
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04002948 my %configs = %{$pc};
Steven Rostedt0a05c762010-11-08 11:14:10 -05002949
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04002950 doprint "Saving configs into $file\n";
Steven Rostedt0a05c762010-11-08 11:14:10 -05002951
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04002952 open(OUT, ">$file") or dodie "Can not write to $file";
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002953
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04002954 foreach my $config (keys %configs) {
2955 print OUT "$configs{$config}\n";
Steven Rostedt0a05c762010-11-08 11:14:10 -05002956 }
2957 close(OUT);
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04002958}
2959
2960sub create_config {
2961 my ($name, $pc) = @_;
2962
2963 doprint "Creating old config from $name configs\n";
2964
2965 save_config $pc, $output_config;
Steven Rostedt0a05c762010-11-08 11:14:10 -05002966
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002967 make_oldconfig;
Steven Rostedt0a05c762010-11-08 11:14:10 -05002968}
2969
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04002970# compare two config hashes, and return configs with different vals.
2971# It returns B's config values, but you can use A to see what A was.
2972sub diff_config_vals {
2973 my ($pa, $pb) = @_;
2974
2975 # crappy Perl way to pass in hashes.
2976 my %a = %{$pa};
2977 my %b = %{$pb};
2978
2979 my %ret;
2980
2981 foreach my $item (keys %a) {
2982 if (defined($b{$item}) && $b{$item} ne $a{$item}) {
2983 $ret{$item} = $b{$item};
2984 }
2985 }
2986
2987 return %ret;
2988}
2989
2990# compare two config hashes and return the configs in B but not A
2991sub diff_configs {
2992 my ($pa, $pb) = @_;
2993
2994 my %ret;
2995
2996 # crappy Perl way to pass in hashes.
2997 my %a = %{$pa};
2998 my %b = %{$pb};
2999
3000 foreach my $item (keys %b) {
3001 if (!defined($a{$item})) {
3002 $ret{$item} = $b{$item};
3003 }
3004 }
3005
3006 return %ret;
3007}
3008
3009# return if two configs are equal or not
3010# 0 is equal +1 b has something a does not
3011# +1 if a and b have a different item.
3012# -1 if a has something b does not
Steven Rostedt0a05c762010-11-08 11:14:10 -05003013sub compare_configs {
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003014 my ($pa, $pb) = @_;
3015
3016 my %ret;
3017
3018 # crappy Perl way to pass in hashes.
3019 my %a = %{$pa};
3020 my %b = %{$pb};
3021
3022 foreach my $item (keys %b) {
3023 if (!defined($a{$item})) {
3024 return 1;
3025 }
3026 if ($a{$item} ne $b{$item}) {
3027 return 1;
3028 }
3029 }
Steven Rostedt0a05c762010-11-08 11:14:10 -05003030
3031 foreach my $item (keys %a) {
3032 if (!defined($b{$item})) {
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003033 return -1;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003034 }
Steven Rostedt0a05c762010-11-08 11:14:10 -05003035 }
3036
Steven Rostedt0a05c762010-11-08 11:14:10 -05003037 return 0;
3038}
3039
3040sub run_config_bisect_test {
3041 my ($type) = @_;
3042
Steven Rostedt (Red Hat)4cc559b2014-04-23 22:27:27 -04003043 my $ret = run_bisect_test $type, "oldconfig";
3044
3045 if ($bisect_manual) {
3046 $ret = answer_bisect;
3047 }
3048
3049 return $ret;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003050}
3051
Steven Rostedt0a05c762010-11-08 11:14:10 -05003052sub process_failed {
3053 my ($config) = @_;
3054
3055 doprint "\n\n***************************************\n";
3056 doprint "Found bad config: $config\n";
3057 doprint "***************************************\n\n";
3058}
3059
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003060# used for config bisecting
3061my $good_config;
3062my $bad_config;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003063
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003064sub process_new_config {
3065 my ($tc, $nc, $gc, $bc) = @_;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003066
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003067 my %tmp_config = %{$tc};
3068 my %good_configs = %{$gc};
3069 my %bad_configs = %{$bc};
3070
3071 my %new_configs;
3072
3073 my $runtest = 1;
3074 my $ret;
3075
3076 create_config "tmp_configs", \%tmp_config;
3077 assign_configs \%new_configs, $output_config;
3078
3079 $ret = compare_configs \%new_configs, \%bad_configs;
3080 if (!$ret) {
3081 doprint "New config equals bad config, try next test\n";
3082 $runtest = 0;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003083 }
3084
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003085 if ($runtest) {
3086 $ret = compare_configs \%new_configs, \%good_configs;
3087 if (!$ret) {
3088 doprint "New config equals good config, try next test\n";
3089 $runtest = 0;
3090 }
3091 }
3092
3093 %{$nc} = %new_configs;
3094
3095 return $runtest;
3096}
3097
3098sub run_config_bisect {
3099 my ($pgood, $pbad) = @_;
3100
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05003101 my $type = $config_bisect_type;
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003102
3103 my %good_configs = %{$pgood};
3104 my %bad_configs = %{$pbad};
3105
3106 my %diff_configs = diff_config_vals \%good_configs, \%bad_configs;
3107 my %b_configs = diff_configs \%good_configs, \%bad_configs;
3108 my %g_configs = diff_configs \%bad_configs, \%good_configs;
3109
3110 my @diff_arr = keys %diff_configs;
3111 my $len_diff = $#diff_arr + 1;
3112
3113 my @b_arr = keys %b_configs;
3114 my $len_b = $#b_arr + 1;
3115
3116 my @g_arr = keys %g_configs;
3117 my $len_g = $#g_arr + 1;
3118
3119 my $runtest = 1;
3120 my %new_configs;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003121 my $ret;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003122
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003123 # First, lets get it down to a single subset.
3124 # Is the problem with a difference in values?
3125 # Is the problem with a missing config?
3126 # Is the problem with a config that breaks things?
Steven Rostedt0a05c762010-11-08 11:14:10 -05003127
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003128 # Enable all of one set and see if we get a new bad
3129 # or good config.
Steven Rostedt0a05c762010-11-08 11:14:10 -05003130
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003131 # first set the good config to the bad values.
Steven Rostedt0a05c762010-11-08 11:14:10 -05003132
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003133 doprint "d=$len_diff g=$len_g b=$len_b\n";
Steven Rostedtcf79fab2012-07-19 15:29:43 -04003134
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003135 # first lets enable things in bad config that are enabled in good config
Steven Rostedt0a05c762010-11-08 11:14:10 -05003136
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003137 if ($len_diff > 0) {
3138 if ($len_b > 0 || $len_g > 0) {
3139 my %tmp_config = %bad_configs;
3140
3141 doprint "Set tmp config to be bad config with good config values\n";
3142 foreach my $item (@diff_arr) {
3143 $tmp_config{$item} = $good_configs{$item};
Steven Rostedt0a05c762010-11-08 11:14:10 -05003144 }
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003145
3146 $runtest = process_new_config \%tmp_config, \%new_configs,
3147 \%good_configs, \%bad_configs;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003148 }
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003149 }
Steven Rostedtcf79fab2012-07-19 15:29:43 -04003150
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003151 if (!$runtest && $len_diff > 0) {
Steven Rostedtcf79fab2012-07-19 15:29:43 -04003152
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003153 if ($len_diff == 1) {
Steven Rostedt (Red Hat)4186cb42014-04-23 22:09:59 -04003154 process_failed $diff_arr[0];
Steven Rostedt0a05c762010-11-08 11:14:10 -05003155 return 1;
3156 }
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003157 my %tmp_config = %bad_configs;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003158
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003159 my $half = int($#diff_arr / 2);
3160 my @tophalf = @diff_arr[0 .. $half];
Steven Rostedt0a05c762010-11-08 11:14:10 -05003161
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003162 doprint "Settings bisect with top half:\n";
3163 doprint "Set tmp config to be bad config with some good config values\n";
3164 foreach my $item (@tophalf) {
3165 $tmp_config{$item} = $good_configs{$item};
3166 }
Steven Rostedtc960bb92011-03-08 09:22:39 -05003167
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003168 $runtest = process_new_config \%tmp_config, \%new_configs,
3169 \%good_configs, \%bad_configs;
3170
3171 if (!$runtest) {
3172 my %tmp_config = %bad_configs;
3173
3174 doprint "Try bottom half\n";
3175
3176 my @bottomhalf = @diff_arr[$half+1 .. $#diff_arr];
3177
3178 foreach my $item (@bottomhalf) {
3179 $tmp_config{$item} = $good_configs{$item};
3180 }
3181
3182 $runtest = process_new_config \%tmp_config, \%new_configs,
3183 \%good_configs, \%bad_configs;
3184 }
Steven Rostedtc960bb92011-03-08 09:22:39 -05003185 }
3186
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003187 if ($runtest) {
3188 $ret = run_config_bisect_test $type;
3189 if ($ret) {
3190 doprint "NEW GOOD CONFIG\n";
3191 %good_configs = %new_configs;
3192 run_command "mv $good_config ${good_config}.last";
3193 save_config \%good_configs, $good_config;
3194 %{$pgood} = %good_configs;
3195 } else {
3196 doprint "NEW BAD CONFIG\n";
3197 %bad_configs = %new_configs;
3198 run_command "mv $bad_config ${bad_config}.last";
3199 save_config \%bad_configs, $bad_config;
3200 %{$pbad} = %bad_configs;
3201 }
Steven Rostedt0a05c762010-11-08 11:14:10 -05003202 return 0;
3203 }
3204
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003205 fail "Hmm, need to do a mix match?\n";
3206 return -1;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003207}
3208
3209sub config_bisect {
3210 my ($i) = @_;
3211
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003212 my $type = $config_bisect_type;
Steven Rostedt (Red Hat)c4d1d112014-04-23 22:04:56 -04003213 my $ret;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003214
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003215 $bad_config = $config_bisect;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003216
Steven Rostedt30f75da2011-06-13 10:35:35 -04003217 if (defined($config_bisect_good)) {
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003218 $good_config = $config_bisect_good;
3219 } elsif (defined($minconfig)) {
3220 $good_config = $minconfig;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003221 } else {
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003222 doprint "No config specified, checking if defconfig works";
Steven Rostedt (Red Hat)c4d1d112014-04-23 22:04:56 -04003223 $ret = run_bisect_test $type, "defconfig";
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003224 if (!$ret) {
3225 fail "Have no good config to compare with, please set CONFIG_BISECT_GOOD";
3226 return 1;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003227 }
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003228 $good_config = $output_config;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003229 }
3230
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003231 # we don't want min configs to cause issues here.
3232 doprint "Disabling 'MIN_CONFIG' for this test\n";
3233 undef $minconfig;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003234
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003235 my %good_configs;
3236 my %bad_configs;
3237 my %tmp_configs;
Steven Rostedtcf79fab2012-07-19 15:29:43 -04003238
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003239 doprint "Run good configs through make oldconfig\n";
3240 assign_configs \%tmp_configs, $good_config;
3241 create_config "$good_config", \%tmp_configs;
3242 assign_configs \%good_configs, $output_config;
3243
3244 doprint "Run bad configs through make oldconfig\n";
3245 assign_configs \%tmp_configs, $bad_config;
3246 create_config "$bad_config", \%tmp_configs;
3247 assign_configs \%bad_configs, $output_config;
3248
3249 $good_config = "$tmpdir/good_config";
3250 $bad_config = "$tmpdir/bad_config";
3251
3252 save_config \%good_configs, $good_config;
3253 save_config \%bad_configs, $bad_config;
3254
Steven Rostedt (Red Hat)c4d1d112014-04-23 22:04:56 -04003255
3256 if (defined($config_bisect_check) && $config_bisect_check ne "0") {
3257 if ($config_bisect_check ne "good") {
3258 doprint "Testing bad config\n";
3259
3260 $ret = run_bisect_test $type, "useconfig:$bad_config";
3261 if ($ret) {
3262 fail "Bad config succeeded when expected to fail!";
3263 return 0;
3264 }
3265 }
3266 if ($config_bisect_check ne "bad") {
3267 doprint "Testing good config\n";
3268
3269 $ret = run_bisect_test $type, "useconfig:$good_config";
3270 if (!$ret) {
3271 fail "Good config failed when expected to succeed!";
3272 return 0;
3273 }
3274 }
3275 }
Steven Rostedtb0918612012-07-19 15:26:00 -04003276
Steven Rostedt0a05c762010-11-08 11:14:10 -05003277 do {
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003278 $ret = run_config_bisect \%good_configs, \%bad_configs;
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05003279 print_times;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003280 } while (!$ret);
3281
3282 return $ret if ($ret < 0);
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04003283
3284 success $i;
3285}
3286
Steven Rostedt27d934b2011-05-20 09:18:18 -04003287sub patchcheck_reboot {
3288 doprint "Reboot and sleep $patchcheck_sleep_time seconds\n";
Steven Rostedtbc7c5802011-12-22 16:29:10 -05003289 reboot_to_good $patchcheck_sleep_time;
Steven Rostedt27d934b2011-05-20 09:18:18 -04003290}
3291
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003292sub patchcheck {
3293 my ($i) = @_;
3294
3295 die "PATCHCHECK_START[$i] not defined\n"
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05003296 if (!defined($patchcheck_start));
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003297 die "PATCHCHECK_TYPE[$i] not defined\n"
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05003298 if (!defined($patchcheck_type));
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003299
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05003300 my $start = $patchcheck_start;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003301
Steven Rostedt (Red Hat)23a0e162014-09-19 20:10:39 -04003302 my $cherry = $patchcheck_cherry;
3303 if (!defined($cherry)) {
3304 $cherry = 0;
3305 }
3306
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003307 my $end = "HEAD";
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05003308 if (defined($patchcheck_end)) {
3309 $end = $patchcheck_end;
Steven Rostedt (Red Hat)23a0e162014-09-19 20:10:39 -04003310 } elsif ($cherry) {
3311 die "PATCHCHECK_END must be defined with PATCHCHECK_CHERRY\n";
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003312 }
3313
Steven Rostedta57419b2010-11-02 15:13:54 -04003314 # Get the true sha1's since we can use things like HEAD~3
3315 $start = get_sha1($start);
3316 $end = get_sha1($end);
3317
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05003318 my $type = $patchcheck_type;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003319
3320 # Can't have a test without having a test to run
3321 if ($type eq "test" && !defined($run_test)) {
3322 $type = "boot";
3323 }
3324
Steven Rostedt (Red Hat)23a0e162014-09-19 20:10:39 -04003325 if ($cherry) {
3326 open (IN, "git cherry -v $start $end|") or
3327 dodie "could not get git list";
3328 } else {
3329 open (IN, "git log --pretty=oneline $end|") or
3330 dodie "could not get git list";
3331 }
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003332
3333 my @list;
3334
3335 while (<IN>) {
3336 chomp;
Steven Rostedt (Red Hat)23a0e162014-09-19 20:10:39 -04003337 # git cherry adds a '+' we want to remove
3338 s/^\+ //;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003339 $list[$#list+1] = $_;
3340 last if (/^$start/);
3341 }
3342 close(IN);
3343
Steven Rostedt (Red Hat)23a0e162014-09-19 20:10:39 -04003344 if (!$cherry) {
3345 if ($list[$#list] !~ /^$start/) {
3346 fail "SHA1 $start not found";
3347 }
3348
3349 # go backwards in the list
3350 @list = reverse @list;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003351 }
3352
Steven Rostedt (Red Hat)23a0e162014-09-19 20:10:39 -04003353 doprint("Going to test the following commits:\n");
3354 foreach my $l (@list) {
3355 doprint "$l\n";
3356 }
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003357
3358 my $save_clean = $noclean;
Steven Rostedt19902072011-06-14 20:46:25 -04003359 my %ignored_warnings;
3360
3361 if (defined($ignore_warnings)) {
3362 foreach my $sha1 (split /\s+/, $ignore_warnings) {
3363 $ignored_warnings{$sha1} = 1;
3364 }
3365 }
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003366
3367 $in_patchcheck = 1;
3368 foreach my $item (@list) {
3369 my $sha1 = $item;
3370 $sha1 =~ s/^([[:xdigit:]]+).*/$1/;
3371
3372 doprint "\nProcessing commit $item\n\n";
3373
3374 run_command "git checkout $sha1" or
3375 die "Failed to checkout $sha1";
3376
3377 # only clean on the first and last patch
3378 if ($item eq $list[0] ||
3379 $item eq $list[$#list]) {
3380 $noclean = $save_clean;
3381 } else {
3382 $noclean = 1;
3383 }
3384
3385 if (defined($minconfig)) {
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04003386 build "useconfig:$minconfig" or return 0;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003387 } else {
3388 # ?? no config to use?
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04003389 build "oldconfig" or return 0;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003390 }
3391
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05003392 # No need to do per patch checking if warnings file exists
3393 if (!defined($warnings_file) && !defined($ignored_warnings{$sha1})) {
3394 check_patch_buildlog $sha1 or return 0;
Steven Rostedt19902072011-06-14 20:46:25 -04003395 }
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003396
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05003397 check_buildlog or return 0;
3398
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003399 next if ($type eq "build");
3400
Steven Rostedt7faafbd2010-11-02 14:58:22 -04003401 my $failed = 0;
3402
Steven Rostedtddf607e2011-06-14 20:49:13 -04003403 start_monitor_and_boot or $failed = 1;
Steven Rostedt7faafbd2010-11-02 14:58:22 -04003404
3405 if (!$failed && $type ne "boot"){
3406 do_run_test or $failed = 1;
3407 }
3408 end_monitor;
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05003409 if ($failed) {
3410 print_times;
3411 return 0;
3412 }
Steven Rostedt27d934b2011-05-20 09:18:18 -04003413 patchcheck_reboot;
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05003414 print_times;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003415 }
3416 $in_patchcheck = 0;
3417 success $i;
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04003418
3419 return 1;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003420}
3421
Steven Rostedtb9066f62011-07-15 21:25:24 -04003422my %depends;
Steven Rostedtac6974c2011-10-04 09:40:17 -04003423my %depcount;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003424my $iflevel = 0;
3425my @ifdeps;
3426
3427# prevent recursion
3428my %read_kconfigs;
3429
Steven Rostedtac6974c2011-10-04 09:40:17 -04003430sub add_dep {
3431 # $config depends on $dep
3432 my ($config, $dep) = @_;
3433
3434 if (defined($depends{$config})) {
3435 $depends{$config} .= " " . $dep;
3436 } else {
3437 $depends{$config} = $dep;
3438 }
3439
3440 # record the number of configs depending on $dep
3441 if (defined $depcount{$dep}) {
3442 $depcount{$dep}++;
3443 } else {
3444 $depcount{$dep} = 1;
3445 }
3446}
3447
Steven Rostedtb9066f62011-07-15 21:25:24 -04003448# taken from streamline_config.pl
3449sub read_kconfig {
3450 my ($kconfig) = @_;
3451
3452 my $state = "NONE";
3453 my $config;
3454 my @kconfigs;
3455
3456 my $cont = 0;
3457 my $line;
3458
3459
3460 if (! -f $kconfig) {
3461 doprint "file $kconfig does not exist, skipping\n";
3462 return;
3463 }
3464
3465 open(KIN, "$kconfig")
3466 or die "Can't open $kconfig";
3467 while (<KIN>) {
3468 chomp;
3469
3470 # Make sure that lines ending with \ continue
3471 if ($cont) {
3472 $_ = $line . " " . $_;
3473 }
3474
3475 if (s/\\$//) {
3476 $cont = 1;
3477 $line = $_;
3478 next;
3479 }
3480
3481 $cont = 0;
3482
3483 # collect any Kconfig sources
3484 if (/^source\s*"(.*)"/) {
3485 $kconfigs[$#kconfigs+1] = $1;
3486 }
3487
3488 # configs found
3489 if (/^\s*(menu)?config\s+(\S+)\s*$/) {
3490 $state = "NEW";
3491 $config = $2;
3492
3493 for (my $i = 0; $i < $iflevel; $i++) {
Steven Rostedtac6974c2011-10-04 09:40:17 -04003494 add_dep $config, $ifdeps[$i];
Steven Rostedtb9066f62011-07-15 21:25:24 -04003495 }
3496
3497 # collect the depends for the config
3498 } elsif ($state eq "NEW" && /^\s*depends\s+on\s+(.*)$/) {
3499
Steven Rostedtac6974c2011-10-04 09:40:17 -04003500 add_dep $config, $1;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003501
3502 # Get the configs that select this config
Steven Rostedtac6974c2011-10-04 09:40:17 -04003503 } elsif ($state eq "NEW" && /^\s*select\s+(\S+)/) {
3504
3505 # selected by depends on config
3506 add_dep $1, $config;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003507
3508 # Check for if statements
3509 } elsif (/^if\s+(.*\S)\s*$/) {
3510 my $deps = $1;
3511 # remove beginning and ending non text
3512 $deps =~ s/^[^a-zA-Z0-9_]*//;
3513 $deps =~ s/[^a-zA-Z0-9_]*$//;
3514
3515 my @deps = split /[^a-zA-Z0-9_]+/, $deps;
3516
3517 $ifdeps[$iflevel++] = join ':', @deps;
3518
3519 } elsif (/^endif/) {
3520
3521 $iflevel-- if ($iflevel);
3522
3523 # stop on "help"
3524 } elsif (/^\s*help\s*$/) {
3525 $state = "NONE";
3526 }
3527 }
3528 close(KIN);
3529
3530 # read in any configs that were found.
3531 foreach $kconfig (@kconfigs) {
3532 if (!defined($read_kconfigs{$kconfig})) {
3533 $read_kconfigs{$kconfig} = 1;
3534 read_kconfig("$builddir/$kconfig");
3535 }
3536 }
3537}
3538
3539sub read_depends {
3540 # find out which arch this is by the kconfig file
3541 open (IN, $output_config)
3542 or dodie "Failed to read $output_config";
3543 my $arch;
3544 while (<IN>) {
3545 if (m,Linux/(\S+)\s+\S+\s+Kernel Configuration,) {
3546 $arch = $1;
3547 last;
3548 }
3549 }
3550 close IN;
3551
3552 if (!defined($arch)) {
3553 doprint "Could not find arch from config file\n";
3554 doprint "no dependencies used\n";
3555 return;
3556 }
3557
3558 # arch is really the subarch, we need to know
3559 # what directory to look at.
3560 if ($arch eq "i386" || $arch eq "x86_64") {
3561 $arch = "x86";
3562 } elsif ($arch =~ /^tile/) {
3563 $arch = "tile";
3564 }
3565
3566 my $kconfig = "$builddir/arch/$arch/Kconfig";
3567
3568 if (! -f $kconfig && $arch =~ /\d$/) {
3569 my $orig = $arch;
3570 # some subarchs have numbers, truncate them
3571 $arch =~ s/\d*$//;
3572 $kconfig = "$builddir/arch/$arch/Kconfig";
3573 if (! -f $kconfig) {
3574 doprint "No idea what arch dir $orig is for\n";
3575 doprint "no dependencies used\n";
3576 return;
3577 }
3578 }
3579
3580 read_kconfig($kconfig);
3581}
3582
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003583sub make_new_config {
3584 my @configs = @_;
3585
3586 open (OUT, ">$output_config")
3587 or dodie "Failed to write $output_config";
3588
3589 foreach my $config (@configs) {
3590 print OUT "$config\n";
3591 }
3592 close OUT;
3593}
3594
Steven Rostedtac6974c2011-10-04 09:40:17 -04003595sub chomp_config {
3596 my ($config) = @_;
3597
3598 $config =~ s/CONFIG_//;
3599
3600 return $config;
3601}
3602
Steven Rostedtb9066f62011-07-15 21:25:24 -04003603sub get_depends {
3604 my ($dep) = @_;
3605
Steven Rostedtac6974c2011-10-04 09:40:17 -04003606 my $kconfig = chomp_config $dep;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003607
3608 $dep = $depends{"$kconfig"};
3609
3610 # the dep string we have saves the dependencies as they
3611 # were found, including expressions like ! && ||. We
3612 # want to split this out into just an array of configs.
3613
3614 my $valid = "A-Za-z_0-9";
3615
3616 my @configs;
3617
3618 while ($dep =~ /[$valid]/) {
3619
3620 if ($dep =~ /^[^$valid]*([$valid]+)/) {
3621 my $conf = "CONFIG_" . $1;
3622
3623 $configs[$#configs + 1] = $conf;
3624
3625 $dep =~ s/^[^$valid]*[$valid]+//;
3626 } else {
3627 die "this should never happen";
3628 }
3629 }
3630
3631 return @configs;
3632}
3633
3634my %min_configs;
3635my %keep_configs;
Steven Rostedt43d1b652011-07-15 22:01:56 -04003636my %save_configs;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003637my %processed_configs;
3638my %nochange_config;
3639
3640sub test_this_config {
3641 my ($config) = @_;
3642
3643 my $found;
3644
3645 # if we already processed this config, skip it
3646 if (defined($processed_configs{$config})) {
3647 return undef;
3648 }
3649 $processed_configs{$config} = 1;
3650
3651 # if this config failed during this round, skip it
3652 if (defined($nochange_config{$config})) {
3653 return undef;
3654 }
3655
Steven Rostedtac6974c2011-10-04 09:40:17 -04003656 my $kconfig = chomp_config $config;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003657
3658 # Test dependencies first
3659 if (defined($depends{"$kconfig"})) {
3660 my @parents = get_depends $config;
3661 foreach my $parent (@parents) {
3662 # if the parent is in the min config, check it first
3663 next if (!defined($min_configs{$parent}));
3664 $found = test_this_config($parent);
3665 if (defined($found)) {
3666 return $found;
3667 }
3668 }
3669 }
3670
3671 # Remove this config from the list of configs
Adam Leefb16d892012-09-01 01:05:17 +08003672 # do a make olddefconfig and then read the resulting
Steven Rostedtb9066f62011-07-15 21:25:24 -04003673 # .config to make sure it is missing the config that
3674 # we had before
3675 my %configs = %min_configs;
3676 delete $configs{$config};
3677 make_new_config ((values %configs), (values %keep_configs));
3678 make_oldconfig;
3679 undef %configs;
3680 assign_configs \%configs, $output_config;
3681
Steven Rostedt (Red Hat)9972fc02014-10-22 10:11:47 -04003682 if (!defined($configs{$config}) || $configs{$config} =~ /^#/) {
3683 return $config;
3684 }
Steven Rostedtb9066f62011-07-15 21:25:24 -04003685
3686 doprint "disabling config $config did not change .config\n";
3687
3688 $nochange_config{$config} = 1;
3689
3690 return undef;
3691}
3692
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003693sub make_min_config {
3694 my ($i) = @_;
3695
Steven Rostedtccc513b2012-05-21 17:13:40 -04003696 my $type = $minconfig_type;
3697 if ($type ne "boot" && $type ne "test") {
3698 fail "Invalid MIN_CONFIG_TYPE '$minconfig_type'\n" .
3699 " make_min_config works only with 'boot' and 'test'\n" and return;
3700 }
3701
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003702 if (!defined($output_minconfig)) {
3703 fail "OUTPUT_MIN_CONFIG not defined" and return;
3704 }
Steven Rostedt35ce5952011-07-15 21:57:25 -04003705
3706 # If output_minconfig exists, and the start_minconfig
3707 # came from min_config, than ask if we should use
3708 # that instead.
3709 if (-f $output_minconfig && !$start_minconfig_defined) {
3710 print "$output_minconfig exists\n";
Steven Rostedt43de3312012-05-21 23:35:12 -04003711 if (!defined($use_output_minconfig)) {
3712 if (read_yn " Use it as minconfig?") {
3713 $start_minconfig = $output_minconfig;
3714 }
3715 } elsif ($use_output_minconfig > 0) {
3716 doprint "Using $output_minconfig as MIN_CONFIG\n";
Steven Rostedt35ce5952011-07-15 21:57:25 -04003717 $start_minconfig = $output_minconfig;
Steven Rostedt43de3312012-05-21 23:35:12 -04003718 } else {
3719 doprint "Set to still use MIN_CONFIG as starting point\n";
Steven Rostedt35ce5952011-07-15 21:57:25 -04003720 }
3721 }
3722
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003723 if (!defined($start_minconfig)) {
3724 fail "START_MIN_CONFIG or MIN_CONFIG not defined" and return;
3725 }
3726
Steven Rostedt35ce5952011-07-15 21:57:25 -04003727 my $temp_config = "$tmpdir/temp_config";
3728
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003729 # First things first. We build an allnoconfig to find
3730 # out what the defaults are that we can't touch.
3731 # Some are selections, but we really can't handle selections.
3732
3733 my $save_minconfig = $minconfig;
3734 undef $minconfig;
3735
3736 run_command "$make allnoconfig" or return 0;
3737
Steven Rostedtb9066f62011-07-15 21:25:24 -04003738 read_depends;
3739
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003740 process_config_ignore $output_config;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003741
Steven Rostedt43d1b652011-07-15 22:01:56 -04003742 undef %save_configs;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003743 undef %min_configs;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003744
3745 if (defined($ignore_config)) {
3746 # make sure the file exists
3747 `touch $ignore_config`;
Steven Rostedt43d1b652011-07-15 22:01:56 -04003748 assign_configs \%save_configs, $ignore_config;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003749 }
3750
Steven Rostedt43d1b652011-07-15 22:01:56 -04003751 %keep_configs = %save_configs;
3752
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003753 doprint "Load initial configs from $start_minconfig\n";
3754
3755 # Look at the current min configs, and save off all the
3756 # ones that were set via the allnoconfig
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003757 assign_configs \%min_configs, $start_minconfig;
3758
3759 my @config_keys = keys %min_configs;
3760
Steven Rostedtac6974c2011-10-04 09:40:17 -04003761 # All configs need a depcount
3762 foreach my $config (@config_keys) {
3763 my $kconfig = chomp_config $config;
3764 if (!defined $depcount{$kconfig}) {
3765 $depcount{$kconfig} = 0;
3766 }
3767 }
3768
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003769 # Remove anything that was set by the make allnoconfig
3770 # we shouldn't need them as they get set for us anyway.
3771 foreach my $config (@config_keys) {
3772 # Remove anything in the ignore_config
3773 if (defined($keep_configs{$config})) {
3774 my $file = $ignore_config;
3775 $file =~ s,.*/(.*?)$,$1,;
3776 doprint "$config set by $file ... ignored\n";
3777 delete $min_configs{$config};
3778 next;
3779 }
3780 # But make sure the settings are the same. If a min config
3781 # sets a selection, we do not want to get rid of it if
3782 # it is not the same as what we have. Just move it into
3783 # the keep configs.
3784 if (defined($config_ignore{$config})) {
3785 if ($config_ignore{$config} ne $min_configs{$config}) {
3786 doprint "$config is in allnoconfig as '$config_ignore{$config}'";
3787 doprint " but it is '$min_configs{$config}' in minconfig .. keeping\n";
3788 $keep_configs{$config} = $min_configs{$config};
3789 } else {
3790 doprint "$config set by allnoconfig ... ignored\n";
3791 }
3792 delete $min_configs{$config};
3793 }
3794 }
3795
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003796 my $done = 0;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003797 my $take_two = 0;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003798
3799 while (!$done) {
3800
3801 my $config;
3802 my $found;
3803
3804 # Now disable each config one by one and do a make oldconfig
3805 # till we find a config that changes our list.
3806
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003807 my @test_configs = keys %min_configs;
Steven Rostedtac6974c2011-10-04 09:40:17 -04003808
3809 # Sort keys by who is most dependent on
3810 @test_configs = sort { $depcount{chomp_config($b)} <=> $depcount{chomp_config($a)} }
3811 @test_configs ;
3812
3813 # Put configs that did not modify the config at the end.
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003814 my $reset = 1;
3815 for (my $i = 0; $i < $#test_configs; $i++) {
3816 if (!defined($nochange_config{$test_configs[0]})) {
3817 $reset = 0;
3818 last;
3819 }
3820 # This config didn't change the .config last time.
3821 # Place it at the end
3822 my $config = shift @test_configs;
3823 push @test_configs, $config;
3824 }
3825
3826 # if every test config has failed to modify the .config file
3827 # in the past, then reset and start over.
3828 if ($reset) {
3829 undef %nochange_config;
3830 }
3831
Steven Rostedtb9066f62011-07-15 21:25:24 -04003832 undef %processed_configs;
3833
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003834 foreach my $config (@test_configs) {
3835
Steven Rostedtb9066f62011-07-15 21:25:24 -04003836 $found = test_this_config $config;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003837
Steven Rostedtb9066f62011-07-15 21:25:24 -04003838 last if (defined($found));
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003839
3840 # oh well, try another config
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003841 }
3842
3843 if (!defined($found)) {
Steven Rostedtb9066f62011-07-15 21:25:24 -04003844 # we could have failed due to the nochange_config hash
3845 # reset and try again
3846 if (!$take_two) {
3847 undef %nochange_config;
3848 $take_two = 1;
3849 next;
3850 }
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003851 doprint "No more configs found that we can disable\n";
3852 $done = 1;
3853 last;
3854 }
Steven Rostedtb9066f62011-07-15 21:25:24 -04003855 $take_two = 0;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003856
3857 $config = $found;
3858
3859 doprint "Test with $config disabled\n";
3860
3861 # set in_bisect to keep build and monitor from dieing
3862 $in_bisect = 1;
3863
3864 my $failed = 0;
Steven Rostedtbf1c95a2012-02-27 13:58:49 -05003865 build "oldconfig" or $failed = 1;
3866 if (!$failed) {
3867 start_monitor_and_boot or $failed = 1;
Steven Rostedtccc513b2012-05-21 17:13:40 -04003868
3869 if ($type eq "test" && !$failed) {
3870 do_run_test or $failed = 1;
3871 }
3872
Steven Rostedtbf1c95a2012-02-27 13:58:49 -05003873 end_monitor;
3874 }
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003875
3876 $in_bisect = 0;
3877
3878 if ($failed) {
Steven Rostedtb9066f62011-07-15 21:25:24 -04003879 doprint "$min_configs{$config} is needed to boot the box... keeping\n";
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003880 # this config is needed, add it to the ignore list.
3881 $keep_configs{$config} = $min_configs{$config};
Steven Rostedt43d1b652011-07-15 22:01:56 -04003882 $save_configs{$config} = $min_configs{$config};
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003883 delete $min_configs{$config};
Steven Rostedt35ce5952011-07-15 21:57:25 -04003884
3885 # update new ignore configs
3886 if (defined($ignore_config)) {
3887 open (OUT, ">$temp_config")
3888 or die "Can't write to $temp_config";
Steven Rostedt43d1b652011-07-15 22:01:56 -04003889 foreach my $config (keys %save_configs) {
3890 print OUT "$save_configs{$config}\n";
Steven Rostedt35ce5952011-07-15 21:57:25 -04003891 }
3892 close OUT;
3893 run_command "mv $temp_config $ignore_config" or
3894 dodie "failed to copy update to $ignore_config";
3895 }
3896
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003897 } else {
3898 # We booted without this config, remove it from the minconfigs.
3899 doprint "$config is not needed, disabling\n";
3900
3901 delete $min_configs{$config};
3902
3903 # Also disable anything that is not enabled in this config
3904 my %configs;
3905 assign_configs \%configs, $output_config;
3906 my @config_keys = keys %min_configs;
3907 foreach my $config (@config_keys) {
3908 if (!defined($configs{$config})) {
3909 doprint "$config is not set, disabling\n";
3910 delete $min_configs{$config};
3911 }
3912 }
3913
3914 # Save off all the current mandidory configs
Steven Rostedt35ce5952011-07-15 21:57:25 -04003915 open (OUT, ">$temp_config")
3916 or die "Can't write to $temp_config";
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003917 foreach my $config (keys %keep_configs) {
3918 print OUT "$keep_configs{$config}\n";
3919 }
3920 foreach my $config (keys %min_configs) {
3921 print OUT "$min_configs{$config}\n";
3922 }
3923 close OUT;
Steven Rostedt35ce5952011-07-15 21:57:25 -04003924
3925 run_command "mv $temp_config $output_minconfig" or
3926 dodie "failed to copy update to $output_minconfig";
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003927 }
3928
3929 doprint "Reboot and wait $sleep_time seconds\n";
Steven Rostedtbc7c5802011-12-22 16:29:10 -05003930 reboot_to_good $sleep_time;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003931 }
3932
3933 success $i;
3934 return 1;
3935}
3936
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05003937sub make_warnings_file {
3938 my ($i) = @_;
3939
3940 if (!defined($warnings_file)) {
3941 dodie "Must define WARNINGS_FILE for make_warnings_file test";
3942 }
3943
3944 if ($build_type eq "nobuild") {
3945 dodie "BUILD_TYPE can not be 'nobuild' for make_warnings_file test";
3946 }
3947
3948 build $build_type or dodie "Failed to build";
3949
3950 open(OUT, ">$warnings_file") or dodie "Can't create $warnings_file";
3951
3952 open(IN, $buildlog) or dodie "Can't open $buildlog";
3953 while (<IN>) {
3954
3955 # Some compilers use UTF-8 extended for quotes
3956 # for distcc heterogeneous systems, this causes issues
3957 s/$utf8_quote/'/g;
3958
3959 if (/$check_build_re/) {
3960 print OUT;
3961 }
3962 }
3963 close(IN);
3964
3965 close(OUT);
3966
3967 success $i;
3968}
3969
Satoru Takeuchi5269faa2014-03-09 23:32:04 +09003970$#ARGV < 1 or die "ktest.pl version: $VERSION\n usage: ktest.pl [config-file]\n";
Steven Rostedt2545eb62010-11-02 15:01:32 -04003971
Steven Rostedt8d1491b2010-11-18 15:39:48 -05003972if ($#ARGV == 0) {
3973 $ktest_config = $ARGV[0];
3974 if (! -f $ktest_config) {
3975 print "$ktest_config does not exist.\n";
Steven Rostedt35ce5952011-07-15 21:57:25 -04003976 if (!read_yn "Create it?") {
Steven Rostedt8d1491b2010-11-18 15:39:48 -05003977 exit 0;
3978 }
3979 }
Steven Rostedt8d1491b2010-11-18 15:39:48 -05003980}
3981
3982if (! -f $ktest_config) {
Steven Rostedtdbd37832011-11-23 16:00:48 -05003983 $newconfig = 1;
Steven Rostedtc4261d02011-11-23 13:41:18 -05003984 get_test_case;
Steven Rostedt8d1491b2010-11-18 15:39:48 -05003985 open(OUT, ">$ktest_config") or die "Can not create $ktest_config";
3986 print OUT << "EOF"
3987# Generated by ktest.pl
3988#
Steven Rostedt0e7a22d2011-11-21 20:39:33 -05003989
3990# PWD is a ktest.pl variable that will result in the process working
3991# directory that ktest.pl is executed in.
3992
3993# THIS_DIR is automatically assigned the PWD of the path that generated
3994# the config file. It is best to use this variable when assigning other
3995# directory paths within this directory. This allows you to easily
3996# move the test cases to other locations or to other machines.
3997#
3998THIS_DIR := $variable{"PWD"}
3999
Steven Rostedt8d1491b2010-11-18 15:39:48 -05004000# Define each test with TEST_START
4001# The config options below it will override the defaults
4002TEST_START
Steven Rostedtc4261d02011-11-23 13:41:18 -05004003TEST_TYPE = $default{"TEST_TYPE"}
Steven Rostedt8d1491b2010-11-18 15:39:48 -05004004
4005DEFAULTS
4006EOF
4007;
4008 close(OUT);
4009}
4010read_config $ktest_config;
4011
Steven Rostedt23715c3c2011-06-13 11:03:34 -04004012if (defined($opt{"LOG_FILE"})) {
Steven Rostedt (Red Hat)04262be2013-01-31 10:12:20 -05004013 $opt{"LOG_FILE"} = eval_option("LOG_FILE", $opt{"LOG_FILE"}, -1);
Steven Rostedt23715c3c2011-06-13 11:03:34 -04004014}
4015
Steven Rostedt8d1491b2010-11-18 15:39:48 -05004016# Append any configs entered in manually to the config file.
4017my @new_configs = keys %entered_configs;
4018if ($#new_configs >= 0) {
4019 print "\nAppending entered in configs to $ktest_config\n";
4020 open(OUT, ">>$ktest_config") or die "Can not append to $ktest_config";
4021 foreach my $config (@new_configs) {
4022 print OUT "$config = $entered_configs{$config}\n";
Steven Rostedt0e7a22d2011-11-21 20:39:33 -05004023 $opt{$config} = process_variables($entered_configs{$config});
Steven Rostedt8d1491b2010-11-18 15:39:48 -05004024 }
4025}
Steven Rostedt2545eb62010-11-02 15:01:32 -04004026
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04004027if ($opt{"CLEAR_LOG"} && defined($opt{"LOG_FILE"})) {
4028 unlink $opt{"LOG_FILE"};
4029}
Steven Rostedt2545eb62010-11-02 15:01:32 -04004030
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04004031doprint "\n\nSTARTING AUTOMATED TESTS\n\n";
4032
Steven Rostedta57419b2010-11-02 15:13:54 -04004033for (my $i = 0, my $repeat = 1; $i <= $opt{"NUM_TESTS"}; $i += $repeat) {
4034
4035 if (!$i) {
4036 doprint "DEFAULT OPTIONS:\n";
4037 } else {
4038 doprint "\nTEST $i OPTIONS";
4039 if (defined($repeat_tests{$i})) {
4040 $repeat = $repeat_tests{$i};
4041 doprint " ITERATE $repeat";
4042 }
4043 doprint "\n";
4044 }
4045
4046 foreach my $option (sort keys %opt) {
4047
4048 if ($option =~ /\[(\d+)\]$/) {
4049 next if ($i != $1);
4050 } else {
4051 next if ($i);
4052 }
4053
4054 doprint "$option = $opt{$option}\n";
4055 }
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04004056}
Steven Rostedt2545eb62010-11-02 15:01:32 -04004057
Steven Rostedt (Red Hat)22c37a92014-11-21 16:21:25 -05004058sub option_defined {
4059 my ($option) = @_;
4060
4061 if (defined($opt{$option}) && $opt{$option} !~ /^\s*$/) {
4062 return 1;
4063 }
4064
4065 return 0;
4066}
4067
Steven Rostedt2a625122011-05-20 15:48:59 -04004068sub __set_test_option {
Steven Rostedt5a391fb2010-11-02 14:57:43 -04004069 my ($name, $i) = @_;
4070
4071 my $option = "$name\[$i\]";
4072
Steven Rostedt (Red Hat)22c37a92014-11-21 16:21:25 -05004073 if (option_defined($option)) {
Steven Rostedt5a391fb2010-11-02 14:57:43 -04004074 return $opt{$option};
4075 }
4076
Steven Rostedta57419b2010-11-02 15:13:54 -04004077 foreach my $test (keys %repeat_tests) {
4078 if ($i >= $test &&
4079 $i < $test + $repeat_tests{$test}) {
4080 $option = "$name\[$test\]";
Steven Rostedt (Red Hat)22c37a92014-11-21 16:21:25 -05004081 if (option_defined($option)) {
Steven Rostedta57419b2010-11-02 15:13:54 -04004082 return $opt{$option};
4083 }
4084 }
4085 }
4086
Steven Rostedt (Red Hat)22c37a92014-11-21 16:21:25 -05004087 if (option_defined($name)) {
Steven Rostedt5a391fb2010-11-02 14:57:43 -04004088 return $opt{$name};
4089 }
4090
4091 return undef;
4092}
4093
Steven Rostedt2a625122011-05-20 15:48:59 -04004094sub set_test_option {
4095 my ($name, $i) = @_;
4096
4097 my $option = __set_test_option($name, $i);
4098 return $option if (!defined($option));
4099
Steven Rostedt (Red Hat)04262be2013-01-31 10:12:20 -05004100 return eval_option($name, $option, $i);
Steven Rostedt2a625122011-05-20 15:48:59 -04004101}
4102
Steven Rostedt2545eb62010-11-02 15:01:32 -04004103# First we need to do is the builds
Steven Rostedta75fece2010-11-02 14:58:27 -04004104for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {
Steven Rostedt2545eb62010-11-02 15:01:32 -04004105
Steven Rostedt4ab1cce2011-09-30 18:12:20 -04004106 # Do not reboot on failing test options
4107 $no_reboot = 1;
Steven Rostedt759a3cc2012-05-01 08:20:12 -04004108 $reboot_success = 0;
Steven Rostedt4ab1cce2011-09-30 18:12:20 -04004109
Steven Rostedt683a3e62012-05-18 13:34:35 -04004110 $have_version = 0;
4111
Steven Rostedt576f6272010-11-02 14:58:38 -04004112 $iteration = $i;
4113
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05004114 $build_time = 0;
4115 $install_time = 0;
4116 $reboot_time = 0;
4117 $test_time = 0;
4118
Steven Rostedtc1434dc2012-07-20 22:39:16 -04004119 undef %force_config;
4120
Steven Rostedta75fece2010-11-02 14:58:27 -04004121 my $makecmd = set_test_option("MAKE_CMD", $i);
4122
Steven Rostedt (Red Hat)8e80bf02013-12-11 15:40:46 -05004123 $outputdir = set_test_option("OUTPUT_DIR", $i);
4124 $builddir = set_test_option("BUILD_DIR", $i);
4125
4126 chdir $builddir || die "can't change directory to $builddir";
4127
4128 if (!-d $outputdir) {
4129 mkpath($outputdir) or
4130 die "can't create $outputdir";
4131 }
4132
4133 $make = "$makecmd O=$outputdir";
4134
Steven Rostedt9cc9e092011-12-22 21:37:22 -05004135 # Load all the options into their mapped variable names
4136 foreach my $opt (keys %option_map) {
4137 ${$option_map{$opt}} = set_test_option($opt, $i);
4138 }
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05004139
Steven Rostedt35ce5952011-07-15 21:57:25 -04004140 $start_minconfig_defined = 1;
4141
Steven Rostedt921ed4c2012-07-19 15:18:27 -04004142 # The first test may override the PRE_KTEST option
4143 if (defined($pre_ktest) && $i == 1) {
4144 doprint "\n";
4145 run_command $pre_ktest;
4146 }
4147
4148 # Any test can override the POST_KTEST option
4149 # The last test takes precedence.
4150 if (defined($post_ktest)) {
4151 $final_post_ktest = $post_ktest;
4152 }
4153
Steven Rostedt4c4ab122011-07-15 21:16:17 -04004154 if (!defined($start_minconfig)) {
Steven Rostedt35ce5952011-07-15 21:57:25 -04004155 $start_minconfig_defined = 0;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04004156 $start_minconfig = $minconfig;
4157 }
4158
Steven Rostedt (Red Hat)8e80bf02013-12-11 15:40:46 -05004159 if (!-d $tmpdir) {
4160 mkpath($tmpdir) or
4161 die "can't create $tmpdir";
Steven Rostedta75fece2010-11-02 14:58:27 -04004162 }
4163
Steven Rostedte48c5292010-11-02 14:35:37 -04004164 $ENV{"SSH_USER"} = $ssh_user;
4165 $ENV{"MACHINE"} = $machine;
4166
Steven Rostedta75fece2010-11-02 14:58:27 -04004167 $buildlog = "$tmpdir/buildlog-$machine";
Rabin Vincenta9dd5d62011-11-18 17:05:29 +05304168 $testlog = "$tmpdir/testlog-$machine";
Steven Rostedta75fece2010-11-02 14:58:27 -04004169 $dmesg = "$tmpdir/dmesg-$machine";
Steven Rostedt51ad1dd2010-11-08 16:43:21 -05004170 $output_config = "$outputdir/.config";
Steven Rostedta75fece2010-11-02 14:58:27 -04004171
Steven Rostedtbb8474b2011-11-23 15:58:00 -05004172 if (!$buildonly) {
4173 $target = "$ssh_user\@$machine";
4174 if ($reboot_type eq "grub") {
4175 dodie "GRUB_MENU not defined" if (!defined($grub_menu));
Steven Rostedta15ba912012-11-13 14:30:37 -05004176 } elsif ($reboot_type eq "grub2") {
4177 dodie "GRUB_MENU not defined" if (!defined($grub_menu));
4178 dodie "GRUB_FILE not defined" if (!defined($grub_file));
Steven Rostedt77869542012-12-11 17:37:41 -05004179 } elsif ($reboot_type eq "syslinux") {
4180 dodie "SYSLINUX_LABEL not defined" if (!defined($syslinux_label));
Steven Rostedtbb8474b2011-11-23 15:58:00 -05004181 }
Steven Rostedta75fece2010-11-02 14:58:27 -04004182 }
4183
4184 my $run_type = $build_type;
4185 if ($test_type eq "patchcheck") {
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05004186 $run_type = $patchcheck_type;
Steven Rostedta75fece2010-11-02 14:58:27 -04004187 } elsif ($test_type eq "bisect") {
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05004188 $run_type = $bisect_type;
Steven Rostedt0a05c762010-11-08 11:14:10 -05004189 } elsif ($test_type eq "config_bisect") {
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05004190 $run_type = $config_bisect_type;
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05004191 } elsif ($test_type eq "make_min_config") {
4192 $run_type = "";
4193 } elsif ($test_type eq "make_warnings_file") {
Steven Rostedt4c4ab122011-07-15 21:16:17 -04004194 $run_type = "";
4195 }
4196
Steven Rostedta75fece2010-11-02 14:58:27 -04004197 # mistake in config file?
4198 if (!defined($run_type)) {
4199 $run_type = "ERROR";
4200 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04004201
Steven Rostedte0a87422011-09-30 17:50:48 -04004202 my $installme = "";
4203 $installme = " no_install" if ($no_install);
4204
Steven Rostedt (Red Hat)18656c72014-11-21 19:28:24 -05004205 my $name = "";
4206
4207 if (defined($test_name)) {
4208 $name = " ($test_name)";
4209 }
4210
Steven Rostedt2545eb62010-11-02 15:01:32 -04004211 doprint "\n\n";
Steven Rostedt (Red Hat)18656c72014-11-21 19:28:24 -05004212 doprint "RUNNING TEST $i of $opt{NUM_TESTS}$name with option $test_type $run_type$installme\n\n";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04004213
Steven Rostedt921ed4c2012-07-19 15:18:27 -04004214 if (defined($pre_test)) {
4215 run_command $pre_test;
4216 }
4217
Steven Rostedt7faafbd2010-11-02 14:58:22 -04004218 unlink $dmesg;
4219 unlink $buildlog;
Rabin Vincenta9dd5d62011-11-18 17:05:29 +05304220 unlink $testlog;
Steven Rostedt2545eb62010-11-02 15:01:32 -04004221
Steven Rostedt250bae82011-07-15 22:05:59 -04004222 if (defined($addconfig)) {
4223 my $min = $minconfig;
4224 if (!defined($minconfig)) {
4225 $min = "";
4226 }
4227 run_command "cat $addconfig $min > $tmpdir/add_config" or
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04004228 dodie "Failed to create temp config";
Steven Rostedt9be2e6b2010-11-09 12:20:21 -05004229 $minconfig = "$tmpdir/add_config";
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04004230 }
4231
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04004232 if (defined($checkout)) {
4233 run_command "git checkout $checkout" or
4234 die "failed to checkout $checkout";
4235 }
4236
Steven Rostedt759a3cc2012-05-01 08:20:12 -04004237 $no_reboot = 0;
4238
Steven Rostedt648a1822012-03-21 11:18:27 -04004239 # A test may opt to not reboot the box
4240 if ($reboot_on_success) {
Steven Rostedt759a3cc2012-05-01 08:20:12 -04004241 $reboot_success = 1;
Steven Rostedt648a1822012-03-21 11:18:27 -04004242 }
Steven Rostedt4ab1cce2011-09-30 18:12:20 -04004243
Steven Rostedta75fece2010-11-02 14:58:27 -04004244 if ($test_type eq "bisect") {
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04004245 bisect $i;
4246 next;
Steven Rostedt0a05c762010-11-08 11:14:10 -05004247 } elsif ($test_type eq "config_bisect") {
4248 config_bisect $i;
4249 next;
Steven Rostedta75fece2010-11-02 14:58:27 -04004250 } elsif ($test_type eq "patchcheck") {
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04004251 patchcheck $i;
4252 next;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04004253 } elsif ($test_type eq "make_min_config") {
4254 make_min_config $i;
4255 next;
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05004256 } elsif ($test_type eq "make_warnings_file") {
4257 $no_reboot = 1;
4258 make_warnings_file $i;
4259 next;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04004260 }
4261
Steven Rostedt7faafbd2010-11-02 14:58:22 -04004262 if ($build_type ne "nobuild") {
4263 build $build_type or next;
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05004264 check_buildlog or next;
Steven Rostedt2545eb62010-11-02 15:01:32 -04004265 }
4266
Steven Rostedtcd8e3682011-08-18 16:35:44 -04004267 if ($test_type eq "install") {
4268 get_version;
4269 install;
4270 success $i;
4271 next;
4272 }
4273
Steven Rostedta75fece2010-11-02 14:58:27 -04004274 if ($test_type ne "build") {
Steven Rostedta75fece2010-11-02 14:58:27 -04004275 my $failed = 0;
Steven Rostedtddf607e2011-06-14 20:49:13 -04004276 start_monitor_and_boot or $failed = 1;
Steven Rostedta75fece2010-11-02 14:58:27 -04004277
4278 if (!$failed && $test_type ne "boot" && defined($run_test)) {
4279 do_run_test or $failed = 1;
4280 }
4281 end_monitor;
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05004282 if ($failed) {
4283 print_times;
4284 next;
4285 }
Steven Rostedt5a391fb2010-11-02 14:57:43 -04004286 }
4287
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05004288 print_times;
4289
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04004290 success $i;
Steven Rostedt2545eb62010-11-02 15:01:32 -04004291}
4292
Steven Rostedt921ed4c2012-07-19 15:18:27 -04004293if (defined($final_post_ktest)) {
4294 run_command $final_post_ktest;
4295}
4296
Steven Rostedt5c42fc52010-11-02 14:57:01 -04004297if ($opt{"POWEROFF_ON_SUCCESS"}) {
Steven Rostedt75c3fda72010-11-02 14:57:21 -04004298 halt;
Steven Rostedt759a3cc2012-05-01 08:20:12 -04004299} elsif ($opt{"REBOOT_ON_SUCCESS"} && !do_not_reboot && $reboot_success) {
Steven Rostedtbc7c5802011-12-22 16:29:10 -05004300 reboot_to_good;
Steven Rostedt648a1822012-03-21 11:18:27 -04004301} elsif (defined($switch_to_good)) {
4302 # still need to get to the good kernel
4303 run_command $switch_to_good;
Steven Rostedt5c42fc52010-11-02 14:57:01 -04004304}
Steven Rostedt75c3fda72010-11-02 14:57:21 -04004305
Steven Rostedt648a1822012-03-21 11:18:27 -04004306
Steven Rostedte48c5292010-11-02 14:35:37 -04004307doprint "\n $successes of $opt{NUM_TESTS} tests were successful\n\n";
4308
Steven Rostedt2545eb62010-11-02 15:01:32 -04004309exit 0;