Il lun 23 mar 2026, 14:59 Magnus Kulke <[email protected]> ha
scritto:

> This mechanism is used to handle more imperative partition-wide steps
> that have to be taken as part of a migration routine.
>
> Currently it's a skeleton that will just pause/resume the partition as
> part of a migration


This should not be necessary. It is handled by common code to pause/resume
before device state is needed.

Paolo

It will later be extended with more specific steps
> like reference time and hypercall pages.


> Signed-off-by: Magnus Kulke <[email protected]>
> ---
>  accel/mshv/mshv-all.c | 75 +++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 75 insertions(+)
>
> diff --git a/accel/mshv/mshv-all.c b/accel/mshv/mshv-all.c
> index d1bf148bb8..365288b901 100644
> --- a/accel/mshv/mshv-all.c
> +++ b/accel/mshv/mshv-all.c
> @@ -39,6 +39,8 @@
>  #include "system/mshv.h"
>  #include "system/mshv_int.h"
>  #include "system/reset.h"
> +#include "migration/qemu-file-types.h"
> +#include "migration/register.h"
>  #include "trace.h"
>  #include <err.h>
>  #include <sys/ioctl.h>
> @@ -47,6 +49,9 @@ bool mshv_allowed;
>
>  MshvState *mshv_state;
>
> +static int pause_vm(int vm_fd);
> +static int resume_vm(int vm_fd);
> +
>  static int init_mshv(int *mshv_fd)
>  {
>      int fd = open("/dev/mshv", O_RDWR | O_CLOEXEC);
> @@ -80,6 +85,64 @@ static int set_time_freeze(int vm_fd, int freeze)
>      return 0;
>  }
>
> +static void mshv_save_state(QEMUFile *f, void *opaque)
> +{
> +    return;
> +}
> +
> +static int mshv_load_state(QEMUFile *f, void *opaque, int version_id)
> +{
> +    return 0;
> +}
> +
> +static int mshv_save_prepare(void *opaque, Error **errp)
> +{
> +    MshvState *s = opaque;
> +    int ret;
> +
> +    ret = pause_vm(s->vm);
> +    if (ret < 0) {
> +        error_setg(errp, "Failed to pause VM for migration");
> +        return -1;
> +    }
> +
> +    return 0;
> +}
> +
> +static void mshv_save_cleanup(void *opaque)
> +{
> +    MshvState *s = opaque;
> +    int ret;
> +
> +    ret = resume_vm(s->vm);
> +    if (ret < 0) {
> +        error_report("Failed to resme VM after  migration");
> +    }
> +}
> +
> +static int mshv_load_setup(QEMUFile *f, void *opaque, Error **errp)
> +{
> +    MshvState *s = opaque;
> +    int ret;
> +
> +    ret = pause_vm(s->vm);
> +    if (ret < 0) {
> +        error_setg(errp, "Failed to pause VM for migration restore");
> +        return -1;
> +    }
> +
> +    return 0;
> +}
> +
> +static int mshv_load_cleanup(void *opaque)
> +{
> +    MshvState *s = opaque;
> +
> +    resume_vm(s->vm);
> +
> +    return 0;
> +}
> +
>  static int pause_vm(int vm_fd)
>  {
>      int ret;
> @@ -454,6 +517,15 @@ static int mshv_init_vcpu(CPUState *cpu)
>      return 0;
>  }
>
> +static SaveVMHandlers savevm_mshv = {
> +    .save_prepare = mshv_save_prepare,
> +    .save_state = mshv_save_state,
> +    .save_cleanup = mshv_save_cleanup,
> +    .load_setup = mshv_load_setup,
> +    .load_state = mshv_load_state,
> +    .load_cleanup = mshv_load_cleanup,
> +};
> +
>  static int mshv_init(AccelState *as, MachineState *ms)
>  {
>      MshvState *s;
> @@ -509,6 +581,9 @@ static int mshv_init(AccelState *as, MachineState *ms)
>                                    0, "mshv-memory");
>      memory_listener_register(&mshv_io_listener, &address_space_io);
>
> +    /* register custom handlers for migration events */
> +    register_savevm_live("mshv", 0, 1, &savevm_mshv, s);
> +
>      return 0;
>  }
>
> --
> 2.34.1
>
>

Reply via email to