From 7f6015b32e92876c0eb5ce9bda84ccbd5e0dc78d Mon Sep 17 00:00:00 2001 From: "Ravi K. Nittala" Date: Mon, 3 Oct 2011 21:49:53 +0000 Subject: [PATCH] --- yaml --- r: 279519 b: refs/heads/master c: df17f56d8a1a3a533b6b3e3a49a624626a49b197 h: refs/heads/master i: 279517: b5b9e4e096ccae811dcb18ecbcb840e0721dd474 279515: 8db23ec87590061391f4e33a951d5a40e91b4620 279511: d3a7e2385718d8052aaead36abf607b3a470819d 279503: 6120c0485487d831f01a97ae00eaeb2e556a679b 279487: 53500ba5c9bd9989478d723814d4e0f4100cecac v: v3 --- [refs] | 2 +- trunk/arch/powerpc/include/asm/rtas.h | 6 ++++++ trunk/arch/powerpc/kernel/rtas_flash.c | 6 ++++++ trunk/arch/powerpc/kernel/rtasd.c | 7 +++++++ 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 4d40f148c58e..bf54e22447aa 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: cc35b6766878e31accc95c3fdae945bdadc73a46 +refs/heads/master: df17f56d8a1a3a533b6b3e3a49a624626a49b197 diff --git a/trunk/arch/powerpc/include/asm/rtas.h b/trunk/arch/powerpc/include/asm/rtas.h index 41f69ae79d4e..1646b76bd3d2 100644 --- a/trunk/arch/powerpc/include/asm/rtas.h +++ b/trunk/arch/powerpc/include/asm/rtas.h @@ -245,6 +245,12 @@ extern int early_init_dt_scan_rtas(unsigned long node, extern void pSeries_log_error(char *buf, unsigned int err_type, int fatal); +#ifdef CONFIG_PPC_RTAS_DAEMON +extern void rtas_cancel_event_scan(void); +#else +static inline void rtas_cancel_event_scan(void) { } +#endif + /* Error types logged. */ #define ERR_FLAG_ALREADY_LOGGED 0x0 #define ERR_FLAG_BOOT 0x1 /* log was pulled from NVRAM on boot */ diff --git a/trunk/arch/powerpc/kernel/rtas_flash.c b/trunk/arch/powerpc/kernel/rtas_flash.c index e037c7494fd8..4174b4b23246 100644 --- a/trunk/arch/powerpc/kernel/rtas_flash.c +++ b/trunk/arch/powerpc/kernel/rtas_flash.c @@ -567,6 +567,12 @@ static void rtas_flash_firmware(int reboot_type) return; } + /* + * Just before starting the firmware flash, cancel the event scan work + * to avoid any soft lockup issues. + */ + rtas_cancel_event_scan(); + /* * NOTE: the "first" block must be under 4GB, so we create * an entry with no data blocks in the reserved buffer in diff --git a/trunk/arch/powerpc/kernel/rtasd.c b/trunk/arch/powerpc/kernel/rtasd.c index 481ef064c8f1..1045ff49cc6d 100644 --- a/trunk/arch/powerpc/kernel/rtasd.c +++ b/trunk/arch/powerpc/kernel/rtasd.c @@ -472,6 +472,13 @@ static void start_event_scan(void) &event_scan_work, event_scan_delay); } +/* Cancel the rtas event scan work */ +void rtas_cancel_event_scan(void) +{ + cancel_delayed_work_sync(&event_scan_work); +} +EXPORT_SYMBOL_GPL(rtas_cancel_event_scan); + static int __init rtas_init(void) { struct proc_dir_entry *entry;