fs/pstore: provide panic data even in suspend
Subsystems (2)
PATCH v2 1/1 fs/pstore: provide panic data even in suspend
From: yangdongdong <[email protected]>
If system restart after panic, this patch also enables panic and oops messages which in suspend context to be logged into ramoops console buffer where it can be read back at some later point.
--- fs/pstore/ram.c | 16 ++++++++++++++++ include/linux/pstore_ram.h | 1 + kernel/printk/printk.c | 7 +++++++ 3 files changed, 24 insertions(+)
fs/pstore/ram.c +16 -0
@@ -642,8 +642,23 @@ static void ramoops_register_dummy(void) } } +static int ramoops_console_notify (struct notifier_block *this, +unsigned long event,void *ptr) +{ +pr_emerg ("ramoops unlock console ...\n" ); +emergency_unlock_console (); + +return 0 ; +} + +static struct notifier_block ramoop_nb = { + .notifier_call = ramoops_console_notify, + .priority =INT_MAX , +}; +static int __init ramoops_init (void ) { +atomic_notifier_chain_register (&panic_notifier_list, &ramoop_nb);ramoops_register_dummy ();return platform_driver_register (&ramoops_driver); }
@@ -654,6 +669,7 @@ static void __exit ramoops_exit(void)platform_driver_unregister (&ramoops_driver);platform_device_unregister (dummy);kfree (dummy_data); +atomic_notifier_chain_unregister (&panic_notifier_list, &ramoop_nb); }module_exit (ramoops_exit);
include/linux/pstore_ram.h +1 -0
@@ -52,6 +52,7 @@ struct persistent_ram_zone {size_t old_log_size; }; +extern void emergency_unlock_console (void );struct persistent_ram_zone *persistent_ram_new (phys_addr_t start,size_t size,u32 sig,struct persistent_ram_ecc_info *ecc_info,unsigned int memtype);
kernel/printk/printk.c +7 -0
@@ -2107,6 +2107,13 @@ void resume_console(void)console_unlock (); } +void emergency_unlock_console (void ) +{ +if (panic_timeout !=0 ) +resume_console (); +} +EXPORT_SYMBOL (emergency_unlock_console); +/** * console_cpu_notify - print deferred console messages after CPU hotplug * @self: notifier struct
Signature · 13 lines
2.5.0 The above PATCH-v2 with following update: - Change subject "[PATCH] ramoops" to "[PATCH-v2] fs/pstore" - Add panic_timeout as emergency_unlock condition - Add Ethan Du to signed-off list For Petr's concern on panic break, here adds panic_timeout check as emergency_unlock_console condition. Because our original intention is collecting suspend panic debugging information before system reboot. Best Regards, Andy 2015-08-05 22:53 GMT+08:00 Petr Mladek <[email protected]>:
Quoted 26 lines · On Wed 2015-08-05 21:56:07, [email protected] wrote:
From: yangdongdong <[email protected]>
Good comments. It is valuable for code readable. Here is not necessary wrap
atomic_notifier_chain_registerintoramoops_prepare. The updated patch as below:Quoted 1 line
From
5ec3976e2b55dfaf8bd1bc88c5a9c05762148fefMon Sep 17 00:00:00 2001From: yangdongdong <[email protected]>
Date: Wed, 5 Aug 2015 18:51:17 +0800
Subject: [PATCH] ramoops: provide panic data even in suspendThis also enables panic and oops messages which in suspend context to be logged into ramoops console buffer where it can be read back at some later point.
Signed-off-by yangdongdong <[email protected]>Signed-off-by gulinghua <[email protected]>--- fs/pstore/ram.c | 16 ++++++++++++++++ include/linux/pstore_ram.h | 1 + kernel/printk/printk.c | 6 ++++++ 3 files changed, 23 insertions(+)fs/pstore/ram.c +0
-0
fs/pstore/ram.c static void ramoops_register_dummy(void) · line 649
Quoted 8 lines
fs/pstore/ram.c +5
-0@@ -642,8 +642,23 @@ static void ramoops_register_dummy(void) } } +static int ramoops_console_notify (struct notifier_block *this, +unsigned long event,void *ptr) +{ +pr_emerg ("ramoops unlock console ...\n" ); +emergency_unlock_console ();
IMHO, you need to make sure that this is called only when the console is suspended.
Well, the panic might come at any time, for example when the console is being suspended. In this case, you might not be able to take the console semaphore and you might break panic().
A solution might be to call zap_locks(). But Peter Zijlstra is against using zap_locks() because it might cause losing messages. He suggests to print to safe consoles directly, something like the x86 early_serial_console.
Best Regards,
Petr
Quoted 57 lines
fs/pstore/ram.c +11
-0+ +return 0 ; +} + +static struct notifier_block ramoop_nb = { + .notifier_call = ramoops_console_notify, + .priority =INT_MAX , +}; +static int __init ramoops_init (void ) { +atomic_notifier_chain_register (&panic_notifier_list, &ramoop_nb);ramoops_register_dummy ();return platform_driver_register (&ramoops_driver); }@@ -654,6 +669,7 @@ static void __exit ramoops_exit(void)platform_driver_unregister (&ramoops_driver);platform_device_unregister (dummy);kfree (dummy_data); +atomic_notifier_chain_unregister (&panic_notifier_list, &ramoop_nb); }module_exit (ramoops_exit);include/linux/pstore_ram.h +1
-0@@ -52,6 +52,7 @@ struct persistent_ram_zone {size_t old_log_size; }; +extern void emergency_unlock_console (void );struct persistent_ram_zone *persistent_ram_new (phys_addr_t start,size_t size,u32 sig,struct persistent_ram_ecc_info *ecc_info,unsigned int memtype);kernel/printk/printk.c +6
-1@@ -2107,6 +2107,12 @@ void resume_console(void)console_unlock (); } +void emergency_unlock_console (void ) +{ +resume_console (); +} +EXPORT_SYMBOL (emergency_unlock_console); +/** * console_cpu_notify - print deferred console messages after CPU hotplug * @self: notifier struct -- 2.5.0
Thanks,
Andy