debug: add end-of-oops marker
Right now it's nearly impossible for parsers that collect kernel crashes from logs or emails (such as www.kerneloops.org) to detect the end-of-oops condition. In addition, it's not currently possible to detect whether or not 2 oopses that look alike are actually the same oops reported twice, or are truly two unique oopses. This patch adds an end-of-oops marker, and makes the end marker include a very simple 64-bit random ID to be able to detect duplicate reports. Normally, this ID is calculated as a late_initcall() (in the hope that at that time there is enough entropy to get a unique enough ID); however for early oopses the oops_exit() function needs to generate the ID on the fly. We do this all at the _end_ of an oops printout, so this does not impact our ability to get the most important portions of a crash out to the console first. [ Sidenote: the already existing oopses-since-bootup counter we print during crashes serves as the differentiator between multiple oopses that trigger during the same bootup. ] Tested on 32-bit and 64-bit x86. Artificially injected very early crashes as well, as expected they result in this constant ID after multiple bootups: ---[ end trace ca143223eefdc828 ]--- ---[ end trace ca143223eefdc828 ]--- because the random pools are still all zero. But it all still works fine and causes no additional problems (which is the main goal of instrumentation code). Signed-off-by: Arjan van de Ven <arjan@linux.intel.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
67e2be0232
commit
2c3b20e91f
|
@ -19,6 +19,7 @@
|
|||
#include <linux/nmi.h>
|
||||
#include <linux/kexec.h>
|
||||
#include <linux/debug_locks.h>
|
||||
#include <linux/random.h>
|
||||
|
||||
int panic_on_oops;
|
||||
int tainted;
|
||||
|
@ -265,6 +266,20 @@ void oops_enter(void)
|
|||
do_oops_enter_exit();
|
||||
}
|
||||
|
||||
/*
|
||||
* 64-bit random ID for oopses:
|
||||
*/
|
||||
static u64 oops_id;
|
||||
|
||||
static int init_oops_id(void)
|
||||
{
|
||||
if (!oops_id)
|
||||
get_random_bytes(&oops_id, sizeof(oops_id));
|
||||
|
||||
return 0;
|
||||
}
|
||||
late_initcall(init_oops_id);
|
||||
|
||||
/*
|
||||
* Called when the architecture exits its oops handler, after printing
|
||||
* everything.
|
||||
|
@ -272,6 +287,9 @@ void oops_enter(void)
|
|||
void oops_exit(void)
|
||||
{
|
||||
do_oops_enter_exit();
|
||||
init_oops_id();
|
||||
printk(KERN_WARNING "---[ end trace %016llx ]---\n",
|
||||
(unsigned long long)oops_id);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CC_STACKPROTECTOR
|
||||
|
|
Loading…
Reference in New Issue