linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / 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
  2020-02-01  8:48 ` [tip: x86/urgent] " tip-bot2 for Dexuan Cui
  0 siblings, 2 replies; 6+ 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 related	[flat|nested] 6+ 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
  2020-02-01  8:48 ` [tip: x86/urgent] " tip-bot2 for Dexuan Cui
  1 sibling, 1 reply; 6+ 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] 6+ 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; 6+ 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] 6+ 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; 6+ 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] 6+ 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; 6+ 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] 6+ messages in thread

* [tip: x86/urgent] 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-02-01  8:48 ` tip-bot2 for Dexuan Cui
  1 sibling, 0 replies; 6+ messages in thread
From: tip-bot2 for Dexuan Cui @ 2020-02-01  8:48 UTC (permalink / raw)
  To: linux-tip-commits; +Cc: Dexuan Cui, Thomas Gleixner, Michael Kelley, x86, LKML

The following commit has been merged into the x86/urgent branch of tip:

Commit-ID:     05bd330a7fd8875c423fc07d8ddcad73c10e556e
Gitweb:        https://git.kernel.org/tip/05bd330a7fd8875c423fc07d8ddcad73c10e556e
Author:        Dexuan Cui <decui@microsoft.com>
AuthorDate:    Mon, 06 Jan 2020 14:42:39 -08:00
Committer:     Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Sat, 01 Feb 2020 09:41:16 +01:00

x86/hyperv: Suspend/resume the hypercall page for hibernation

For hibernation the hypercall page must be disabled before the hibernation
image is created so that subsequent hypercall operations fail safely. On
resume the hypercall page has to be restored and reenabled to ensure proper
operation of the resumed kernel.

Implement the necessary suspend/resume callbacks.

[ tglx: Decrypted changelog ]

Signed-off-by: Dexuan Cui <decui@microsoft.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Michael Kelley <mikelley@microsoft.com>
Link: https://lore.kernel.org/r/1578350559-130275-1-git-send-email-decui@microsoft.com

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

diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
index caaf4dc..b0da532 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);
 
+/* Storage to 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,48 @@ 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 as it is going to be invalidated
+	 * accross hibernation. Setting hv_hypercall_pg to NULL ensures
+	 * that any subsequent hypercall operation fails safely instead of
+	 * crashing due to an access of an invalid page. The hypercall page
+	 * pointer is restored on resume.
+	 */
+	hv_hypercall_pg_saved = hv_hypercall_pg;
+	hv_hypercall_pg = NULL;
+
+	/* Disable the hypercall page in the hypervisor */
+	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 +376,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 +397,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);
 

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

end of thread, other threads:[~2020-02-01  8:48 UTC | newest]

Thread overview: 6+ 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
2020-02-01  8:48 ` [tip: x86/urgent] " tip-bot2 for Dexuan Cui

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).