@@ -444,7 +444,7 @@ static struct notifier_block arm64_panic_block = {
static int __init register_arm64_panic_block(void)
{
- atomic_notifier_chain_register(&panic_notifier_list,
+ atomic_notifier_chain_register(&panic_info_list,
&arm64_panic_block);
return 0;
}
@@ -459,7 +459,7 @@ static struct notifier_block kernel_location_notifier = {
static int __init register_kernel_offset_dumper(void)
{
- atomic_notifier_chain_register(&panic_notifier_list,
+ atomic_notifier_chain_register(&panic_info_list,
&kernel_location_notifier);
return 0;
}
@@ -757,7 +757,7 @@ void __init setup_panic(void)
&ppc_fadump_block);
if (IS_ENABLED(CONFIG_RANDOMIZE_BASE) && kaslr_offset() > 0)
- atomic_notifier_chain_register(&panic_notifier_list,
+ atomic_notifier_chain_register(&panic_info_list,
&kernel_offset_notifier);
/* Low-level platform-specific routines that should run on panic */
@@ -1266,7 +1266,7 @@ static struct notifier_block kernel_offset_notifier = {
static int __init register_kernel_offset_dumper(void)
{
- atomic_notifier_chain_register(&panic_notifier_list,
+ atomic_notifier_chain_register(&panic_info_list,
&kernel_offset_notifier);
return 0;
}
@@ -486,7 +486,7 @@ static int __init brcmstb_gisb_arb_probe(struct platform_device *pdev)
if (list_is_singular(&brcmstb_gisb_arb_device_list)) {
register_die_notifier(&gisb_die_notifier);
- atomic_notifier_chain_register(&panic_notifier_list,
+ atomic_notifier_chain_register(&panic_info_list,
&gisb_panic_notifier);
}
@@ -535,7 +535,7 @@ static int debug_func_init(void)
&debug_func_knob_fops);
/* Register function to be called for panic */
- ret = atomic_notifier_chain_register(&panic_notifier_list,
+ ret = atomic_notifier_chain_register(&panic_info_list,
&debug_notifier);
if (ret) {
pr_err("%s: unable to register notifier: %d\n",
@@ -552,7 +552,7 @@ static int debug_func_init(void)
static void debug_func_exit(void)
{
- atomic_notifier_chain_unregister(&panic_notifier_list,
+ atomic_notifier_chain_unregister(&panic_info_list,
&debug_notifier);
debugfs_remove_recursive(debug_debugfs_dir);
}
@@ -73,7 +73,8 @@ static struct notifier_block tegra186_ari_panic_nb = {
static int __init tegra186_ari_init(void)
{
if (of_machine_is_compatible("nvidia,tegra186"))
- atomic_notifier_chain_register(&panic_notifier_list, &tegra186_ari_panic_nb);
+ atomic_notifier_chain_register(&panic_info_list,
+ &tegra186_ari_panic_nb);
return 0;
}
@@ -7,6 +7,7 @@
extern struct atomic_notifier_head panic_notifier_list;
extern struct atomic_notifier_head panic_hypervisor_list;
+extern struct atomic_notifier_head panic_info_list;
extern bool crash_kexec_post_notifiers;
@@ -85,6 +85,7 @@ hung_task_panic(struct notifier_block *this, unsigned long event, void *ptr)
static struct notifier_block panic_block = {
.notifier_call = hung_task_panic,
+ .priority = INT_MAX, /* run early to prevent potential log flood */
};
static void check_hung_task(struct task_struct *t, unsigned long timeout)
@@ -378,7 +379,7 @@ static int watchdog(void *dummy)
static int __init hung_task_init(void)
{
- atomic_notifier_chain_register(&panic_notifier_list, &panic_block);
+ atomic_notifier_chain_register(&panic_info_list, &panic_block);
/* Disable hung task detector on suspend */
pm_notifier(hungtask_pm_notify, 0);
@@ -76,6 +76,9 @@ EXPORT_SYMBOL(panic_notifier_list);
ATOMIC_NOTIFIER_HEAD(panic_hypervisor_list);
EXPORT_SYMBOL(panic_hypervisor_list);
+ATOMIC_NOTIFIER_HEAD(panic_info_list);
+EXPORT_SYMBOL(panic_info_list);
+
static long no_blink(int state)
{
return 0;
@@ -291,6 +294,7 @@ void panic(const char *fmt, ...)
* add information to the kmsg dump output.
*/
atomic_notifier_call_chain(&panic_hypervisor_list, PANIC_NOTIFIER, buf);
+ atomic_notifier_call_chain(&panic_info_list, PANIC_NOTIFIER, buf);
atomic_notifier_call_chain(&panic_notifier_list, PANIC_NOTIFIER, buf);
panic_print_sys_info(false);
@@ -35,7 +35,6 @@
#include <linux/panic.h>
#include <linux/panic_notifier.h>
#include <linux/percpu.h>
-#include <linux/notifier.h>
#include <linux/cpu.h>
#include <linux/mutex.h>
#include <linux/time.h>
@@ -97,11 +97,12 @@ static int rcu_panic(struct notifier_block *this, unsigned long ev, void *ptr)
static struct notifier_block rcu_panic_block = {
.notifier_call = rcu_panic,
+ .priority = INT_MAX, /* run early to prevent potential log flood */
};
static int __init check_cpu_stall_init(void)
{
- atomic_notifier_chain_register(&panic_notifier_list, &rcu_panic_block);
+ atomic_notifier_chain_register(&panic_info_list, &rcu_panic_block);
return 0;
}
early_initcall(check_cpu_stall_init);
@@ -10138,7 +10138,7 @@ __init static int tracer_alloc_buffers(void)
/* All seems OK, enable tracing */
tracing_disabled = 0;
- atomic_notifier_chain_register(&panic_notifier_list,
+ atomic_notifier_chain_register(&panic_info_list,
&trace_panic_notifier);
register_die_notifier(&trace_die_notifier);
The goal of this new panic notifier is to allow its users to register callbacks to run earlier in the panic path than they currently do. This aims at informational mechanisms, like dumping kernel offsets and showing device error data (in case it's simple registers reading, for example) as well as mechanisms to disable log flooding (like hung_task detector / RCU warnings) and the tracing dump_on_oops (when enabled). Any (non-invasive) information that should be provided before kmsg_dump() as well as log flooding preventing code should fit here, as long it offers relatively low risk for kdump. For now, the patch is almost a no-op, although it changes a bit the ordering in which some panic notifiers are executed - specially affected by this are the notifiers responsible for disabling the hung_task detector / RCU warnings, which now run first. In a subsequent patch, the panic path will be refactored, then the panic informational notifiers will effectively run earlier, before ksmg_dump() (and usually before kdump as well). We also defer documenting it all properly in the subsequent refactor patch. Finally, while at it, we removed some useless header inclusions too. Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Florian Fainelli <f.fainelli@gmail.com> Cc: Frederic Weisbecker <frederic@kernel.org> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Hari Bathini <hbathini@linux.ibm.com> Cc: Joel Fernandes <joel@joelfernandes.org> Cc: Jonathan Hunter <jonathanh@nvidia.com> Cc: Josh Triplett <josh@joshtriplett.org> Cc: Lai Jiangshan <jiangshanlai@gmail.com> Cc: Leo Yan <leo.yan@linaro.org> Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Cc: Mathieu Poirier <mathieu.poirier@linaro.org> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Mike Leach <mike.leach@linaro.org> Cc: Mikko Perttunen <mperttunen@nvidia.com> Cc: Neeraj Upadhyay <quic_neeraju@quicinc.com> Cc: Nicholas Piggin <npiggin@gmail.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Suzuki K Poulose <suzuki.poulose@arm.com> Cc: Thierry Reding <thierry.reding@gmail.com> Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de> Signed-off-by: Guilherme G. Piccoli <gpiccoli@igalia.com> --- arch/arm64/kernel/setup.c | 2 +- arch/mips/kernel/relocate.c | 2 +- arch/powerpc/kernel/setup-common.c | 2 +- arch/x86/kernel/setup.c | 2 +- drivers/bus/brcmstb_gisb.c | 2 +- drivers/hwtracing/coresight/coresight-cpu-debug.c | 4 ++-- drivers/soc/tegra/ari-tegra186.c | 3 ++- include/linux/panic_notifier.h | 1 + kernel/hung_task.c | 3 ++- kernel/panic.c | 4 ++++ kernel/rcu/tree.c | 1 - kernel/rcu/tree_stall.h | 3 ++- kernel/trace/trace.c | 2 +- 13 files changed, 19 insertions(+), 12 deletions(-)