提交 f1a5b962 编写于 作者: S Steven Rostedt 提交者: Steven Rostedt

ktest: Add detection of triple faults

When a triple fault happens in a test, no call trace nor panic
is displayed. Instead, the system reboots to the good kernel.
Since the good kernel may display a boot prompt that matches the
success string, ktest may think that the test succeeded, when it
did not.

Detecting triple faults is tricky because it is hard to generalize
what a reboot looks like. The best that we can come up with for now
is to examine the Linux banner. If we detect that the Linux banner
matches the test we want to test, then look to see if we hit another
Linux banner with a different kernel is booted. This can be assumed
to be a triple fault.

We can't just check for two Linux banners because things like
early printk may cause the Linux banner to be displayed twice. Checking
for different kernel versions should be the safe bet.

If this for some reason detects a false triple boot. A new ktest
config option is also created:

 DETECT_TRIPLE_FAULT

This can be set to 0 to disable this checking.
Signed-off-by: NSteven Rostedt <rostedt@goodmis.org>
上级 cd4f1d53
...@@ -41,6 +41,7 @@ $default{"CLEAR_LOG"} = 0; ...@@ -41,6 +41,7 @@ $default{"CLEAR_LOG"} = 0;
$default{"BISECT_MANUAL"} = 0; $default{"BISECT_MANUAL"} = 0;
$default{"BISECT_SKIP"} = 1; $default{"BISECT_SKIP"} = 1;
$default{"SUCCESS_LINE"} = "login:"; $default{"SUCCESS_LINE"} = "login:";
$default{"DETECT_TRIPLE_FAULT"} = 1;
$default{"BOOTED_TIMEOUT"} = 1; $default{"BOOTED_TIMEOUT"} = 1;
$default{"DIE_ON_FAILURE"} = 1; $default{"DIE_ON_FAILURE"} = 1;
$default{"SSH_EXEC"} = "ssh \$SSH_USER\@\$MACHINE \$SSH_COMMAND"; $default{"SSH_EXEC"} = "ssh \$SSH_USER\@\$MACHINE \$SSH_COMMAND";
...@@ -101,6 +102,7 @@ my $patchcheck_sleep_time; ...@@ -101,6 +102,7 @@ my $patchcheck_sleep_time;
my $store_failures; my $store_failures;
my $timeout; my $timeout;
my $booted_timeout; my $booted_timeout;
my $detect_triplefault;
my $console; my $console;
my $success_line; my $success_line;
my $stop_after_success; my $stop_after_success;
...@@ -836,6 +838,7 @@ sub monitor { ...@@ -836,6 +838,7 @@ sub monitor {
my $failure_start; my $failure_start;
my $monitor_start = time; my $monitor_start = time;
my $done = 0; my $done = 0;
my $version_found = 0;
while (!$done) { while (!$done) {
...@@ -904,6 +907,22 @@ sub monitor { ...@@ -904,6 +907,22 @@ sub monitor {
$bug = 1; $bug = 1;
} }
# Detect triple faults by testing the banner
if ($full_line =~ /\bLinux version (\S+).*\n/) {
if ($1 eq $version) {
$version_found = 1;
} elsif ($version_found && $detect_triplefault) {
# We already booted into the kernel we are testing,
# but now we booted into another kernel?
# Consider this a triple fault.
doprint "Aleady booted in Linux kernel $version, but now\n";
doprint "we booted into Linux kernel $1.\n";
doprint "Assuming that this is a triple fault.\n";
doprint "To disable this: set DETECT_TRIPLE_FAULT to 0\n";
last;
}
}
if ($line =~ /\n/) { if ($line =~ /\n/) {
$full_line = ""; $full_line = "";
} }
...@@ -2159,6 +2178,7 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) { ...@@ -2159,6 +2178,7 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {
$timeout = set_test_option("TIMEOUT", $i); $timeout = set_test_option("TIMEOUT", $i);
$booted_timeout = set_test_option("BOOTED_TIMEOUT", $i); $booted_timeout = set_test_option("BOOTED_TIMEOUT", $i);
$console = set_test_option("CONSOLE", $i); $console = set_test_option("CONSOLE", $i);
$detect_triplefault = set_test_option("DETECT_TRIPLE_FAULT", $i);
$success_line = set_test_option("SUCCESS_LINE", $i); $success_line = set_test_option("SUCCESS_LINE", $i);
$stop_after_success = set_test_option("STOP_AFTER_SUCCESS", $i); $stop_after_success = set_test_option("STOP_AFTER_SUCCESS", $i);
$stop_after_failure = set_test_option("STOP_AFTER_FAILURE", $i); $stop_after_failure = set_test_option("STOP_AFTER_FAILURE", $i);
......
...@@ -518,6 +518,16 @@ ...@@ -518,6 +518,16 @@
# The variables SSH_USER and MACHINE are defined. # The variables SSH_USER and MACHINE are defined.
#REBOOT = ssh $SSH_USER@$MACHINE reboot #REBOOT = ssh $SSH_USER@$MACHINE reboot
# The way triple faults are detected is by testing the kernel
# banner. If the kernel banner for the kernel we are testing is
# found, and then later a kernel banner for another kernel version
# is found, it is considered that we encountered a triple fault,
# and there is no panic or callback, but simply a reboot.
# To disable this (because it did a false positive) set the following
# to 0.
# (default 1)
#DETECT_TRIPLE_FAULT = 0
#### Per test run options #### #### Per test run options ####
# The following options are only allowed in TEST_START sections. # The following options are only allowed in TEST_START sections.
# They are ignored in the DEFAULTS sections. # They are ignored in the DEFAULTS sections.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册