![Matthew Garrett](/assets/img/avatar_default.png)
Since commit 04c6862c05
("kmsg_dump: add kmsg_dump() calls to the
reboot, halt, poweroff and emergency_restart paths"), kmsg_dump() gets
run on normal paths including poweroff and reboot.
This is less than ideal given pstore implementations that can only
represent single backtraces, since a reboot may overwrite a stored oops
before it's been picked up by userspace. In addition, some pstore
backends may have low performance and provide a significant delay in
reboot as a result.
This patch adds a printk.always_kmsg_dump kernel parameter (which can also
be changed from userspace). Without it, the code will only be run on
failure paths rather than on normal paths. The option can be enabled in
environments where there's a desire to attempt to audit whether or not a
reboot was cleanly requested or not.
Signed-off-by: Matthew Garrett <mjg@redhat.com>
Acked-by: Seiji Aguchi <seiji.aguchi@hds.com>
Cc: Seiji Aguchi <seiji.aguchi@hds.com>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: Marco Stornelli <marco.stornelli@gmail.com>
Cc: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Vivek Goyal <vgoyal@redhat.com>
Cc: Don Zickus <dzickus@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
71 lines
1.7 KiB
C
71 lines
1.7 KiB
C
/*
|
|
* linux/include/kmsg_dump.h
|
|
*
|
|
* Copyright (C) 2009 Net Insight AB
|
|
*
|
|
* Author: Simon Kagstrom <simon.kagstrom@netinsight.net>
|
|
*
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
* License. See the file COPYING in the main directory of this archive
|
|
* for more details.
|
|
*/
|
|
#ifndef _LINUX_KMSG_DUMP_H
|
|
#define _LINUX_KMSG_DUMP_H
|
|
|
|
#include <linux/errno.h>
|
|
#include <linux/list.h>
|
|
|
|
/*
|
|
* Keep this list arranged in rough order of priority. Anything listed after
|
|
* KMSG_DUMP_OOPS will not be logged by default unless printk.always_kmsg_dump
|
|
* is passed to the kernel.
|
|
*/
|
|
enum kmsg_dump_reason {
|
|
KMSG_DUMP_PANIC,
|
|
KMSG_DUMP_OOPS,
|
|
KMSG_DUMP_EMERG,
|
|
KMSG_DUMP_RESTART,
|
|
KMSG_DUMP_HALT,
|
|
KMSG_DUMP_POWEROFF,
|
|
};
|
|
|
|
/**
|
|
* struct kmsg_dumper - kernel crash message dumper structure
|
|
* @dump: The callback which gets called on crashes. The buffer is passed
|
|
* as two sections, where s1 (length l1) contains the older
|
|
* messages and s2 (length l2) contains the newer.
|
|
* @list: Entry in the dumper list (private)
|
|
* @registered: Flag that specifies if this is already registered
|
|
*/
|
|
struct kmsg_dumper {
|
|
void (*dump)(struct kmsg_dumper *dumper, enum kmsg_dump_reason reason,
|
|
const char *s1, unsigned long l1,
|
|
const char *s2, unsigned long l2);
|
|
struct list_head list;
|
|
int registered;
|
|
};
|
|
|
|
#ifdef CONFIG_PRINTK
|
|
void kmsg_dump(enum kmsg_dump_reason reason);
|
|
|
|
int kmsg_dump_register(struct kmsg_dumper *dumper);
|
|
|
|
int kmsg_dump_unregister(struct kmsg_dumper *dumper);
|
|
#else
|
|
static inline void kmsg_dump(enum kmsg_dump_reason reason)
|
|
{
|
|
}
|
|
|
|
static inline int kmsg_dump_register(struct kmsg_dumper *dumper)
|
|
{
|
|
return -EINVAL;
|
|
}
|
|
|
|
static inline int kmsg_dump_unregister(struct kmsg_dumper *dumper)
|
|
{
|
|
return -EINVAL;
|
|
}
|
|
#endif
|
|
|
|
#endif /* _LINUX_KMSG_DUMP_H */
|