On Thu, Apr 06, 2017 at 02:17:22AM +0530, Mahesh J Salgaonkar wrote: > From: Mahesh Salgaonkar <mahesh@xxxxxxxxxxxxxxxxxx> > > This patch introduces a mce hook which is invoked at the time of guest > exit to facilitate the host-side handling of machine check exception > before the exception is passed on to the guest. This hook will be invoked > from host virtual mode from KVM (before exiting the guest with > KVM_EXIT_NMI reason) for machine check exception that occurs in the guest. > > Signed-off-by: Mahesh Salgaonkar <mahesh@xxxxxxxxxxxxxxxxxx> Um.. this introduces the hook, and puts in an implementation of it, but AFAICT, nothing calls it, either here or in the next patch. That seems a bit pointless. > --- > arch/powerpc/include/asm/machdep.h | 7 +++++++ > arch/powerpc/include/asm/opal.h | 4 ++++ > arch/powerpc/platforms/powernv/opal.c | 26 ++++++++++++++++++++++++++ > arch/powerpc/platforms/powernv/setup.c | 3 +++ > 4 files changed, 40 insertions(+) > > diff --git a/arch/powerpc/include/asm/machdep.h b/arch/powerpc/include/asm/machdep.h > index 5011b69..9d74e7a 100644 > --- a/arch/powerpc/include/asm/machdep.h > +++ b/arch/powerpc/include/asm/machdep.h > @@ -15,6 +15,7 @@ > #include <linux/export.h> > > #include <asm/setup.h> > +#include <asm/mce.h> > > /* We export this macro for external modules like Alsa to know if > * ppc_md.feature_call is implemented or not > @@ -112,6 +113,12 @@ struct machdep_calls { > /* Called during machine check exception to retrive fixup address. */ > bool (*mce_check_early_recovery)(struct pt_regs *regs); > > +#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE > + /* Called after KVM interrupt handler finishes handling MCE for guest */ > + int (*machine_check_exception_guest) > + (struct machine_check_event *evt); > +#endif > + > /* Motherboard/chipset features. This is a kind of general purpose > * hook used to control some machine specific features (like reset > * lines, chip power control, etc...). > diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h > index 1ff03a6..9b1fcbf 100644 > --- a/arch/powerpc/include/asm/opal.h > +++ b/arch/powerpc/include/asm/opal.h > @@ -17,6 +17,7 @@ > #ifndef __ASSEMBLY__ > > #include <linux/notifier.h> > +#include <asm/mce.h> > > /* We calculate number of sg entries based on PAGE_SIZE */ > #define SG_ENTRIES_PER_NODE ((PAGE_SIZE - 16) / sizeof(struct opal_sg_entry)) > @@ -273,6 +274,9 @@ extern int opal_hmi_handler_init(void); > extern int opal_event_init(void); > > extern int opal_machine_check(struct pt_regs *regs); > +#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE > +extern int opal_machine_check_guest(struct machine_check_event *evt); > +#endif > extern bool opal_mce_check_early_recovery(struct pt_regs *regs); > extern int opal_hmi_exception_early(struct pt_regs *regs); > extern int opal_handle_hmi_exception(struct pt_regs *regs); > diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c > index e0f856b..5e633a4 100644 > --- a/arch/powerpc/platforms/powernv/opal.c > +++ b/arch/powerpc/platforms/powernv/opal.c > @@ -479,6 +479,32 @@ int opal_machine_check(struct pt_regs *regs) > return 0; > } > > +#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE > +/* > + * opal_machine_check_guest() is a hook which is invoked at the time > + * of guest exit to facilitate the host-side handling of machine check > + * exception before the exception is passed on to the guest. This hook > + * is invoked from host virtual mode from KVM (before exiting the guest > + * with KVM_EXIT_NMI reason) for machine check exception that occurs in > + * the guest. > + * > + * Currently no action is performed in the host other than printing the > + * event information. The machine check exception is passed on to the > + * guest kernel and the guest kernel will attempt for recovery. > + */ > +int opal_machine_check_guest(struct machine_check_event *evt) > +{ > + /* Print things out */ > + if (evt->version != MCE_V1) { > + pr_err("Machine Check Exception, Unknown event version %d !\n", > + evt->version); > + return 0; > + } > + machine_check_print_event_info(evt); > + return 0; > +} > +#endif > + > /* Early hmi handler called in real mode. */ > int opal_hmi_exception_early(struct pt_regs *regs) > { > diff --git a/arch/powerpc/platforms/powernv/setup.c b/arch/powerpc/platforms/powernv/setup.c > index d50c7d9..333ee09 100644 > --- a/arch/powerpc/platforms/powernv/setup.c > +++ b/arch/powerpc/platforms/powernv/setup.c > @@ -264,6 +264,9 @@ static void __init pnv_setup_machdep_opal(void) > ppc_md.mce_check_early_recovery = opal_mce_check_early_recovery; > ppc_md.hmi_exception_early = opal_hmi_exception_early; > ppc_md.handle_hmi_exception = opal_handle_hmi_exception; > +#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE > + ppc_md.machine_check_exception_guest = opal_machine_check_guest; > +#endif > } > > static int __init pnv_probe(void) > -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson
Attachment:
signature.asc
Description: PGP signature