On 07/05/2017 09:26 AM, Nicholas Piggin wrote:
> If fadump is not registered, and no other crash or debug handlers are
> registered, the powerpc panic handler stops the guest before the generic
> panic code can push out debug information to the console.
> 
> Currently, system reset injection causes the guest to silently
> stop.
> 
> Stop calling ppc_md.panic in the panic notifier. crash_fadump already
> does rtas_os_term() to terminate the guest if fadump is registered.
> 
> Remove ppc_md.panic. Move fadump panic notifier into fadump code.
> 
> Signed-off-by: Nicholas Piggin <npig...@gmail.com>

Reviewed-by: Mahesh Salgaonkar <mah...@linux.vnet.ibm.com>

Thanks,
-Mahesh.

> ---
>  arch/powerpc/include/asm/machdep.h     |  1 -
>  arch/powerpc/include/asm/setup.h       |  1 -
>  arch/powerpc/kernel/fadump.c           | 22 ++++++++++++++++++++++
>  arch/powerpc/kernel/setup-common.c     | 27 ---------------------------
>  arch/powerpc/platforms/ps3/setup.c     | 15 ---------------
>  arch/powerpc/platforms/pseries/setup.c |  1 -
>  6 files changed, 22 insertions(+), 45 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/machdep.h 
> b/arch/powerpc/include/asm/machdep.h
> index cd2fc1cc1cc7..73b92017b6d7 100644
> --- a/arch/powerpc/include/asm/machdep.h
> +++ b/arch/powerpc/include/asm/machdep.h
> @@ -76,7 +76,6 @@ struct machdep_calls {
> 
>       void __noreturn (*restart)(char *cmd);
>       void __noreturn (*halt)(void);
> -     void            (*panic)(char *str);
>       void            (*cpu_die)(void);
> 
>       long            (*time_init)(void); /* Optional, may be NULL */
> diff --git a/arch/powerpc/include/asm/setup.h 
> b/arch/powerpc/include/asm/setup.h
> index 654d64c9f3ac..3a3fb0ca68f5 100644
> --- a/arch/powerpc/include/asm/setup.h
> +++ b/arch/powerpc/include/asm/setup.h
> @@ -23,7 +23,6 @@ extern void reloc_got2(unsigned long);
> 
>  void check_for_initrd(void);
>  void initmem_init(void);
> -void setup_panic(void);
>  #define ARCH_PANIC_TIMEOUT 180
> 
>  #ifdef CONFIG_PPC_PSERIES
> diff --git a/arch/powerpc/kernel/fadump.c b/arch/powerpc/kernel/fadump.c
> index 3079518f2245..8f1a8bd8433c 100644
> --- a/arch/powerpc/kernel/fadump.c
> +++ b/arch/powerpc/kernel/fadump.c
> @@ -1447,6 +1447,25 @@ static void fadump_init_files(void)
>       return;
>  }
> 
> +static int fadump_panic_event(struct notifier_block *this,
> +                             unsigned long event, void *ptr)
> +{
> +     /*
> +      * If firmware-assisted dump has been registered then trigger
> +      * firmware-assisted dump and let firmware handle everything
> +      * else. If this returns, then fadump was not registered, so
> +      * go through the rest of the panic path.
> +      */
> +     crash_fadump(NULL, ptr);
> +
> +     return NOTIFY_DONE;
> +}
> +
> +static struct notifier_block fadump_panic_block = {
> +     .notifier_call = fadump_panic_event,
> +     .priority = INT_MIN /* may not return; must be done last */
> +};
> +
>  /*
>   * Prepare for firmware-assisted dump.
>   */
> @@ -1479,6 +1498,9 @@ int __init setup_fadump(void)
>               init_fadump_mem_struct(&fdm, fw_dump.reserve_dump_area_start);
>       fadump_init_files();
> 
> +     atomic_notifier_chain_register(&panic_notifier_list,
> +                                     &fadump_panic_block);
> +
>       return 1;
>  }
>  subsys_initcall(setup_fadump);
> diff --git a/arch/powerpc/kernel/setup-common.c 
> b/arch/powerpc/kernel/setup-common.c
> index 94a948207cd2..b697530d9bdc 100644
> --- a/arch/powerpc/kernel/setup-common.c
> +++ b/arch/powerpc/kernel/setup-common.c
> @@ -704,30 +704,6 @@ int check_legacy_ioport(unsigned long base_port)
>  }
>  EXPORT_SYMBOL(check_legacy_ioport);
> 
> -static int ppc_panic_event(struct notifier_block *this,
> -                             unsigned long event, void *ptr)
> -{
> -     /*
> -      * If firmware-assisted dump has been registered then trigger
> -      * firmware-assisted dump and let firmware handle everything else.
> -      */
> -     crash_fadump(NULL, ptr);
> -     ppc_md.panic(ptr);  /* May not return */
> -     return NOTIFY_DONE;
> -}
> -
> -static struct notifier_block ppc_panic_block = {
> -     .notifier_call = ppc_panic_event,
> -     .priority = INT_MIN /* may not return; must be done last */
> -};
> -
> -void __init setup_panic(void)
> -{
> -     if (!ppc_md.panic)
> -             return;
> -     atomic_notifier_chain_register(&panic_notifier_list, &ppc_panic_block);
> -}
> -
>  #ifdef CONFIG_CHECK_CACHE_COHERENCY
>  /*
>   * For platforms that have configurable cache-coherency.  This function
> @@ -872,9 +848,6 @@ void __init setup_arch(char **cmdline_p)
>       /* Probe the machine type, establish ppc_md. */
>       probe_machine();
> 
> -     /* Setup panic notifier if requested by the platform. */
> -     setup_panic();
> -
>       /*
>        * Configure ppc_md.power_save (ppc32 only, 64-bit machines do
>        * it from their respective probe() function.
> diff --git a/arch/powerpc/platforms/ps3/setup.c 
> b/arch/powerpc/platforms/ps3/setup.c
> index 6244bc849469..9dabea6e1443 100644
> --- a/arch/powerpc/platforms/ps3/setup.c
> +++ b/arch/powerpc/platforms/ps3/setup.c
> @@ -104,20 +104,6 @@ static void __noreturn ps3_halt(void)
>       ps3_sys_manager_halt(); /* never returns */
>  }
> 
> -static void ps3_panic(char *str)
> -{
> -     DBG("%s:%d %s\n", __func__, __LINE__, str);
> -
> -     smp_send_stop();
> -     printk("\n");
> -     printk("   System does not reboot automatically.\n");
> -     printk("   Please press POWER button.\n");
> -     printk("\n");
> -
> -     while(1)
> -             lv1_pause(1);
> -}
> -
>  #if defined(CONFIG_FB_PS3) || defined(CONFIG_FB_PS3_MODULE) || \
>      defined(CONFIG_PS3_FLASH) || defined(CONFIG_PS3_FLASH_MODULE)
>  static void __init prealloc(struct ps3_prealloc *p)
> @@ -269,7 +255,6 @@ define_machine(ps3) {
>       .probe                          = ps3_probe,
>       .setup_arch                     = ps3_setup_arch,
>       .init_IRQ                       = ps3_init_IRQ,
> -     .panic                          = ps3_panic,
>       .get_boot_time                  = ps3_get_boot_time,
>       .set_dabr                       = ps3_set_dabr,
>       .calibrate_decr                 = ps3_calibrate_decr,
> diff --git a/arch/powerpc/platforms/pseries/setup.c 
> b/arch/powerpc/platforms/pseries/setup.c
> index b5d86426e97b..b5b650910cf5 100644
> --- a/arch/powerpc/platforms/pseries/setup.c
> +++ b/arch/powerpc/platforms/pseries/setup.c
> @@ -722,7 +722,6 @@ define_machine(pseries) {
>       .pcibios_fixup          = pSeries_final_fixup,
>       .restart                = rtas_restart,
>       .halt                   = rtas_halt,
> -     .panic                  = rtas_os_term,
>       .get_boot_time          = rtas_get_boot_time,
>       .get_rtc_time           = rtas_get_rtc_time,
>       .set_rtc_time           = rtas_set_rtc_time,
> 

Reply via email to