From: "Doru Blânzeanu" <dblanzeanu@linux.microsoft.com>
To: Magnus Kulke <magnuskulke@linux.microsoft.com>
Cc: qemu-devel@nongnu.org, "Paolo Bonzini" <pbonzini@redhat.com>,
"Zhao Liu" <zhao1.liu@intel.com>,
"Richard Henderson" <richard.henderson@linaro.org>,
"Magnus Kulke" <magnuskulke@microsoft.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
"Wei Liu" <wei.liu@kernel.org>,
"Doru Blânzeanu" <doru.blanzeanu@microsoft.com>,
"Wei Liu" <liuwe@microsoft.com>
Subject: Re: [PATCH 10/12] target/i386/mshv: migrate MP_STATE
Date: Thu, 23 Jul 2026 12:25:20 +0300 [thread overview]
Message-ID: <amHeAGrBuPM4kyto@linux.microsoft.com> (raw)
In-Reply-To: <20260710101534.664604-11-magnuskulke@linux.microsoft.com>
On Fri, Jul 10, 2026 at 12:15:32PM +0200, Magnus Kulke wrote:
> MSHV's "internal activity state" roughly maps to QEMU's env->mp_state
> and cpu->halted states that describe state of APs in a guest.
>
> We don't invoke set_mp_state as part of store_vcpu_state() b/c we would
> put all BSP + APs in a RUNNABLE (0) state immediately, breaking SMP boot
>
> Instead we store the mp state as part of the load_cleanup() routine
> after a migration.
>
> Signed-off-by: Magnus Kulke <magnuskulke@linux.microsoft.com>
> ---
> accel/mshv/mshv-all.c | 10 +++++
> include/system/mshv_int.h | 1 +
> target/i386/mshv/mshv-cpu.c | 80 +++++++++++++++++++++++++++++++++++++
> 3 files changed, 91 insertions(+)
>
> diff --git a/accel/mshv/mshv-all.c b/accel/mshv/mshv-all.c
> index 1ca1d4b54f..5921ce693e 100644
> --- a/accel/mshv/mshv-all.c
> +++ b/accel/mshv/mshv-all.c
> @@ -62,6 +62,7 @@ static int init_mshv(int *mshv_fd)
>
> static int mshv_load_cleanup(void *opaque)
> {
> + CPUState *cpu;
> int ret;
>
> ret = mshv_arch_set_partition_msrs(first_cpu);
> @@ -70,6 +71,15 @@ static int mshv_load_cleanup(void *opaque)
> return -1;
> }
>
> + CPU_FOREACH(cpu) {
> + ret = mshv_arch_set_mp_state(cpu);
> + if (ret < 0) {
> + error_report("Failed to set mp state for vCPU %d: %s",
> + cpu->cpu_index, strerror(-ret));
> + return -1;
> + }
> + }
> +
> return 0;
> }
>
> diff --git a/include/system/mshv_int.h b/include/system/mshv_int.h
> index cbfcb8611b..3dffe3c5fb 100644
> --- a/include/system/mshv_int.h
> +++ b/include/system/mshv_int.h
> @@ -99,6 +99,7 @@ int mshv_get_generic_regs(CPUState *cpu, hv_register_assoc *assocs,
> int mshv_arch_store_vcpu_state(const CPUState *cpu);
> int mshv_arch_load_vcpu_state(CPUState *cpu);
> int mshv_arch_set_partition_msrs(const CPUState *cpu);
> +int mshv_arch_set_mp_state(const CPUState *cpu);
> void mshv_arch_init_vcpu(CPUState *cpu);
> void mshv_arch_destroy_vcpu(CPUState *cpu);
> void mshv_arch_amend_proc_features(
> diff --git a/target/i386/mshv/mshv-cpu.c b/target/i386/mshv/mshv-cpu.c
> index 1485f6a1ef..bff1ac9d17 100644
> --- a/target/i386/mshv/mshv-cpu.c
> +++ b/target/i386/mshv/mshv-cpu.c
> @@ -35,6 +35,11 @@
>
> #include <sys/ioctl.h>
>
> +#define MSHV_MP_STATE_RUNNABLE 0
> +#define MSHV_MP_STATE_UNINITIALIZED 1
> +#define MSHV_MP_STATE_INIT_RECEIVED 2
> +#define MSHV_MP_STATE_HALTED 3
> +
> #define MAX_REGISTER_COUNT (MAX_CONST(ARRAY_SIZE(STANDARD_REGISTER_NAMES), \
> MAX_CONST(ARRAY_SIZE(SPECIAL_REGISTER_NAMES), \
> ARRAY_SIZE(FPU_REGISTER_NAMES))))
> @@ -950,6 +955,76 @@ static int set_vcpu_events(const CPUState *cpu)
> return 0;
> }
>
> +static int get_mp_state(CPUState *cpu)
> +{
> + X86CPU *x86cpu = X86_CPU(cpu);
> + CPUX86State *env = &x86cpu->env;
> + struct hv_register_assoc assoc = {
> + .name = HV_REGISTER_INTERNAL_ACTIVITY_STATE,
> + };
> + union hv_internal_activity_register activity;
> + int ret;
> +
> + ret = mshv_get_generic_regs(cpu, &assoc, 1);
> + if (ret < 0) {
> + error_report("failed to get internal activity state");
> + return -1;
> + }
> +
> + activity.as_uint64 = assoc.value.reg64;
> +
> + /*
> + * map MSHV activity state to KVM mp_state values, which are used as the
> + * shared representation in env->mp_state and serialized by vmstate_x86_cpu.
> + */
> +
> + if (activity.startup_suspend) {
> + env->mp_state = MSHV_MP_STATE_UNINITIALIZED;
> + } else if (activity.halt_suspend) {
> + env->mp_state = MSHV_MP_STATE_HALTED;
> + } else {
> + env->mp_state = MSHV_MP_STATE_RUNNABLE;
> + }
> +
> + cpu->halted = (env->mp_state == MSHV_MP_STATE_HALTED);
> +
> + return 0;
> +}
> +
> +int mshv_arch_set_mp_state(const CPUState *cpu)
> +{
> + X86CPU *x86cpu = X86_CPU(cpu);
> + CPUX86State *env = &x86cpu->env;
> + union hv_internal_activity_register activity = { 0 };
> + struct hv_register_assoc assoc = {
> + .name = HV_REGISTER_INTERNAL_ACTIVITY_STATE,
> + };
> + int ret;
> +
> + switch (env->mp_state) {
> + case MSHV_MP_STATE_HALTED:
> + activity.halt_suspend = 1;
> + break;
> + case MSHV_MP_STATE_UNINITIALIZED:
> + case MSHV_MP_STATE_INIT_RECEIVED:
> + activity.startup_suspend = 1;
> + break;
> + case MSHV_MP_STATE_RUNNABLE:
> + default:
> + break;
> + }
> +
> + assoc.value.reg64 = activity.as_uint64;
> +
> + ret = mshv_set_generic_regs(cpu, &assoc, 1);
> + if (ret < 0) {
> + error_report("failed to set internal activity state");
> + return -1;
> + }
> +
> + return 0;
> +}
> +
> static int update_hflags(CPUState *cpu)
> {
> X86CPU *x86cpu = X86_CPU(cpu);
> @@ -1012,6 +1087,11 @@ int mshv_arch_load_vcpu_state(CPUState *cpu)
> return ret;
> }
>
> + ret = get_mp_state(cpu);
> + if (ret < 0) {
> + return ret;
> + }
> +
> return 0;
> }
>
> --
> 2.34.1
Reviewed-by: Doru Blânzeanu <dblanzeanu@linux.microsoft.com>
next prev parent reply other threads:[~2026-07-23 9:26 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-10 10:15 [PATCH 00/12] Add migration support to MSHV accelerator, Part 2 Magnus Kulke
2026-07-10 10:15 ` [PATCH 01/12] target/i386/mshv: disable AMX TILE features Magnus Kulke
2026-07-16 11:06 ` Doru Blânzeanu
2026-07-10 10:15 ` [PATCH 02/12] accel/mshv: introduce SaveVMHandler Magnus Kulke
2026-07-16 11:10 ` Doru Blânzeanu
2026-07-10 10:15 ` [PATCH 03/12] hw/i386/mshv: migrate REFERENCE_TIME Magnus Kulke
2026-07-16 12:01 ` Doru Blânzeanu
2026-07-10 10:15 ` [PATCH 04/12] accel/mshv: install dummy handler for SIG_IPI Magnus Kulke
2026-07-17 14:43 ` Doru Blânzeanu
2026-07-10 10:15 ` [PATCH 05/12] target/i386/mshv: migrate LAPIC state Magnus Kulke
2026-07-22 11:57 ` Doru Blânzeanu
2026-07-10 10:15 ` [PATCH 06/12] target/i386/mshv: migrate Synic SINT MSRs Magnus Kulke
2026-07-22 14:03 ` Doru Blânzeanu
2026-07-10 10:15 ` [PATCH 07/12] target/i386/mshv: migrate SIMP and SIEFP state Magnus Kulke
2026-07-22 14:12 ` Doru Blânzeanu
2026-07-10 10:15 ` [PATCH 08/12] target/i386/mshv: migrate STIMER state Magnus Kulke
2026-07-22 14:24 ` Doru Blânzeanu
2026-07-10 10:15 ` [PATCH 09/12] accel/mshv: write synthetic MSRs after migration Magnus Kulke
2026-07-23 8:24 ` Doru Blânzeanu
2026-07-10 10:15 ` [PATCH 10/12] target/i386/mshv: migrate MP_STATE Magnus Kulke
2026-07-23 9:25 ` Doru Blânzeanu [this message]
2026-07-10 10:15 ` [PATCH 11/12] target/i386/mshv: toggle fpu/xsave migration Magnus Kulke
2026-07-23 9:27 ` Doru Blânzeanu
2026-07-10 10:15 ` [PATCH 12/12] hw/i386/mshv: drop initial msi vector 0 Magnus Kulke
2026-07-23 9:28 ` Doru Blânzeanu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=amHeAGrBuPM4kyto@linux.microsoft.com \
--to=dblanzeanu@linux.microsoft.com \
--cc=doru.blanzeanu@microsoft.com \
--cc=liuwe@microsoft.com \
--cc=magnuskulke@linux.microsoft.com \
--cc=magnuskulke@microsoft.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=wei.liu@kernel.org \
--cc=zhao1.liu@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.