blob: ef1d99f3859cf01d15ec89b36b2977f68cbac4e3 [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 Poimboeuf9d2f7f02015-01-28 13:38:39 -0600181my $stty_orig;
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
Josh Poimboeuf9f2cdcb2015-01-28 13:38:38 -06001413sub create_pty {
1414 my ($ptm, $pts) = @_;
1415 my $tmp;
1416 my $TIOCSPTLCK = 0x40045431;
1417 my $TIOCGPTN = 0x80045430;
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001418
Josh Poimboeuf9f2cdcb2015-01-28 13:38:38 -06001419 sysopen($ptm, "/dev/ptmx", O_RDWR | O_NONBLOCK) or
1420 dodie "Cant open /dev/ptmx";
1421
1422 # unlockpt()
1423 $tmp = pack("i", 0);
1424 ioctl($ptm, $TIOCSPTLCK, $tmp) or
1425 dodie "ioctl TIOCSPTLCK for /dev/ptmx failed";
1426
1427 # ptsname()
1428 ioctl($ptm, $TIOCGPTN, $tmp) or
1429 dodie "ioctl TIOCGPTN for /dev/ptmx failed";
1430 $tmp = unpack("i", $tmp);
1431
1432 sysopen($pts, "/dev/pts/$tmp", O_RDWR | O_NONBLOCK) or
1433 dodie "Can't open /dev/pts/$tmp";
1434}
1435
1436sub exec_console {
1437 my ($ptm, $pts) = @_;
1438
1439 close($ptm);
1440
1441 close(\*STDIN);
1442 close(\*STDOUT);
1443 close(\*STDERR);
1444
1445 open(\*STDIN, '<&', $pts);
1446 open(\*STDOUT, '>&', $pts);
1447 open(\*STDERR, '>&', $pts);
1448
1449 close($pts);
1450
1451 exec $console or
1452 dodie "Can't open console $console";
1453}
1454
1455sub open_console {
1456 my ($ptm) = @_;
1457 my $pts = \*PTSFD;
1458 my $pid;
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001459
Josh Poimboeuf98842782015-01-27 12:10:04 -06001460 # save terminal settings
Josh Poimboeuf9d2f7f02015-01-28 13:38:39 -06001461 $stty_orig = `stty -g`;
1462
1463 # place terminal in cbreak mode so that stdin can be read one character at
1464 # a time without having to wait for a newline
1465 system("stty -icanon -echo -icrnl");
Josh Poimboeuf98842782015-01-27 12:10:04 -06001466
Josh Poimboeuf9f2cdcb2015-01-28 13:38:38 -06001467 create_pty($ptm, $pts);
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001468
Josh Poimboeuf9f2cdcb2015-01-28 13:38:38 -06001469 $pid = fork;
1470
1471 if (!$pid) {
1472 # child
1473 exec_console($ptm, $pts)
1474 }
1475
1476 # parent
1477 close($pts);
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001478
1479 return $pid;
Josh Poimboeuf9f2cdcb2015-01-28 13:38:38 -06001480
1481 open(PTSFD, "Stop perl from warning about single use of PTSFD");
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001482}
1483
1484sub close_console {
1485 my ($fp, $pid) = @_;
1486
1487 doprint "kill child process $pid\n";
Satoru Takeuchi5a5d8e42013-12-01 07:57:58 +09001488 kill $close_console_signal, $pid;
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001489
1490 print "closing!\n";
1491 close($fp);
Josh Poimboeuf98842782015-01-27 12:10:04 -06001492
1493 # restore terminal settings
Josh Poimboeuf9d2f7f02015-01-28 13:38:39 -06001494 system("stty $stty_orig");
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001495}
1496
1497sub start_monitor {
1498 if ($monitor_cnt++) {
1499 return;
1500 }
1501 $monitor_fp = \*MONFD;
1502 $monitor_pid = open_console $monitor_fp;
Steven Rostedta75fece2010-11-02 14:58:27 -04001503
1504 return;
1505
1506 open(MONFD, "Stop perl from warning about single use of MONFD");
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001507}
1508
1509sub end_monitor {
Steven Rostedt (Red Hat)319ab142013-01-30 12:25:38 -05001510 return if (!defined $console);
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001511 if (--$monitor_cnt) {
1512 return;
1513 }
1514 close_console($monitor_fp, $monitor_pid);
1515}
1516
1517sub wait_for_monitor {
Steven Rostedt2b803362011-09-30 18:00:23 -04001518 my ($time, $stop) = @_;
1519 my $full_line = "";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001520 my $line;
Steven Rostedt2b803362011-09-30 18:00:23 -04001521 my $booted = 0;
Steven Rostedt407b95b2012-07-19 16:05:42 -04001522 my $start_time = time;
Steven Rostedt8a80c722012-07-19 16:08:33 -04001523 my $skip_call_trace = 0;
1524 my $bug = 0;
1525 my $bug_ignored = 0;
Steven Rostedt407b95b2012-07-19 16:05:42 -04001526 my $now;
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001527
Steven Rostedta75fece2010-11-02 14:58:27 -04001528 doprint "** Wait for monitor to settle down **\n";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001529
1530 # read the monitor and wait for the system to calm down
Steven Rostedt2b803362011-09-30 18:00:23 -04001531 while (!$booted) {
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001532 $line = wait_for_input($monitor_fp, $time);
Steven Rostedt2b803362011-09-30 18:00:23 -04001533 last if (!defined($line));
1534 print "$line";
1535 $full_line .= $line;
1536
1537 if (defined($stop) && $full_line =~ /$stop/) {
1538 doprint "wait for monitor detected $stop\n";
1539 $booted = 1;
1540 }
1541
Steven Rostedt8a80c722012-07-19 16:08:33 -04001542 if ($full_line =~ /\[ backtrace testing \]/) {
1543 $skip_call_trace = 1;
1544 }
1545
1546 if ($full_line =~ /call trace:/i) {
1547 if (!$bug && !$skip_call_trace) {
1548 if ($ignore_errors) {
1549 $bug_ignored = 1;
1550 } else {
1551 $bug = 1;
1552 }
1553 }
1554 }
1555
1556 if ($full_line =~ /\[ end of backtrace testing \]/) {
1557 $skip_call_trace = 0;
1558 }
1559
1560 if ($full_line =~ /Kernel panic -/) {
1561 $bug = 1;
1562 }
1563
Steven Rostedt2b803362011-09-30 18:00:23 -04001564 if ($line =~ /\n/) {
1565 $full_line = "";
1566 }
Steven Rostedt407b95b2012-07-19 16:05:42 -04001567 $now = time;
1568 if ($now - $start_time >= $max_monitor_wait) {
1569 doprint "Exiting monitor flush due to hitting MAX_MONITOR_WAIT\n";
1570 return 1;
1571 }
Steven Rostedt2b803362011-09-30 18:00:23 -04001572 }
Steven Rostedta75fece2010-11-02 14:58:27 -04001573 print "** Monitor flushed **\n";
Steven Rostedt (Red Hat)995bc432014-10-07 16:31:07 -04001574
1575 # if stop is defined but wasn't hit, return error
1576 # used by reboot (which wants to see a reboot)
1577 if (defined($stop) && !$booted) {
1578 $bug = 1;
1579 }
Steven Rostedt8a80c722012-07-19 16:08:33 -04001580 return $bug;
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001581}
1582
Rabin Vincentde5b6e32011-11-18 17:05:31 +05301583sub save_logs {
1584 my ($result, $basedir) = @_;
1585 my @t = localtime;
1586 my $date = sprintf "%04d%02d%02d%02d%02d%02d",
1587 1900+$t[5],$t[4],$t[3],$t[2],$t[1],$t[0];
1588
1589 my $type = $build_type;
1590 if ($type =~ /useconfig/) {
1591 $type = "useconfig";
1592 }
1593
1594 my $dir = "$machine-$test_type-$type-$result-$date";
1595
1596 $dir = "$basedir/$dir";
1597
1598 if (!-d $dir) {
1599 mkpath($dir) or
1600 die "can't create $dir";
1601 }
1602
1603 my %files = (
1604 "config" => $output_config,
1605 "buildlog" => $buildlog,
1606 "dmesg" => $dmesg,
1607 "testlog" => $testlog,
1608 );
1609
1610 while (my ($name, $source) = each(%files)) {
1611 if (-f "$source") {
1612 cp "$source", "$dir/$name" or
1613 die "failed to copy $source";
1614 }
1615 }
1616
1617 doprint "*** Saved info to $dir ***\n";
1618}
1619
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001620sub fail {
1621
Steven Rostedt921ed4c2012-07-19 15:18:27 -04001622 if (defined($post_test)) {
1623 run_command $post_test;
1624 }
1625
Steven Rostedta75fece2010-11-02 14:58:27 -04001626 if ($die_on_failure) {
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001627 dodie @_;
1628 }
1629
Steven Rostedta75fece2010-11-02 14:58:27 -04001630 doprint "FAILED\n";
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001631
Steven Rostedt576f6272010-11-02 14:58:38 -04001632 my $i = $iteration;
1633
Steven Rostedta75fece2010-11-02 14:58:27 -04001634 # no need to reboot for just building.
Steven Rostedt576f6272010-11-02 14:58:38 -04001635 if (!do_not_reboot) {
Steven Rostedta75fece2010-11-02 14:58:27 -04001636 doprint "REBOOTING\n";
Steven Rostedtbc7c5802011-12-22 16:29:10 -05001637 reboot_to_good $sleep_time;
Steven Rostedta75fece2010-11-02 14:58:27 -04001638 }
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001639
Steven Rostedt9064af52011-06-13 10:38:48 -04001640 my $name = "";
1641
1642 if (defined($test_name)) {
1643 $name = " ($test_name)";
1644 }
1645
Steven Rostedt576f6272010-11-02 14:58:38 -04001646 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
1647 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
Steven Rostedt9064af52011-06-13 10:38:48 -04001648 doprint "KTEST RESULT: TEST $i$name Failed: ", @_, "\n";
Steven Rostedt576f6272010-11-02 14:58:38 -04001649 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
1650 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
Steven Rostedta75fece2010-11-02 14:58:27 -04001651
Rabin Vincentde5b6e32011-11-18 17:05:31 +05301652 if (defined($store_failures)) {
1653 save_logs "fail", $store_failures;
1654 }
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001655
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001656 return 1;
1657}
1658
Steven Rostedt2545eb62010-11-02 15:01:32 -04001659sub run_command {
Satoru Takeuchif983a2b2014-03-02 21:20:31 +09001660 my ($command, $redirect) = @_;
Steven Rostedt (Red Hat)b53486e2015-01-27 17:02:02 -05001661 my $start_time;
1662 my $end_time;
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001663 my $dolog = 0;
1664 my $dord = 0;
1665 my $pid;
1666
Steven Rostedt (Red Hat)b53486e2015-01-27 17:02:02 -05001667 $start_time = time;
1668
Steven Rostedte48c5292010-11-02 14:35:37 -04001669 $command =~ s/\$SSH_USER/$ssh_user/g;
1670 $command =~ s/\$MACHINE/$machine/g;
1671
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001672 doprint("$command ... ");
1673
1674 $pid = open(CMD, "$command 2>&1 |") or
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001675 (fail "unable to exec $command" and return 0);
Steven Rostedt2545eb62010-11-02 15:01:32 -04001676
1677 if (defined($opt{"LOG_FILE"})) {
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001678 open(LOG, ">>$opt{LOG_FILE}") or
1679 dodie "failed to write to log";
1680 $dolog = 1;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04001681 }
1682
1683 if (defined($redirect)) {
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001684 open (RD, ">$redirect") or
1685 dodie "failed to write to redirect $redirect";
1686 $dord = 1;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001687 }
1688
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001689 while (<CMD>) {
1690 print LOG if ($dolog);
1691 print RD if ($dord);
1692 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04001693
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001694 waitpid($pid, 0);
Steven Rostedt2545eb62010-11-02 15:01:32 -04001695 my $failed = $?;
1696
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04001697 close(CMD);
1698 close(LOG) if ($dolog);
1699 close(RD) if ($dord);
1700
Steven Rostedt (Red Hat)b53486e2015-01-27 17:02:02 -05001701 $end_time = time;
1702 my $delta = $end_time - $start_time;
1703
1704 if ($delta == 1) {
1705 doprint "[1 second] ";
1706 } else {
1707 doprint "[$delta seconds] ";
1708 }
1709
Steven Rostedt2545eb62010-11-02 15:01:32 -04001710 if ($failed) {
1711 doprint "FAILED!\n";
1712 } else {
1713 doprint "SUCCESS\n";
1714 }
1715
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001716 return !$failed;
1717}
1718
Steven Rostedte48c5292010-11-02 14:35:37 -04001719sub run_ssh {
1720 my ($cmd) = @_;
1721 my $cp_exec = $ssh_exec;
1722
1723 $cp_exec =~ s/\$SSH_COMMAND/$cmd/g;
1724 return run_command "$cp_exec";
1725}
1726
1727sub run_scp {
Steven Rostedt02ad2612012-03-21 08:21:24 -04001728 my ($src, $dst, $cp_scp) = @_;
Steven Rostedte48c5292010-11-02 14:35:37 -04001729
1730 $cp_scp =~ s/\$SRC_FILE/$src/g;
1731 $cp_scp =~ s/\$DST_FILE/$dst/g;
1732
1733 return run_command "$cp_scp";
1734}
1735
Steven Rostedt02ad2612012-03-21 08:21:24 -04001736sub run_scp_install {
1737 my ($src, $dst) = @_;
1738
1739 my $cp_scp = $scp_to_target_install;
1740
1741 return run_scp($src, $dst, $cp_scp);
1742}
1743
1744sub run_scp_mod {
1745 my ($src, $dst) = @_;
1746
1747 my $cp_scp = $scp_to_target;
1748
1749 return run_scp($src, $dst, $cp_scp);
1750}
1751
Steven Rostedta15ba912012-11-13 14:30:37 -05001752sub get_grub2_index {
1753
Steven Rostedt (Red Hat)752d9662013-03-08 09:33:35 -05001754 return if (defined($grub_number) && defined($last_grub_menu) &&
Steven Rostedt (Red Hat)df5f7c62013-04-24 16:03:30 -04001755 $last_grub_menu eq $grub_menu && defined($last_machine) &&
1756 $last_machine eq $machine);
Steven Rostedta15ba912012-11-13 14:30:37 -05001757
1758 doprint "Find grub2 menu ... ";
1759 $grub_number = -1;
1760
1761 my $ssh_grub = $ssh_exec;
1762 $ssh_grub =~ s,\$SSH_COMMAND,cat $grub_file,g;
1763
1764 open(IN, "$ssh_grub |")
1765 or die "unable to get $grub_file";
1766
1767 my $found = 0;
1768
1769 while (<IN>) {
1770 if (/^menuentry.*$grub_menu/) {
1771 $grub_number++;
1772 $found = 1;
1773 last;
1774 } elsif (/^menuentry\s/) {
1775 $grub_number++;
1776 }
1777 }
1778 close(IN);
1779
1780 die "Could not find '$grub_menu' in $grub_file on $machine"
1781 if (!$found);
1782 doprint "$grub_number\n";
Steven Rostedt (Red Hat)752d9662013-03-08 09:33:35 -05001783 $last_grub_menu = $grub_menu;
Steven Rostedt (Red Hat)df5f7c62013-04-24 16:03:30 -04001784 $last_machine = $machine;
Steven Rostedta15ba912012-11-13 14:30:37 -05001785}
1786
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001787sub get_grub_index {
1788
Steven Rostedta15ba912012-11-13 14:30:37 -05001789 if ($reboot_type eq "grub2") {
1790 get_grub2_index;
1791 return;
1792 }
1793
Steven Rostedta75fece2010-11-02 14:58:27 -04001794 if ($reboot_type ne "grub") {
1795 return;
1796 }
Steven Rostedt (Red Hat)752d9662013-03-08 09:33:35 -05001797 return if (defined($grub_number) && defined($last_grub_menu) &&
Steven Rostedt (Red Hat)df5f7c62013-04-24 16:03:30 -04001798 $last_grub_menu eq $grub_menu && defined($last_machine) &&
1799 $last_machine eq $machine);
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001800
1801 doprint "Find grub menu ... ";
1802 $grub_number = -1;
Steven Rostedte48c5292010-11-02 14:35:37 -04001803
1804 my $ssh_grub = $ssh_exec;
1805 $ssh_grub =~ s,\$SSH_COMMAND,cat /boot/grub/menu.lst,g;
1806
1807 open(IN, "$ssh_grub |")
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001808 or die "unable to get menu.lst";
Steven Rostedte48c5292010-11-02 14:35:37 -04001809
Steven Rostedteaa1fe22011-09-14 17:20:39 -04001810 my $found = 0;
1811
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001812 while (<IN>) {
Steven Rostedta75fece2010-11-02 14:58:27 -04001813 if (/^\s*title\s+$grub_menu\s*$/) {
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001814 $grub_number++;
Steven Rostedteaa1fe22011-09-14 17:20:39 -04001815 $found = 1;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001816 last;
1817 } elsif (/^\s*title\s/) {
1818 $grub_number++;
1819 }
1820 }
1821 close(IN);
1822
Steven Rostedta75fece2010-11-02 14:58:27 -04001823 die "Could not find '$grub_menu' in /boot/grub/menu on $machine"
Steven Rostedteaa1fe22011-09-14 17:20:39 -04001824 if (!$found);
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04001825 doprint "$grub_number\n";
Steven Rostedt (Red Hat)752d9662013-03-08 09:33:35 -05001826 $last_grub_menu = $grub_menu;
Steven Rostedt (Red Hat)df5f7c62013-04-24 16:03:30 -04001827 $last_machine = $machine;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001828}
1829
Steven Rostedt2545eb62010-11-02 15:01:32 -04001830sub wait_for_input
1831{
1832 my ($fp, $time) = @_;
1833 my $rin;
Josh Poimboeuf9d2f7f02015-01-28 13:38:39 -06001834 my $rout;
1835 my $nr;
1836 my $buf;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001837 my $line;
1838 my $ch;
1839
1840 if (!defined($time)) {
1841 $time = $timeout;
1842 }
1843
1844 $rin = '';
1845 vec($rin, fileno($fp), 1) = 1;
Josh Poimboeuf9d2f7f02015-01-28 13:38:39 -06001846 vec($rin, fileno(\*STDIN), 1) = 1;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001847
Josh Poimboeuf9d2f7f02015-01-28 13:38:39 -06001848 while (1) {
1849 $nr = select($rout=$rin, undef, undef, $time);
Steven Rostedt2545eb62010-11-02 15:01:32 -04001850
Josh Poimboeuf9d2f7f02015-01-28 13:38:39 -06001851 if ($nr <= 0) {
1852 return undef;
1853 }
1854
1855 # copy data from stdin to the console
1856 if (vec($rout, fileno(\*STDIN), 1) == 1) {
1857 sysread(\*STDIN, $buf, 1000);
1858 syswrite($fp, $buf, 1000);
1859 next;
1860 }
1861
1862 $line = "";
1863
1864 # try to read one char at a time
1865 while (sysread $fp, $ch, 1) {
1866 $line .= $ch;
1867 last if ($ch eq "\n");
1868 }
1869
1870 if (!length($line)) {
1871 return undef;
1872 }
1873
1874 return $line;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001875 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04001876}
1877
Steven Rostedt75c3fda72010-11-02 14:57:21 -04001878sub reboot_to {
Steven Rostedtbc7c5802011-12-22 16:29:10 -05001879 if (defined($switch_to_test)) {
1880 run_command $switch_to_test;
1881 }
1882
Steven Rostedta75fece2010-11-02 14:58:27 -04001883 if ($reboot_type eq "grub") {
Steven Rostedtc54367f2011-10-20 09:56:41 -04001884 run_ssh "'(echo \"savedefault --default=$grub_number --once\" | grub --batch)'";
Steven Rostedta15ba912012-11-13 14:30:37 -05001885 } elsif ($reboot_type eq "grub2") {
1886 run_ssh "$grub_reboot $grub_number";
Steven Rostedt77869542012-12-11 17:37:41 -05001887 } elsif ($reboot_type eq "syslinux") {
1888 run_ssh "$syslinux --once \\\"$syslinux_label\\\" $syslinux_path";
Steven Rostedt96f6a0d2011-12-23 00:24:51 -05001889 } elsif (defined $reboot_script) {
1890 run_command "$reboot_script";
Steven Rostedta75fece2010-11-02 14:58:27 -04001891 }
Steven Rostedt96f6a0d2011-12-23 00:24:51 -05001892 reboot;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001893}
1894
Steven Rostedta57419b2010-11-02 15:13:54 -04001895sub get_sha1 {
1896 my ($commit) = @_;
1897
1898 doprint "git rev-list --max-count=1 $commit ... ";
1899 my $sha1 = `git rev-list --max-count=1 $commit`;
1900 my $ret = $?;
1901
1902 logit $sha1;
1903
1904 if ($ret) {
1905 doprint "FAILED\n";
1906 dodie "Failed to get git $commit";
1907 }
1908
1909 print "SUCCESS\n";
1910
1911 chomp $sha1;
1912
1913 return $sha1;
1914}
1915
Steven Rostedt5a391fb2010-11-02 14:57:43 -04001916sub monitor {
Steven Rostedt2545eb62010-11-02 15:01:32 -04001917 my $booted = 0;
1918 my $bug = 0;
Steven Rostedt6ca996c2012-03-21 08:18:35 -04001919 my $bug_ignored = 0;
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001920 my $skip_call_trace = 0;
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001921 my $loops;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001922
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05001923 my $start_time = time;
1924
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001925 wait_for_monitor 5;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001926
1927 my $line;
1928 my $full_line = "";
1929
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001930 open(DMESG, "> $dmesg") or
1931 die "unable to write to $dmesg";
Steven Rostedt2545eb62010-11-02 15:01:32 -04001932
Steven Rostedt75c3fda72010-11-02 14:57:21 -04001933 reboot_to;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001934
Steven Rostedt1c8a6172010-11-09 12:55:40 -05001935 my $success_start;
1936 my $failure_start;
Steven Rostedt2d01b262011-03-08 09:47:54 -05001937 my $monitor_start = time;
1938 my $done = 0;
Steven Rostedtf1a5b962011-06-13 10:30:00 -04001939 my $version_found = 0;
Steven Rostedt1c8a6172010-11-09 12:55:40 -05001940
Steven Rostedt2d01b262011-03-08 09:47:54 -05001941 while (!$done) {
Steven Rostedt2545eb62010-11-02 15:01:32 -04001942
Steven Rostedtecaf8e52011-06-13 10:48:10 -04001943 if ($bug && defined($stop_after_failure) &&
1944 $stop_after_failure >= 0) {
1945 my $time = $stop_after_failure - (time - $failure_start);
1946 $line = wait_for_input($monitor_fp, $time);
1947 if (!defined($line)) {
1948 doprint "bug timed out after $booted_timeout seconds\n";
1949 doprint "Test forced to stop after $stop_after_failure seconds after failure\n";
1950 last;
1951 }
1952 } elsif ($booted) {
Steven Rostedta75fece2010-11-02 14:58:27 -04001953 $line = wait_for_input($monitor_fp, $booted_timeout);
Steven Rostedtcd4f1d52011-06-13 10:26:27 -04001954 if (!defined($line)) {
1955 my $s = $booted_timeout == 1 ? "" : "s";
1956 doprint "Successful boot found: break after $booted_timeout second$s\n";
1957 last;
1958 }
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001959 } else {
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001960 $line = wait_for_input($monitor_fp);
Steven Rostedtcd4f1d52011-06-13 10:26:27 -04001961 if (!defined($line)) {
1962 my $s = $timeout == 1 ? "" : "s";
1963 doprint "Timed out after $timeout second$s\n";
1964 last;
1965 }
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04001966 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04001967
Steven Rostedt2545eb62010-11-02 15:01:32 -04001968 doprint $line;
Steven Rostedt7faafbd2010-11-02 14:58:22 -04001969 print DMESG $line;
Steven Rostedt2545eb62010-11-02 15:01:32 -04001970
1971 # we are not guaranteed to get a full line
1972 $full_line .= $line;
1973
Steven Rostedta75fece2010-11-02 14:58:27 -04001974 if ($full_line =~ /$success_line/) {
Steven Rostedt2545eb62010-11-02 15:01:32 -04001975 $booted = 1;
Steven Rostedt1c8a6172010-11-09 12:55:40 -05001976 $success_start = time;
1977 }
1978
1979 if ($booted && defined($stop_after_success) &&
1980 $stop_after_success >= 0) {
1981 my $now = time;
1982 if ($now - $success_start >= $stop_after_success) {
1983 doprint "Test forced to stop after $stop_after_success seconds after success\n";
1984 last;
1985 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04001986 }
1987
Steven Rostedt5c42fc52010-11-02 14:57:01 -04001988 if ($full_line =~ /\[ backtrace testing \]/) {
1989 $skip_call_trace = 1;
1990 }
1991
Steven Rostedt2545eb62010-11-02 15:01:32 -04001992 if ($full_line =~ /call trace:/i) {
Steven Rostedt6ca996c2012-03-21 08:18:35 -04001993 if (!$bug && !$skip_call_trace) {
1994 if ($ignore_errors) {
1995 $bug_ignored = 1;
1996 } else {
1997 $bug = 1;
1998 $failure_start = time;
1999 }
Steven Rostedt1c8a6172010-11-09 12:55:40 -05002000 }
2001 }
2002
2003 if ($bug && defined($stop_after_failure) &&
2004 $stop_after_failure >= 0) {
2005 my $now = time;
2006 if ($now - $failure_start >= $stop_after_failure) {
2007 doprint "Test forced to stop after $stop_after_failure seconds after failure\n";
2008 last;
2009 }
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002010 }
2011
2012 if ($full_line =~ /\[ end of backtrace testing \]/) {
2013 $skip_call_trace = 0;
2014 }
2015
2016 if ($full_line =~ /Kernel panic -/) {
Steven Rostedt10abf112011-03-07 13:21:00 -05002017 $failure_start = time;
Steven Rostedt2545eb62010-11-02 15:01:32 -04002018 $bug = 1;
2019 }
2020
Steven Rostedtf1a5b962011-06-13 10:30:00 -04002021 # Detect triple faults by testing the banner
2022 if ($full_line =~ /\bLinux version (\S+).*\n/) {
2023 if ($1 eq $version) {
2024 $version_found = 1;
2025 } elsif ($version_found && $detect_triplefault) {
2026 # We already booted into the kernel we are testing,
2027 # but now we booted into another kernel?
2028 # Consider this a triple fault.
Masanari Iida8b513d02013-05-21 23:13:12 +09002029 doprint "Already booted in Linux kernel $version, but now\n";
Steven Rostedtf1a5b962011-06-13 10:30:00 -04002030 doprint "we booted into Linux kernel $1.\n";
2031 doprint "Assuming that this is a triple fault.\n";
2032 doprint "To disable this: set DETECT_TRIPLE_FAULT to 0\n";
2033 last;
2034 }
2035 }
2036
Steven Rostedt2545eb62010-11-02 15:01:32 -04002037 if ($line =~ /\n/) {
2038 $full_line = "";
2039 }
Steven Rostedt2d01b262011-03-08 09:47:54 -05002040
2041 if ($stop_test_after > 0 && !$booted && !$bug) {
2042 if (time - $monitor_start > $stop_test_after) {
Steven Rostedt4d62bf52011-05-20 09:14:35 -04002043 doprint "STOP_TEST_AFTER ($stop_test_after seconds) timed out\n";
Steven Rostedt2d01b262011-03-08 09:47:54 -05002044 $done = 1;
2045 }
2046 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04002047 }
2048
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05002049 my $end_time = time;
2050 $reboot_time = $end_time - $start_time;
2051
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002052 close(DMESG);
Steven Rostedt2545eb62010-11-02 15:01:32 -04002053
Steven Rostedt2545eb62010-11-02 15:01:32 -04002054 if ($bug) {
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002055 return 0 if ($in_bisect);
Steven Rostedt576f6272010-11-02 14:58:38 -04002056 fail "failed - got a bug report" and return 0;
Steven Rostedt2545eb62010-11-02 15:01:32 -04002057 }
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002058
Steven Rostedta75fece2010-11-02 14:58:27 -04002059 if (!$booted) {
2060 return 0 if ($in_bisect);
Steven Rostedt576f6272010-11-02 14:58:38 -04002061 fail "failed - never got a boot prompt." and return 0;
Steven Rostedta75fece2010-11-02 14:58:27 -04002062 }
2063
Steven Rostedt6ca996c2012-03-21 08:18:35 -04002064 if ($bug_ignored) {
2065 doprint "WARNING: Call Trace detected but ignored due to IGNORE_ERRORS=1\n";
2066 }
2067
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002068 return 1;
Steven Rostedt2545eb62010-11-02 15:01:32 -04002069}
2070
Steven Rostedt2b29b2f2011-12-22 11:25:46 -05002071sub eval_kernel_version {
2072 my ($option) = @_;
2073
2074 $option =~ s/\$KERNEL_VERSION/$version/g;
2075
2076 return $option;
2077}
2078
Steven Rostedtdb05cfe2011-06-13 11:09:22 -04002079sub do_post_install {
2080
2081 return if (!defined($post_install));
2082
Steven Rostedt2b29b2f2011-12-22 11:25:46 -05002083 my $cp_post_install = eval_kernel_version $post_install;
Steven Rostedtdb05cfe2011-06-13 11:09:22 -04002084 run_command "$cp_post_install" or
2085 dodie "Failed to run post install";
2086}
2087
Steven Rostedte1a6c3d2012-12-11 21:19:41 -05002088# Sometimes the reboot fails, and will hang. We try to ssh to the box
2089# and if we fail, we force another reboot, that should powercycle it.
2090sub test_booted {
2091 if (!run_ssh "echo testing connection") {
2092 reboot $sleep_time;
2093 }
2094}
2095
Steven Rostedt2545eb62010-11-02 15:01:32 -04002096sub install {
2097
Steven Rostedte0a87422011-09-30 17:50:48 -04002098 return if ($no_install);
2099
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05002100 my $start_time = time;
2101
Steven Rostedte5c2ec12012-07-19 15:22:05 -04002102 if (defined($pre_install)) {
2103 my $cp_pre_install = eval_kernel_version $pre_install;
2104 run_command "$cp_pre_install" or
2105 dodie "Failed to run pre install";
2106 }
2107
Steven Rostedt2b29b2f2011-12-22 11:25:46 -05002108 my $cp_target = eval_kernel_version $target_image;
2109
Steven Rostedte1a6c3d2012-12-11 21:19:41 -05002110 test_booted;
2111
Steven Rostedt02ad2612012-03-21 08:21:24 -04002112 run_scp_install "$outputdir/$build_target", "$cp_target" or
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002113 dodie "failed to copy image";
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002114
2115 my $install_mods = 0;
2116
2117 # should we process modules?
2118 $install_mods = 0;
Steven Rostedt51ad1dd2010-11-08 16:43:21 -05002119 open(IN, "$output_config") or dodie("Can't read config file");
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002120 while (<IN>) {
2121 if (/CONFIG_MODULES(=y)?/) {
Steven Rostedt8bc5e4e2012-10-26 00:10:32 -04002122 if (defined($1)) {
2123 $install_mods = 1;
2124 last;
2125 }
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002126 }
2127 }
2128 close(IN);
2129
2130 if (!$install_mods) {
Steven Rostedtdb05cfe2011-06-13 11:09:22 -04002131 do_post_install;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002132 doprint "No modules needed\n";
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05002133 my $end_time = time;
2134 $install_time = $end_time - $start_time;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002135 return;
Steven Rostedt2545eb62010-11-02 15:01:32 -04002136 }
2137
Steven Rostedt627977d2012-03-21 08:16:15 -04002138 run_command "$make INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH=$tmpdir modules_install" or
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002139 dodie "Failed to install modules";
Steven Rostedt2545eb62010-11-02 15:01:32 -04002140
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002141 my $modlib = "/lib/modules/$version";
Steven Rostedta57419b2010-11-02 15:13:54 -04002142 my $modtar = "ktest-mods.tar.bz2";
Steven Rostedt2545eb62010-11-02 15:01:32 -04002143
Steven Rostedte48c5292010-11-02 14:35:37 -04002144 run_ssh "rm -rf $modlib" or
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002145 dodie "failed to remove old mods: $modlib";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002146
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002147 # would be nice if scp -r did not follow symbolic links
Steven Rostedta75fece2010-11-02 14:58:27 -04002148 run_command "cd $tmpdir && tar -cjf $modtar lib/modules/$version" or
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002149 dodie "making tarball";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002150
Steven Rostedt02ad2612012-03-21 08:21:24 -04002151 run_scp_mod "$tmpdir/$modtar", "/tmp" or
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002152 dodie "failed to copy modules";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002153
Steven Rostedta75fece2010-11-02 14:58:27 -04002154 unlink "$tmpdir/$modtar";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002155
Steven Rostedte7b13442011-06-14 20:44:36 -04002156 run_ssh "'(cd / && tar xjf /tmp/$modtar)'" or
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002157 dodie "failed to tar modules";
Steven Rostedt2545eb62010-11-02 15:01:32 -04002158
Steven Rostedte48c5292010-11-02 14:35:37 -04002159 run_ssh "rm -f /tmp/$modtar";
Steven Rostedt8b37ca82010-11-02 14:58:33 -04002160
Steven Rostedtdb05cfe2011-06-13 11:09:22 -04002161 do_post_install;
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05002162
2163 my $end_time = time;
2164 $install_time = $end_time - $start_time;
Steven Rostedt2545eb62010-11-02 15:01:32 -04002165}
2166
Steven Rostedtddf607e2011-06-14 20:49:13 -04002167sub get_version {
2168 # get the release name
Steven Rostedt683a3e62012-05-18 13:34:35 -04002169 return if ($have_version);
Steven Rostedtddf607e2011-06-14 20:49:13 -04002170 doprint "$make kernelrelease ... ";
Steven Rostedt (Red Hat)17150fe2014-11-23 15:13:44 -05002171 $version = `$make -s kernelrelease | tail -1`;
Steven Rostedtddf607e2011-06-14 20:49:13 -04002172 chomp($version);
2173 doprint "$version\n";
Steven Rostedt683a3e62012-05-18 13:34:35 -04002174 $have_version = 1;
Steven Rostedtddf607e2011-06-14 20:49:13 -04002175}
2176
Steven Rostedt (Red Hat)64d98282015-01-28 15:17:35 -05002177sub start_monitor_and_install {
Steven Rostedt9f7424c2011-10-22 08:58:19 -04002178 # Make sure the stable kernel has finished booting
Steven Rostedt (Red Hat)319ab142013-01-30 12:25:38 -05002179
2180 # Install bisects, don't need console
2181 if (defined $console) {
2182 start_monitor;
2183 wait_for_monitor 5;
2184 end_monitor;
2185 }
Steven Rostedt9f7424c2011-10-22 08:58:19 -04002186
Steven Rostedtddf607e2011-06-14 20:49:13 -04002187 get_grub_index;
2188 get_version;
2189 install;
2190
Steven Rostedt (Red Hat)319ab142013-01-30 12:25:38 -05002191 start_monitor if (defined $console);
Steven Rostedtddf607e2011-06-14 20:49:13 -04002192 return monitor;
2193}
2194
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05002195my $check_build_re = ".*:.*(warning|error|Error):.*";
2196my $utf8_quote = "\\x{e2}\\x{80}(\\x{98}|\\x{99})";
2197
Steven Rostedt (Red Hat)73287352013-02-18 09:35:49 -05002198sub process_warning_line {
2199 my ($line) = @_;
2200
2201 chomp $line;
2202
2203 # for distcc heterogeneous systems, some compilers
2204 # do things differently causing warning lines
2205 # to be slightly different. This makes an attempt
2206 # to fixe those issues.
2207
2208 # chop off the index into the line
2209 # using distcc, some compilers give different indexes
2210 # depending on white space
2211 $line =~ s/^(\s*\S+:\d+:)\d+/$1/;
2212
2213 # Some compilers use UTF-8 extended for quotes and some don't.
2214 $line =~ s/$utf8_quote/'/g;
2215
2216 return $line;
2217}
2218
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05002219# Read buildlog and check against warnings file for any
2220# new warnings.
2221#
2222# Returns 1 if OK
2223# 0 otherwise
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04002224sub check_buildlog {
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05002225 return 1 if (!defined $warnings_file);
2226
2227 my %warnings_list;
2228
2229 # Failed builds should not reboot the target
2230 my $save_no_reboot = $no_reboot;
2231 $no_reboot = 1;
2232
2233 if (-f $warnings_file) {
2234 open(IN, $warnings_file) or
2235 dodie "Error opening $warnings_file";
2236
2237 while (<IN>) {
2238 if (/$check_build_re/) {
Steven Rostedt (Red Hat)73287352013-02-18 09:35:49 -05002239 my $warning = process_warning_line $_;
2240
2241 $warnings_list{$warning} = 1;
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05002242 }
2243 }
2244 close(IN);
2245 }
2246
2247 # If warnings file didn't exist, and WARNINGS_FILE exist,
2248 # then we fail on any warning!
2249
2250 open(IN, $buildlog) or dodie "Can't open $buildlog";
2251 while (<IN>) {
2252 if (/$check_build_re/) {
Steven Rostedt (Red Hat)73287352013-02-18 09:35:49 -05002253 my $warning = process_warning_line $_;
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05002254
Steven Rostedt (Red Hat)73287352013-02-18 09:35:49 -05002255 if (!defined $warnings_list{$warning}) {
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05002256 fail "New warning found (not in $warnings_file)\n$_\n";
2257 $no_reboot = $save_no_reboot;
2258 return 0;
2259 }
2260 }
2261 }
2262 $no_reboot = $save_no_reboot;
2263 close(IN);
2264}
2265
2266sub check_patch_buildlog {
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04002267 my ($patch) = @_;
2268
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04002269 my @files = `git show $patch | diffstat -l`;
2270
Steven Rostedt (Red Hat)35275682013-01-30 12:28:15 -05002271 foreach my $file (@files) {
2272 chomp $file;
2273 }
2274
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04002275 open(IN, "git show $patch |") or
2276 dodie "failed to show $patch";
2277 while (<IN>) {
2278 if (m,^--- a/(.*),) {
2279 chomp $1;
2280 $files[$#files] = $1;
2281 }
2282 }
2283 close(IN);
2284
2285 open(IN, $buildlog) or dodie "Can't open $buildlog";
2286 while (<IN>) {
2287 if (/^\s*(.*?):.*(warning|error)/) {
2288 my $err = $1;
2289 foreach my $file (@files) {
Steven Rostedta75fece2010-11-02 14:58:27 -04002290 my $fullpath = "$builddir/$file";
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04002291 if ($file eq $err || $fullpath eq $err) {
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002292 fail "$file built with warnings" and return 0;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04002293 }
2294 }
2295 }
2296 }
2297 close(IN);
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002298
2299 return 1;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04002300}
2301
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002302sub apply_min_config {
2303 my $outconfig = "$output_config.new";
Steven Rostedt612b9e92011-03-07 13:27:43 -05002304
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002305 # Read the config file and remove anything that
2306 # is in the force_config hash (from minconfig and others)
2307 # then add the force config back.
2308
2309 doprint "Applying minimum configurations into $output_config.new\n";
2310
2311 open (OUT, ">$outconfig") or
2312 dodie "Can't create $outconfig";
2313
2314 if (-f $output_config) {
2315 open (IN, $output_config) or
2316 dodie "Failed to open $output_config";
2317 while (<IN>) {
2318 if (/^(# )?(CONFIG_[^\s=]*)/) {
2319 next if (defined($force_config{$2}));
2320 }
2321 print OUT;
2322 }
2323 close IN;
2324 }
2325 foreach my $config (keys %force_config) {
2326 print OUT "$force_config{$config}\n";
2327 }
2328 close OUT;
2329
2330 run_command "mv $outconfig $output_config";
2331}
2332
2333sub make_oldconfig {
2334
Steven Rostedt4c4ab122011-07-15 21:16:17 -04002335 my @force_list = keys %force_config;
2336
2337 if ($#force_list >= 0) {
2338 apply_min_config;
2339 }
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002340
Adam Leefb16d892012-09-01 01:05:17 +08002341 if (!run_command "$make olddefconfig") {
2342 # Perhaps olddefconfig doesn't exist in this version of the kernel
Steven Rostedt18925172012-12-11 20:16:03 -05002343 # try oldnoconfig
2344 doprint "olddefconfig failed, trying make oldnoconfig\n";
2345 if (!run_command "$make oldnoconfig") {
2346 doprint "oldnoconfig failed, trying yes '' | make oldconfig\n";
2347 # try a yes '' | oldconfig
2348 run_command "yes '' | $make oldconfig" or
2349 dodie "failed make config oldconfig";
2350 }
Steven Rostedt612b9e92011-03-07 13:27:43 -05002351 }
2352}
2353
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002354# read a config file and use this to force new configs.
2355sub load_force_config {
2356 my ($config) = @_;
2357
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002358 doprint "Loading force configs from $config\n";
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002359 open(IN, $config) or
2360 dodie "failed to read $config";
2361 while (<IN>) {
2362 chomp;
2363 if (/^(CONFIG[^\s=]*)(\s*=.*)/) {
2364 $force_config{$1} = $_;
2365 } elsif (/^# (CONFIG_\S*) is not set/) {
2366 $force_config{$1} = $_;
2367 }
2368 }
2369 close IN;
2370}
2371
Steven Rostedt2545eb62010-11-02 15:01:32 -04002372sub build {
2373 my ($type) = @_;
2374
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002375 unlink $buildlog;
2376
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05002377 my $start_time = time;
2378
Steven Rostedt4ab1cce2011-09-30 18:12:20 -04002379 # Failed builds should not reboot the target
2380 my $save_no_reboot = $no_reboot;
2381 $no_reboot = 1;
2382
Steven Rostedt683a3e62012-05-18 13:34:35 -04002383 # Calculate a new version from here.
2384 $have_version = 0;
2385
Steven Rostedt0bd6c1a2011-06-14 20:39:31 -04002386 if (defined($pre_build)) {
2387 my $ret = run_command $pre_build;
2388 if (!$ret && defined($pre_build_die) &&
2389 $pre_build_die) {
2390 dodie "failed to pre_build\n";
2391 }
2392 }
2393
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002394 if ($type =~ /^useconfig:(.*)/) {
Steven Rostedt51ad1dd2010-11-08 16:43:21 -05002395 run_command "cp $1 $output_config" or
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002396 dodie "could not copy $1 to .config";
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002397
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002398 $type = "oldconfig";
2399 }
2400
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002401 # old config can ask questions
2402 if ($type eq "oldconfig") {
Adam Leefb16d892012-09-01 01:05:17 +08002403 $type = "olddefconfig";
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002404
2405 # allow for empty configs
Steven Rostedt51ad1dd2010-11-08 16:43:21 -05002406 run_command "touch $output_config";
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002407
Andrew Jones13488232011-08-12 15:32:04 +02002408 if (!$noclean) {
2409 run_command "mv $output_config $outputdir/config_temp" or
2410 dodie "moving .config";
Steven Rostedt2545eb62010-11-02 15:01:32 -04002411
Andrew Jones13488232011-08-12 15:32:04 +02002412 run_command "$make mrproper" or dodie "make mrproper";
2413
2414 run_command "mv $outputdir/config_temp $output_config" or
2415 dodie "moving config_temp";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002416 }
2417
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002418 } elsif (!$noclean) {
Steven Rostedt51ad1dd2010-11-08 16:43:21 -05002419 unlink "$output_config";
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002420 run_command "$make mrproper" or
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002421 dodie "make mrproper";
Steven Rostedt5c42fc52010-11-02 14:57:01 -04002422 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04002423
2424 # add something to distinguish this build
Steven Rostedta75fece2010-11-02 14:58:27 -04002425 open(OUT, "> $outputdir/localversion") or dodie("Can't make localversion file");
2426 print OUT "$localversion\n";
Steven Rostedt2545eb62010-11-02 15:01:32 -04002427 close(OUT);
2428
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002429 if (defined($minconfig)) {
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002430 load_force_config($minconfig);
Steven Rostedt2545eb62010-11-02 15:01:32 -04002431 }
2432
Adam Leefb16d892012-09-01 01:05:17 +08002433 if ($type ne "olddefconfig") {
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002434 run_command "$make $type" or
Steven Rostedt612b9e92011-03-07 13:27:43 -05002435 dodie "failed make config";
2436 }
Steven Rostedtfcb3f162011-06-13 10:40:58 -04002437 # Run old config regardless, to enforce min configurations
2438 make_oldconfig;
Steven Rostedt2545eb62010-11-02 15:01:32 -04002439
Satoru Takeuchif983a2b2014-03-02 21:20:31 +09002440 my $build_ret = run_command "$make $build_options", $buildlog;
Steven Rostedt0bd6c1a2011-06-14 20:39:31 -04002441
2442 if (defined($post_build)) {
Steven Rostedt683a3e62012-05-18 13:34:35 -04002443 # Because a post build may change the kernel version
2444 # do it now.
2445 get_version;
Steven Rostedt0bd6c1a2011-06-14 20:39:31 -04002446 my $ret = run_command $post_build;
2447 if (!$ret && defined($post_build_die) &&
2448 $post_build_die) {
2449 dodie "failed to post_build\n";
2450 }
2451 }
2452
2453 if (!$build_ret) {
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002454 # bisect may need this to pass
Steven Rostedt4ab1cce2011-09-30 18:12:20 -04002455 if ($in_bisect) {
2456 $no_reboot = $save_no_reboot;
2457 return 0;
2458 }
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002459 fail "failed build" and return 0;
Steven Rostedt2545eb62010-11-02 15:01:32 -04002460 }
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002461
Steven Rostedt4ab1cce2011-09-30 18:12:20 -04002462 $no_reboot = $save_no_reboot;
2463
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05002464 my $end_time = time;
2465 $build_time = $end_time - $start_time;
2466
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002467 return 1;
Steven Rostedt2545eb62010-11-02 15:01:32 -04002468}
2469
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002470sub halt {
Steven Rostedte48c5292010-11-02 14:35:37 -04002471 if (!run_ssh "halt" or defined($power_off)) {
Steven Rostedt576f6272010-11-02 14:58:38 -04002472 if (defined($poweroff_after_halt)) {
2473 sleep $poweroff_after_halt;
2474 run_command "$power_off";
2475 }
2476 } else {
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002477 # nope? the zap it!
Steven Rostedta75fece2010-11-02 14:58:27 -04002478 run_command "$power_off";
Steven Rostedt75c3fda72010-11-02 14:57:21 -04002479 }
2480}
2481
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002482sub success {
2483 my ($i) = @_;
2484
Steven Rostedt921ed4c2012-07-19 15:18:27 -04002485 if (defined($post_test)) {
2486 run_command $post_test;
2487 }
2488
Steven Rostedte48c5292010-11-02 14:35:37 -04002489 $successes++;
2490
Steven Rostedt9064af52011-06-13 10:38:48 -04002491 my $name = "";
2492
2493 if (defined($test_name)) {
2494 $name = " ($test_name)";
2495 }
2496
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002497 doprint "\n\n*******************************************\n";
2498 doprint "*******************************************\n";
Steven Rostedt9064af52011-06-13 10:38:48 -04002499 doprint "KTEST RESULT: TEST $i$name SUCCESS!!!! **\n";
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002500 doprint "*******************************************\n";
2501 doprint "*******************************************\n";
2502
Rabin Vincentde5b6e32011-11-18 17:05:31 +05302503 if (defined($store_successes)) {
2504 save_logs "success", $store_successes;
2505 }
2506
Steven Rostedt576f6272010-11-02 14:58:38 -04002507 if ($i != $opt{"NUM_TESTS"} && !do_not_reboot) {
Steven Rostedta75fece2010-11-02 14:58:27 -04002508 doprint "Reboot and wait $sleep_time seconds\n";
Steven Rostedtbc7c5802011-12-22 16:29:10 -05002509 reboot_to_good $sleep_time;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002510 }
2511}
2512
Steven Rostedtc960bb92011-03-08 09:22:39 -05002513sub answer_bisect {
2514 for (;;) {
Chris J Argesfee9d3e2014-08-27 13:26:53 -05002515 doprint "Pass, fail, or skip? [p/f/s]";
Steven Rostedtc960bb92011-03-08 09:22:39 -05002516 my $ans = <STDIN>;
2517 chomp $ans;
2518 if ($ans eq "p" || $ans eq "P") {
2519 return 1;
2520 } elsif ($ans eq "f" || $ans eq "F") {
2521 return 0;
Chris J Argesfee9d3e2014-08-27 13:26:53 -05002522 } elsif ($ans eq "s" || $ans eq "S") {
2523 return -1;
Steven Rostedtc960bb92011-03-08 09:22:39 -05002524 } else {
Chris J Argesfee9d3e2014-08-27 13:26:53 -05002525 print "Please answer 'p', 'f', or 's'\n";
Steven Rostedtc960bb92011-03-08 09:22:39 -05002526 }
2527 }
2528}
2529
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002530sub child_run_test {
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002531 my $failed = 0;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002532
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002533 # child should have no power
Steven Rostedta75fece2010-11-02 14:58:27 -04002534 $reboot_on_error = 0;
2535 $poweroff_on_error = 0;
2536 $die_on_failure = 1;
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002537
Satoru Takeuchif983a2b2014-03-02 21:20:31 +09002538 run_command $run_test, $testlog or $failed = 1;
Rabin Vincenta9dd5d62011-11-18 17:05:29 +05302539
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002540 exit $failed;
2541}
2542
2543my $child_done;
2544
2545sub child_finished {
2546 $child_done = 1;
2547}
2548
2549sub do_run_test {
2550 my $child_pid;
2551 my $child_exit;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002552 my $line;
2553 my $full_line;
2554 my $bug = 0;
Steven Rostedt9b1d3672012-07-30 14:30:53 -04002555 my $bug_ignored = 0;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002556
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05002557 my $start_time = time;
2558
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002559 wait_for_monitor 1;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002560
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002561 doprint "run test $run_test\n";
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002562
2563 $child_done = 0;
2564
2565 $SIG{CHLD} = qw(child_finished);
2566
2567 $child_pid = fork;
2568
2569 child_run_test if (!$child_pid);
2570
2571 $full_line = "";
2572
2573 do {
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002574 $line = wait_for_input($monitor_fp, 1);
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002575 if (defined($line)) {
2576
2577 # we are not guaranteed to get a full line
2578 $full_line .= $line;
Steven Rostedt8ea0e062011-03-08 09:44:35 -05002579 doprint $line;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002580
2581 if ($full_line =~ /call trace:/i) {
Steven Rostedt9b1d3672012-07-30 14:30:53 -04002582 if ($ignore_errors) {
2583 $bug_ignored = 1;
2584 } else {
2585 $bug = 1;
2586 }
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002587 }
2588
2589 if ($full_line =~ /Kernel panic -/) {
2590 $bug = 1;
2591 }
2592
2593 if ($line =~ /\n/) {
2594 $full_line = "";
2595 }
2596 }
2597 } while (!$child_done && !$bug);
2598
Steven Rostedt9b1d3672012-07-30 14:30:53 -04002599 if (!$bug && $bug_ignored) {
2600 doprint "WARNING: Call Trace detected but ignored due to IGNORE_ERRORS=1\n";
2601 }
2602
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002603 if ($bug) {
Steven Rostedt8ea0e062011-03-08 09:44:35 -05002604 my $failure_start = time;
2605 my $now;
2606 do {
2607 $line = wait_for_input($monitor_fp, 1);
2608 if (defined($line)) {
2609 doprint $line;
2610 }
2611 $now = time;
2612 if ($now - $failure_start >= $stop_after_failure) {
2613 last;
2614 }
2615 } while (defined($line));
2616
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002617 doprint "Detected kernel crash!\n";
2618 # kill the child with extreme prejudice
2619 kill 9, $child_pid;
2620 }
2621
2622 waitpid $child_pid, 0;
2623 $child_exit = $?;
2624
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05002625 my $end_time = time;
2626 $test_time = $end_time - $start_time;
2627
Steven Rostedtc5dacb82011-12-22 12:43:57 -05002628 if (!$bug && $in_bisect) {
2629 if (defined($bisect_ret_good)) {
2630 if ($child_exit == $bisect_ret_good) {
2631 return 1;
2632 }
2633 }
2634 if (defined($bisect_ret_skip)) {
2635 if ($child_exit == $bisect_ret_skip) {
2636 return -1;
2637 }
2638 }
2639 if (defined($bisect_ret_abort)) {
2640 if ($child_exit == $bisect_ret_abort) {
2641 fail "test abort" and return -2;
2642 }
2643 }
2644 if (defined($bisect_ret_bad)) {
2645 if ($child_exit == $bisect_ret_skip) {
2646 return 0;
2647 }
2648 }
2649 if (defined($bisect_ret_default)) {
2650 if ($bisect_ret_default eq "good") {
2651 return 1;
2652 } elsif ($bisect_ret_default eq "bad") {
2653 return 0;
2654 } elsif ($bisect_ret_default eq "skip") {
2655 return -1;
2656 } elsif ($bisect_ret_default eq "abort") {
2657 return -2;
2658 } else {
2659 fail "unknown default action: $bisect_ret_default"
2660 and return -2;
2661 }
2662 }
2663 }
2664
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002665 if ($bug || $child_exit) {
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002666 return 0 if $in_bisect;
2667 fail "test failed" and return 0;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002668 }
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002669 return 1;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002670}
2671
Steven Rostedta75fece2010-11-02 14:58:27 -04002672sub run_git_bisect {
2673 my ($command) = @_;
2674
2675 doprint "$command ... ";
2676
2677 my $output = `$command 2>&1`;
2678 my $ret = $?;
2679
2680 logit $output;
2681
2682 if ($ret) {
2683 doprint "FAILED\n";
2684 dodie "Failed to git bisect";
2685 }
2686
2687 doprint "SUCCESS\n";
2688 if ($output =~ m/^(Bisecting: .*\(roughly \d+ steps?\))\s+\[([[:xdigit:]]+)\]/) {
2689 doprint "$1 [$2]\n";
2690 } elsif ($output =~ m/^([[:xdigit:]]+) is the first bad commit/) {
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002691 $bisect_bad_commit = $1;
Steven Rostedta75fece2010-11-02 14:58:27 -04002692 doprint "Found bad commit... $1\n";
2693 return 0;
2694 } else {
2695 # we already logged it, just print it now.
2696 print $output;
2697 }
2698
2699 return 1;
2700}
2701
Steven Rostedtc23dca72011-03-08 09:26:31 -05002702sub bisect_reboot {
2703 doprint "Reboot and sleep $bisect_sleep_time seconds\n";
Steven Rostedtbc7c5802011-12-22 16:29:10 -05002704 reboot_to_good $bisect_sleep_time;
Steven Rostedtc23dca72011-03-08 09:26:31 -05002705}
2706
2707# returns 1 on success, 0 on failure, -1 on skip
Steven Rostedt0a05c762010-11-08 11:14:10 -05002708sub run_bisect_test {
2709 my ($type, $buildtype) = @_;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002710
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002711 my $failed = 0;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002712 my $result;
2713 my $output;
2714 my $ret;
2715
Steven Rostedt0a05c762010-11-08 11:14:10 -05002716 $in_bisect = 1;
2717
2718 build $buildtype or $failed = 1;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002719
2720 if ($type ne "build") {
Steven Rostedtc23dca72011-03-08 09:26:31 -05002721 if ($failed && $bisect_skip) {
2722 $in_bisect = 0;
2723 return -1;
2724 }
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002725 dodie "Failed on build" if $failed;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002726
2727 # Now boot the box
Steven Rostedt (Red Hat)64d98282015-01-28 15:17:35 -05002728 start_monitor_and_install or $failed = 1;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002729
2730 if ($type ne "boot") {
Steven Rostedtc23dca72011-03-08 09:26:31 -05002731 if ($failed && $bisect_skip) {
2732 end_monitor;
2733 bisect_reboot;
2734 $in_bisect = 0;
2735 return -1;
2736 }
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002737 dodie "Failed on boot" if $failed;
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002738
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04002739 do_run_test or $failed = 1;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002740 }
Steven Rostedt7faafbd2010-11-02 14:58:22 -04002741 end_monitor;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002742 }
2743
2744 if ($failed) {
Steven Rostedt0a05c762010-11-08 11:14:10 -05002745 $result = 0;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002746 } else {
Steven Rostedt0a05c762010-11-08 11:14:10 -05002747 $result = 1;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002748 }
Steven Rostedt4025bc62011-05-20 09:16:29 -04002749
2750 # reboot the box to a kernel we can ssh to
2751 if ($type ne "build") {
2752 bisect_reboot;
2753 }
Steven Rostedt0a05c762010-11-08 11:14:10 -05002754 $in_bisect = 0;
2755
2756 return $result;
2757}
2758
2759sub run_bisect {
2760 my ($type) = @_;
2761 my $buildtype = "oldconfig";
2762
2763 # We should have a minconfig to use?
2764 if (defined($minconfig)) {
2765 $buildtype = "useconfig:$minconfig";
2766 }
2767
Steven Rostedt (Red Hat)961d9ca2014-01-18 19:52:13 -05002768 # If the user sets bisect_tries to less than 1, then no tries
2769 # is a success.
2770 my $ret = 1;
Steven Rostedt0a05c762010-11-08 11:14:10 -05002771
Steven Rostedt (Red Hat)961d9ca2014-01-18 19:52:13 -05002772 # Still let the user manually decide that though.
2773 if ($bisect_tries < 1 && $bisect_manual) {
Steven Rostedtc960bb92011-03-08 09:22:39 -05002774 $ret = answer_bisect;
2775 }
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002776
Steven Rostedt (Red Hat)961d9ca2014-01-18 19:52:13 -05002777 for (my $i = 0; $i < $bisect_tries; $i++) {
2778 if ($bisect_tries > 1) {
2779 my $t = $i + 1;
2780 doprint("Running bisect trial $t of $bisect_tries:\n");
2781 }
2782 $ret = run_bisect_test $type, $buildtype;
2783
2784 if ($bisect_manual) {
2785 $ret = answer_bisect;
2786 }
2787
2788 last if (!$ret);
2789 }
2790
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04002791 # Are we looking for where it worked, not failed?
Russ Dill5158ba3e2012-04-23 19:43:00 -07002792 if ($reverse_bisect && $ret >= 0) {
Steven Rostedt0a05c762010-11-08 11:14:10 -05002793 $ret = !$ret;
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04002794 }
2795
Steven Rostedtc23dca72011-03-08 09:26:31 -05002796 if ($ret > 0) {
Steven Rostedt0a05c762010-11-08 11:14:10 -05002797 return "good";
Steven Rostedtc23dca72011-03-08 09:26:31 -05002798 } elsif ($ret == 0) {
Steven Rostedt0a05c762010-11-08 11:14:10 -05002799 return "bad";
Steven Rostedtc23dca72011-03-08 09:26:31 -05002800 } elsif ($bisect_skip) {
2801 doprint "HIT A BAD COMMIT ... SKIPPING\n";
2802 return "skip";
Steven Rostedt0a05c762010-11-08 11:14:10 -05002803 }
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002804}
2805
Steven Rostedtdad98752011-11-22 20:48:57 -05002806sub update_bisect_replay {
2807 my $tmp_log = "$tmpdir/ktest_bisect_log";
2808 run_command "git bisect log > $tmp_log" or
2809 die "can't create bisect log";
2810 return $tmp_log;
2811}
2812
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002813sub bisect {
2814 my ($i) = @_;
2815
2816 my $result;
2817
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002818 die "BISECT_GOOD[$i] not defined\n" if (!defined($bisect_good));
2819 die "BISECT_BAD[$i] not defined\n" if (!defined($bisect_bad));
2820 die "BISECT_TYPE[$i] not defined\n" if (!defined($bisect_type));
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002821
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002822 my $good = $bisect_good;
2823 my $bad = $bisect_bad;
2824 my $type = $bisect_type;
2825 my $start = $bisect_start;
2826 my $replay = $bisect_replay;
2827 my $start_files = $bisect_files;
Steven Rostedt3410f6f2011-03-08 09:38:12 -05002828
2829 if (defined($start_files)) {
2830 $start_files = " -- " . $start_files;
2831 } else {
2832 $start_files = "";
2833 }
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002834
Steven Rostedta57419b2010-11-02 15:13:54 -04002835 # convert to true sha1's
2836 $good = get_sha1($good);
2837 $bad = get_sha1($bad);
2838
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002839 if (defined($bisect_reverse) && $bisect_reverse == 1) {
Steven Rostedtd6ce2a02010-11-02 14:58:05 -04002840 doprint "Performing a reverse bisect (bad is good, good is bad!)\n";
2841 $reverse_bisect = 1;
2842 } else {
2843 $reverse_bisect = 0;
2844 }
2845
Steven Rostedt5a391fb2010-11-02 14:57:43 -04002846 # Can't have a test without having a test to run
2847 if ($type eq "test" && !defined($run_test)) {
2848 $type = "boot";
2849 }
2850
Steven Rostedtdad98752011-11-22 20:48:57 -05002851 # Check if a bisect was running
2852 my $bisect_start_file = "$builddir/.git/BISECT_START";
2853
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002854 my $check = $bisect_check;
Steven Rostedtdad98752011-11-22 20:48:57 -05002855 my $do_check = defined($check) && $check ne "0";
2856
2857 if ( -f $bisect_start_file ) {
2858 print "Bisect in progress found\n";
2859 if ($do_check) {
2860 print " If you say yes, then no checks of good or bad will be done\n";
2861 }
2862 if (defined($replay)) {
2863 print "** BISECT_REPLAY is defined in config file **";
2864 print " Ignore config option and perform new git bisect log?\n";
2865 if (read_ync " (yes, no, or cancel) ") {
2866 $replay = update_bisect_replay;
2867 $do_check = 0;
2868 }
2869 } elsif (read_yn "read git log and continue?") {
2870 $replay = update_bisect_replay;
2871 $do_check = 0;
2872 }
2873 }
2874
2875 if ($do_check) {
Steven Rostedta75fece2010-11-02 14:58:27 -04002876
2877 # get current HEAD
Steven Rostedta57419b2010-11-02 15:13:54 -04002878 my $head = get_sha1("HEAD");
Steven Rostedta75fece2010-11-02 14:58:27 -04002879
2880 if ($check ne "good") {
2881 doprint "TESTING BISECT BAD [$bad]\n";
2882 run_command "git checkout $bad" or
2883 die "Failed to checkout $bad";
2884
2885 $result = run_bisect $type;
2886
2887 if ($result ne "bad") {
2888 fail "Tested BISECT_BAD [$bad] and it succeeded" and return 0;
2889 }
2890 }
2891
2892 if ($check ne "bad") {
2893 doprint "TESTING BISECT GOOD [$good]\n";
2894 run_command "git checkout $good" or
2895 die "Failed to checkout $good";
2896
2897 $result = run_bisect $type;
2898
2899 if ($result ne "good") {
2900 fail "Tested BISECT_GOOD [$good] and it failed" and return 0;
2901 }
2902 }
2903
2904 # checkout where we started
2905 run_command "git checkout $head" or
2906 die "Failed to checkout $head";
2907 }
2908
Steven Rostedt3410f6f2011-03-08 09:38:12 -05002909 run_command "git bisect start$start_files" or
Steven Rostedta75fece2010-11-02 14:58:27 -04002910 dodie "could not start bisect";
2911
Steven Rostedta75fece2010-11-02 14:58:27 -04002912 if (defined($replay)) {
2913 run_command "git bisect replay $replay" or
2914 dodie "failed to run replay";
Steven Rostedt (Red Hat)d832d742014-10-07 16:34:25 -04002915 } else {
2916
2917 run_command "git bisect good $good" or
2918 dodie "could not set bisect good to $good";
2919
2920 run_git_bisect "git bisect bad $bad" or
2921 dodie "could not set bisect bad to $bad";
2922
Steven Rostedta75fece2010-11-02 14:58:27 -04002923 }
2924
2925 if (defined($start)) {
2926 run_command "git checkout $start" or
2927 dodie "failed to checkout $start";
2928 }
2929
2930 my $test;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002931 do {
2932 $result = run_bisect $type;
Steven Rostedta75fece2010-11-02 14:58:27 -04002933 $test = run_git_bisect "git bisect $result";
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05002934 print_times;
Steven Rostedta75fece2010-11-02 14:58:27 -04002935 } while ($test);
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002936
2937 run_command "git bisect log" or
2938 dodie "could not capture git bisect log";
2939
2940 run_command "git bisect reset" or
2941 dodie "could not reset git bisect";
2942
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05002943 doprint "Bad commit was [$bisect_bad_commit]\n";
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04002944
Steven Rostedt0a05c762010-11-08 11:14:10 -05002945 success $i;
2946}
2947
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002948# config_ignore holds the configs that were set (or unset) for
2949# a good config and we will ignore these configs for the rest
2950# of a config bisect. These configs stay as they were.
Steven Rostedt0a05c762010-11-08 11:14:10 -05002951my %config_ignore;
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002952
2953# config_set holds what all configs were set as.
Steven Rostedt0a05c762010-11-08 11:14:10 -05002954my %config_set;
2955
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002956# config_off holds the set of configs that the bad config had disabled.
2957# We need to record them and set them in the .config when running
Adam Leefb16d892012-09-01 01:05:17 +08002958# olddefconfig, because olddefconfig keeps the defaults.
Steven Rostedtcf79fab2012-07-19 15:29:43 -04002959my %config_off;
2960
2961# config_off_tmp holds a set of configs to turn off for now
2962my @config_off_tmp;
2963
2964# config_list is the set of configs that are being tested
Steven Rostedt0a05c762010-11-08 11:14:10 -05002965my %config_list;
2966my %null_config;
2967
2968my %dependency;
2969
Steven Rostedt4c4ab122011-07-15 21:16:17 -04002970sub assign_configs {
2971 my ($hash, $config) = @_;
Steven Rostedt0a05c762010-11-08 11:14:10 -05002972
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04002973 doprint "Reading configs from $config\n";
2974
Steven Rostedt0a05c762010-11-08 11:14:10 -05002975 open (IN, $config)
2976 or dodie "Failed to read $config";
2977
2978 while (<IN>) {
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04002979 chomp;
Steven Rostedt9bf71742011-06-01 23:27:19 -04002980 if (/^((CONFIG\S*)=.*)/) {
Steven Rostedt4c4ab122011-07-15 21:16:17 -04002981 ${$hash}{$2} = $1;
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04002982 } elsif (/^(# (CONFIG\S*) is not set)/) {
2983 ${$hash}{$2} = $1;
Steven Rostedt0a05c762010-11-08 11:14:10 -05002984 }
2985 }
2986
2987 close(IN);
2988}
2989
Steven Rostedt4c4ab122011-07-15 21:16:17 -04002990sub process_config_ignore {
2991 my ($config) = @_;
2992
2993 assign_configs \%config_ignore, $config;
2994}
2995
Steven Rostedt0a05c762010-11-08 11:14:10 -05002996sub get_dependencies {
2997 my ($config) = @_;
2998
2999 my $arr = $dependency{$config};
3000 if (!defined($arr)) {
3001 return ();
3002 }
3003
3004 my @deps = @{$arr};
3005
3006 foreach my $dep (@{$arr}) {
3007 print "ADD DEP $dep\n";
3008 @deps = (@deps, get_dependencies $dep);
3009 }
3010
3011 return @deps;
3012}
3013
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003014sub save_config {
3015 my ($pc, $file) = @_;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003016
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003017 my %configs = %{$pc};
Steven Rostedt0a05c762010-11-08 11:14:10 -05003018
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003019 doprint "Saving configs into $file\n";
Steven Rostedt0a05c762010-11-08 11:14:10 -05003020
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003021 open(OUT, ">$file") or dodie "Can not write to $file";
Steven Rostedtcf79fab2012-07-19 15:29:43 -04003022
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003023 foreach my $config (keys %configs) {
3024 print OUT "$configs{$config}\n";
Steven Rostedt0a05c762010-11-08 11:14:10 -05003025 }
3026 close(OUT);
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003027}
3028
3029sub create_config {
3030 my ($name, $pc) = @_;
3031
3032 doprint "Creating old config from $name configs\n";
3033
3034 save_config $pc, $output_config;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003035
Steven Rostedtfcb3f162011-06-13 10:40:58 -04003036 make_oldconfig;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003037}
3038
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003039# compare two config hashes, and return configs with different vals.
3040# It returns B's config values, but you can use A to see what A was.
3041sub diff_config_vals {
3042 my ($pa, $pb) = @_;
3043
3044 # crappy Perl way to pass in hashes.
3045 my %a = %{$pa};
3046 my %b = %{$pb};
3047
3048 my %ret;
3049
3050 foreach my $item (keys %a) {
3051 if (defined($b{$item}) && $b{$item} ne $a{$item}) {
3052 $ret{$item} = $b{$item};
3053 }
3054 }
3055
3056 return %ret;
3057}
3058
3059# compare two config hashes and return the configs in B but not A
3060sub diff_configs {
3061 my ($pa, $pb) = @_;
3062
3063 my %ret;
3064
3065 # crappy Perl way to pass in hashes.
3066 my %a = %{$pa};
3067 my %b = %{$pb};
3068
3069 foreach my $item (keys %b) {
3070 if (!defined($a{$item})) {
3071 $ret{$item} = $b{$item};
3072 }
3073 }
3074
3075 return %ret;
3076}
3077
3078# return if two configs are equal or not
3079# 0 is equal +1 b has something a does not
3080# +1 if a and b have a different item.
3081# -1 if a has something b does not
Steven Rostedt0a05c762010-11-08 11:14:10 -05003082sub compare_configs {
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003083 my ($pa, $pb) = @_;
3084
3085 my %ret;
3086
3087 # crappy Perl way to pass in hashes.
3088 my %a = %{$pa};
3089 my %b = %{$pb};
3090
3091 foreach my $item (keys %b) {
3092 if (!defined($a{$item})) {
3093 return 1;
3094 }
3095 if ($a{$item} ne $b{$item}) {
3096 return 1;
3097 }
3098 }
Steven Rostedt0a05c762010-11-08 11:14:10 -05003099
3100 foreach my $item (keys %a) {
3101 if (!defined($b{$item})) {
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003102 return -1;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003103 }
Steven Rostedt0a05c762010-11-08 11:14:10 -05003104 }
3105
Steven Rostedt0a05c762010-11-08 11:14:10 -05003106 return 0;
3107}
3108
3109sub run_config_bisect_test {
3110 my ($type) = @_;
3111
Steven Rostedt (Red Hat)4cc559b2014-04-23 22:27:27 -04003112 my $ret = run_bisect_test $type, "oldconfig";
3113
3114 if ($bisect_manual) {
3115 $ret = answer_bisect;
3116 }
3117
3118 return $ret;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003119}
3120
Steven Rostedt0a05c762010-11-08 11:14:10 -05003121sub process_failed {
3122 my ($config) = @_;
3123
3124 doprint "\n\n***************************************\n";
3125 doprint "Found bad config: $config\n";
3126 doprint "***************************************\n\n";
3127}
3128
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003129# used for config bisecting
3130my $good_config;
3131my $bad_config;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003132
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003133sub process_new_config {
3134 my ($tc, $nc, $gc, $bc) = @_;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003135
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003136 my %tmp_config = %{$tc};
3137 my %good_configs = %{$gc};
3138 my %bad_configs = %{$bc};
3139
3140 my %new_configs;
3141
3142 my $runtest = 1;
3143 my $ret;
3144
3145 create_config "tmp_configs", \%tmp_config;
3146 assign_configs \%new_configs, $output_config;
3147
3148 $ret = compare_configs \%new_configs, \%bad_configs;
3149 if (!$ret) {
3150 doprint "New config equals bad config, try next test\n";
3151 $runtest = 0;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003152 }
3153
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003154 if ($runtest) {
3155 $ret = compare_configs \%new_configs, \%good_configs;
3156 if (!$ret) {
3157 doprint "New config equals good config, try next test\n";
3158 $runtest = 0;
3159 }
3160 }
3161
3162 %{$nc} = %new_configs;
3163
3164 return $runtest;
3165}
3166
3167sub run_config_bisect {
3168 my ($pgood, $pbad) = @_;
3169
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05003170 my $type = $config_bisect_type;
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003171
3172 my %good_configs = %{$pgood};
3173 my %bad_configs = %{$pbad};
3174
3175 my %diff_configs = diff_config_vals \%good_configs, \%bad_configs;
3176 my %b_configs = diff_configs \%good_configs, \%bad_configs;
3177 my %g_configs = diff_configs \%bad_configs, \%good_configs;
3178
3179 my @diff_arr = keys %diff_configs;
3180 my $len_diff = $#diff_arr + 1;
3181
3182 my @b_arr = keys %b_configs;
3183 my $len_b = $#b_arr + 1;
3184
3185 my @g_arr = keys %g_configs;
3186 my $len_g = $#g_arr + 1;
3187
3188 my $runtest = 1;
3189 my %new_configs;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003190 my $ret;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003191
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003192 # First, lets get it down to a single subset.
3193 # Is the problem with a difference in values?
3194 # Is the problem with a missing config?
3195 # Is the problem with a config that breaks things?
Steven Rostedt0a05c762010-11-08 11:14:10 -05003196
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003197 # Enable all of one set and see if we get a new bad
3198 # or good config.
Steven Rostedt0a05c762010-11-08 11:14:10 -05003199
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003200 # first set the good config to the bad values.
Steven Rostedt0a05c762010-11-08 11:14:10 -05003201
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003202 doprint "d=$len_diff g=$len_g b=$len_b\n";
Steven Rostedtcf79fab2012-07-19 15:29:43 -04003203
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003204 # first lets enable things in bad config that are enabled in good config
Steven Rostedt0a05c762010-11-08 11:14:10 -05003205
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003206 if ($len_diff > 0) {
3207 if ($len_b > 0 || $len_g > 0) {
3208 my %tmp_config = %bad_configs;
3209
3210 doprint "Set tmp config to be bad config with good config values\n";
3211 foreach my $item (@diff_arr) {
3212 $tmp_config{$item} = $good_configs{$item};
Steven Rostedt0a05c762010-11-08 11:14:10 -05003213 }
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003214
3215 $runtest = process_new_config \%tmp_config, \%new_configs,
3216 \%good_configs, \%bad_configs;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003217 }
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003218 }
Steven Rostedtcf79fab2012-07-19 15:29:43 -04003219
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003220 if (!$runtest && $len_diff > 0) {
Steven Rostedtcf79fab2012-07-19 15:29:43 -04003221
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003222 if ($len_diff == 1) {
Steven Rostedt (Red Hat)4186cb42014-04-23 22:09:59 -04003223 process_failed $diff_arr[0];
Steven Rostedt0a05c762010-11-08 11:14:10 -05003224 return 1;
3225 }
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003226 my %tmp_config = %bad_configs;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003227
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003228 my $half = int($#diff_arr / 2);
3229 my @tophalf = @diff_arr[0 .. $half];
Steven Rostedt0a05c762010-11-08 11:14:10 -05003230
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003231 doprint "Settings bisect with top half:\n";
3232 doprint "Set tmp config to be bad config with some good config values\n";
3233 foreach my $item (@tophalf) {
3234 $tmp_config{$item} = $good_configs{$item};
3235 }
Steven Rostedtc960bb92011-03-08 09:22:39 -05003236
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003237 $runtest = process_new_config \%tmp_config, \%new_configs,
3238 \%good_configs, \%bad_configs;
3239
3240 if (!$runtest) {
3241 my %tmp_config = %bad_configs;
3242
3243 doprint "Try bottom half\n";
3244
3245 my @bottomhalf = @diff_arr[$half+1 .. $#diff_arr];
3246
3247 foreach my $item (@bottomhalf) {
3248 $tmp_config{$item} = $good_configs{$item};
3249 }
3250
3251 $runtest = process_new_config \%tmp_config, \%new_configs,
3252 \%good_configs, \%bad_configs;
3253 }
Steven Rostedtc960bb92011-03-08 09:22:39 -05003254 }
3255
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003256 if ($runtest) {
3257 $ret = run_config_bisect_test $type;
3258 if ($ret) {
3259 doprint "NEW GOOD CONFIG\n";
3260 %good_configs = %new_configs;
3261 run_command "mv $good_config ${good_config}.last";
3262 save_config \%good_configs, $good_config;
3263 %{$pgood} = %good_configs;
3264 } else {
3265 doprint "NEW BAD CONFIG\n";
3266 %bad_configs = %new_configs;
3267 run_command "mv $bad_config ${bad_config}.last";
3268 save_config \%bad_configs, $bad_config;
3269 %{$pbad} = %bad_configs;
3270 }
Steven Rostedt0a05c762010-11-08 11:14:10 -05003271 return 0;
3272 }
3273
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003274 fail "Hmm, need to do a mix match?\n";
3275 return -1;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003276}
3277
3278sub config_bisect {
3279 my ($i) = @_;
3280
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003281 my $type = $config_bisect_type;
Steven Rostedt (Red Hat)c4d1d112014-04-23 22:04:56 -04003282 my $ret;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003283
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003284 $bad_config = $config_bisect;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003285
Steven Rostedt30f75da2011-06-13 10:35:35 -04003286 if (defined($config_bisect_good)) {
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003287 $good_config = $config_bisect_good;
3288 } elsif (defined($minconfig)) {
3289 $good_config = $minconfig;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003290 } else {
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003291 doprint "No config specified, checking if defconfig works";
Steven Rostedt (Red Hat)c4d1d112014-04-23 22:04:56 -04003292 $ret = run_bisect_test $type, "defconfig";
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003293 if (!$ret) {
3294 fail "Have no good config to compare with, please set CONFIG_BISECT_GOOD";
3295 return 1;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003296 }
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003297 $good_config = $output_config;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003298 }
3299
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003300 # we don't want min configs to cause issues here.
3301 doprint "Disabling 'MIN_CONFIG' for this test\n";
3302 undef $minconfig;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003303
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003304 my %good_configs;
3305 my %bad_configs;
3306 my %tmp_configs;
Steven Rostedtcf79fab2012-07-19 15:29:43 -04003307
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003308 doprint "Run good configs through make oldconfig\n";
3309 assign_configs \%tmp_configs, $good_config;
3310 create_config "$good_config", \%tmp_configs;
3311 assign_configs \%good_configs, $output_config;
3312
3313 doprint "Run bad configs through make oldconfig\n";
3314 assign_configs \%tmp_configs, $bad_config;
3315 create_config "$bad_config", \%tmp_configs;
3316 assign_configs \%bad_configs, $output_config;
3317
3318 $good_config = "$tmpdir/good_config";
3319 $bad_config = "$tmpdir/bad_config";
3320
3321 save_config \%good_configs, $good_config;
3322 save_config \%bad_configs, $bad_config;
3323
Steven Rostedt (Red Hat)c4d1d112014-04-23 22:04:56 -04003324
3325 if (defined($config_bisect_check) && $config_bisect_check ne "0") {
3326 if ($config_bisect_check ne "good") {
3327 doprint "Testing bad config\n";
3328
3329 $ret = run_bisect_test $type, "useconfig:$bad_config";
3330 if ($ret) {
3331 fail "Bad config succeeded when expected to fail!";
3332 return 0;
3333 }
3334 }
3335 if ($config_bisect_check ne "bad") {
3336 doprint "Testing good config\n";
3337
3338 $ret = run_bisect_test $type, "useconfig:$good_config";
3339 if (!$ret) {
3340 fail "Good config failed when expected to succeed!";
3341 return 0;
3342 }
3343 }
3344 }
Steven Rostedtb0918612012-07-19 15:26:00 -04003345
Steven Rostedt0a05c762010-11-08 11:14:10 -05003346 do {
Steven Rostedt (Red Hat)6071c222014-04-23 15:24:04 -04003347 $ret = run_config_bisect \%good_configs, \%bad_configs;
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05003348 print_times;
Steven Rostedt0a05c762010-11-08 11:14:10 -05003349 } while (!$ret);
3350
3351 return $ret if ($ret < 0);
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04003352
3353 success $i;
3354}
3355
Steven Rostedt27d934b2011-05-20 09:18:18 -04003356sub patchcheck_reboot {
3357 doprint "Reboot and sleep $patchcheck_sleep_time seconds\n";
Steven Rostedtbc7c5802011-12-22 16:29:10 -05003358 reboot_to_good $patchcheck_sleep_time;
Steven Rostedt27d934b2011-05-20 09:18:18 -04003359}
3360
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003361sub patchcheck {
3362 my ($i) = @_;
3363
3364 die "PATCHCHECK_START[$i] not defined\n"
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05003365 if (!defined($patchcheck_start));
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003366 die "PATCHCHECK_TYPE[$i] not defined\n"
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05003367 if (!defined($patchcheck_type));
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003368
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05003369 my $start = $patchcheck_start;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003370
Steven Rostedt (Red Hat)23a0e162014-09-19 20:10:39 -04003371 my $cherry = $patchcheck_cherry;
3372 if (!defined($cherry)) {
3373 $cherry = 0;
3374 }
3375
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003376 my $end = "HEAD";
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05003377 if (defined($patchcheck_end)) {
3378 $end = $patchcheck_end;
Steven Rostedt (Red Hat)23a0e162014-09-19 20:10:39 -04003379 } elsif ($cherry) {
3380 die "PATCHCHECK_END must be defined with PATCHCHECK_CHERRY\n";
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003381 }
3382
Steven Rostedta57419b2010-11-02 15:13:54 -04003383 # Get the true sha1's since we can use things like HEAD~3
3384 $start = get_sha1($start);
3385 $end = get_sha1($end);
3386
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05003387 my $type = $patchcheck_type;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003388
3389 # Can't have a test without having a test to run
3390 if ($type eq "test" && !defined($run_test)) {
3391 $type = "boot";
3392 }
3393
Steven Rostedt (Red Hat)23a0e162014-09-19 20:10:39 -04003394 if ($cherry) {
3395 open (IN, "git cherry -v $start $end|") or
3396 dodie "could not get git list";
3397 } else {
3398 open (IN, "git log --pretty=oneline $end|") or
3399 dodie "could not get git list";
3400 }
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003401
3402 my @list;
3403
3404 while (<IN>) {
3405 chomp;
Steven Rostedt (Red Hat)23a0e162014-09-19 20:10:39 -04003406 # git cherry adds a '+' we want to remove
3407 s/^\+ //;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003408 $list[$#list+1] = $_;
3409 last if (/^$start/);
3410 }
3411 close(IN);
3412
Steven Rostedt (Red Hat)23a0e162014-09-19 20:10:39 -04003413 if (!$cherry) {
3414 if ($list[$#list] !~ /^$start/) {
3415 fail "SHA1 $start not found";
3416 }
3417
3418 # go backwards in the list
3419 @list = reverse @list;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003420 }
3421
Steven Rostedt (Red Hat)23a0e162014-09-19 20:10:39 -04003422 doprint("Going to test the following commits:\n");
3423 foreach my $l (@list) {
3424 doprint "$l\n";
3425 }
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003426
3427 my $save_clean = $noclean;
Steven Rostedt19902072011-06-14 20:46:25 -04003428 my %ignored_warnings;
3429
3430 if (defined($ignore_warnings)) {
3431 foreach my $sha1 (split /\s+/, $ignore_warnings) {
3432 $ignored_warnings{$sha1} = 1;
3433 }
3434 }
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003435
3436 $in_patchcheck = 1;
3437 foreach my $item (@list) {
3438 my $sha1 = $item;
3439 $sha1 =~ s/^([[:xdigit:]]+).*/$1/;
3440
3441 doprint "\nProcessing commit $item\n\n";
3442
3443 run_command "git checkout $sha1" or
3444 die "Failed to checkout $sha1";
3445
3446 # only clean on the first and last patch
3447 if ($item eq $list[0] ||
3448 $item eq $list[$#list]) {
3449 $noclean = $save_clean;
3450 } else {
3451 $noclean = 1;
3452 }
3453
3454 if (defined($minconfig)) {
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04003455 build "useconfig:$minconfig" or return 0;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003456 } else {
3457 # ?? no config to use?
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04003458 build "oldconfig" or return 0;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003459 }
3460
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05003461 # No need to do per patch checking if warnings file exists
3462 if (!defined($warnings_file) && !defined($ignored_warnings{$sha1})) {
3463 check_patch_buildlog $sha1 or return 0;
Steven Rostedt19902072011-06-14 20:46:25 -04003464 }
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003465
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05003466 check_buildlog or return 0;
3467
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003468 next if ($type eq "build");
3469
Steven Rostedt7faafbd2010-11-02 14:58:22 -04003470 my $failed = 0;
3471
Steven Rostedt (Red Hat)64d98282015-01-28 15:17:35 -05003472 start_monitor_and_install or $failed = 1;
Steven Rostedt7faafbd2010-11-02 14:58:22 -04003473
3474 if (!$failed && $type ne "boot"){
3475 do_run_test or $failed = 1;
3476 }
3477 end_monitor;
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05003478 if ($failed) {
3479 print_times;
3480 return 0;
3481 }
Steven Rostedt27d934b2011-05-20 09:18:18 -04003482 patchcheck_reboot;
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05003483 print_times;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003484 }
3485 $in_patchcheck = 0;
3486 success $i;
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04003487
3488 return 1;
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04003489}
3490
Steven Rostedtb9066f62011-07-15 21:25:24 -04003491my %depends;
Steven Rostedtac6974c2011-10-04 09:40:17 -04003492my %depcount;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003493my $iflevel = 0;
3494my @ifdeps;
3495
3496# prevent recursion
3497my %read_kconfigs;
3498
Steven Rostedtac6974c2011-10-04 09:40:17 -04003499sub add_dep {
3500 # $config depends on $dep
3501 my ($config, $dep) = @_;
3502
3503 if (defined($depends{$config})) {
3504 $depends{$config} .= " " . $dep;
3505 } else {
3506 $depends{$config} = $dep;
3507 }
3508
3509 # record the number of configs depending on $dep
3510 if (defined $depcount{$dep}) {
3511 $depcount{$dep}++;
3512 } else {
3513 $depcount{$dep} = 1;
3514 }
3515}
3516
Steven Rostedtb9066f62011-07-15 21:25:24 -04003517# taken from streamline_config.pl
3518sub read_kconfig {
3519 my ($kconfig) = @_;
3520
3521 my $state = "NONE";
3522 my $config;
3523 my @kconfigs;
3524
3525 my $cont = 0;
3526 my $line;
3527
3528
3529 if (! -f $kconfig) {
3530 doprint "file $kconfig does not exist, skipping\n";
3531 return;
3532 }
3533
3534 open(KIN, "$kconfig")
3535 or die "Can't open $kconfig";
3536 while (<KIN>) {
3537 chomp;
3538
3539 # Make sure that lines ending with \ continue
3540 if ($cont) {
3541 $_ = $line . " " . $_;
3542 }
3543
3544 if (s/\\$//) {
3545 $cont = 1;
3546 $line = $_;
3547 next;
3548 }
3549
3550 $cont = 0;
3551
3552 # collect any Kconfig sources
3553 if (/^source\s*"(.*)"/) {
3554 $kconfigs[$#kconfigs+1] = $1;
3555 }
3556
3557 # configs found
3558 if (/^\s*(menu)?config\s+(\S+)\s*$/) {
3559 $state = "NEW";
3560 $config = $2;
3561
3562 for (my $i = 0; $i < $iflevel; $i++) {
Steven Rostedtac6974c2011-10-04 09:40:17 -04003563 add_dep $config, $ifdeps[$i];
Steven Rostedtb9066f62011-07-15 21:25:24 -04003564 }
3565
3566 # collect the depends for the config
3567 } elsif ($state eq "NEW" && /^\s*depends\s+on\s+(.*)$/) {
3568
Steven Rostedtac6974c2011-10-04 09:40:17 -04003569 add_dep $config, $1;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003570
3571 # Get the configs that select this config
Steven Rostedtac6974c2011-10-04 09:40:17 -04003572 } elsif ($state eq "NEW" && /^\s*select\s+(\S+)/) {
3573
3574 # selected by depends on config
3575 add_dep $1, $config;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003576
3577 # Check for if statements
3578 } elsif (/^if\s+(.*\S)\s*$/) {
3579 my $deps = $1;
3580 # remove beginning and ending non text
3581 $deps =~ s/^[^a-zA-Z0-9_]*//;
3582 $deps =~ s/[^a-zA-Z0-9_]*$//;
3583
3584 my @deps = split /[^a-zA-Z0-9_]+/, $deps;
3585
3586 $ifdeps[$iflevel++] = join ':', @deps;
3587
3588 } elsif (/^endif/) {
3589
3590 $iflevel-- if ($iflevel);
3591
3592 # stop on "help"
3593 } elsif (/^\s*help\s*$/) {
3594 $state = "NONE";
3595 }
3596 }
3597 close(KIN);
3598
3599 # read in any configs that were found.
3600 foreach $kconfig (@kconfigs) {
3601 if (!defined($read_kconfigs{$kconfig})) {
3602 $read_kconfigs{$kconfig} = 1;
3603 read_kconfig("$builddir/$kconfig");
3604 }
3605 }
3606}
3607
3608sub read_depends {
3609 # find out which arch this is by the kconfig file
3610 open (IN, $output_config)
3611 or dodie "Failed to read $output_config";
3612 my $arch;
3613 while (<IN>) {
3614 if (m,Linux/(\S+)\s+\S+\s+Kernel Configuration,) {
3615 $arch = $1;
3616 last;
3617 }
3618 }
3619 close IN;
3620
3621 if (!defined($arch)) {
3622 doprint "Could not find arch from config file\n";
3623 doprint "no dependencies used\n";
3624 return;
3625 }
3626
3627 # arch is really the subarch, we need to know
3628 # what directory to look at.
3629 if ($arch eq "i386" || $arch eq "x86_64") {
3630 $arch = "x86";
3631 } elsif ($arch =~ /^tile/) {
3632 $arch = "tile";
3633 }
3634
3635 my $kconfig = "$builddir/arch/$arch/Kconfig";
3636
3637 if (! -f $kconfig && $arch =~ /\d$/) {
3638 my $orig = $arch;
3639 # some subarchs have numbers, truncate them
3640 $arch =~ s/\d*$//;
3641 $kconfig = "$builddir/arch/$arch/Kconfig";
3642 if (! -f $kconfig) {
3643 doprint "No idea what arch dir $orig is for\n";
3644 doprint "no dependencies used\n";
3645 return;
3646 }
3647 }
3648
3649 read_kconfig($kconfig);
3650}
3651
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003652sub make_new_config {
3653 my @configs = @_;
3654
3655 open (OUT, ">$output_config")
3656 or dodie "Failed to write $output_config";
3657
3658 foreach my $config (@configs) {
3659 print OUT "$config\n";
3660 }
3661 close OUT;
3662}
3663
Steven Rostedtac6974c2011-10-04 09:40:17 -04003664sub chomp_config {
3665 my ($config) = @_;
3666
3667 $config =~ s/CONFIG_//;
3668
3669 return $config;
3670}
3671
Steven Rostedtb9066f62011-07-15 21:25:24 -04003672sub get_depends {
3673 my ($dep) = @_;
3674
Steven Rostedtac6974c2011-10-04 09:40:17 -04003675 my $kconfig = chomp_config $dep;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003676
3677 $dep = $depends{"$kconfig"};
3678
3679 # the dep string we have saves the dependencies as they
3680 # were found, including expressions like ! && ||. We
3681 # want to split this out into just an array of configs.
3682
3683 my $valid = "A-Za-z_0-9";
3684
3685 my @configs;
3686
3687 while ($dep =~ /[$valid]/) {
3688
3689 if ($dep =~ /^[^$valid]*([$valid]+)/) {
3690 my $conf = "CONFIG_" . $1;
3691
3692 $configs[$#configs + 1] = $conf;
3693
3694 $dep =~ s/^[^$valid]*[$valid]+//;
3695 } else {
3696 die "this should never happen";
3697 }
3698 }
3699
3700 return @configs;
3701}
3702
3703my %min_configs;
3704my %keep_configs;
Steven Rostedt43d1b652011-07-15 22:01:56 -04003705my %save_configs;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003706my %processed_configs;
3707my %nochange_config;
3708
3709sub test_this_config {
3710 my ($config) = @_;
3711
3712 my $found;
3713
3714 # if we already processed this config, skip it
3715 if (defined($processed_configs{$config})) {
3716 return undef;
3717 }
3718 $processed_configs{$config} = 1;
3719
3720 # if this config failed during this round, skip it
3721 if (defined($nochange_config{$config})) {
3722 return undef;
3723 }
3724
Steven Rostedtac6974c2011-10-04 09:40:17 -04003725 my $kconfig = chomp_config $config;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003726
3727 # Test dependencies first
3728 if (defined($depends{"$kconfig"})) {
3729 my @parents = get_depends $config;
3730 foreach my $parent (@parents) {
3731 # if the parent is in the min config, check it first
3732 next if (!defined($min_configs{$parent}));
3733 $found = test_this_config($parent);
3734 if (defined($found)) {
3735 return $found;
3736 }
3737 }
3738 }
3739
3740 # Remove this config from the list of configs
Adam Leefb16d892012-09-01 01:05:17 +08003741 # do a make olddefconfig and then read the resulting
Steven Rostedtb9066f62011-07-15 21:25:24 -04003742 # .config to make sure it is missing the config that
3743 # we had before
3744 my %configs = %min_configs;
3745 delete $configs{$config};
3746 make_new_config ((values %configs), (values %keep_configs));
3747 make_oldconfig;
3748 undef %configs;
3749 assign_configs \%configs, $output_config;
3750
Steven Rostedt (Red Hat)9972fc02014-10-22 10:11:47 -04003751 if (!defined($configs{$config}) || $configs{$config} =~ /^#/) {
3752 return $config;
3753 }
Steven Rostedtb9066f62011-07-15 21:25:24 -04003754
3755 doprint "disabling config $config did not change .config\n";
3756
3757 $nochange_config{$config} = 1;
3758
3759 return undef;
3760}
3761
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003762sub make_min_config {
3763 my ($i) = @_;
3764
Steven Rostedtccc513b2012-05-21 17:13:40 -04003765 my $type = $minconfig_type;
3766 if ($type ne "boot" && $type ne "test") {
3767 fail "Invalid MIN_CONFIG_TYPE '$minconfig_type'\n" .
3768 " make_min_config works only with 'boot' and 'test'\n" and return;
3769 }
3770
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003771 if (!defined($output_minconfig)) {
3772 fail "OUTPUT_MIN_CONFIG not defined" and return;
3773 }
Steven Rostedt35ce5952011-07-15 21:57:25 -04003774
3775 # If output_minconfig exists, and the start_minconfig
3776 # came from min_config, than ask if we should use
3777 # that instead.
3778 if (-f $output_minconfig && !$start_minconfig_defined) {
3779 print "$output_minconfig exists\n";
Steven Rostedt43de3312012-05-21 23:35:12 -04003780 if (!defined($use_output_minconfig)) {
3781 if (read_yn " Use it as minconfig?") {
3782 $start_minconfig = $output_minconfig;
3783 }
3784 } elsif ($use_output_minconfig > 0) {
3785 doprint "Using $output_minconfig as MIN_CONFIG\n";
Steven Rostedt35ce5952011-07-15 21:57:25 -04003786 $start_minconfig = $output_minconfig;
Steven Rostedt43de3312012-05-21 23:35:12 -04003787 } else {
3788 doprint "Set to still use MIN_CONFIG as starting point\n";
Steven Rostedt35ce5952011-07-15 21:57:25 -04003789 }
3790 }
3791
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003792 if (!defined($start_minconfig)) {
3793 fail "START_MIN_CONFIG or MIN_CONFIG not defined" and return;
3794 }
3795
Steven Rostedt35ce5952011-07-15 21:57:25 -04003796 my $temp_config = "$tmpdir/temp_config";
3797
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003798 # First things first. We build an allnoconfig to find
3799 # out what the defaults are that we can't touch.
3800 # Some are selections, but we really can't handle selections.
3801
3802 my $save_minconfig = $minconfig;
3803 undef $minconfig;
3804
3805 run_command "$make allnoconfig" or return 0;
3806
Steven Rostedtb9066f62011-07-15 21:25:24 -04003807 read_depends;
3808
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003809 process_config_ignore $output_config;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003810
Steven Rostedt43d1b652011-07-15 22:01:56 -04003811 undef %save_configs;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003812 undef %min_configs;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003813
3814 if (defined($ignore_config)) {
3815 # make sure the file exists
3816 `touch $ignore_config`;
Steven Rostedt43d1b652011-07-15 22:01:56 -04003817 assign_configs \%save_configs, $ignore_config;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003818 }
3819
Steven Rostedt43d1b652011-07-15 22:01:56 -04003820 %keep_configs = %save_configs;
3821
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003822 doprint "Load initial configs from $start_minconfig\n";
3823
3824 # Look at the current min configs, and save off all the
3825 # ones that were set via the allnoconfig
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003826 assign_configs \%min_configs, $start_minconfig;
3827
3828 my @config_keys = keys %min_configs;
3829
Steven Rostedtac6974c2011-10-04 09:40:17 -04003830 # All configs need a depcount
3831 foreach my $config (@config_keys) {
3832 my $kconfig = chomp_config $config;
3833 if (!defined $depcount{$kconfig}) {
3834 $depcount{$kconfig} = 0;
3835 }
3836 }
3837
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003838 # Remove anything that was set by the make allnoconfig
3839 # we shouldn't need them as they get set for us anyway.
3840 foreach my $config (@config_keys) {
3841 # Remove anything in the ignore_config
3842 if (defined($keep_configs{$config})) {
3843 my $file = $ignore_config;
3844 $file =~ s,.*/(.*?)$,$1,;
3845 doprint "$config set by $file ... ignored\n";
3846 delete $min_configs{$config};
3847 next;
3848 }
3849 # But make sure the settings are the same. If a min config
3850 # sets a selection, we do not want to get rid of it if
3851 # it is not the same as what we have. Just move it into
3852 # the keep configs.
3853 if (defined($config_ignore{$config})) {
3854 if ($config_ignore{$config} ne $min_configs{$config}) {
3855 doprint "$config is in allnoconfig as '$config_ignore{$config}'";
3856 doprint " but it is '$min_configs{$config}' in minconfig .. keeping\n";
3857 $keep_configs{$config} = $min_configs{$config};
3858 } else {
3859 doprint "$config set by allnoconfig ... ignored\n";
3860 }
3861 delete $min_configs{$config};
3862 }
3863 }
3864
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003865 my $done = 0;
Steven Rostedtb9066f62011-07-15 21:25:24 -04003866 my $take_two = 0;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003867
3868 while (!$done) {
3869
3870 my $config;
3871 my $found;
3872
3873 # Now disable each config one by one and do a make oldconfig
3874 # till we find a config that changes our list.
3875
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003876 my @test_configs = keys %min_configs;
Steven Rostedtac6974c2011-10-04 09:40:17 -04003877
3878 # Sort keys by who is most dependent on
3879 @test_configs = sort { $depcount{chomp_config($b)} <=> $depcount{chomp_config($a)} }
3880 @test_configs ;
3881
3882 # Put configs that did not modify the config at the end.
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003883 my $reset = 1;
3884 for (my $i = 0; $i < $#test_configs; $i++) {
3885 if (!defined($nochange_config{$test_configs[0]})) {
3886 $reset = 0;
3887 last;
3888 }
3889 # This config didn't change the .config last time.
3890 # Place it at the end
3891 my $config = shift @test_configs;
3892 push @test_configs, $config;
3893 }
3894
3895 # if every test config has failed to modify the .config file
3896 # in the past, then reset and start over.
3897 if ($reset) {
3898 undef %nochange_config;
3899 }
3900
Steven Rostedtb9066f62011-07-15 21:25:24 -04003901 undef %processed_configs;
3902
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003903 foreach my $config (@test_configs) {
3904
Steven Rostedtb9066f62011-07-15 21:25:24 -04003905 $found = test_this_config $config;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003906
Steven Rostedtb9066f62011-07-15 21:25:24 -04003907 last if (defined($found));
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003908
3909 # oh well, try another config
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003910 }
3911
3912 if (!defined($found)) {
Steven Rostedtb9066f62011-07-15 21:25:24 -04003913 # we could have failed due to the nochange_config hash
3914 # reset and try again
3915 if (!$take_two) {
3916 undef %nochange_config;
3917 $take_two = 1;
3918 next;
3919 }
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003920 doprint "No more configs found that we can disable\n";
3921 $done = 1;
3922 last;
3923 }
Steven Rostedtb9066f62011-07-15 21:25:24 -04003924 $take_two = 0;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003925
3926 $config = $found;
3927
3928 doprint "Test with $config disabled\n";
3929
3930 # set in_bisect to keep build and monitor from dieing
3931 $in_bisect = 1;
3932
3933 my $failed = 0;
Steven Rostedtbf1c95a2012-02-27 13:58:49 -05003934 build "oldconfig" or $failed = 1;
3935 if (!$failed) {
Steven Rostedt (Red Hat)64d98282015-01-28 15:17:35 -05003936 start_monitor_and_install or $failed = 1;
Steven Rostedtccc513b2012-05-21 17:13:40 -04003937
3938 if ($type eq "test" && !$failed) {
3939 do_run_test or $failed = 1;
3940 }
3941
Steven Rostedtbf1c95a2012-02-27 13:58:49 -05003942 end_monitor;
3943 }
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003944
3945 $in_bisect = 0;
3946
3947 if ($failed) {
Steven Rostedtb9066f62011-07-15 21:25:24 -04003948 doprint "$min_configs{$config} is needed to boot the box... keeping\n";
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003949 # this config is needed, add it to the ignore list.
3950 $keep_configs{$config} = $min_configs{$config};
Steven Rostedt43d1b652011-07-15 22:01:56 -04003951 $save_configs{$config} = $min_configs{$config};
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003952 delete $min_configs{$config};
Steven Rostedt35ce5952011-07-15 21:57:25 -04003953
3954 # update new ignore configs
3955 if (defined($ignore_config)) {
3956 open (OUT, ">$temp_config")
3957 or die "Can't write to $temp_config";
Steven Rostedt43d1b652011-07-15 22:01:56 -04003958 foreach my $config (keys %save_configs) {
3959 print OUT "$save_configs{$config}\n";
Steven Rostedt35ce5952011-07-15 21:57:25 -04003960 }
3961 close OUT;
3962 run_command "mv $temp_config $ignore_config" or
3963 dodie "failed to copy update to $ignore_config";
3964 }
3965
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003966 } else {
3967 # We booted without this config, remove it from the minconfigs.
3968 doprint "$config is not needed, disabling\n";
3969
3970 delete $min_configs{$config};
3971
3972 # Also disable anything that is not enabled in this config
3973 my %configs;
3974 assign_configs \%configs, $output_config;
3975 my @config_keys = keys %min_configs;
3976 foreach my $config (@config_keys) {
3977 if (!defined($configs{$config})) {
3978 doprint "$config is not set, disabling\n";
3979 delete $min_configs{$config};
3980 }
3981 }
3982
3983 # Save off all the current mandidory configs
Steven Rostedt35ce5952011-07-15 21:57:25 -04003984 open (OUT, ">$temp_config")
3985 or die "Can't write to $temp_config";
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003986 foreach my $config (keys %keep_configs) {
3987 print OUT "$keep_configs{$config}\n";
3988 }
3989 foreach my $config (keys %min_configs) {
3990 print OUT "$min_configs{$config}\n";
3991 }
3992 close OUT;
Steven Rostedt35ce5952011-07-15 21:57:25 -04003993
3994 run_command "mv $temp_config $output_minconfig" or
3995 dodie "failed to copy update to $output_minconfig";
Steven Rostedt4c4ab122011-07-15 21:16:17 -04003996 }
3997
3998 doprint "Reboot and wait $sleep_time seconds\n";
Steven Rostedtbc7c5802011-12-22 16:29:10 -05003999 reboot_to_good $sleep_time;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04004000 }
4001
4002 success $i;
4003 return 1;
4004}
4005
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05004006sub make_warnings_file {
4007 my ($i) = @_;
4008
4009 if (!defined($warnings_file)) {
4010 dodie "Must define WARNINGS_FILE for make_warnings_file test";
4011 }
4012
4013 if ($build_type eq "nobuild") {
4014 dodie "BUILD_TYPE can not be 'nobuild' for make_warnings_file test";
4015 }
4016
4017 build $build_type or dodie "Failed to build";
4018
4019 open(OUT, ">$warnings_file") or dodie "Can't create $warnings_file";
4020
4021 open(IN, $buildlog) or dodie "Can't open $buildlog";
4022 while (<IN>) {
4023
4024 # Some compilers use UTF-8 extended for quotes
4025 # for distcc heterogeneous systems, this causes issues
4026 s/$utf8_quote/'/g;
4027
4028 if (/$check_build_re/) {
4029 print OUT;
4030 }
4031 }
4032 close(IN);
4033
4034 close(OUT);
4035
4036 success $i;
4037}
4038
Satoru Takeuchi5269faa2014-03-09 23:32:04 +09004039$#ARGV < 1 or die "ktest.pl version: $VERSION\n usage: ktest.pl [config-file]\n";
Steven Rostedt2545eb62010-11-02 15:01:32 -04004040
Steven Rostedt8d1491b2010-11-18 15:39:48 -05004041if ($#ARGV == 0) {
4042 $ktest_config = $ARGV[0];
4043 if (! -f $ktest_config) {
4044 print "$ktest_config does not exist.\n";
Steven Rostedt35ce5952011-07-15 21:57:25 -04004045 if (!read_yn "Create it?") {
Steven Rostedt8d1491b2010-11-18 15:39:48 -05004046 exit 0;
4047 }
4048 }
Steven Rostedt8d1491b2010-11-18 15:39:48 -05004049}
4050
4051if (! -f $ktest_config) {
Steven Rostedtdbd37832011-11-23 16:00:48 -05004052 $newconfig = 1;
Steven Rostedtc4261d02011-11-23 13:41:18 -05004053 get_test_case;
Steven Rostedt8d1491b2010-11-18 15:39:48 -05004054 open(OUT, ">$ktest_config") or die "Can not create $ktest_config";
4055 print OUT << "EOF"
4056# Generated by ktest.pl
4057#
Steven Rostedt0e7a22d2011-11-21 20:39:33 -05004058
4059# PWD is a ktest.pl variable that will result in the process working
4060# directory that ktest.pl is executed in.
4061
4062# THIS_DIR is automatically assigned the PWD of the path that generated
4063# the config file. It is best to use this variable when assigning other
4064# directory paths within this directory. This allows you to easily
4065# move the test cases to other locations or to other machines.
4066#
4067THIS_DIR := $variable{"PWD"}
4068
Steven Rostedt8d1491b2010-11-18 15:39:48 -05004069# Define each test with TEST_START
4070# The config options below it will override the defaults
4071TEST_START
Steven Rostedtc4261d02011-11-23 13:41:18 -05004072TEST_TYPE = $default{"TEST_TYPE"}
Steven Rostedt8d1491b2010-11-18 15:39:48 -05004073
4074DEFAULTS
4075EOF
4076;
4077 close(OUT);
4078}
4079read_config $ktest_config;
4080
Steven Rostedt23715c3c2011-06-13 11:03:34 -04004081if (defined($opt{"LOG_FILE"})) {
Steven Rostedt (Red Hat)04262be2013-01-31 10:12:20 -05004082 $opt{"LOG_FILE"} = eval_option("LOG_FILE", $opt{"LOG_FILE"}, -1);
Steven Rostedt23715c3c2011-06-13 11:03:34 -04004083}
4084
Steven Rostedt8d1491b2010-11-18 15:39:48 -05004085# Append any configs entered in manually to the config file.
4086my @new_configs = keys %entered_configs;
4087if ($#new_configs >= 0) {
4088 print "\nAppending entered in configs to $ktest_config\n";
4089 open(OUT, ">>$ktest_config") or die "Can not append to $ktest_config";
4090 foreach my $config (@new_configs) {
4091 print OUT "$config = $entered_configs{$config}\n";
Steven Rostedt0e7a22d2011-11-21 20:39:33 -05004092 $opt{$config} = process_variables($entered_configs{$config});
Steven Rostedt8d1491b2010-11-18 15:39:48 -05004093 }
4094}
Steven Rostedt2545eb62010-11-02 15:01:32 -04004095
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04004096if ($opt{"CLEAR_LOG"} && defined($opt{"LOG_FILE"})) {
4097 unlink $opt{"LOG_FILE"};
4098}
Steven Rostedt2545eb62010-11-02 15:01:32 -04004099
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04004100doprint "\n\nSTARTING AUTOMATED TESTS\n\n";
4101
Steven Rostedta57419b2010-11-02 15:13:54 -04004102for (my $i = 0, my $repeat = 1; $i <= $opt{"NUM_TESTS"}; $i += $repeat) {
4103
4104 if (!$i) {
4105 doprint "DEFAULT OPTIONS:\n";
4106 } else {
4107 doprint "\nTEST $i OPTIONS";
4108 if (defined($repeat_tests{$i})) {
4109 $repeat = $repeat_tests{$i};
4110 doprint " ITERATE $repeat";
4111 }
4112 doprint "\n";
4113 }
4114
4115 foreach my $option (sort keys %opt) {
4116
4117 if ($option =~ /\[(\d+)\]$/) {
4118 next if ($i != $1);
4119 } else {
4120 next if ($i);
4121 }
4122
4123 doprint "$option = $opt{$option}\n";
4124 }
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04004125}
Steven Rostedt2545eb62010-11-02 15:01:32 -04004126
Steven Rostedt (Red Hat)22c37a92014-11-21 16:21:25 -05004127sub option_defined {
4128 my ($option) = @_;
4129
4130 if (defined($opt{$option}) && $opt{$option} !~ /^\s*$/) {
4131 return 1;
4132 }
4133
4134 return 0;
4135}
4136
Steven Rostedt2a625122011-05-20 15:48:59 -04004137sub __set_test_option {
Steven Rostedt5a391fb2010-11-02 14:57:43 -04004138 my ($name, $i) = @_;
4139
4140 my $option = "$name\[$i\]";
4141
Steven Rostedt (Red Hat)22c37a92014-11-21 16:21:25 -05004142 if (option_defined($option)) {
Steven Rostedt5a391fb2010-11-02 14:57:43 -04004143 return $opt{$option};
4144 }
4145
Steven Rostedta57419b2010-11-02 15:13:54 -04004146 foreach my $test (keys %repeat_tests) {
4147 if ($i >= $test &&
4148 $i < $test + $repeat_tests{$test}) {
4149 $option = "$name\[$test\]";
Steven Rostedt (Red Hat)22c37a92014-11-21 16:21:25 -05004150 if (option_defined($option)) {
Steven Rostedta57419b2010-11-02 15:13:54 -04004151 return $opt{$option};
4152 }
4153 }
4154 }
4155
Steven Rostedt (Red Hat)22c37a92014-11-21 16:21:25 -05004156 if (option_defined($name)) {
Steven Rostedt5a391fb2010-11-02 14:57:43 -04004157 return $opt{$name};
4158 }
4159
4160 return undef;
4161}
4162
Steven Rostedt2a625122011-05-20 15:48:59 -04004163sub set_test_option {
4164 my ($name, $i) = @_;
4165
4166 my $option = __set_test_option($name, $i);
4167 return $option if (!defined($option));
4168
Steven Rostedt (Red Hat)04262be2013-01-31 10:12:20 -05004169 return eval_option($name, $option, $i);
Steven Rostedt2a625122011-05-20 15:48:59 -04004170}
4171
Steven Rostedt2545eb62010-11-02 15:01:32 -04004172# First we need to do is the builds
Steven Rostedta75fece2010-11-02 14:58:27 -04004173for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {
Steven Rostedt2545eb62010-11-02 15:01:32 -04004174
Steven Rostedt4ab1cce2011-09-30 18:12:20 -04004175 # Do not reboot on failing test options
4176 $no_reboot = 1;
Steven Rostedt759a3cc2012-05-01 08:20:12 -04004177 $reboot_success = 0;
Steven Rostedt4ab1cce2011-09-30 18:12:20 -04004178
Steven Rostedt683a3e62012-05-18 13:34:35 -04004179 $have_version = 0;
4180
Steven Rostedt576f6272010-11-02 14:58:38 -04004181 $iteration = $i;
4182
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05004183 $build_time = 0;
4184 $install_time = 0;
4185 $reboot_time = 0;
4186 $test_time = 0;
4187
Steven Rostedtc1434dc2012-07-20 22:39:16 -04004188 undef %force_config;
4189
Steven Rostedta75fece2010-11-02 14:58:27 -04004190 my $makecmd = set_test_option("MAKE_CMD", $i);
4191
Steven Rostedt (Red Hat)8e80bf02013-12-11 15:40:46 -05004192 $outputdir = set_test_option("OUTPUT_DIR", $i);
4193 $builddir = set_test_option("BUILD_DIR", $i);
4194
4195 chdir $builddir || die "can't change directory to $builddir";
4196
4197 if (!-d $outputdir) {
4198 mkpath($outputdir) or
4199 die "can't create $outputdir";
4200 }
4201
4202 $make = "$makecmd O=$outputdir";
4203
Steven Rostedt9cc9e092011-12-22 21:37:22 -05004204 # Load all the options into their mapped variable names
4205 foreach my $opt (keys %option_map) {
4206 ${$option_map{$opt}} = set_test_option($opt, $i);
4207 }
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05004208
Steven Rostedt35ce5952011-07-15 21:57:25 -04004209 $start_minconfig_defined = 1;
4210
Steven Rostedt921ed4c2012-07-19 15:18:27 -04004211 # The first test may override the PRE_KTEST option
4212 if (defined($pre_ktest) && $i == 1) {
4213 doprint "\n";
4214 run_command $pre_ktest;
4215 }
4216
4217 # Any test can override the POST_KTEST option
4218 # The last test takes precedence.
4219 if (defined($post_ktest)) {
4220 $final_post_ktest = $post_ktest;
4221 }
4222
Steven Rostedt4c4ab122011-07-15 21:16:17 -04004223 if (!defined($start_minconfig)) {
Steven Rostedt35ce5952011-07-15 21:57:25 -04004224 $start_minconfig_defined = 0;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04004225 $start_minconfig = $minconfig;
4226 }
4227
Steven Rostedt (Red Hat)8e80bf02013-12-11 15:40:46 -05004228 if (!-d $tmpdir) {
4229 mkpath($tmpdir) or
4230 die "can't create $tmpdir";
Steven Rostedta75fece2010-11-02 14:58:27 -04004231 }
4232
Steven Rostedte48c5292010-11-02 14:35:37 -04004233 $ENV{"SSH_USER"} = $ssh_user;
4234 $ENV{"MACHINE"} = $machine;
4235
Steven Rostedta75fece2010-11-02 14:58:27 -04004236 $buildlog = "$tmpdir/buildlog-$machine";
Rabin Vincenta9dd5d62011-11-18 17:05:29 +05304237 $testlog = "$tmpdir/testlog-$machine";
Steven Rostedta75fece2010-11-02 14:58:27 -04004238 $dmesg = "$tmpdir/dmesg-$machine";
Steven Rostedt51ad1dd2010-11-08 16:43:21 -05004239 $output_config = "$outputdir/.config";
Steven Rostedta75fece2010-11-02 14:58:27 -04004240
Steven Rostedtbb8474b2011-11-23 15:58:00 -05004241 if (!$buildonly) {
4242 $target = "$ssh_user\@$machine";
4243 if ($reboot_type eq "grub") {
4244 dodie "GRUB_MENU not defined" if (!defined($grub_menu));
Steven Rostedta15ba912012-11-13 14:30:37 -05004245 } elsif ($reboot_type eq "grub2") {
4246 dodie "GRUB_MENU not defined" if (!defined($grub_menu));
4247 dodie "GRUB_FILE not defined" if (!defined($grub_file));
Steven Rostedt77869542012-12-11 17:37:41 -05004248 } elsif ($reboot_type eq "syslinux") {
4249 dodie "SYSLINUX_LABEL not defined" if (!defined($syslinux_label));
Steven Rostedtbb8474b2011-11-23 15:58:00 -05004250 }
Steven Rostedta75fece2010-11-02 14:58:27 -04004251 }
4252
4253 my $run_type = $build_type;
4254 if ($test_type eq "patchcheck") {
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05004255 $run_type = $patchcheck_type;
Steven Rostedta75fece2010-11-02 14:58:27 -04004256 } elsif ($test_type eq "bisect") {
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05004257 $run_type = $bisect_type;
Steven Rostedt0a05c762010-11-08 11:14:10 -05004258 } elsif ($test_type eq "config_bisect") {
Steven Rostedtb5f4aea2011-12-22 21:33:55 -05004259 $run_type = $config_bisect_type;
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05004260 } elsif ($test_type eq "make_min_config") {
4261 $run_type = "";
4262 } elsif ($test_type eq "make_warnings_file") {
Steven Rostedt4c4ab122011-07-15 21:16:17 -04004263 $run_type = "";
4264 }
4265
Steven Rostedta75fece2010-11-02 14:58:27 -04004266 # mistake in config file?
4267 if (!defined($run_type)) {
4268 $run_type = "ERROR";
4269 }
Steven Rostedt2545eb62010-11-02 15:01:32 -04004270
Steven Rostedte0a87422011-09-30 17:50:48 -04004271 my $installme = "";
4272 $installme = " no_install" if ($no_install);
4273
Steven Rostedt (Red Hat)18656c72014-11-21 19:28:24 -05004274 my $name = "";
4275
4276 if (defined($test_name)) {
4277 $name = " ($test_name)";
4278 }
4279
Steven Rostedt2545eb62010-11-02 15:01:32 -04004280 doprint "\n\n";
Steven Rostedt (Red Hat)18656c72014-11-21 19:28:24 -05004281 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 -04004282
Steven Rostedt921ed4c2012-07-19 15:18:27 -04004283 if (defined($pre_test)) {
4284 run_command $pre_test;
4285 }
4286
Steven Rostedt7faafbd2010-11-02 14:58:22 -04004287 unlink $dmesg;
4288 unlink $buildlog;
Rabin Vincenta9dd5d62011-11-18 17:05:29 +05304289 unlink $testlog;
Steven Rostedt2545eb62010-11-02 15:01:32 -04004290
Steven Rostedt250bae82011-07-15 22:05:59 -04004291 if (defined($addconfig)) {
4292 my $min = $minconfig;
4293 if (!defined($minconfig)) {
4294 $min = "";
4295 }
4296 run_command "cat $addconfig $min > $tmpdir/add_config" or
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04004297 dodie "Failed to create temp config";
Steven Rostedt9be2e6b2010-11-09 12:20:21 -05004298 $minconfig = "$tmpdir/add_config";
Steven Rostedt2b7d9b22010-11-02 14:58:15 -04004299 }
4300
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04004301 if (defined($checkout)) {
4302 run_command "git checkout $checkout" or
4303 die "failed to checkout $checkout";
4304 }
4305
Steven Rostedt759a3cc2012-05-01 08:20:12 -04004306 $no_reboot = 0;
4307
Steven Rostedt648a1822012-03-21 11:18:27 -04004308 # A test may opt to not reboot the box
4309 if ($reboot_on_success) {
Steven Rostedt759a3cc2012-05-01 08:20:12 -04004310 $reboot_success = 1;
Steven Rostedt648a1822012-03-21 11:18:27 -04004311 }
Steven Rostedt4ab1cce2011-09-30 18:12:20 -04004312
Steven Rostedta75fece2010-11-02 14:58:27 -04004313 if ($test_type eq "bisect") {
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04004314 bisect $i;
4315 next;
Steven Rostedt0a05c762010-11-08 11:14:10 -05004316 } elsif ($test_type eq "config_bisect") {
4317 config_bisect $i;
4318 next;
Steven Rostedta75fece2010-11-02 14:58:27 -04004319 } elsif ($test_type eq "patchcheck") {
Steven Rostedt6c5ee0b2010-11-02 14:57:58 -04004320 patchcheck $i;
4321 next;
Steven Rostedt4c4ab122011-07-15 21:16:17 -04004322 } elsif ($test_type eq "make_min_config") {
4323 make_min_config $i;
4324 next;
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05004325 } elsif ($test_type eq "make_warnings_file") {
4326 $no_reboot = 1;
4327 make_warnings_file $i;
4328 next;
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04004329 }
4330
Steven Rostedt7faafbd2010-11-02 14:58:22 -04004331 if ($build_type ne "nobuild") {
4332 build $build_type or next;
Steven Rostedt (Red Hat)4283b162013-01-30 18:37:47 -05004333 check_buildlog or next;
Steven Rostedt2545eb62010-11-02 15:01:32 -04004334 }
4335
Steven Rostedtcd8e3682011-08-18 16:35:44 -04004336 if ($test_type eq "install") {
4337 get_version;
4338 install;
4339 success $i;
4340 next;
4341 }
4342
Steven Rostedta75fece2010-11-02 14:58:27 -04004343 if ($test_type ne "build") {
Steven Rostedta75fece2010-11-02 14:58:27 -04004344 my $failed = 0;
Steven Rostedt (Red Hat)64d98282015-01-28 15:17:35 -05004345 start_monitor_and_install or $failed = 1;
Steven Rostedta75fece2010-11-02 14:58:27 -04004346
4347 if (!$failed && $test_type ne "boot" && defined($run_test)) {
4348 do_run_test or $failed = 1;
4349 }
4350 end_monitor;
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05004351 if ($failed) {
4352 print_times;
4353 next;
4354 }
Steven Rostedt5a391fb2010-11-02 14:57:43 -04004355 }
4356
Steven Rostedt (Red Hat)38fa3dc2015-01-28 09:43:01 -05004357 print_times;
4358
Steven Rostedt5f9b6ce2010-11-02 14:57:33 -04004359 success $i;
Steven Rostedt2545eb62010-11-02 15:01:32 -04004360}
4361
Steven Rostedt921ed4c2012-07-19 15:18:27 -04004362if (defined($final_post_ktest)) {
4363 run_command $final_post_ktest;
4364}
4365
Steven Rostedt5c42fc52010-11-02 14:57:01 -04004366if ($opt{"POWEROFF_ON_SUCCESS"}) {
Steven Rostedt75c3fda72010-11-02 14:57:21 -04004367 halt;
Steven Rostedt759a3cc2012-05-01 08:20:12 -04004368} elsif ($opt{"REBOOT_ON_SUCCESS"} && !do_not_reboot && $reboot_success) {
Steven Rostedtbc7c5802011-12-22 16:29:10 -05004369 reboot_to_good;
Steven Rostedt648a1822012-03-21 11:18:27 -04004370} elsif (defined($switch_to_good)) {
4371 # still need to get to the good kernel
4372 run_command $switch_to_good;
Steven Rostedt5c42fc52010-11-02 14:57:01 -04004373}
Steven Rostedt75c3fda72010-11-02 14:57:21 -04004374
Steven Rostedt648a1822012-03-21 11:18:27 -04004375
Steven Rostedte48c5292010-11-02 14:35:37 -04004376doprint "\n $successes of $opt{NUM_TESTS} tests were successful\n\n";
4377
Steven Rostedt2545eb62010-11-02 15:01:32 -04004378exit 0;