[igt-dev] [PATCH i-g-t v3 1/1] lib/core: Use whitelist with kmsg filter
Petri Latvala
petri.latvala at intel.com
Thu Mar 1 11:15:21 UTC 2018
dmesg messages of level >=warn don't result in an IGT_LOG_WARN if they
match a whitelist regexp now.
The whitelist is not configureable without rebuilding, and it's not
even possible to use a different whitelist for different drivers;
launching the kmsg monitor happens way before opening the driver (if
any).
v2: Use static and a less yelling variable name for the whitelist,
compare to REG_NOMATCH directly, construct the regexp in a nicer
looking way (Chris). Be more verbose when monitoring stops.
v3: More patterns, document them.
Signed-off-by: Petri Latvala <petri.latvala at intel.com>
---
lib/igt_core.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 46 insertions(+), 2 deletions(-)
diff --git a/lib/igt_core.c b/lib/igt_core.c
index 0b3bf49e..6bcf004a 100644
--- a/lib/igt_core.c
+++ b/lib/igt_core.c
@@ -55,6 +55,7 @@
#include <limits.h>
#include <locale.h>
#include <uwildmat/uwildmat.h>
+#include <regex.h>
#ifdef HAVE_GLIB
#include <glib.h>
#endif
@@ -572,6 +573,37 @@ static void oom_adjust_for_doom(void)
}
+/*
+ * This regexp controls the kmsg monitor handling. All kernel log
+ * records that have log level of warning or higher get inserted into
+ * IGT log buffer with an IGT_LOG_WARN unless they match this
+ * regexp. Otherwise they get inserted at IGT_LOG_DEBUG.
+ */
+
+#define _ "|"
+static const char igt_dmesg_whitelist[] =
+ "ACPI: button: The lid device is not compliant to SW_LID" _
+ "ACPI: .*: Unable to dock!" _
+ "IRQ [0-9]+: no longer affine to CPU[0-9]+" _
+ "IRQ fixup: irq [0-9]+ move in progress, old vector [0-9]+" _
+ /* i915 tests set module options, expected message */
+ "Setting dangerous option [a-z_]+ - tainting kernel" _
+ /* Raw printk() call, uses default log level (warn) */
+ "Suspending console\\(s\\) \\(use no_console_suspend to debug\\)" _
+ "atkbd serio[0-9]+: Failed to (deactivate|enable) keyboard on isa[0-9]+/serio[0-9]+" _
+ "cache: parent cpu[0-9]+ should not be sleeping" _
+ "hpet[0-9]+: lost [0-9]+ rtc interrupts" _
+ /* i915 selftests terminate normally with ENODEV from the
+ * module load after the testing finishes, which produces this
+ * message.
+ */
+ "i915: probe of [0-9:.]+ failed with error -25" _
+ /* swiotbl warns even when asked not to */
+ "mock: DMA: Out of SW-IOMMU space for [0-9]+ bytes" _
+ "usb usb[0-9]+: root hub lost power or was reset"
+ ;
+#undef _
+
static void *kmsg_capture(void *arg)
{
/*
@@ -584,6 +616,13 @@ static void *kmsg_capture(void *arg)
char *line = NULL;
size_t line_len = 0;
ssize_t read;
+ regex_t re;
+
+ if (regcomp(&re, igt_dmesg_whitelist, REG_EXTENDED | REG_NOSUB) != 0) {
+ igt_warn("Cannot compile dmesg whitelist regexp\n");
+ fclose(kmsg_file);
+ return NULL;
+ }
while ((read = getline(&line, &line_len, kmsg_file))) {
int s;
@@ -604,7 +643,8 @@ static void *kmsg_capture(void *arg)
&seq, &ts_usec, &continuation);
if (s == 4) {
- if ((flags & 0x7) <= 4)
+ if ((flags & 0x7) <= 4 &&
+ regexec(&re, line, (size_t)0, NULL, 0) == REG_NOMATCH)
level = IGT_LOG_WARN;
else
level = IGT_LOG_DEBUG;
@@ -629,7 +669,11 @@ static void *kmsg_capture(void *arg)
}
}
- igt_warn("ran out of dmesg, this shouldn't happen\n");
+ igt_warn("Ran out of dmesg, this shouldn't happen. Reason: ");
+ if (errno)
+ igt_warn("%s\n", strerror(errno));
+ else
+ igt_warn("EOF\n");
free(line);
fclose(kmsg_file);
--
2.14.1
More information about the igt-dev
mailing list