提交 1ac884f1 编写于 作者: L Linus Torvalds

Merge tag 'ktest-v4.11' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-ktest

Pull ktest updates from Steven Rostedt:
 "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"

* tag 'ktest-v4.11' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-ktest:
  ktest: Add variable run_command_status to save status of commands executed
  ktest.pl: Powercycle the box on reboot if no connection can be made
  ktest: Add timeout to ssh command
  ktest: Fix child exit code processing
  ktest: Have POST_TEST run after the test has totally completed
...@@ -179,6 +179,7 @@ my $localversion; ...@@ -179,6 +179,7 @@ my $localversion;
my $iteration = 0; my $iteration = 0;
my $successes = 0; my $successes = 0;
my $stty_orig; my $stty_orig;
my $run_command_status = 0;
my $bisect_good; my $bisect_good;
my $bisect_bad; my $bisect_bad;
...@@ -1325,26 +1326,44 @@ sub wait_for_monitor; ...@@ -1325,26 +1326,44 @@ sub wait_for_monitor;
sub reboot { sub reboot {
my ($time) = @_; my ($time) = @_;
my $powercycle = 0;
# Make sure everything has been written to disk # test if the machine can be connected to within 5 seconds
run_ssh("sync"); 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; start_monitor;
# flush out current monitor # flush out current monitor
# May contain the reboot success line # May contain the reboot success line
wait_for_monitor 1; wait_for_monitor 1;
}
# try to reboot normally } else {
if (run_command $reboot) { # Make sure everything has been written to disk
if (defined($powercycle_after_reboot)) { run_ssh("sync");
sleep $powercycle_after_reboot;
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"; run_command "$power_cycle";
} }
} else {
# nope? power cycle it.
run_command "$power_cycle";
} }
if (defined($time)) { if (defined($time)) {
...@@ -1412,6 +1431,10 @@ sub dodie { ...@@ -1412,6 +1431,10 @@ sub dodie {
system("stty $stty_orig"); system("stty $stty_orig");
} }
if (defined($post_test)) {
run_command $post_test;
}
die @_, "\n"; die @_, "\n";
} }
...@@ -1624,10 +1647,6 @@ sub save_logs { ...@@ -1624,10 +1647,6 @@ sub save_logs {
sub fail { sub fail {
if (defined($post_test)) {
run_command $post_test;
}
if ($die_on_failure) { if ($die_on_failure) {
dodie @_; dodie @_;
} }
...@@ -1660,23 +1679,26 @@ sub fail { ...@@ -1660,23 +1679,26 @@ sub fail {
save_logs "fail", $store_failures; save_logs "fail", $store_failures;
} }
if (defined($post_test)) {
run_command $post_test;
}
return 1; return 1;
} }
sub run_command { sub run_command {
my ($command, $redirect) = @_; my ($command, $redirect, $timeout) = @_;
my $start_time; my $start_time;
my $end_time; my $end_time;
my $dolog = 0; my $dolog = 0;
my $dord = 0; my $dord = 0;
my $pid; my $pid;
$start_time = time;
$command =~ s/\$SSH_USER/$ssh_user/g; $command =~ s/\$SSH_USER/$ssh_user/g;
$command =~ s/\$MACHINE/$machine/g; $command =~ s/\$MACHINE/$machine/g;
doprint("$command ... "); doprint("$command ... ");
$start_time = time;
$pid = open(CMD, "$command 2>&1 |") or $pid = open(CMD, "$command 2>&1 |") or
(fail "unable to exec $command" and return 0); (fail "unable to exec $command" and return 0);
...@@ -1693,13 +1715,30 @@ sub run_command { ...@@ -1693,13 +1715,30 @@ sub run_command {
$dord = 1; $dord = 1;
} }
while (<CMD>) { my $hit_timeout = 0;
print LOG if ($dolog);
print RD if ($dord); 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); waitpid($pid, 0);
my $failed = $?; # shift 8 for real exit status
$run_command_status = $? >> 8;
close(CMD); close(CMD);
close(LOG) if ($dolog); close(LOG) if ($dolog);
...@@ -1714,21 +1753,25 @@ sub run_command { ...@@ -1714,21 +1753,25 @@ sub run_command {
doprint "[$delta seconds] "; doprint "[$delta seconds] ";
} }
if ($failed) { if ($hit_timeout) {
$run_command_status = 1;
}
if ($run_command_status) {
doprint "FAILED!\n"; doprint "FAILED!\n";
} else { } else {
doprint "SUCCESS\n"; doprint "SUCCESS\n";
} }
return !$failed; return !$run_command_status;
} }
sub run_ssh { sub run_ssh {
my ($cmd) = @_; my ($cmd, $timeout) = @_;
my $cp_exec = $ssh_exec; my $cp_exec = $ssh_exec;
$cp_exec =~ s/\$SSH_COMMAND/$cmd/g; $cp_exec =~ s/\$SSH_COMMAND/$cmd/g;
return run_command "$cp_exec"; return run_command "$cp_exec", undef , $timeout;
} }
sub run_scp { sub run_scp {
...@@ -2489,10 +2532,6 @@ sub halt { ...@@ -2489,10 +2532,6 @@ sub halt {
sub success { sub success {
my ($i) = @_; my ($i) = @_;
if (defined($post_test)) {
run_command $post_test;
}
$successes++; $successes++;
my $name = ""; my $name = "";
...@@ -2517,6 +2556,10 @@ sub success { ...@@ -2517,6 +2556,10 @@ sub success {
doprint "Reboot and wait $sleep_time seconds\n"; doprint "Reboot and wait $sleep_time seconds\n";
reboot_to_good $sleep_time; reboot_to_good $sleep_time;
} }
if (defined($post_test)) {
run_command $post_test;
}
} }
sub answer_bisect { sub answer_bisect {
...@@ -2537,16 +2580,15 @@ sub answer_bisect { ...@@ -2537,16 +2580,15 @@ sub answer_bisect {
} }
sub child_run_test { sub child_run_test {
my $failed = 0;
# child should have no power # child should have no power
$reboot_on_error = 0; $reboot_on_error = 0;
$poweroff_on_error = 0; $poweroff_on_error = 0;
$die_on_failure = 1; $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; my $child_done;
...@@ -2629,7 +2671,7 @@ sub do_run_test { ...@@ -2629,7 +2671,7 @@ sub do_run_test {
} }
waitpid $child_pid, 0; waitpid $child_pid, 0;
$child_exit = $?; $child_exit = $? >> 8;
my $end_time = time; my $end_time = time;
$test_time = $end_time - $start_time; $test_time = $end_time - $start_time;
...@@ -3330,7 +3372,6 @@ sub config_bisect { ...@@ -3330,7 +3372,6 @@ sub config_bisect {
save_config \%good_configs, $good_config; save_config \%good_configs, $good_config;
save_config \%bad_configs, $bad_config; save_config \%bad_configs, $bad_config;
if (defined($config_bisect_check) && $config_bisect_check ne "0") { if (defined($config_bisect_check) && $config_bisect_check ne "0") {
if ($config_bisect_check ne "good") { if ($config_bisect_check ne "good") {
doprint "Testing bad config\n"; doprint "Testing bad config\n";
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册