[GIT PULL] ktest: Updates for v4.11

From: Steven Rostedt
Date: Mon Feb 27 2017 - 09:54:15 EST



Linus,

These are various fixes that I have made and never got around to pushing.
I've been asked to get the upstream repo back up-to-date.


Please pull the latest ktest-v4.11 tree, which can be found at:


git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-ktest.git
ktest-v4.11

Tag SHA1: df85fa17600e4b347d233bc08a33d79e6443a364
Head SHA1: 5739438b725c09938bb6af9e4477c4283b8326cf


Steven Rostedt (VMware) (5):
ktest: Have POST_TEST run after the test has totally completed
ktest: Fix child exit code processing
ktest: Add timeout to ssh command
ktest.pl: Powercycle the box on reboot if no connection can be made
ktest: Add variable run_command_status to save status of commands executed

----
tools/testing/ktest/ktest.pl | 111 +++++++++++++++++++++++++++++--------------
1 file changed, 76 insertions(+), 35 deletions(-)
---------------------------
diff --git a/tools/testing/ktest/ktest.pl b/tools/testing/ktest/ktest.pl
index d08e214ec6e7..29470b554711 100755
--- a/tools/testing/ktest/ktest.pl
+++ b/tools/testing/ktest/ktest.pl
@@ -179,6 +179,7 @@ my $localversion;
my $iteration = 0;
my $successes = 0;
my $stty_orig;
+my $run_command_status = 0;

my $bisect_good;
my $bisect_bad;
@@ -1325,26 +1326,44 @@ sub wait_for_monitor;

sub reboot {
my ($time) = @_;
+ my $powercycle = 0;

- # Make sure everything has been written to disk
- run_ssh("sync");
+ # test if the machine can be connected to within 5 seconds
+ my $stat = run_ssh("echo check machine status", 5);
+ if (!$stat) {
+ doprint("power cycle\n");
+ $powercycle = 1;
+ }
+
+ if ($powercycle) {
+ run_command "$power_cycle";

- if (defined($time)) {
start_monitor;
# flush out current monitor
# May contain the reboot success line
wait_for_monitor 1;
- }

- # try to reboot normally
- if (run_command $reboot) {
- if (defined($powercycle_after_reboot)) {
- sleep $powercycle_after_reboot;
+ } else {
+ # Make sure everything has been written to disk
+ run_ssh("sync");
+
+ if (defined($time)) {
+ start_monitor;
+ # flush out current monitor
+ # May contain the reboot success line
+ wait_for_monitor 1;
+ }
+
+ # try to reboot normally
+ if (run_command $reboot) {
+ if (defined($powercycle_after_reboot)) {
+ sleep $powercycle_after_reboot;
+ run_command "$power_cycle";
+ }
+ } else {
+ # nope? power cycle it.
run_command "$power_cycle";
}
- } else {
- # nope? power cycle it.
- run_command "$power_cycle";
}

if (defined($time)) {
@@ -1412,6 +1431,10 @@ sub dodie {
system("stty $stty_orig");
}

+ if (defined($post_test)) {
+ run_command $post_test;
+ }
+
die @_, "\n";
}

@@ -1624,10 +1647,6 @@ sub save_logs {

sub fail {

- if (defined($post_test)) {
- run_command $post_test;
- }
-
if ($die_on_failure) {
dodie @_;
}
@@ -1660,23 +1679,26 @@ sub fail {
save_logs "fail", $store_failures;
}

+ if (defined($post_test)) {
+ run_command $post_test;
+ }
+
return 1;
}

sub run_command {
- my ($command, $redirect) = @_;
+ my ($command, $redirect, $timeout) = @_;
my $start_time;
my $end_time;
my $dolog = 0;
my $dord = 0;
my $pid;

- $start_time = time;
-
$command =~ s/\$SSH_USER/$ssh_user/g;
$command =~ s/\$MACHINE/$machine/g;

doprint("$command ... ");
+ $start_time = time;

$pid = open(CMD, "$command 2>&1 |") or
(fail "unable to exec $command" and return 0);
@@ -1693,13 +1715,30 @@ sub run_command {
$dord = 1;
}

- while (<CMD>) {
- print LOG if ($dolog);
- print RD if ($dord);
+ my $hit_timeout = 0;
+
+ while (1) {
+ my $fp = \*CMD;
+ if (defined($timeout)) {
+ doprint "timeout = $timeout\n";
+ }
+ my $line = wait_for_input($fp, $timeout);
+ if (!defined($line)) {
+ my $now = time;
+ if (defined($timeout) && (($now - $start_time) >= $timeout)) {
+ doprint "Hit timeout of $timeout, killing process\n";
+ $hit_timeout = 1;
+ kill 9, $pid;
+ }
+ last;
+ }
+ print LOG $line if ($dolog);
+ print RD $line if ($dord);
}

waitpid($pid, 0);
- my $failed = $?;
+ # shift 8 for real exit status
+ $run_command_status = $? >> 8;

close(CMD);
close(LOG) if ($dolog);
@@ -1714,21 +1753,25 @@ sub run_command {
doprint "[$delta seconds] ";
}

- if ($failed) {
+ if ($hit_timeout) {
+ $run_command_status = 1;
+ }
+
+ if ($run_command_status) {
doprint "FAILED!\n";
} else {
doprint "SUCCESS\n";
}

- return !$failed;
+ return !$run_command_status;
}

sub run_ssh {
- my ($cmd) = @_;
+ my ($cmd, $timeout) = @_;
my $cp_exec = $ssh_exec;

$cp_exec =~ s/\$SSH_COMMAND/$cmd/g;
- return run_command "$cp_exec";
+ return run_command "$cp_exec", undef , $timeout;
}

sub run_scp {
@@ -2489,10 +2532,6 @@ sub halt {
sub success {
my ($i) = @_;

- if (defined($post_test)) {
- run_command $post_test;
- }
-
$successes++;

my $name = "";
@@ -2517,6 +2556,10 @@ sub success {
doprint "Reboot and wait $sleep_time seconds\n";
reboot_to_good $sleep_time;
}
+
+ if (defined($post_test)) {
+ run_command $post_test;
+ }
}

sub answer_bisect {
@@ -2537,16 +2580,15 @@ sub answer_bisect {
}

sub child_run_test {
- my $failed = 0;

# child should have no power
$reboot_on_error = 0;
$poweroff_on_error = 0;
$die_on_failure = 1;

- run_command $run_test, $testlog or $failed = 1;
+ run_command $run_test, $testlog;

- exit $failed;
+ exit $run_command_status;
}

my $child_done;
@@ -2629,7 +2671,7 @@ sub do_run_test {
}

waitpid $child_pid, 0;
- $child_exit = $?;
+ $child_exit = $? >> 8;

my $end_time = time;
$test_time = $end_time - $start_time;
@@ -3330,7 +3372,6 @@ sub config_bisect {
save_config \%good_configs, $good_config;
save_config \%bad_configs, $bad_config;

-
if (defined($config_bisect_check) && $config_bisect_check ne "0") {
if ($config_bisect_check ne "good") {
doprint "Testing bad config\n";