Linux-HyperV Archive on lore.kernel.org
 help / color / Atom feed
* [PATCH v6][RESEND] x86/hyperv: Suspend/resume the hypercall page for hibernation
@ 2020-01-06 22:42 Dexuan Cui
  2020-01-25  1:44 ` Dexuan Cui
  0 siblings, 1 reply; 5+ messages in thread
From: Dexuan Cui @ 2020-01-06 22:42 UTC (permalink / raw)
  To: arnd, bp, daniel.lezcano, haiyangz, hpa, kys, linux-hyperv,
	linux-kernel, mingo, sashal, sthemmin, tglx, x86, mikelley,
	Alexander.Levin, vkuznets
  Cc: linux-arch, Dexuan Cui

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@microsoft.com>
Reviewed-by: Michael Kelley <mikelley@microsoft.com>
---

This is a RESEND of https://lkml.org/lkml/2019/11/20/68 .

Please review.

If it looks good, can you please pick it up through the tip.git tree?


 arch/x86/hyperv/hv_init.c | 48 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)

diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
index caaf4dce99bf..24a62d33067c 100644
--- a/arch/x86/hyperv/hv_init.c
+++ b/arch/x86/hyperv/hv_init.c
@@ -21,11 +21,15 @@
 #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;
 EXPORT_SYMBOL_GPL(hv_hypercall_pg);
 
+/* Save the hypercall page temporarily for hibernation */
+static void *hv_hypercall_pg_saved;
+
 u32 *hv_vp_index;
 EXPORT_SYMBOL_GPL(hv_vp_index);
 
@@ -246,6 +250,46 @@ static int __init hv_pci_init(void)
 	return 1;
 }
 
+static int hv_suspend(void)
+{
+	union hv_x64_msr_hypercall_contents hypercall_msr;
+
+	/*
+	 * Reset hypercall page reference before reset the page,
+	 * let hypercall operations fail safely rather than
+	 * panic the kernel for using invalid hypercall page
+	 */
+	hv_hypercall_pg_saved = hv_hypercall_pg;
+	hv_hypercall_pg = NULL;
+
+	/* 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);
+
+	return 0;
+}
+
+static void hv_resume(void)
+{
+	union hv_x64_msr_hypercall_contents hypercall_msr;
+
+	/* Re-enable the hypercall page */
+	rdmsrl(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64);
+	hypercall_msr.enable = 1;
+	hypercall_msr.guest_physical_address =
+		vmalloc_to_pfn(hv_hypercall_pg_saved);
+	wrmsrl(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64);
+
+	hv_hypercall_pg = hv_hypercall_pg_saved;
+	hv_hypercall_pg_saved = NULL;
+}
+
+static struct syscore_ops hv_syscore_ops = {
+	.suspend = hv_suspend,
+	.resume = hv_resume,
+};
+
 /*
  * This function is to be invoked early in the boot sequence after the
  * hypervisor has been detected.
@@ -330,6 +374,8 @@ void __init hyperv_init(void)
 
 	x86_init.pci.arch_init = hv_pci_init;
 
+	register_syscore_ops(&hv_syscore_ops);
+
 	return;
 
 remove_cpuhp_state:
@@ -349,6 +395,8 @@ void hyperv_cleanup(void)
 {
 	union hv_x64_msr_hypercall_contents hypercall_msr;
 
+	unregister_syscore_ops(&hv_syscore_ops);
+
 	/* Reset our OS id */
 	wrmsrl(HV_X64_MSR_GUEST_OS_ID, 0);
 
-- 
2.19.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* RE: [PATCH v6][RESEND] x86/hyperv: Suspend/resume the hypercall page for hibernation
  2020-01-06 22:42 [PATCH v6][RESEND] x86/hyperv: Suspend/resume the hypercall page for hibernation Dexuan Cui
@ 2020-01-25  1:44 ` Dexuan Cui
  2020-01-30  0:05   ` Sasha Levin
  0 siblings, 1 reply; 5+ messages in thread
From: Dexuan Cui @ 2020-01-25  1:44 UTC (permalink / raw)
  To: arnd, bp, daniel.lezcano, Haiyang Zhang, hpa, KY Srinivasan,
	linux-hyperv, linux-kernel, mingo, sashal, Stephen Hemminger,
	tglx, x86, Michael Kelley, Sasha Levin, vkuznets
  Cc: linux-arch

> From: Dexuan Cui <decui@microsoft.com>
> Sent: Monday, January 6, 2020 2:43 PM
> 
> 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@microsoft.com>
> Reviewed-by: Michael Kelley <mikelley@microsoft.com>
> ---
> 
> This is a RESEND of https://lkml.org/lkml/2019/11/20/68
> 
> Please review.
> 
> If it looks good, can you please pick it up through the tip.git tree?
> 
>  arch/x86/hyperv/hv_init.c | 48
> +++++++++++++++++++++++++++++++++++++++
>  1 file changed, 48 insertions(+)

Hi, Vitaly and x86 maintainers,
Can you please take a look at this patch?

Thanks,
-- Dexuan

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v6][RESEND] x86/hyperv: Suspend/resume the hypercall page for hibernation
  2020-01-25  1:44 ` Dexuan Cui
@ 2020-01-30  0:05   ` Sasha Levin
  2020-01-30  1:02     ` Dexuan Cui
  2020-01-30  7:37     ` Thomas Gleixner
  0 siblings, 2 replies; 5+ messages in thread
From: Sasha Levin @ 2020-01-30  0:05 UTC (permalink / raw)
  To: Dexuan Cui
  Cc: arnd, bp, daniel.lezcano, Haiyang Zhang, hpa, KY Srinivasan,
	linux-hyperv, linux-kernel, mingo, Stephen Hemminger, tglx, x86,
	Michael Kelley, Sasha Levin, vkuznets, linux-arch

On Sat, Jan 25, 2020 at 01:44:31AM +0000, Dexuan Cui wrote:
>> From: Dexuan Cui <decui@microsoft.com>
>> Sent: Monday, January 6, 2020 2:43 PM
>>
>> 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@microsoft.com>
>> Reviewed-by: Michael Kelley <mikelley@microsoft.com>
>> ---
>>
>> This is a RESEND of https://lkml.org/lkml/2019/11/20/68
>>
>> Please review.
>>
>> If it looks good, can you please pick it up through the tip.git tree?
>>
>>  arch/x86/hyperv/hv_init.c | 48
>> +++++++++++++++++++++++++++++++++++++++
>>  1 file changed, 48 insertions(+)
>
>Hi, Vitaly and x86 maintainers,
>Can you please take a look at this patch?

Ping?

This patch has been floating around in it's current form for the past 2
months. I'll happily take Hyper-V patches under arch/x86/hyperv/ via the
Hyper-V tree rather than tip if the x86 folks don't want to deal with
them.

-- 
Thanks,
Sasha

^ permalink raw reply	[flat|nested] 5+ messages in thread

* RE: [PATCH v6][RESEND] x86/hyperv: Suspend/resume the hypercall page for hibernation
  2020-01-30  0:05   ` Sasha Levin
@ 2020-01-30  1:02     ` Dexuan Cui
  2020-01-30  7:37     ` Thomas Gleixner
  1 sibling, 0 replies; 5+ messages in thread
From: Dexuan Cui @ 2020-01-30  1:02 UTC (permalink / raw)
  To: Sasha Levin, tglx
  Cc: arnd, bp, daniel.lezcano, Haiyang Zhang, hpa, KY Srinivasan,
	linux-hyperv, linux-kernel, mingo, Stephen Hemminger, x86,
	Michael Kelley, Sasha Levin, vkuznets, linux-arch

> From: linux-hyperv-owner@vger.kernel.org
> <linux-hyperv-owner@vger.kernel.org> On Behalf Of Sasha Levin
> Sent: Wednesday, January 29, 2020 4:06 PM
> To: Dexuan Cui <decui@microsoft.com>
> Cc: arnd@arndb.de; bp@alien8.de; daniel.lezcano@linaro.org; Haiyang Zhang
> <haiyangz@microsoft.com>; hpa@zytor.com; KY Srinivasan
> <kys@microsoft.com>; linux-hyperv@vger.kernel.org;
> linux-kernel@vger.kernel.org; mingo@redhat.com; Stephen Hemminger
> <sthemmin@microsoft.com>; tglx@linutronix.de; x86@kernel.org; Michael
> Kelley <mikelley@microsoft.com>; Sasha Levin
> <Alexander.Levin@microsoft.com>; vkuznets <vkuznets@redhat.com>;
> linux-arch@vger.kernel.org
> Subject: Re: [PATCH v6][RESEND] x86/hyperv: Suspend/resume the hypercall
> page for hibernation
> 
> On Sat, Jan 25, 2020 at 01:44:31AM +0000, Dexuan Cui wrote:
> >> From: Dexuan Cui <decui@microsoft.com>
> >> Sent: Monday, January 6, 2020 2:43 PM
> >>
> >> 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@microsoft.com>
> >> Reviewed-by: Michael Kelley <mikelley@microsoft.com>
> >> ---
> >>
> >> This is a RESEND of https://lkml.org/lkml/2019/11/20/68
> >>
> >> Please review.
> >>
> >> If it looks good, can you please pick it up through the tip.git tree?
> >>
> >>  arch/x86/hyperv/hv_init.c | 48
> >> +++++++++++++++++++++++++++++++++++++++
> >>  1 file changed, 48 insertions(+)
> >
> >Hi, Vitaly and x86 maintainers,
> >Can you please take a look at this patch?
> 
> Ping?
> 
> This patch has been floating around in it's current form for the past 2
> months. I'll happily take Hyper-V patches under arch/x86/hyperv/ via the
> Hyper-V tree rather than tip if the x86 folks don't want to deal with
> them.
> 
> --
> Thanks,
> Sasha

This straightforward patch is the only pending patch for v5.6 for the
hibernation functionality of Linux VM on Hyper-V. It would be really great
if we could merge it for v5.6-rc1. The patch is safe in that it only runs when 
the VM hibernates, and the hibernation functionality of Linux VM on
Hyper-V never worked before. I'm pretty sure the patch can not cause any
merge conflict since nobody else tries to modify the file recently.

Thanks,
-- Dexuan

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v6][RESEND] x86/hyperv: Suspend/resume the hypercall page for hibernation
  2020-01-30  0:05   ` Sasha Levin
  2020-01-30  1:02     ` Dexuan Cui
@ 2020-01-30  7:37     ` Thomas Gleixner
  1 sibling, 0 replies; 5+ messages in thread
From: Thomas Gleixner @ 2020-01-30  7:37 UTC (permalink / raw)
  To: Sasha Levin, Dexuan Cui
  Cc: arnd\, bp\, daniel.lezcano\, Haiyang Zhang, hpa\,
	KY Srinivasan, linux-hyperv\, linux-kernel\, mingo\,
	Stephen Hemminger, x86\,
	Michael Kelley, Sasha Levin, vkuznets, linux-arch\

Sasha Levin <sashal@kernel.org> writes:
> On Sat, Jan 25, 2020 at 01:44:31AM +0000, Dexuan Cui wrote:
>>> This is a RESEND of https://lkml.org/lkml/2019/11/20/68
>>>
>>> Please review.
>>>
>>> If it looks good, can you please pick it up through the tip.git tree?
>>>
>>>  arch/x86/hyperv/hv_init.c | 48
>>> +++++++++++++++++++++++++++++++++++++++
>>>  1 file changed, 48 insertions(+)
>>
>>Hi, Vitaly and x86 maintainers,
>>Can you please take a look at this patch?
>
> Ping?
>
> This patch has been floating around in it's current form for the past 2
> months. I'll happily take Hyper-V patches under arch/x86/hyperv/ via the
> Hyper-V tree rather than tip if the x86 folks don't want to deal with
> them.

sorry fell through the cracks. Will take care of it.

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, back to index

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-01-06 22:42 [PATCH v6][RESEND] x86/hyperv: Suspend/resume the hypercall page for hibernation Dexuan Cui
2020-01-25  1:44 ` Dexuan Cui
2020-01-30  0:05   ` Sasha Levin
2020-01-30  1:02     ` Dexuan Cui
2020-01-30  7:37     ` Thomas Gleixner

Linux-HyperV Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-hyperv/0 linux-hyperv/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-hyperv linux-hyperv/ https://lore.kernel.org/linux-hyperv \
		linux-hyperv@vger.kernel.org
	public-inbox-index linux-hyperv

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-hyperv


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git