aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2020-03-06 13:37:58 +0100
committerDmitry Vyukov <dvyukov@google.com>2020-03-06 13:38:53 +0100
commitfd2a5f28eb5e2b7c83b5e814f53e44e2a5dde24c (patch)
tree3db98c79b3220c44faa6ec98fda13eb594c4ed1e
parent7fb694ef82d4dace30cf68efba5a6af705c94fa4 (diff)
executor: prevent "NMI handler took too long" messages
nmi_check_duration() prints "INFO: NMI handler took too long" on slow debug kernels. It happens a lot in qemu, and the messages are frequently corrupted (intermixed with other kernel output as they are printed from NMI) and are not matched against the suppression in pkg/report. This write prevents these messages from being printed.
-rw-r--r--executor/executor.cc4
-rw-r--r--executor/executor_linux.h12
-rw-r--r--pkg/report/linux.go7
3 files changed, 16 insertions, 7 deletions
diff --git a/executor/executor.cc b/executor/executor.cc
index 2635d5a7c..768081ad6 100644
--- a/executor/executor.cc
+++ b/executor/executor.cc
@@ -1404,6 +1404,10 @@ void setup_features(char** enable, int n)
{
// This does any one-time setup for the requested features on the machine.
// Note: this can be called multiple times and must be idempotent.
+#if SYZ_HAVE_FEATURES
+ // Note: this is not executed in C reproducers.
+ setup_machine();
+#endif
for (int i = 0; i < n; i++) {
bool found = false;
#if SYZ_HAVE_FEATURES
diff --git a/executor/executor_linux.h b/executor/executor_linux.h
index 63c900c5a..d4220c23f 100644
--- a/executor/executor_linux.h
+++ b/executor/executor_linux.h
@@ -225,3 +225,15 @@ static feature_t features[] = {
{"binfmt_misc", setup_binfmt_misc},
{"kcsan", setup_kcsan},
};
+
+static void setup_machine()
+{
+ // nmi_check_duration() prints "INFO: NMI handler took too long" on slow debug kernels.
+ // It happens a lot in qemu, and the messages are frequently corrupted
+ // (intermixed with other kernel output as they are printed from NMI)
+ // and are not matched against the suppression in pkg/report.
+ // This write prevents these messages from being printed.
+ // Note: this is not executed in C reproducers.
+ if (!write_file("/sys/kernel/debug/x86/nmi_longest_ns", "10000000000"))
+ printf("write to /sys/kernel/debug/x86/nmi_longest_ns failed: %s\n", strerror(errno));
+}
diff --git a/pkg/report/linux.go b/pkg/report/linux.go
index da56e1219..b81ffd814 100644
--- a/pkg/report/linux.go
+++ b/pkg/report/linux.go
@@ -1341,13 +1341,6 @@ var linuxOopses = append([]*oops{
[]*regexp.Regexp{
compile("INFO: lockdep is turned off"),
compile("INFO: Stall ended before state dump start"),
- // This is printed by nmi_check_duration(), the message simply states
- // that an interrupt took too long. It happens a lot in qemu,
- // and the messages are frequently corrupted (intermixed with other
- // kernel output as they are printed from NMI) and are not matched
- // against this suppression. There is a debug var that holds the current
- // max duration, so potentially this can be fixed with:
- // echo 10000000000 > /sys/kernel/debug/x86/nmi_longest_ns
compile("INFO: NMI handler"),
compile("INFO: recovery required on readonly filesystem"),
compile("(handler|interrupt).*took too long"),