mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/
synced 2026-05-02 18:15:03 -04:00
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: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
committed by
Steven Rostedt
parent
cd4f1d536c
commit
f1a5b96219
@@ -41,6 +41,7 @@ $default{"CLEAR_LOG"} = 0;
|
||||
$default{"BISECT_MANUAL"} = 0;
|
||||
$default{"BISECT_SKIP"} = 1;
|
||||
$default{"SUCCESS_LINE"} = "login:";
|
||||
$default{"DETECT_TRIPLE_FAULT"} = 1;
|
||||
$default{"BOOTED_TIMEOUT"} = 1;
|
||||
$default{"DIE_ON_FAILURE"} = 1;
|
||||
$default{"SSH_EXEC"} = "ssh \$SSH_USER\@\$MACHINE \$SSH_COMMAND";
|
||||
@@ -101,6 +102,7 @@ my $patchcheck_sleep_time;
|
||||
my $store_failures;
|
||||
my $timeout;
|
||||
my $booted_timeout;
|
||||
my $detect_triplefault;
|
||||
my $console;
|
||||
my $success_line;
|
||||
my $stop_after_success;
|
||||
@@ -836,6 +838,7 @@ sub monitor {
|
||||
my $failure_start;
|
||||
my $monitor_start = time;
|
||||
my $done = 0;
|
||||
my $version_found = 0;
|
||||
|
||||
while (!$done) {
|
||||
|
||||
@@ -904,6 +907,22 @@ sub monitor {
|
||||
$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/) {
|
||||
$full_line = "";
|
||||
}
|
||||
@@ -2159,6 +2178,7 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {
|
||||
$timeout = set_test_option("TIMEOUT", $i);
|
||||
$booted_timeout = set_test_option("BOOTED_TIMEOUT", $i);
|
||||
$console = set_test_option("CONSOLE", $i);
|
||||
$detect_triplefault = set_test_option("DETECT_TRIPLE_FAULT", $i);
|
||||
$success_line = set_test_option("SUCCESS_LINE", $i);
|
||||
$stop_after_success = set_test_option("STOP_AFTER_SUCCESS", $i);
|
||||
$stop_after_failure = set_test_option("STOP_AFTER_FAILURE", $i);
|
||||
|
||||
Reference in New Issue
Block a user