* [RFC PATCH 1/3] accel/mshv: mark mshv cpus as resetable
2026-10-30 14:20 [RFC PATCH 0/3] mshv: Fix soft reboot by using scrub partition ioctl on init Doru Blânzeanu
@ 2026-10-30 14:20 ` Doru Blânzeanu
2026-10-30 14:20 ` [RFC PATCH 2/3] include/hw/hyperv: Add SCRUB_PARTITION ioctl Doru Blânzeanu
2026-10-30 14:20 ` [RFC PATCH 3/3] accel/mshv: use scrub_partition ioctl on init Doru Blânzeanu
2 siblings, 0 replies; 4+ messages in thread
From: Doru Blânzeanu @ 2026-10-30 14:20 UTC (permalink / raw)
To: qemu-devel
Cc: Wei Liu, Michael S. Tsirkin, Magnus Kulke, Paolo Bonzini,
Doru Blânzeanu, Cornelia Huck, Doru Blânzeanu,
Magnus Kulke
From: Magnus Kulke <magnuskulke@linux.microsoft.com>
Guest using the MSHV accelerator aren't resetable otherwise.
Signed-off-by: Magnus Kulke <magnuskulke@linux.microsoft.com>
Signed-off-by: Doru Blânzeanu <dblanzeanu@linux.microsoft.com>
---
accel/mshv/mshv-all.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/accel/mshv/mshv-all.c b/accel/mshv/mshv-all.c
index d820a67b95..a7b7017fb1 100644
--- a/accel/mshv/mshv-all.c
+++ b/accel/mshv/mshv-all.c
@@ -952,7 +952,7 @@ static void mshv_cpu_synchronize(CPUState *cpu)
static bool mshv_cpus_are_resettable(void)
{
- return false;
+ return true;
}
static void mshv_accel_class_init(ObjectClass *oc, const void *data)
--
2.54.0
^ permalink raw reply related [flat|nested] 4+ messages in thread* [RFC PATCH 2/3] include/hw/hyperv: Add SCRUB_PARTITION ioctl
2026-10-30 14:20 [RFC PATCH 0/3] mshv: Fix soft reboot by using scrub partition ioctl on init Doru Blânzeanu
2026-10-30 14:20 ` [RFC PATCH 1/3] accel/mshv: mark mshv cpus as resetable Doru Blânzeanu
@ 2026-10-30 14:20 ` Doru Blânzeanu
2026-10-30 14:20 ` [RFC PATCH 3/3] accel/mshv: use scrub_partition ioctl on init Doru Blânzeanu
2 siblings, 0 replies; 4+ messages in thread
From: Doru Blânzeanu @ 2026-10-30 14:20 UTC (permalink / raw)
To: qemu-devel
Cc: Wei Liu, Michael S. Tsirkin, Magnus Kulke, Paolo Bonzini,
Doru Blânzeanu, Cornelia Huck, Doru Blânzeanu,
Magnus Kulke
Signed-off-by: Doru Blânzeanu <dblanzeanu@linux.microsoft.com>
---
include/hw/hyperv/hvgdk_mini.h | 2 ++
1 file changed, 2 insertions(+)
diff --git a/include/hw/hyperv/hvgdk_mini.h b/include/hw/hyperv/hvgdk_mini.h
index 0983e3a58d..5178ed07a1 100644
--- a/include/hw/hyperv/hvgdk_mini.h
+++ b/include/hw/hyperv/hvgdk_mini.h
@@ -545,6 +545,8 @@ struct hv_input_assert_virtual_interrupt {
#define MSHV_IOEVENTFD _IOW(MSHV_IOCTL, 0x04, struct mshv_user_ioeventfd)
#define MSHV_SET_MSI_ROUTING _IOW(MSHV_IOCTL, 0x05, struct mshv_user_irq_table)
+#define MSHV_SCRUB_PARTITION _IO(MSHV_IOCTL, 0x0B)
+
/*
********************************
* VP APIs for child partitions *
--
2.54.0
^ permalink raw reply related [flat|nested] 4+ messages in thread* [RFC PATCH 3/3] accel/mshv: use scrub_partition ioctl on init
2026-10-30 14:20 [RFC PATCH 0/3] mshv: Fix soft reboot by using scrub partition ioctl on init Doru Blânzeanu
2026-10-30 14:20 ` [RFC PATCH 1/3] accel/mshv: mark mshv cpus as resetable Doru Blânzeanu
2026-10-30 14:20 ` [RFC PATCH 2/3] include/hw/hyperv: Add SCRUB_PARTITION ioctl Doru Blânzeanu
@ 2026-10-30 14:20 ` Doru Blânzeanu
2 siblings, 0 replies; 4+ messages in thread
From: Doru Blânzeanu @ 2026-10-30 14:20 UTC (permalink / raw)
To: qemu-devel
Cc: Wei Liu, Michael S. Tsirkin, Magnus Kulke, Paolo Bonzini,
Doru Blânzeanu, Cornelia Huck, Doru Blânzeanu,
Magnus Kulke
This is relevant on soft resets, when the MSHV partition will have a
preinitialized state for guest enlightenments and LAPIC state.
Without invoking the ioctl, a rebooted guest will fail during boot
when attempting to init Hyper-V enlightenments or the APIC.
Signed-off-by: Doru Blânzeanu <dblanzeanu@linux.microsoft.com>
---
accel/mshv/mshv-all.c | 25 ++++++++++++++++++++++++-
1 file changed, 24 insertions(+), 1 deletion(-)
diff --git a/accel/mshv/mshv-all.c b/accel/mshv/mshv-all.c
index a7b7017fb1..5e51d0f1fa 100644
--- a/accel/mshv/mshv-all.c
+++ b/accel/mshv/mshv-all.c
@@ -84,6 +84,17 @@ static int mshv_load_cleanup(void *opaque)
return 0;
}
+static int scrub_partition(int vm_fd)
+{
+ int ret = ioctl(vm_fd, MSHV_SCRUB_PARTITION);
+
+ if (ret < 0) {
+ error_report("Failed to scrub partition");
+ return -errno;
+ }
+
+ return 0;
+}
static int get_host_partition_property(int mshv_fd, uint32_t property_code,
uint64_t *value)
@@ -906,7 +917,19 @@ static void mshv_cpu_synchronize_post_init(CPUState *cpu)
static void mshv_cpu_synchronize_post_reset(CPUState *cpu)
{
- int ret = mshv_arch_store_vcpu_state(cpu);
+ int ret;
+ bool is_bsp = (cpu == first_cpu);
+
+ if (is_bsp) {
+ ret = scrub_partition(mshv_state->vm);
+ if (ret < 0) {
+ error_report("Failed to scrub partition during reset: %s",
+ strerror(-ret));
+ vm_stop(RUN_STATE_INTERNAL_ERROR);
+ }
+ }
+
+ ret = mshv_arch_store_vcpu_state(cpu);
if (ret) {
error_report("Failed to put registers after reset: %s",
strerror(-ret));
--
2.54.0
^ permalink raw reply related [flat|nested] 4+ messages in thread