On Mon, Apr 29, 2024 at 08:55:14AM -0700, Steve Sistare wrote:
> Provide the VMStateDescription precreate field to mark objects that must
> be loaded on the incoming side before devices have been created, because
> they provide properties that will be needed at creation time.  They will
> be saved to and loaded from their own QEMUFile, via
> qemu_savevm_precreate_save and qemu_savevm_precreate_load, but these
> functions are not yet called in this patch.  Allow them to be called
> before or after normal migration is active, when current_migration and
> current_incoming are not valid.
> 
> Signed-off-by: Steve Sistare <steven.sist...@oracle.com>
> ---
>  include/migration/vmstate.h |  6 ++++
>  migration/savevm.c          | 69 
> +++++++++++++++++++++++++++++++++++++++++----
>  migration/savevm.h          |  3 ++
>  3 files changed, 73 insertions(+), 5 deletions(-)
> 
> diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
> index 294d2d8..4691334 100644
> --- a/include/migration/vmstate.h
> +++ b/include/migration/vmstate.h
> @@ -198,6 +198,12 @@ struct VMStateDescription {
>       * a QEMU_VM_SECTION_START section.
>       */
>      bool early_setup;
> +
> +    /*
> +     * Send/receive this object in the precreate migration stream.
> +     */
> +    bool precreate;
> +
>      int version_id;
>      int minimum_version_id;
>      MigrationPriority priority;
> diff --git a/migration/savevm.c b/migration/savevm.c
> index 9789823..a30bcd9 100644
> --- a/migration/savevm.c
> +++ b/migration/savevm.c
> @@ -239,6 +239,7 @@ static SaveState savevm_state = {
>  
>  #define SAVEVM_FOREACH(se, entry)                                    \
>      QTAILQ_FOREACH(se, &savevm_state.handlers, entry)                \
> +        if (!se->vmsd || !se->vmsd->precreate)
>  
>  #define SAVEVM_FOREACH_ALL(se, entry)                                \
>      QTAILQ_FOREACH(se, &savevm_state.handlers, entry)
> @@ -1006,13 +1007,19 @@ static void save_section_header(QEMUFile *f, 
> SaveStateEntry *se,
>      }
>  }
>  
> +static bool send_section_footer(SaveStateEntry *se)
> +{
> +    return (se->vmsd && se->vmsd->precreate) ||
> +           migrate_get_current()->send_section_footer;
> +}

Does the precreate vmsd "require" the footer?  Or it should also work?
IMHO it's less optimal to bind features without good reasons.

Thanks,

-- 
Peter Xu


Reply via email to