linux-hyperv.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v6 0/3] Add support for clean shutdown with MSHV
@ 2025-11-26 21:49 Praveen K Paladugu
  2025-11-26 21:49 ` [PATCH v6 1/3] hyperv: Add definitions for MSHV sleep state configuration Praveen K Paladugu
                   ` (3 more replies)
  0 siblings, 4 replies; 13+ messages in thread
From: Praveen K Paladugu @ 2025-11-26 21:49 UTC (permalink / raw)
  To: kys, haiyangz, wei.liu, decui, tglx, mingo, linux-hyperv,
	linux-kernel, bp, dave.hansen, x86, hpa, arnd
  Cc: anbelski, prapal, easwar.hariharan, nunodasneves, skinsburskii

Add support for clean shutdown of the root partition when running on
MSHV Hypervisor.

v6:
 - Fixed build errors, by adding CONFIG_X86_64 guard
 - Moved machine_ops hook definition to ms_hyperv_init_platform
 - Addressed review comments in v5

v5:
 - Fixed build errors
 - Padded struct hv_input_set_system_property for alignment
 - Dropped CONFIG_ACPI stub

v4:
 - Adopted machine_ops to order invoking HV_ENTER_SLEEP_STATE as the
   last step in shutdown sequence.
 - This ensures rest of the cleanups are done before powering off

v3:
 - Dropped acpi_sleep handlers as they are not used on mshv
 - Applied ordering for hv_reboot_notifier
 - Fixed build issues on i386, arm64 architectures

v2:
  - Addressed review comments from v1.
  - Moved all sleep state handling methods under CONFIG_ACPI stub
  - - This fixes build issues on non-x86 architectures.


Praveen K Paladugu (3):
  hyperv: Add definitions for MSHV sleep state configuration
  hyperv: Use reboot notifier to configure sleep state
  hyperv: Cleanly shutdown root partition with MSHV

 arch/x86/hyperv/hv_init.c       |  1 +
 arch/x86/include/asm/mshyperv.h |  4 ++
 arch/x86/kernel/cpu/mshyperv.c  |  2 +
 drivers/hv/mshv_common.c        | 98 +++++++++++++++++++++++++++++++++
 include/hyperv/hvgdk_mini.h     |  4 +-
 include/hyperv/hvhdk_mini.h     | 40 ++++++++++++++
 6 files changed, 148 insertions(+), 1 deletion(-)

-- 
2.51.0


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

* [PATCH v6 1/3] hyperv: Add definitions for MSHV sleep state configuration
  2025-11-26 21:49 [PATCH v6 0/3] Add support for clean shutdown with MSHV Praveen K Paladugu
@ 2025-11-26 21:49 ` Praveen K Paladugu
  2025-12-01 17:00   ` Stanislav Kinsburskii
  2025-11-26 21:49 ` [PATCH v6 2/3] hyperv: Use reboot notifier to configure sleep state Praveen K Paladugu
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 13+ messages in thread
From: Praveen K Paladugu @ 2025-11-26 21:49 UTC (permalink / raw)
  To: kys, haiyangz, wei.liu, decui, tglx, mingo, linux-hyperv,
	linux-kernel, bp, dave.hansen, x86, hpa, arnd
  Cc: anbelski, prapal, easwar.hariharan, nunodasneves, skinsburskii

Add the definitions required to configure sleep states in mshv hypervsior.

Signed-off-by: Praveen K Paladugu <prapal@linux.microsoft.com>
Co-developed-by: Anatol Belski <anbelski@linux.microsoft.com>
Signed-off-by: Anatol Belski <anbelski@linux.microsoft.com>
Reviewed-by: Easwar Hariharan <easwar.hariharan@linux.microsoft.com>
Reviewed-by: Nuno Das Neves <nunodasneves@linux.microsoft.com>
---
 include/hyperv/hvgdk_mini.h |  4 +++-
 include/hyperv/hvhdk_mini.h | 40 +++++++++++++++++++++++++++++++++++++
 2 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/include/hyperv/hvgdk_mini.h b/include/hyperv/hvgdk_mini.h
index 1d5ce11be8b6..04b18d0e37af 100644
--- a/include/hyperv/hvgdk_mini.h
+++ b/include/hyperv/hvgdk_mini.h
@@ -465,19 +465,21 @@ union hv_vp_assist_msr_contents {	 /* HV_REGISTER_VP_ASSIST_PAGE */
 #define HVCALL_RESET_DEBUG_SESSION			0x006b
 #define HVCALL_MAP_STATS_PAGE				0x006c
 #define HVCALL_UNMAP_STATS_PAGE				0x006d
+#define HVCALL_SET_SYSTEM_PROPERTY			0x006f
 #define HVCALL_ADD_LOGICAL_PROCESSOR			0x0076
 #define HVCALL_GET_SYSTEM_PROPERTY			0x007b
 #define HVCALL_MAP_DEVICE_INTERRUPT			0x007c
 #define HVCALL_UNMAP_DEVICE_INTERRUPT			0x007d
 #define HVCALL_RETARGET_INTERRUPT			0x007e
 #define HVCALL_NOTIFY_PARTITION_EVENT                   0x0087
+#define HVCALL_ENTER_SLEEP_STATE			0x0084
 #define HVCALL_NOTIFY_PORT_RING_EMPTY			0x008b
 #define HVCALL_REGISTER_INTERCEPT_RESULT		0x0091
 #define HVCALL_ASSERT_VIRTUAL_INTERRUPT			0x0094
 #define HVCALL_CREATE_PORT				0x0095
 #define HVCALL_CONNECT_PORT				0x0096
 #define HVCALL_START_VP					0x0099
-#define HVCALL_GET_VP_INDEX_FROM_APIC_ID			0x009a
+#define HVCALL_GET_VP_INDEX_FROM_APIC_ID		0x009a
 #define HVCALL_FLUSH_GUEST_PHYSICAL_ADDRESS_SPACE	0x00af
 #define HVCALL_FLUSH_GUEST_PHYSICAL_ADDRESS_LIST	0x00b0
 #define HVCALL_SIGNAL_EVENT_DIRECT			0x00c0
diff --git a/include/hyperv/hvhdk_mini.h b/include/hyperv/hvhdk_mini.h
index f2d7b50de7a4..41a29bf8ec14 100644
--- a/include/hyperv/hvhdk_mini.h
+++ b/include/hyperv/hvhdk_mini.h
@@ -140,6 +140,7 @@ enum hv_snp_status {
 
 enum hv_system_property {
 	/* Add more values when needed */
+	HV_SYSTEM_PROPERTY_SLEEP_STATE = 3,
 	HV_SYSTEM_PROPERTY_SCHEDULER_TYPE = 15,
 	HV_DYNAMIC_PROCESSOR_FEATURE_PROPERTY = 21,
 	HV_SYSTEM_PROPERTY_CRASHDUMPAREA = 47,
@@ -155,6 +156,19 @@ union hv_pfn_range {            /* HV_SPA_PAGE_RANGE */
 	} __packed;
 };
 
+enum hv_sleep_state {
+	HV_SLEEP_STATE_S1 = 1,
+	HV_SLEEP_STATE_S2 = 2,
+	HV_SLEEP_STATE_S3 = 3,
+	HV_SLEEP_STATE_S4 = 4,
+	HV_SLEEP_STATE_S5 = 5,
+	/*
+	 * After hypervisor has received this, any follow up sleep
+	 * state registration requests will be rejected.
+	 */
+	HV_SLEEP_STATE_LOCK = 6
+};
+
 enum hv_dynamic_processor_feature_property {
 	/* Add more values when needed */
 	HV_X64_DYNAMIC_PROCESSOR_FEATURE_MAX_ENCRYPTED_PARTITIONS = 13,
@@ -184,6 +198,32 @@ struct hv_output_get_system_property {
 	};
 } __packed;
 
+struct hv_sleep_state_info {
+	u32 sleep_state; /* enum hv_sleep_state */
+	u8 pm1a_slp_typ;
+	u8 pm1b_slp_typ;
+} __packed;
+
+struct hv_input_set_system_property {
+	u32 property_id; /* enum hv_system_property */
+	u32 reserved;
+	union {
+		/* More fields to be filled in when needed */
+		struct hv_sleep_state_info set_sleep_state_info;
+
+		/*
+		 * Add a reserved field to ensure the union is 8-byte aligned as
+		 * existing members may not be. This is a temporary measure
+		 * until all remaining members are added.
+		 */
+		 u64 reserved0[8];
+	};
+} __packed;
+
+struct hv_input_enter_sleep_state {     /* HV_INPUT_ENTER_SLEEP_STATE */
+	u32 sleep_state;        /* enum hv_sleep_state */
+} __packed;
+
 struct hv_input_map_stats_page {
 	u32 type; /* enum hv_stats_object_type */
 	u32 padding;
-- 
2.51.0


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

* [PATCH v6 2/3] hyperv: Use reboot notifier to configure sleep state
  2025-11-26 21:49 [PATCH v6 0/3] Add support for clean shutdown with MSHV Praveen K Paladugu
  2025-11-26 21:49 ` [PATCH v6 1/3] hyperv: Add definitions for MSHV sleep state configuration Praveen K Paladugu
@ 2025-11-26 21:49 ` Praveen K Paladugu
  2025-12-01 17:02   ` Stanislav Kinsburskii
                     ` (2 more replies)
  2025-11-26 21:49 ` [PATCH v6 3/3] hyperv: Cleanly shutdown root partition with MSHV Praveen K Paladugu
  2025-11-29  6:48 ` [PATCH v6 0/3] Add support for clean shutdown " Michael Kelley
  3 siblings, 3 replies; 13+ messages in thread
From: Praveen K Paladugu @ 2025-11-26 21:49 UTC (permalink / raw)
  To: kys, haiyangz, wei.liu, decui, tglx, mingo, linux-hyperv,
	linux-kernel, bp, dave.hansen, x86, hpa, arnd
  Cc: anbelski, prapal, easwar.hariharan, nunodasneves, skinsburskii

Configure sleep state information in mshv hypervisor. This sleep state
information from ACPI will be used by hypervisor to poweroff the host.

Signed-off-by: Praveen K Paladugu <prapal@linux.microsoft.com>
Co-developed-by: Anatol Belski <anbelski@linux.microsoft.com>
Signed-off-by: Anatol Belski <anbelski@linux.microsoft.com>
Reviewed-by: Easwar Hariharan <easwar.hariharan@linux.microsoft.com>
---
 arch/x86/hyperv/hv_init.c       |  1 +
 arch/x86/include/asm/mshyperv.h |  2 +
 drivers/hv/mshv_common.c        | 80 +++++++++++++++++++++++++++++++++
 3 files changed, 83 insertions(+)

diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
index e28737ec7054..daf97a984b78 100644
--- a/arch/x86/hyperv/hv_init.c
+++ b/arch/x86/hyperv/hv_init.c
@@ -555,6 +555,7 @@ void __init hyperv_init(void)
 
 		hv_remap_tsc_clocksource();
 		hv_root_crash_init();
+		hv_sleep_notifiers_register();
 	} else {
 		hypercall_msr.guest_physical_address = vmalloc_to_pfn(hv_hypercall_pg);
 		wrmsrq(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64);
diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h
index 10037125099a..166053df0484 100644
--- a/arch/x86/include/asm/mshyperv.h
+++ b/arch/x86/include/asm/mshyperv.h
@@ -182,8 +182,10 @@ int hyperv_fill_flush_guest_mapping_list(
 void hv_apic_init(void);
 void __init hv_init_spinlocks(void);
 bool hv_vcpu_is_preempted(int vcpu);
+void hv_sleep_notifiers_register(void);
 #else
 static inline void hv_apic_init(void) {}
+static inline void hv_sleep_notifiers_register(void) {};
 #endif
 
 struct irq_domain *hv_create_pci_msi_domain(void);
diff --git a/drivers/hv/mshv_common.c b/drivers/hv/mshv_common.c
index aa2be51979fd..f1d4e81107ee 100644
--- a/drivers/hv/mshv_common.c
+++ b/drivers/hv/mshv_common.c
@@ -14,6 +14,9 @@
 #include <asm/mshyperv.h>
 #include <linux/resume_user_mode.h>
 #include <linux/export.h>
+#include <linux/acpi.h>
+#include <linux/notifier.h>
+#include <linux/reboot.h>
 
 #include "mshv.h"
 
@@ -138,3 +141,80 @@ int hv_call_get_partition_property(u64 partition_id,
 	return 0;
 }
 EXPORT_SYMBOL_GPL(hv_call_get_partition_property);
+
+#ifdef CONFIG_X86_64
+/*
+ * Corresponding sleep states have to be initialized in order for a subsequent
+ * HVCALL_ENTER_SLEEP_STATE call to succeed. Currently only S5 state as per
+ * ACPI 6.4 chapter 7.4.2 is relevant, while S1, S2 and S3 can be supported.
+ *
+ * In order to pass proper PM values to mshv, ACPI should be initialized and
+ * should support S5 sleep state when this method is invoked.
+ */
+static int hv_initialize_sleep_states(void)
+{
+	u64 status;
+	unsigned long flags;
+	struct hv_input_set_system_property *in;
+	acpi_status acpi_status;
+	u8 sleep_type_a, sleep_type_b;
+
+	if (!acpi_sleep_state_supported(ACPI_STATE_S5)) {
+		pr_err("%s: S5 sleep state not supported.\n", __func__);
+		return -ENODEV;
+	}
+
+	acpi_status = acpi_get_sleep_type_data(ACPI_STATE_S5, &sleep_type_a,
+					       &sleep_type_b);
+	if (ACPI_FAILURE(acpi_status))
+		return -ENODEV;
+
+	local_irq_save(flags);
+	in = *this_cpu_ptr(hyperv_pcpu_input_arg);
+	memset(in, 0, sizeof(*in));
+
+	in->property_id = HV_SYSTEM_PROPERTY_SLEEP_STATE;
+	in->set_sleep_state_info.sleep_state = HV_SLEEP_STATE_S5;
+	in->set_sleep_state_info.pm1a_slp_typ = sleep_type_a;
+	in->set_sleep_state_info.pm1b_slp_typ = sleep_type_b;
+
+	status = hv_do_hypercall(HVCALL_SET_SYSTEM_PROPERTY, in, NULL);
+	local_irq_restore(flags);
+
+	if (!hv_result_success(status)) {
+		hv_status_err(status, "\n");
+		return hv_result_to_errno(status);
+	}
+
+	return 0;
+}
+
+/*
+ * This notifier initializes sleep states in mshv hypervisor which will be
+ * used during power off.
+ */
+static int hv_reboot_notifier_handler(struct notifier_block *this,
+				      unsigned long code, void *another)
+{
+	int ret = 0;
+
+	if (code == SYS_HALT || code == SYS_POWER_OFF)
+		ret = hv_initialize_sleep_states();
+
+	return ret ? NOTIFY_DONE : NOTIFY_OK;
+}
+
+static struct notifier_block hv_reboot_notifier = {
+	.notifier_call = hv_reboot_notifier_handler,
+};
+
+void hv_sleep_notifiers_register(void)
+{
+	int ret;
+
+	ret = register_reboot_notifier(&hv_reboot_notifier);
+	if (ret)
+		pr_err("%s: cannot register reboot notifier %d\n", __func__,
+		       ret);
+}
+#endif
-- 
2.51.0


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

* [PATCH v6 3/3] hyperv: Cleanly shutdown root partition with MSHV
  2025-11-26 21:49 [PATCH v6 0/3] Add support for clean shutdown with MSHV Praveen K Paladugu
  2025-11-26 21:49 ` [PATCH v6 1/3] hyperv: Add definitions for MSHV sleep state configuration Praveen K Paladugu
  2025-11-26 21:49 ` [PATCH v6 2/3] hyperv: Use reboot notifier to configure sleep state Praveen K Paladugu
@ 2025-11-26 21:49 ` Praveen K Paladugu
  2025-12-01 17:05   ` Stanislav Kinsburskii
  2025-12-03 23:00   ` Nuno Das Neves
  2025-11-29  6:48 ` [PATCH v6 0/3] Add support for clean shutdown " Michael Kelley
  3 siblings, 2 replies; 13+ messages in thread
From: Praveen K Paladugu @ 2025-11-26 21:49 UTC (permalink / raw)
  To: kys, haiyangz, wei.liu, decui, tglx, mingo, linux-hyperv,
	linux-kernel, bp, dave.hansen, x86, hpa, arnd
  Cc: anbelski, prapal, easwar.hariharan, nunodasneves, skinsburskii

When a root partition running on MSHV is powered off, the default
behavior is to write ACPI registers to power-off. However, this ACPI
write is intercepted by MSHV and will result in a Machine Check
Exception(MCE).

The root partition eventually panics with a trace similar to:

  [   81.306348] reboot: Power down
  [   81.314709] mce: [Hardware Error]: CPU 0: Machine Check Exception: 4 Bank 0: b2000000c0060001
  [   81.314711] mce: [Hardware Error]: TSC 3b8cb60a66 PPIN 11d98332458e4ea9
  [   81.314713] mce: [Hardware Error]: PROCESSOR 0:606a6 TIME 1759339405 SOCKET 0 APIC 0 microcode ffffffff
  [   81.314715] mce: [Hardware Error]: Run the above through 'mcelog --ascii'
  [   81.314716] mce: [Hardware Error]: Machine check: Processor context corrupt
  [   81.314717] Kernel panic - not syncing: Fatal machine check

To correctly shutdown a root partition running on MSHV hypervisor, sleep
state information must be configured within the hypervsior. Later, the
HVCALL_ENTER_SLEEP_STATE hypercall should be invoked as the last step in
the shutdown sequence.

The previous patch configures the sleep state information and this patch
invokes HVCALL_ENTER_SLEEP_STATE hypercall to cleanly shutdown the root
partition.

Signed-off-by: Praveen K Paladugu <prapal@linux.microsoft.com>
Co-developed-by: Anatol Belski <anbelski@linux.microsoft.com>
Signed-off-by: Anatol Belski <anbelski@linux.microsoft.com>
Reviewed-by: Easwar Hariharan <easwar.hariharan@linux.microsoft.com>
---
 arch/x86/include/asm/mshyperv.h |  2 ++
 arch/x86/kernel/cpu/mshyperv.c  |  2 ++
 drivers/hv/mshv_common.c        | 18 ++++++++++++++++++
 3 files changed, 22 insertions(+)

diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h
index 166053df0484..4c22f3257368 100644
--- a/arch/x86/include/asm/mshyperv.h
+++ b/arch/x86/include/asm/mshyperv.h
@@ -183,9 +183,11 @@ void hv_apic_init(void);
 void __init hv_init_spinlocks(void);
 bool hv_vcpu_is_preempted(int vcpu);
 void hv_sleep_notifiers_register(void);
+void hv_machine_power_off(void);
 #else
 static inline void hv_apic_init(void) {}
 static inline void hv_sleep_notifiers_register(void) {};
+static inline void hv_machine_power_off(void) {};
 #endif
 
 struct irq_domain *hv_create_pci_msi_domain(void);
diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c
index fac9953a72ef..579fb2c64cfd 100644
--- a/arch/x86/kernel/cpu/mshyperv.c
+++ b/arch/x86/kernel/cpu/mshyperv.c
@@ -621,6 +621,8 @@ static void __init ms_hyperv_init_platform(void)
 #endif
 
 #if IS_ENABLED(CONFIG_HYPERV)
+	if (hv_root_partition())
+		machine_ops.power_off = hv_machine_power_off;
 #if defined(CONFIG_KEXEC_CORE)
 	machine_ops.shutdown = hv_machine_shutdown;
 #endif
diff --git a/drivers/hv/mshv_common.c b/drivers/hv/mshv_common.c
index f1d4e81107ee..28905e3ed9c0 100644
--- a/drivers/hv/mshv_common.c
+++ b/drivers/hv/mshv_common.c
@@ -217,4 +217,22 @@ void hv_sleep_notifiers_register(void)
 		pr_err("%s: cannot register reboot notifier %d\n", __func__,
 		       ret);
 }
+
+/*
+ * Power off the machine by entering S5 sleep state via Hyper-V hypercall.
+ * This call does not return if successful.
+ */
+void hv_machine_power_off(void)
+{
+	unsigned long flags;
+	struct hv_input_enter_sleep_state *in;
+
+	local_irq_save(flags);
+	in = *this_cpu_ptr(hyperv_pcpu_input_arg);
+	in->sleep_state = HV_SLEEP_STATE_S5;
+
+	(void)hv_do_hypercall(HVCALL_ENTER_SLEEP_STATE, in, NULL);
+	local_irq_restore(flags);
+
+}
 #endif
-- 
2.51.0


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

* RE: [PATCH v6 0/3] Add support for clean shutdown with MSHV
  2025-11-26 21:49 [PATCH v6 0/3] Add support for clean shutdown with MSHV Praveen K Paladugu
                   ` (2 preceding siblings ...)
  2025-11-26 21:49 ` [PATCH v6 3/3] hyperv: Cleanly shutdown root partition with MSHV Praveen K Paladugu
@ 2025-11-29  6:48 ` Michael Kelley
  2025-12-05 19:58   ` Praveen K Paladugu
  3 siblings, 1 reply; 13+ messages in thread
From: Michael Kelley @ 2025-11-29  6:48 UTC (permalink / raw)
  To: Praveen K Paladugu, kys@microsoft.com, haiyangz@microsoft.com,
	wei.liu@kernel.org, decui@microsoft.com, tglx@linutronix.de,
	mingo@redhat.com, linux-hyperv@vger.kernel.org,
	linux-kernel@vger.kernel.org, bp@alien8.de,
	dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com,
	arnd@arndb.de
  Cc: anbelski@linux.microsoft.com,
	easwar.hariharan@linux.microsoft.com,
	nunodasneves@linux.microsoft.com,
	skinsburskii@linux.microsoft.com

From: Praveen K Paladugu <prapal@linux.microsoft.com> Sent: Wednesday, November 26, 2025 1:50 PM
> 
> Add support for clean shutdown of the root partition when running on
> MSHV Hypervisor.
> 
> v6:
>  - Fixed build errors, by adding CONFIG_X86_64 guard

Adding the CONFIG_X86_64 guard seems like the right solution, and it does
make the build errors go away. However note that as coded in drivers/hv/Makefile,
 the code under the new guard won't be built at all unless CONFIG_MSHV_ROOT
is set (ignoring the VTL case for now), which can only happen in the X86_64 or
ARM64 cases. So it was nagging at me as to why the guard is needed for an
x86 32-bit build failure reported by the kernel test robot.

It turns out there's an underlying bug in drivers/hv/Makefile causing
mshv_common.o to be built in cases when it shouldn't be, such as the x86
32-bit case. The build failures reported by the kernel test robot were on these
cases when it shouldn't be built in the first place. The bug is in this Makefile line:

ifneq ($(CONFIG_MSHV_ROOT) $(CONFIG_MSHV_VTL),)

which should be 

ifneq ($(CONFIG_MSHV_ROOT)$(CONFIG_MSHV_VTL),)

The buggy version has a spurious "space" character before the start of
$(CONFIG_MSHV_VTL) such that the result is always "not equal" and
mshv_common.o is always built.

If the Makefile is fixed, then the X86_64 guards you added in
mshv_common.c are not needed. Furthermore, the stubs for
hv_sleep_notifiers_register() and hv_machine_power_off() in
arch/x86/include/asm/mshyperv.h for the !CONFIG_X86_64 case aren't
needed. And the declarations for hv_sleep_notifiers_register() and
hv_machine_power_off() can be moved out from under the #ifdef
CONFIG_X86_64. The bottom line is that nothing in this patch set needs
to be guarded by CONFIG_X86_64.

Here's a quick diff of what I changed on top of your v6 patch set
(including the fix to drivers/hv/Makefile). I tested the build process
on both x86/64 and arm64, with and without CONFIG_MSHV_ROOT
selected.

diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h
index 4c22f3257368..01d192e70211 100644
--- a/arch/x86/include/asm/mshyperv.h
+++ b/arch/x86/include/asm/mshyperv.h
@@ -178,16 +178,15 @@ int hyperv_fill_flush_guest_mapping_list(
                struct hv_guest_mapping_flush_list *flush,
                u64 start_gfn, u64 end_gfn);

+void hv_sleep_notifiers_register(void);
+void hv_machine_power_off(void);
+
 #ifdef CONFIG_X86_64
 void hv_apic_init(void);
 void __init hv_init_spinlocks(void);
 bool hv_vcpu_is_preempted(int vcpu);
-void hv_sleep_notifiers_register(void);
-void hv_machine_power_off(void);
 #else
 static inline void hv_apic_init(void) {}
-static inline void hv_sleep_notifiers_register(void) {};
-static inline void hv_machine_power_off(void) {};
 #endif

 struct irq_domain *hv_create_pci_msi_domain(void);
diff --git a/drivers/hv/Makefile b/drivers/hv/Makefile
index 58b8d07639f3..6d929fb0e13d 100644
--- a/drivers/hv/Makefile
+++ b/drivers/hv/Makefile
@@ -20,6 +20,6 @@ mshv_vtl-y := mshv_vtl_main.o
 # Code that must be built-in
 obj-$(CONFIG_HYPERV) += hv_common.o
 obj-$(subst m,y,$(CONFIG_MSHV_ROOT)) += hv_proc.o
-ifneq ($(CONFIG_MSHV_ROOT) $(CONFIG_MSHV_VTL),)
+ifneq ($(CONFIG_MSHV_ROOT)$(CONFIG_MSHV_VTL),)
        obj-y += mshv_common.o
 endif
diff --git a/drivers/hv/mshv_common.c b/drivers/hv/mshv_common.c
index 28905e3ed9c0..73505cbdc324 100644
--- a/drivers/hv/mshv_common.c
+++ b/drivers/hv/mshv_common.c
@@ -142,7 +142,6 @@ int hv_call_get_partition_property(u64 partition_id,
 }
 EXPORT_SYMBOL_GPL(hv_call_get_partition_property);

-#ifdef CONFIG_X86_64
 /*
  * Corresponding sleep states have to be initialized in order for a subsequent
  * HVCALL_ENTER_SLEEP_STATE call to succeed. Currently only S5 state as per
@@ -235,4 +234,3 @@ void hv_machine_power_off(void)
        local_irq_restore(flags);

 }
-#endif

The Makefile fix needs to be a separate patch.

I think I got all this correct, but please double-check my work! :-)

Michael

>  - Moved machine_ops hook definition to ms_hyperv_init_platform
>  - Addressed review comments in v5
> 
> v5:
>  - Fixed build errors
>  - Padded struct hv_input_set_system_property for alignment
>  - Dropped CONFIG_ACPI stub
> 
> v4:
>  - Adopted machine_ops to order invoking HV_ENTER_SLEEP_STATE as the
>    last step in shutdown sequence.
>  - This ensures rest of the cleanups are done before powering off
> 
> v3:
>  - Dropped acpi_sleep handlers as they are not used on mshv
>  - Applied ordering for hv_reboot_notifier
>  - Fixed build issues on i386, arm64 architectures
> 
> v2:
>   - Addressed review comments from v1.
>   - Moved all sleep state handling methods under CONFIG_ACPI stub
>   - - This fixes build issues on non-x86 architectures.
> 
> 
> Praveen K Paladugu (3):
>   hyperv: Add definitions for MSHV sleep state configuration
>   hyperv: Use reboot notifier to configure sleep state
>   hyperv: Cleanly shutdown root partition with MSHV
> 
>  arch/x86/hyperv/hv_init.c       |  1 +
>  arch/x86/include/asm/mshyperv.h |  4 ++
>  arch/x86/kernel/cpu/mshyperv.c  |  2 +
>  drivers/hv/mshv_common.c        | 98 +++++++++++++++++++++++++++++++++
>  include/hyperv/hvgdk_mini.h     |  4 +-
>  include/hyperv/hvhdk_mini.h     | 40 ++++++++++++++
>  6 files changed, 148 insertions(+), 1 deletion(-)
> 
> --
> 2.51.0
> 


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

* Re: [PATCH v6 1/3] hyperv: Add definitions for MSHV sleep state configuration
  2025-11-26 21:49 ` [PATCH v6 1/3] hyperv: Add definitions for MSHV sleep state configuration Praveen K Paladugu
@ 2025-12-01 17:00   ` Stanislav Kinsburskii
  0 siblings, 0 replies; 13+ messages in thread
From: Stanislav Kinsburskii @ 2025-12-01 17:00 UTC (permalink / raw)
  To: Praveen K Paladugu
  Cc: kys, haiyangz, wei.liu, decui, tglx, mingo, linux-hyperv,
	linux-kernel, bp, dave.hansen, x86, hpa, arnd, anbelski,
	easwar.hariharan, nunodasneves

On Wed, Nov 26, 2025 at 03:49:51PM -0600, Praveen K Paladugu wrote:
> Add the definitions required to configure sleep states in mshv hypervsior.
> 

Acked-by: Stanislav Kinsburskii <skinsburskii@linux.microsoft.com>

> Signed-off-by: Praveen K Paladugu <prapal@linux.microsoft.com>
> Co-developed-by: Anatol Belski <anbelski@linux.microsoft.com>
> Signed-off-by: Anatol Belski <anbelski@linux.microsoft.com>
> Reviewed-by: Easwar Hariharan <easwar.hariharan@linux.microsoft.com>
> Reviewed-by: Nuno Das Neves <nunodasneves@linux.microsoft.com>
> ---
>  include/hyperv/hvgdk_mini.h |  4 +++-
>  include/hyperv/hvhdk_mini.h | 40 +++++++++++++++++++++++++++++++++++++
>  2 files changed, 43 insertions(+), 1 deletion(-)
> 
> diff --git a/include/hyperv/hvgdk_mini.h b/include/hyperv/hvgdk_mini.h
> index 1d5ce11be8b6..04b18d0e37af 100644
> --- a/include/hyperv/hvgdk_mini.h
> +++ b/include/hyperv/hvgdk_mini.h
> @@ -465,19 +465,21 @@ union hv_vp_assist_msr_contents {	 /* HV_REGISTER_VP_ASSIST_PAGE */
>  #define HVCALL_RESET_DEBUG_SESSION			0x006b
>  #define HVCALL_MAP_STATS_PAGE				0x006c
>  #define HVCALL_UNMAP_STATS_PAGE				0x006d
> +#define HVCALL_SET_SYSTEM_PROPERTY			0x006f
>  #define HVCALL_ADD_LOGICAL_PROCESSOR			0x0076
>  #define HVCALL_GET_SYSTEM_PROPERTY			0x007b
>  #define HVCALL_MAP_DEVICE_INTERRUPT			0x007c
>  #define HVCALL_UNMAP_DEVICE_INTERRUPT			0x007d
>  #define HVCALL_RETARGET_INTERRUPT			0x007e
>  #define HVCALL_NOTIFY_PARTITION_EVENT                   0x0087
> +#define HVCALL_ENTER_SLEEP_STATE			0x0084
>  #define HVCALL_NOTIFY_PORT_RING_EMPTY			0x008b
>  #define HVCALL_REGISTER_INTERCEPT_RESULT		0x0091
>  #define HVCALL_ASSERT_VIRTUAL_INTERRUPT			0x0094
>  #define HVCALL_CREATE_PORT				0x0095
>  #define HVCALL_CONNECT_PORT				0x0096
>  #define HVCALL_START_VP					0x0099
> -#define HVCALL_GET_VP_INDEX_FROM_APIC_ID			0x009a
> +#define HVCALL_GET_VP_INDEX_FROM_APIC_ID		0x009a
>  #define HVCALL_FLUSH_GUEST_PHYSICAL_ADDRESS_SPACE	0x00af
>  #define HVCALL_FLUSH_GUEST_PHYSICAL_ADDRESS_LIST	0x00b0
>  #define HVCALL_SIGNAL_EVENT_DIRECT			0x00c0
> diff --git a/include/hyperv/hvhdk_mini.h b/include/hyperv/hvhdk_mini.h
> index f2d7b50de7a4..41a29bf8ec14 100644
> --- a/include/hyperv/hvhdk_mini.h
> +++ b/include/hyperv/hvhdk_mini.h
> @@ -140,6 +140,7 @@ enum hv_snp_status {
>  
>  enum hv_system_property {
>  	/* Add more values when needed */
> +	HV_SYSTEM_PROPERTY_SLEEP_STATE = 3,
>  	HV_SYSTEM_PROPERTY_SCHEDULER_TYPE = 15,
>  	HV_DYNAMIC_PROCESSOR_FEATURE_PROPERTY = 21,
>  	HV_SYSTEM_PROPERTY_CRASHDUMPAREA = 47,
> @@ -155,6 +156,19 @@ union hv_pfn_range {            /* HV_SPA_PAGE_RANGE */
>  	} __packed;
>  };
>  
> +enum hv_sleep_state {
> +	HV_SLEEP_STATE_S1 = 1,
> +	HV_SLEEP_STATE_S2 = 2,
> +	HV_SLEEP_STATE_S3 = 3,
> +	HV_SLEEP_STATE_S4 = 4,
> +	HV_SLEEP_STATE_S5 = 5,
> +	/*
> +	 * After hypervisor has received this, any follow up sleep
> +	 * state registration requests will be rejected.
> +	 */
> +	HV_SLEEP_STATE_LOCK = 6
> +};
> +
>  enum hv_dynamic_processor_feature_property {
>  	/* Add more values when needed */
>  	HV_X64_DYNAMIC_PROCESSOR_FEATURE_MAX_ENCRYPTED_PARTITIONS = 13,
> @@ -184,6 +198,32 @@ struct hv_output_get_system_property {
>  	};
>  } __packed;
>  
> +struct hv_sleep_state_info {
> +	u32 sleep_state; /* enum hv_sleep_state */
> +	u8 pm1a_slp_typ;
> +	u8 pm1b_slp_typ;
> +} __packed;
> +
> +struct hv_input_set_system_property {
> +	u32 property_id; /* enum hv_system_property */
> +	u32 reserved;
> +	union {
> +		/* More fields to be filled in when needed */
> +		struct hv_sleep_state_info set_sleep_state_info;
> +
> +		/*
> +		 * Add a reserved field to ensure the union is 8-byte aligned as
> +		 * existing members may not be. This is a temporary measure
> +		 * until all remaining members are added.
> +		 */
> +		 u64 reserved0[8];
> +	};
> +} __packed;
> +
> +struct hv_input_enter_sleep_state {     /* HV_INPUT_ENTER_SLEEP_STATE */
> +	u32 sleep_state;        /* enum hv_sleep_state */
> +} __packed;
> +
>  struct hv_input_map_stats_page {
>  	u32 type; /* enum hv_stats_object_type */
>  	u32 padding;
> -- 
> 2.51.0

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

* Re: [PATCH v6 2/3] hyperv: Use reboot notifier to configure sleep state
  2025-11-26 21:49 ` [PATCH v6 2/3] hyperv: Use reboot notifier to configure sleep state Praveen K Paladugu
@ 2025-12-01 17:02   ` Stanislav Kinsburskii
  2025-12-03 17:13   ` Ingo Molnar
  2025-12-03 23:02   ` Nuno Das Neves
  2 siblings, 0 replies; 13+ messages in thread
From: Stanislav Kinsburskii @ 2025-12-01 17:02 UTC (permalink / raw)
  To: Praveen K Paladugu
  Cc: kys, haiyangz, wei.liu, decui, tglx, mingo, linux-hyperv,
	linux-kernel, bp, dave.hansen, x86, hpa, arnd, anbelski,
	easwar.hariharan, nunodasneves

On Wed, Nov 26, 2025 at 03:49:52PM -0600, Praveen K Paladugu wrote:
> Configure sleep state information in mshv hypervisor. This sleep state
> information from ACPI will be used by hypervisor to poweroff the host.
> 

Acked-by: Stanislav Kinsburskii <skinsburskii@linux.microsoft.com>

> Signed-off-by: Praveen K Paladugu <prapal@linux.microsoft.com>
> Co-developed-by: Anatol Belski <anbelski@linux.microsoft.com>
> Signed-off-by: Anatol Belski <anbelski@linux.microsoft.com>
> Reviewed-by: Easwar Hariharan <easwar.hariharan@linux.microsoft.com>
> ---
>  arch/x86/hyperv/hv_init.c       |  1 +
>  arch/x86/include/asm/mshyperv.h |  2 +
>  drivers/hv/mshv_common.c        | 80 +++++++++++++++++++++++++++++++++
>  3 files changed, 83 insertions(+)
> 
> diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
> index e28737ec7054..daf97a984b78 100644
> --- a/arch/x86/hyperv/hv_init.c
> +++ b/arch/x86/hyperv/hv_init.c
> @@ -555,6 +555,7 @@ void __init hyperv_init(void)
>  
>  		hv_remap_tsc_clocksource();
>  		hv_root_crash_init();
> +		hv_sleep_notifiers_register();
>  	} else {
>  		hypercall_msr.guest_physical_address = vmalloc_to_pfn(hv_hypercall_pg);
>  		wrmsrq(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64);
> diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h
> index 10037125099a..166053df0484 100644
> --- a/arch/x86/include/asm/mshyperv.h
> +++ b/arch/x86/include/asm/mshyperv.h
> @@ -182,8 +182,10 @@ int hyperv_fill_flush_guest_mapping_list(
>  void hv_apic_init(void);
>  void __init hv_init_spinlocks(void);
>  bool hv_vcpu_is_preempted(int vcpu);
> +void hv_sleep_notifiers_register(void);
>  #else
>  static inline void hv_apic_init(void) {}
> +static inline void hv_sleep_notifiers_register(void) {};
>  #endif
>  
>  struct irq_domain *hv_create_pci_msi_domain(void);
> diff --git a/drivers/hv/mshv_common.c b/drivers/hv/mshv_common.c
> index aa2be51979fd..f1d4e81107ee 100644
> --- a/drivers/hv/mshv_common.c
> +++ b/drivers/hv/mshv_common.c
> @@ -14,6 +14,9 @@
>  #include <asm/mshyperv.h>
>  #include <linux/resume_user_mode.h>
>  #include <linux/export.h>
> +#include <linux/acpi.h>
> +#include <linux/notifier.h>
> +#include <linux/reboot.h>
>  
>  #include "mshv.h"
>  
> @@ -138,3 +141,80 @@ int hv_call_get_partition_property(u64 partition_id,
>  	return 0;
>  }
>  EXPORT_SYMBOL_GPL(hv_call_get_partition_property);
> +
> +#ifdef CONFIG_X86_64
> +/*
> + * Corresponding sleep states have to be initialized in order for a subsequent
> + * HVCALL_ENTER_SLEEP_STATE call to succeed. Currently only S5 state as per
> + * ACPI 6.4 chapter 7.4.2 is relevant, while S1, S2 and S3 can be supported.
> + *
> + * In order to pass proper PM values to mshv, ACPI should be initialized and
> + * should support S5 sleep state when this method is invoked.
> + */
> +static int hv_initialize_sleep_states(void)
> +{
> +	u64 status;
> +	unsigned long flags;
> +	struct hv_input_set_system_property *in;
> +	acpi_status acpi_status;
> +	u8 sleep_type_a, sleep_type_b;
> +
> +	if (!acpi_sleep_state_supported(ACPI_STATE_S5)) {
> +		pr_err("%s: S5 sleep state not supported.\n", __func__);
> +		return -ENODEV;
> +	}
> +
> +	acpi_status = acpi_get_sleep_type_data(ACPI_STATE_S5, &sleep_type_a,
> +					       &sleep_type_b);
> +	if (ACPI_FAILURE(acpi_status))
> +		return -ENODEV;
> +
> +	local_irq_save(flags);
> +	in = *this_cpu_ptr(hyperv_pcpu_input_arg);
> +	memset(in, 0, sizeof(*in));
> +
> +	in->property_id = HV_SYSTEM_PROPERTY_SLEEP_STATE;
> +	in->set_sleep_state_info.sleep_state = HV_SLEEP_STATE_S5;
> +	in->set_sleep_state_info.pm1a_slp_typ = sleep_type_a;
> +	in->set_sleep_state_info.pm1b_slp_typ = sleep_type_b;
> +
> +	status = hv_do_hypercall(HVCALL_SET_SYSTEM_PROPERTY, in, NULL);
> +	local_irq_restore(flags);
> +
> +	if (!hv_result_success(status)) {
> +		hv_status_err(status, "\n");
> +		return hv_result_to_errno(status);
> +	}
> +
> +	return 0;
> +}
> +
> +/*
> + * This notifier initializes sleep states in mshv hypervisor which will be
> + * used during power off.
> + */
> +static int hv_reboot_notifier_handler(struct notifier_block *this,
> +				      unsigned long code, void *another)
> +{
> +	int ret = 0;
> +
> +	if (code == SYS_HALT || code == SYS_POWER_OFF)
> +		ret = hv_initialize_sleep_states();
> +
> +	return ret ? NOTIFY_DONE : NOTIFY_OK;
> +}
> +
> +static struct notifier_block hv_reboot_notifier = {
> +	.notifier_call = hv_reboot_notifier_handler,
> +};
> +
> +void hv_sleep_notifiers_register(void)
> +{
> +	int ret;
> +
> +	ret = register_reboot_notifier(&hv_reboot_notifier);
> +	if (ret)
> +		pr_err("%s: cannot register reboot notifier %d\n", __func__,
> +		       ret);
> +}
> +#endif
> -- 
> 2.51.0

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

* Re: [PATCH v6 3/3] hyperv: Cleanly shutdown root partition with MSHV
  2025-11-26 21:49 ` [PATCH v6 3/3] hyperv: Cleanly shutdown root partition with MSHV Praveen K Paladugu
@ 2025-12-01 17:05   ` Stanislav Kinsburskii
  2025-12-05 19:59     ` Praveen K Paladugu
  2025-12-03 23:00   ` Nuno Das Neves
  1 sibling, 1 reply; 13+ messages in thread
From: Stanislav Kinsburskii @ 2025-12-01 17:05 UTC (permalink / raw)
  To: Praveen K Paladugu
  Cc: kys, haiyangz, wei.liu, decui, tglx, mingo, linux-hyperv,
	linux-kernel, bp, dave.hansen, x86, hpa, arnd, anbelski,
	easwar.hariharan, nunodasneves

On Wed, Nov 26, 2025 at 03:49:53PM -0600, Praveen K Paladugu wrote:
> When a root partition running on MSHV is powered off, the default
> behavior is to write ACPI registers to power-off. However, this ACPI
> write is intercepted by MSHV and will result in a Machine Check
> Exception(MCE).
> 
> The root partition eventually panics with a trace similar to:
> 
>   [   81.306348] reboot: Power down
>   [   81.314709] mce: [Hardware Error]: CPU 0: Machine Check Exception: 4 Bank 0: b2000000c0060001
>   [   81.314711] mce: [Hardware Error]: TSC 3b8cb60a66 PPIN 11d98332458e4ea9
>   [   81.314713] mce: [Hardware Error]: PROCESSOR 0:606a6 TIME 1759339405 SOCKET 0 APIC 0 microcode ffffffff
>   [   81.314715] mce: [Hardware Error]: Run the above through 'mcelog --ascii'
>   [   81.314716] mce: [Hardware Error]: Machine check: Processor context corrupt
>   [   81.314717] Kernel panic - not syncing: Fatal machine check
> 
> To correctly shutdown a root partition running on MSHV hypervisor, sleep
> state information must be configured within the hypervsior. Later, the
> HVCALL_ENTER_SLEEP_STATE hypercall should be invoked as the last step in
> the shutdown sequence.
> 
> The previous patch configures the sleep state information and this patch
> invokes HVCALL_ENTER_SLEEP_STATE hypercall to cleanly shutdown the root
> partition.
> 
> Signed-off-by: Praveen K Paladugu <prapal@linux.microsoft.com>
> Co-developed-by: Anatol Belski <anbelski@linux.microsoft.com>
> Signed-off-by: Anatol Belski <anbelski@linux.microsoft.com>
> Reviewed-by: Easwar Hariharan <easwar.hariharan@linux.microsoft.com>
> ---
>  arch/x86/include/asm/mshyperv.h |  2 ++
>  arch/x86/kernel/cpu/mshyperv.c  |  2 ++
>  drivers/hv/mshv_common.c        | 18 ++++++++++++++++++
>  3 files changed, 22 insertions(+)
> 
> diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h
> index 166053df0484..4c22f3257368 100644
> --- a/arch/x86/include/asm/mshyperv.h
> +++ b/arch/x86/include/asm/mshyperv.h
> @@ -183,9 +183,11 @@ void hv_apic_init(void);
>  void __init hv_init_spinlocks(void);
>  bool hv_vcpu_is_preempted(int vcpu);
>  void hv_sleep_notifiers_register(void);
> +void hv_machine_power_off(void);
>  #else
>  static inline void hv_apic_init(void) {}
>  static inline void hv_sleep_notifiers_register(void) {};
> +static inline void hv_machine_power_off(void) {};
>  #endif
>  
>  struct irq_domain *hv_create_pci_msi_domain(void);
> diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c
> index fac9953a72ef..579fb2c64cfd 100644
> --- a/arch/x86/kernel/cpu/mshyperv.c
> +++ b/arch/x86/kernel/cpu/mshyperv.c
> @@ -621,6 +621,8 @@ static void __init ms_hyperv_init_platform(void)
>  #endif
>  
>  #if IS_ENABLED(CONFIG_HYPERV)
> +	if (hv_root_partition())
> +		machine_ops.power_off = hv_machine_power_off;
>  #if defined(CONFIG_KEXEC_CORE)
>  	machine_ops.shutdown = hv_machine_shutdown;
>  #endif
> diff --git a/drivers/hv/mshv_common.c b/drivers/hv/mshv_common.c
> index f1d4e81107ee..28905e3ed9c0 100644
> --- a/drivers/hv/mshv_common.c
> +++ b/drivers/hv/mshv_common.c
> @@ -217,4 +217,22 @@ void hv_sleep_notifiers_register(void)
>  		pr_err("%s: cannot register reboot notifier %d\n", __func__,
>  		       ret);
>  }
> +
> +/*
> + * Power off the machine by entering S5 sleep state via Hyper-V hypercall.
> + * This call does not return if successful.
> + */
> +void hv_machine_power_off(void)
> +{
> +	unsigned long flags;
> +	struct hv_input_enter_sleep_state *in;
> +
> +	local_irq_save(flags);
> +	in = *this_cpu_ptr(hyperv_pcpu_input_arg);
> +	in->sleep_state = HV_SLEEP_STATE_S5;
> +
> +	(void)hv_do_hypercall(HVCALL_ENTER_SLEEP_STATE, in, NULL);

Should this the error be printed?

Acked-by: Stanislav Kinsburskii <skinsburskii@linux.microsoft.com>

> +	local_irq_restore(flags);
> +
> +}
>  #endif
> -- 
> 2.51.0

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

* Re: [PATCH v6 2/3] hyperv: Use reboot notifier to configure sleep state
  2025-11-26 21:49 ` [PATCH v6 2/3] hyperv: Use reboot notifier to configure sleep state Praveen K Paladugu
  2025-12-01 17:02   ` Stanislav Kinsburskii
@ 2025-12-03 17:13   ` Ingo Molnar
  2025-12-03 23:02   ` Nuno Das Neves
  2 siblings, 0 replies; 13+ messages in thread
From: Ingo Molnar @ 2025-12-03 17:13 UTC (permalink / raw)
  To: Praveen K Paladugu
  Cc: kys, haiyangz, wei.liu, decui, tglx, mingo, linux-hyperv,
	linux-kernel, bp, dave.hansen, x86, hpa, arnd, anbelski,
	easwar.hariharan, nunodasneves, skinsburskii

* Praveen K Paladugu <prapal@linux.microsoft.com> wrote:

> Configure sleep state information in mshv hypervisor. This sleep state
> information from ACPI will be used by hypervisor to poweroff the host.
> 
> Signed-off-by: Praveen K Paladugu <prapal@linux.microsoft.com>
> Co-developed-by: Anatol Belski <anbelski@linux.microsoft.com>
> Signed-off-by: Anatol Belski <anbelski@linux.microsoft.com>
> Reviewed-by: Easwar Hariharan <easwar.hariharan@linux.microsoft.com>
> ---
>  arch/x86/hyperv/hv_init.c       |  1 +
>  arch/x86/include/asm/mshyperv.h |  2 +
>  drivers/hv/mshv_common.c        | 80 +++++++++++++++++++++++++++++++++
>  3 files changed, 83 insertions(+)
> 
> diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
> index e28737ec7054..daf97a984b78 100644
> --- a/arch/x86/hyperv/hv_init.c
> +++ b/arch/x86/hyperv/hv_init.c
> @@ -555,6 +555,7 @@ void __init hyperv_init(void)
>  
>  		hv_remap_tsc_clocksource();
>  		hv_root_crash_init();
> +		hv_sleep_notifiers_register();
>  	} else {
>  		hypercall_msr.guest_physical_address = vmalloc_to_pfn(hv_hypercall_pg);
>  		wrmsrq(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64);
> diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h
> index 10037125099a..166053df0484 100644
> --- a/arch/x86/include/asm/mshyperv.h
> +++ b/arch/x86/include/asm/mshyperv.h
> @@ -182,8 +182,10 @@ int hyperv_fill_flush_guest_mapping_list(
>  void hv_apic_init(void);
>  void __init hv_init_spinlocks(void);
>  bool hv_vcpu_is_preempted(int vcpu);
> +void hv_sleep_notifiers_register(void);
>  #else
>  static inline void hv_apic_init(void) {}
> +static inline void hv_sleep_notifiers_register(void) {};
>  #endif
>  
>  struct irq_domain *hv_create_pci_msi_domain(void);

Acked-by: Ingo Molnar <mingo@kernel.org>

Thanks,

	Ingo

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

* Re: [PATCH v6 3/3] hyperv: Cleanly shutdown root partition with MSHV
  2025-11-26 21:49 ` [PATCH v6 3/3] hyperv: Cleanly shutdown root partition with MSHV Praveen K Paladugu
  2025-12-01 17:05   ` Stanislav Kinsburskii
@ 2025-12-03 23:00   ` Nuno Das Neves
  1 sibling, 0 replies; 13+ messages in thread
From: Nuno Das Neves @ 2025-12-03 23:00 UTC (permalink / raw)
  To: Praveen K Paladugu, kys, haiyangz, wei.liu, decui, tglx, mingo,
	linux-hyperv, linux-kernel, bp, dave.hansen, x86, hpa, arnd
  Cc: anbelski, easwar.hariharan, skinsburskii

On 11/26/2025 1:49 PM, Praveen K Paladugu wrote:
> When a root partition running on MSHV is powered off, the default
> behavior is to write ACPI registers to power-off. However, this ACPI
> write is intercepted by MSHV and will result in a Machine Check
> Exception(MCE).
> 
> The root partition eventually panics with a trace similar to:
> 
>   [   81.306348] reboot: Power down
>   [   81.314709] mce: [Hardware Error]: CPU 0: Machine Check Exception: 4 Bank 0: b2000000c0060001
>   [   81.314711] mce: [Hardware Error]: TSC 3b8cb60a66 PPIN 11d98332458e4ea9
>   [   81.314713] mce: [Hardware Error]: PROCESSOR 0:606a6 TIME 1759339405 SOCKET 0 APIC 0 microcode ffffffff
>   [   81.314715] mce: [Hardware Error]: Run the above through 'mcelog --ascii'
>   [   81.314716] mce: [Hardware Error]: Machine check: Processor context corrupt
>   [   81.314717] Kernel panic - not syncing: Fatal machine check
> 
> To correctly shutdown a root partition running on MSHV hypervisor, sleep
> state information must be configured within the hypervsior. Later, the
> HVCALL_ENTER_SLEEP_STATE hypercall should be invoked as the last step in
> the shutdown sequence.
> 
> The previous patch configures the sleep state information and this patch
> invokes HVCALL_ENTER_SLEEP_STATE hypercall to cleanly shutdown the root
> partition.
> 

Avoid statements like "The previous patch", since these patches may not
always follow each other directly once pulled into other trees, ported, etc.
You could explicitly mention the dependency on calling
hv_sleep_notifiers_register() before HVCALL_ENTER_SLEEP_STATE will work
correctly.

> Signed-off-by: Praveen K Paladugu <prapal@linux.microsoft.com>
> Co-developed-by: Anatol Belski <anbelski@linux.microsoft.com>
> Signed-off-by: Anatol Belski <anbelski@linux.microsoft.com>
> Reviewed-by: Easwar Hariharan <easwar.hariharan@linux.microsoft.com>
> ---
>  arch/x86/include/asm/mshyperv.h |  2 ++
>  arch/x86/kernel/cpu/mshyperv.c  |  2 ++
>  drivers/hv/mshv_common.c        | 18 ++++++++++++++++++
>  3 files changed, 22 insertions(+)
> 
> diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h
> index 166053df0484..4c22f3257368 100644
> --- a/arch/x86/include/asm/mshyperv.h
> +++ b/arch/x86/include/asm/mshyperv.h
> @@ -183,9 +183,11 @@ void hv_apic_init(void);
>  void __init hv_init_spinlocks(void);
>  bool hv_vcpu_is_preempted(int vcpu);
>  void hv_sleep_notifiers_register(void);
> +void hv_machine_power_off(void);
>  #else
>  static inline void hv_apic_init(void) {}
>  static inline void hv_sleep_notifiers_register(void) {};
> +static inline void hv_machine_power_off(void) {};
>  #endif
>  
>  struct irq_domain *hv_create_pci_msi_domain(void);
> diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c
> index fac9953a72ef..579fb2c64cfd 100644
> --- a/arch/x86/kernel/cpu/mshyperv.c
> +++ b/arch/x86/kernel/cpu/mshyperv.c
> @@ -621,6 +621,8 @@ static void __init ms_hyperv_init_platform(void)
>  #endif
>  
>  #if IS_ENABLED(CONFIG_HYPERV)
> +	if (hv_root_partition())
> +		machine_ops.power_off = hv_machine_power_off;
>  #if defined(CONFIG_KEXEC_CORE)
>  	machine_ops.shutdown = hv_machine_shutdown;
>  #endif
> diff --git a/drivers/hv/mshv_common.c b/drivers/hv/mshv_common.c
> index f1d4e81107ee..28905e3ed9c0 100644
> --- a/drivers/hv/mshv_common.c
> +++ b/drivers/hv/mshv_common.c
> @@ -217,4 +217,22 @@ void hv_sleep_notifiers_register(void)
>  		pr_err("%s: cannot register reboot notifier %d\n", __func__,
>  		       ret);
>  }
> +
> +/*
> + * Power off the machine by entering S5 sleep state via Hyper-V hypercall.
> + * This call does not return if successful.
> + */
> +void hv_machine_power_off(void)
> +{
> +	unsigned long flags;
> +	struct hv_input_enter_sleep_state *in;
> +
> +	local_irq_save(flags);
> +	in = *this_cpu_ptr(hyperv_pcpu_input_arg);
> +	in->sleep_state = HV_SLEEP_STATE_S5;
> +
> +	(void)hv_do_hypercall(HVCALL_ENTER_SLEEP_STATE, in, NULL);
> +	local_irq_restore(flags);

We don't expect to return here. If we do for some reason, it is surely
a bug.

I suggest either:
- fall back to native_machine_power_off(), or
- BUG(), since the machine shouldn't continue running

> +
> +}
>  #endif


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

* Re: [PATCH v6 2/3] hyperv: Use reboot notifier to configure sleep state
  2025-11-26 21:49 ` [PATCH v6 2/3] hyperv: Use reboot notifier to configure sleep state Praveen K Paladugu
  2025-12-01 17:02   ` Stanislav Kinsburskii
  2025-12-03 17:13   ` Ingo Molnar
@ 2025-12-03 23:02   ` Nuno Das Neves
  2 siblings, 0 replies; 13+ messages in thread
From: Nuno Das Neves @ 2025-12-03 23:02 UTC (permalink / raw)
  To: Praveen K Paladugu, kys, haiyangz, wei.liu, decui, tglx, mingo,
	linux-hyperv, linux-kernel, bp, dave.hansen, x86, hpa, arnd
  Cc: anbelski, easwar.hariharan, skinsburskii

On 11/26/2025 1:49 PM, Praveen K Paladugu wrote:
> Configure sleep state information in mshv hypervisor. This sleep state
> information from ACPI will be used by hypervisor to poweroff the host.
> 
> Signed-off-by: Praveen K Paladugu <prapal@linux.microsoft.com>
> Co-developed-by: Anatol Belski <anbelski@linux.microsoft.com>
> Signed-off-by: Anatol Belski <anbelski@linux.microsoft.com>
> Reviewed-by: Easwar Hariharan <easwar.hariharan@linux.microsoft.com>
> ---
>  arch/x86/hyperv/hv_init.c       |  1 +
>  arch/x86/include/asm/mshyperv.h |  2 +
>  drivers/hv/mshv_common.c        | 80 +++++++++++++++++++++++++++++++++
>  3 files changed, 83 insertions(+)
> 
As Michael mentioned, please fix the bug in the Makefile, and clean up
the unnecessary function stubs. Otherwise, it looks good to me.
Reviewed-by: Nuno Das Neves <nunodasneves@linux.microsoft.com>

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

* Re: [PATCH v6 0/3] Add support for clean shutdown with MSHV
  2025-11-29  6:48 ` [PATCH v6 0/3] Add support for clean shutdown " Michael Kelley
@ 2025-12-05 19:58   ` Praveen K Paladugu
  0 siblings, 0 replies; 13+ messages in thread
From: Praveen K Paladugu @ 2025-12-05 19:58 UTC (permalink / raw)
  To: Michael Kelley, Praveen K Paladugu, kys@microsoft.com,
	haiyangz@microsoft.com, wei.liu@kernel.org, decui@microsoft.com,
	tglx@linutronix.de, mingo@redhat.com,
	linux-hyperv@vger.kernel.org, linux-kernel@vger.kernel.org,
	bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org,
	hpa@zytor.com, arnd@arndb.de
  Cc: anbelski@linux.microsoft.com,
	easwar.hariharan@linux.microsoft.com,
	nunodasneves@linux.microsoft.com,
	skinsburskii@linux.microsoft.com



On 11/29/2025 12:48 AM, Michael Kelley wrote:
> From: Praveen K Paladugu <prapal@linux.microsoft.com> Sent: Wednesday, November 26, 2025 1:50 PM
>>
>> Add support for clean shutdown of the root partition when running on
>> MSHV Hypervisor.
>>
>> v6:
>>   - Fixed build errors, by adding CONFIG_X86_64 guard
> 
> Adding the CONFIG_X86_64 guard seems like the right solution, and it does
> make the build errors go away. However note that as coded in drivers/hv/Makefile,
>   the code under the new guard won't be built at all unless CONFIG_MSHV_ROOT
> is set (ignoring the VTL case for now), which can only happen in the X86_64 or
> ARM64 cases. So it was nagging at me as to why the guard is needed for an
> x86 32-bit build failure reported by the kernel test robot.
> 
> It turns out there's an underlying bug in drivers/hv/Makefile causing
> mshv_common.o to be built in cases when it shouldn't be, such as the x86
> 32-bit case. The build failures reported by the kernel test robot were on these
> cases when it shouldn't be built in the first place. The bug is in this Makefile line:
> 
> ifneq ($(CONFIG_MSHV_ROOT) $(CONFIG_MSHV_VTL),)
> 
> which should be
> 
> ifneq ($(CONFIG_MSHV_ROOT)$(CONFIG_MSHV_VTL),)
> 
> The buggy version has a spurious "space" character before the start of
> $(CONFIG_MSHV_VTL) such that the result is always "not equal" and
> mshv_common.o is always built.
> 
> If the Makefile is fixed, then the X86_64 guards you added in
> mshv_common.c are not needed. Furthermore, the stubs for
> hv_sleep_notifiers_register() and hv_machine_power_off() in
> arch/x86/include/asm/mshyperv.h for the !CONFIG_X86_64 case aren't
> needed. And the declarations for hv_sleep_notifiers_register() and
> hv_machine_power_off() can be moved out from under the #ifdef
> CONFIG_X86_64. The bottom line is that nothing in this patch set needs
> to be guarded by CONFIG_X86_64.
> 
Thanks for this investigation Michael. With these changes, I am not able
to reproduce any build failures anymore. I will push these changes in v7.

Praveen

> Here's a quick diff of what I changed on top of your v6 patch set
> (including the fix to drivers/hv/Makefile). I tested the build process
> on both x86/64 and arm64, with and without CONFIG_MSHV_ROOT
> selected.
> 
> diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h
> index 4c22f3257368..01d192e70211 100644
> --- a/arch/x86/include/asm/mshyperv.h
> +++ b/arch/x86/include/asm/mshyperv.h
> @@ -178,16 +178,15 @@ int hyperv_fill_flush_guest_mapping_list(
>                  struct hv_guest_mapping_flush_list *flush,
>                  u64 start_gfn, u64 end_gfn);
> 
> +void hv_sleep_notifiers_register(void);
> +void hv_machine_power_off(void);
> +
>   #ifdef CONFIG_X86_64
>   void hv_apic_init(void);
>   void __init hv_init_spinlocks(void);
>   bool hv_vcpu_is_preempted(int vcpu);
> -void hv_sleep_notifiers_register(void);
> -void hv_machine_power_off(void);
>   #else
>   static inline void hv_apic_init(void) {}
> -static inline void hv_sleep_notifiers_register(void) {};
> -static inline void hv_machine_power_off(void) {};
>   #endif
> 
>   struct irq_domain *hv_create_pci_msi_domain(void);
> diff --git a/drivers/hv/Makefile b/drivers/hv/Makefile
> index 58b8d07639f3..6d929fb0e13d 100644
> --- a/drivers/hv/Makefile
> +++ b/drivers/hv/Makefile
> @@ -20,6 +20,6 @@ mshv_vtl-y := mshv_vtl_main.o
>   # Code that must be built-in
>   obj-$(CONFIG_HYPERV) += hv_common.o
>   obj-$(subst m,y,$(CONFIG_MSHV_ROOT)) += hv_proc.o
> -ifneq ($(CONFIG_MSHV_ROOT) $(CONFIG_MSHV_VTL),)
> +ifneq ($(CONFIG_MSHV_ROOT)$(CONFIG_MSHV_VTL),)
>          obj-y += mshv_common.o
>   endif
> diff --git a/drivers/hv/mshv_common.c b/drivers/hv/mshv_common.c
> index 28905e3ed9c0..73505cbdc324 100644
> --- a/drivers/hv/mshv_common.c
> +++ b/drivers/hv/mshv_common.c
> @@ -142,7 +142,6 @@ int hv_call_get_partition_property(u64 partition_id,
>   }
>   EXPORT_SYMBOL_GPL(hv_call_get_partition_property);
> 
> -#ifdef CONFIG_X86_64
>   /*
>    * Corresponding sleep states have to be initialized in order for a subsequent
>    * HVCALL_ENTER_SLEEP_STATE call to succeed. Currently only S5 state as per
> @@ -235,4 +234,3 @@ void hv_machine_power_off(void)
>          local_irq_restore(flags);
> 
>   }
> -#endif
> 
> The Makefile fix needs to be a separate patch.
> 
> I think I got all this correct, but please double-check my work! :-)
> 
> Michael
> 
>>   - Moved machine_ops hook definition to ms_hyperv_init_platform
>>   - Addressed review comments in v5
>>
>> v5:
>>   - Fixed build errors
>>   - Padded struct hv_input_set_system_property for alignment
>>   - Dropped CONFIG_ACPI stub
>>
>> v4:
>>   - Adopted machine_ops to order invoking HV_ENTER_SLEEP_STATE as the
>>     last step in shutdown sequence.
>>   - This ensures rest of the cleanups are done before powering off
>>
>> v3:
>>   - Dropped acpi_sleep handlers as they are not used on mshv
>>   - Applied ordering for hv_reboot_notifier
>>   - Fixed build issues on i386, arm64 architectures
>>
>> v2:
>>    - Addressed review comments from v1.
>>    - Moved all sleep state handling methods under CONFIG_ACPI stub
>>    - - This fixes build issues on non-x86 architectures.
>>
>>
>> Praveen K Paladugu (3):
>>    hyperv: Add definitions for MSHV sleep state configuration
>>    hyperv: Use reboot notifier to configure sleep state
>>    hyperv: Cleanly shutdown root partition with MSHV
>>
>>   arch/x86/hyperv/hv_init.c       |  1 +
>>   arch/x86/include/asm/mshyperv.h |  4 ++
>>   arch/x86/kernel/cpu/mshyperv.c  |  2 +
>>   drivers/hv/mshv_common.c        | 98 +++++++++++++++++++++++++++++++++
>>   include/hyperv/hvgdk_mini.h     |  4 +-
>>   include/hyperv/hvhdk_mini.h     | 40 ++++++++++++++
>>   6 files changed, 148 insertions(+), 1 deletion(-)
>>
>> --
>> 2.51.0
>>
> 
> 

-- 
Regards,
Praveen K Paladugu


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

* Re: [PATCH v6 3/3] hyperv: Cleanly shutdown root partition with MSHV
  2025-12-01 17:05   ` Stanislav Kinsburskii
@ 2025-12-05 19:59     ` Praveen K Paladugu
  0 siblings, 0 replies; 13+ messages in thread
From: Praveen K Paladugu @ 2025-12-05 19:59 UTC (permalink / raw)
  To: Stanislav Kinsburskii, Praveen K Paladugu
  Cc: kys, haiyangz, wei.liu, decui, tglx, mingo, linux-hyperv,
	linux-kernel, bp, dave.hansen, x86, hpa, arnd, anbelski,
	easwar.hariharan, nunodasneves



On 12/1/2025 11:05 AM, Stanislav Kinsburskii wrote:
> On Wed, Nov 26, 2025 at 03:49:53PM -0600, Praveen K Paladugu wrote:
>> When a root partition running on MSHV is powered off, the default
>> behavior is to write ACPI registers to power-off. However, this ACPI
>> write is intercepted by MSHV and will result in a Machine Check
>> Exception(MCE).
>>
>> The root partition eventually panics with a trace similar to:
>>
>>    [   81.306348] reboot: Power down
>>    [   81.314709] mce: [Hardware Error]: CPU 0: Machine Check Exception: 4 Bank 0: b2000000c0060001
>>    [   81.314711] mce: [Hardware Error]: TSC 3b8cb60a66 PPIN 11d98332458e4ea9
>>    [   81.314713] mce: [Hardware Error]: PROCESSOR 0:606a6 TIME 1759339405 SOCKET 0 APIC 0 microcode ffffffff
>>    [   81.314715] mce: [Hardware Error]: Run the above through 'mcelog --ascii'
>>    [   81.314716] mce: [Hardware Error]: Machine check: Processor context corrupt
>>    [   81.314717] Kernel panic - not syncing: Fatal machine check
>>
>> To correctly shutdown a root partition running on MSHV hypervisor, sleep
>> state information must be configured within the hypervsior. Later, the
>> HVCALL_ENTER_SLEEP_STATE hypercall should be invoked as the last step in
>> the shutdown sequence.
>>
>> The previous patch configures the sleep state information and this patch
>> invokes HVCALL_ENTER_SLEEP_STATE hypercall to cleanly shutdown the root
>> partition.
>>
>> Signed-off-by: Praveen K Paladugu <prapal@linux.microsoft.com>
>> Co-developed-by: Anatol Belski <anbelski@linux.microsoft.com>
>> Signed-off-by: Anatol Belski <anbelski@linux.microsoft.com>
>> Reviewed-by: Easwar Hariharan <easwar.hariharan@linux.microsoft.com>
>> ---
>>   arch/x86/include/asm/mshyperv.h |  2 ++
>>   arch/x86/kernel/cpu/mshyperv.c  |  2 ++
>>   drivers/hv/mshv_common.c        | 18 ++++++++++++++++++
>>   3 files changed, 22 insertions(+)
>>
>> diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h
>> index 166053df0484..4c22f3257368 100644
>> --- a/arch/x86/include/asm/mshyperv.h
>> +++ b/arch/x86/include/asm/mshyperv.h
>> @@ -183,9 +183,11 @@ void hv_apic_init(void);
>>   void __init hv_init_spinlocks(void);
>>   bool hv_vcpu_is_preempted(int vcpu);
>>   void hv_sleep_notifiers_register(void);
>> +void hv_machine_power_off(void);
>>   #else
>>   static inline void hv_apic_init(void) {}
>>   static inline void hv_sleep_notifiers_register(void) {};
>> +static inline void hv_machine_power_off(void) {};
>>   #endif
>>   
>>   struct irq_domain *hv_create_pci_msi_domain(void);
>> diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c
>> index fac9953a72ef..579fb2c64cfd 100644
>> --- a/arch/x86/kernel/cpu/mshyperv.c
>> +++ b/arch/x86/kernel/cpu/mshyperv.c
>> @@ -621,6 +621,8 @@ static void __init ms_hyperv_init_platform(void)
>>   #endif
>>   
>>   #if IS_ENABLED(CONFIG_HYPERV)
>> +	if (hv_root_partition())
>> +		machine_ops.power_off = hv_machine_power_off;
>>   #if defined(CONFIG_KEXEC_CORE)
>>   	machine_ops.shutdown = hv_machine_shutdown;
>>   #endif
>> diff --git a/drivers/hv/mshv_common.c b/drivers/hv/mshv_common.c
>> index f1d4e81107ee..28905e3ed9c0 100644
>> --- a/drivers/hv/mshv_common.c
>> +++ b/drivers/hv/mshv_common.c
>> @@ -217,4 +217,22 @@ void hv_sleep_notifiers_register(void)
>>   		pr_err("%s: cannot register reboot notifier %d\n", __func__,
>>   		       ret);
>>   }
>> +
>> +/*
>> + * Power off the machine by entering S5 sleep state via Hyper-V hypercall.
>> + * This call does not return if successful.
>> + */
>> +void hv_machine_power_off(void)
>> +{
>> +	unsigned long flags;
>> +	struct hv_input_enter_sleep_state *in;
>> +
>> +	local_irq_save(flags);
>> +	in = *this_cpu_ptr(hyperv_pcpu_input_arg);
>> +	in->sleep_state = HV_SLEEP_STATE_S5;
>> +
>> +	(void)hv_do_hypercall(HVCALL_ENTER_SLEEP_STATE, in, NULL);
> 
> Should this the error be printed?
> 
> Acked-by: Stanislav Kinsburskii <skinsburskii@linux.microsoft.com>

I will add a BUG() here, as the hypercall is not supposed to return.
  >> +	local_irq_restore(flags);
>> +
>> +}
>>   #endif
>> -- 
>> 2.51.0
> 

-- 
Regards,
Praveen K Paladugu


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

end of thread, other threads:[~2025-12-05 19:59 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-26 21:49 [PATCH v6 0/3] Add support for clean shutdown with MSHV Praveen K Paladugu
2025-11-26 21:49 ` [PATCH v6 1/3] hyperv: Add definitions for MSHV sleep state configuration Praveen K Paladugu
2025-12-01 17:00   ` Stanislav Kinsburskii
2025-11-26 21:49 ` [PATCH v6 2/3] hyperv: Use reboot notifier to configure sleep state Praveen K Paladugu
2025-12-01 17:02   ` Stanislav Kinsburskii
2025-12-03 17:13   ` Ingo Molnar
2025-12-03 23:02   ` Nuno Das Neves
2025-11-26 21:49 ` [PATCH v6 3/3] hyperv: Cleanly shutdown root partition with MSHV Praveen K Paladugu
2025-12-01 17:05   ` Stanislav Kinsburskii
2025-12-05 19:59     ` Praveen K Paladugu
2025-12-03 23:00   ` Nuno Das Neves
2025-11-29  6:48 ` [PATCH v6 0/3] Add support for clean shutdown " Michael Kelley
2025-12-05 19:58   ` Praveen K Paladugu

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).