[PATCH 1/4] lib: fwts_oops: check for WARN_ON messages as well as oopses
Keng-Yu Lin
kengyu at canonical.com
Thu Nov 22 05:55:27 UTC 2012
On Thu, Nov 15, 2012 at 8:05 PM, Colin King <colin.king at canonical.com> wrote:
> 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
>
Acked-by: Keng-Yu Lin <kengyu at canonical.com>
More information about the fwts-devel
mailing list