Dexuan Cui <decui@xxxxxxxxxxxxx> writes: > This is needed for hibernation, e.g. when we resume the old kernel, we need > to disable the "current" kernel's hypercall page and then resume the old > kernel's. > > Signed-off-by: Dexuan Cui <decui@xxxxxxxxxxxxx> > Reviewed-by: Michael Kelley <mikelley@xxxxxxxxxxxxx> > --- > arch/x86/hyperv/hv_init.c | 33 +++++++++++++++++++++++++++++++++ > 1 file changed, 33 insertions(+) > > diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c > index 866dfb3..037b0f3 100644 > --- a/arch/x86/hyperv/hv_init.c > +++ b/arch/x86/hyperv/hv_init.c > @@ -20,6 +20,7 @@ > #include <linux/hyperv.h> > #include <linux/slab.h> > #include <linux/cpuhotplug.h> > +#include <linux/syscore_ops.h> > #include <clocksource/hyperv_timer.h> > > void *hv_hypercall_pg; > @@ -223,6 +224,34 @@ static int __init hv_pci_init(void) > return 1; > } > > +static int hv_suspend(void) > +{ > + union hv_x64_msr_hypercall_contents hypercall_msr; > + > + /* Reset the hypercall page */ > + rdmsrl(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64); > + hypercall_msr.enable = 0; > + wrmsrl(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64); > + (trying to think out loud, not sure there's a real issue): When PV IPIs (or PV TLB flush) are enabled we do the following checks: if (!hv_hypercall_pg) return false; or if (!hv_hypercall_pg) goto do_native; which will pass as we're not invalidating the pointer. Can we actually be sure that the kernel will never try to send an IPI/do TLB flush before we resume? -- Vitaly