From fd2a5f28eb5e2b7c83b5e814f53e44e2a5dde24c Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Fri, 6 Mar 2020 13:37:58 +0100 Subject: 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. --- executor/executor.cc | 4 ++++ executor/executor_linux.h | 12 ++++++++++++ pkg/report/linux.go | 7 ------- 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"), -- cgit mrf-deployment