[PATCH 1/4] lib: fwts_oops: check for WARN_ON messages as well as oopses
Colin King
colin.king at canonical.com
Thu Nov 15 12:05:41 UTC 2012
From: Colin Ian King <colin.king at canonical.com>
It is also useful to check for WARN_ON messages as well as oopses
in the oops check. We add a new counter to count WARN_ONs too.
Signed-off-by: Colin Ian King <colin.king at canonical.com>
---
src/lib/include/fwts_oops.h | 2 +-
src/lib/src/fwts_oops.c | 63 ++++++++++++++++++++++++++++++-------------
2 files changed, 45 insertions(+), 20 deletions(-)
diff --git a/src/lib/include/fwts_oops.h b/src/lib/include/fwts_oops.h
index 556b1c5..e09e5e3 100644
--- a/src/lib/include/fwts_oops.h
+++ b/src/lib/include/fwts_oops.h
@@ -22,6 +22,6 @@
#include <sys/types.h>
-int fwts_oops_check(fwts_framework *fw, fwts_list *klog, int *oopses);
+int fwts_oops_check(fwts_framework *fw, fwts_list *klog, int *oopses, int *warn_ons);
#endif
diff --git a/src/lib/src/fwts_oops.c b/src/lib/src/fwts_oops.c
index fe557e5..4eaad1f 100644
--- a/src/lib/src/fwts_oops.c
+++ b/src/lib/src/fwts_oops.c
@@ -25,33 +25,40 @@
#include "fwts.h"
#define FWTS_OOPS_GOT_OOPS (0x0001)
-#define FWTS_OOPS_GOT_STACK (0x0002)
-#define FWTS_OOPS_GOT_CALL_TRACE (0x0004)
-#define FWTS_OOPS_GOT_END_TRACE (0x0008)
+#define FWTS_OOPS_GOT_CALL_TRACE (0x0002)
+#define FWTS_OOPS_GOT_END_TRACE (0x0004)
+#define FWTS_OOPS_GOT_WARN_ON (0x0008)
#define FWTS_OOPS_DUMPABLE \
- (FWTS_OOPS_GOT_OOPS | FWTS_OOPS_GOT_STACK | FWTS_OOPS_GOT_CALL_TRACE | FWTS_OOPS_GOT_END_TRACE)
+ (FWTS_OOPS_GOT_OOPS | FWTS_OOPS_GOT_CALL_TRACE | FWTS_OOPS_GOT_END_TRACE)
+#define FWTS_WARN_ON_DUMPABLE \
+ (FWTS_OOPS_GOT_WARN_ON | FWTS_OOPS_GOT_CALL_TRACE | FWTS_OOPS_GOT_END_TRACE)
/*
- * fwts_oops_dump()
- * for a given item in a kernel log list, scan for an oops message and
- * if we find an oops message increment 'oopses' and dump out the oops
- * message to the fwts log
+ * fwts_klog_stack_dump()
+ * for a given item in a kernel log list, scan for an oops or WARN_ON message.
+ * Increment oopses or warn_ons depending on what we find and dump out the stack
+ * trace to the fwts log
*/
-void fwts_oops_dump(fwts_framework *fw, fwts_list_link *bug_item, int *oopses)
+static void fwts_klog_stack_dump(
+ fwts_framework *fw,
+ fwts_list_link *bug_item,
+ int *oopses,
+ int *warn_ons)
{
fwts_list_link *item = bug_item;
int lines = 0;
int dumpable = 0;
+ bool dumpstack = false;
fwts_list_foreach_continue(item) {
char *line = fwts_klog_remove_timestamp(fwts_list_data(char *, item));
if (strstr(line, "Oops:"))
dumpable |= FWTS_OOPS_GOT_OOPS;
- if (strstr(line, "Stack:"))
- dumpable |= FWTS_OOPS_GOT_STACK;
+ if (strstr(line, "WARNING: at"))
+ dumpable |= FWTS_OOPS_GOT_WARN_ON;
if (strstr(line, "Call Trace:"))
dumpable |= FWTS_OOPS_GOT_CALL_TRACE;
if (strstr(line, "--[ end trace")) {
@@ -60,8 +67,12 @@ void fwts_oops_dump(fwts_framework *fw, fwts_list_link *bug_item, int *oopses)
}
lines++;
- /* We are looking for an Oops message within 5 lines of a "BUG:" */
- if ((lines > 5) && (!(dumpable & FWTS_OOPS_GOT_OOPS)))
+ /*
+ * We are looking for an Oops message within 5 lines of a "BUG:"
+ * or we've got a WARN_ON then, OK, otherwise abort.
+ */
+ if ((lines > 5) &&
+ (!(dumpable & (FWTS_OOPS_GOT_OOPS | FWTS_OOPS_GOT_WARN_ON))))
return;
}
@@ -73,12 +84,21 @@ void fwts_oops_dump(fwts_framework *fw, fwts_list_link *bug_item, int *oopses)
if (item == NULL)
return;
-
/* Found all the features that indicate an oops, so dump it */
- if (dumpable & FWTS_OOPS_DUMPABLE) {
+ if ((dumpable & FWTS_OOPS_DUMPABLE) == FWTS_OOPS_DUMPABLE) {
(*oopses)++;
fwts_log_info(fw, "Found OOPS (%d):", *oopses);
+ dumpstack = true;
+ }
+ /* Found all the features that indicate a WARN_ON, so dump it */
+ if ((dumpable & FWTS_WARN_ON_DUMPABLE) == FWTS_WARN_ON_DUMPABLE) {
+ (*warn_ons)++;
+ fwts_log_info(fw, "Found WARNING (%d):", *warn_ons);
+ dumpstack = true;
+ }
+
+ if (dumpstack) {
while (bug_item != NULL && bug_item != item) {
fwts_log_info_verbatum(fw, " %s",
fwts_klog_remove_timestamp(fwts_list_data(char *, bug_item)));
@@ -94,17 +114,22 @@ void fwts_oops_dump(fwts_framework *fw, fwts_list_link *bug_item, int *oopses)
* messages found is returned in 'oopses'. Oops messages are logged to the
* fwts log.
*/
-int fwts_oops_check(fwts_framework *fw, fwts_list *klog, int *oopses)
+int fwts_oops_check(fwts_framework *fw, fwts_list *klog, int *oopses, int *warn_ons)
{
fwts_list_link *item;
*oopses = 0;
+ *warn_ons = 0;
- if ((fw == NULL) || (oopses == NULL) || (klog == NULL))
+ /* Sanity check */
+ if ((fw == NULL) || (oopses == NULL) ||
+ (warn_ons == NULL) || (klog == NULL))
return FWTS_ERROR;
fwts_list_foreach(item, klog) {
- if (strncmp("BUG:", fwts_klog_remove_timestamp(fwts_list_data(char *, item)), 4) == 0)
- fwts_oops_dump(fw, item, oopses);
+ char *line = fwts_klog_remove_timestamp(fwts_list_data(char *, item));
+ if ((strncmp("BUG:", line, 4) == 0) ||
+ (strncmp("WARNING:", line, 8) == 0))
+ fwts_klog_stack_dump(fw, item, oopses, warn_ons);
}
return FWTS_OK;
--
1.7.10.4
More information about the fwts-devel
mailing list