On Wed, Mar 11, 2026 at 01:16:58PM +0800, Yanfei Xu wrote:
> old-style vmstate doesn't use vmsd and instead rely on SaveStateEntry
> ops. Check is_active for old-style vmstate to determine whether they
> should be skipped during migration.

Would you please dscribe the use case?

We only have two users in upstream tree that provided is_active(), and
neither of them provided save_state().  IOW, so far it works kind of mutual
exclusively v.s. save_state(), afaict.

> 
> Signed-off-by: Yanfei Xu <[email protected]>
> ---
>  migration/savevm.c | 14 +++++++++++++-
>  1 file changed, 13 insertions(+), 1 deletion(-)
> 
> diff --git a/migration/savevm.c b/migration/savevm.c
> index 197c89e0e6..7eee83ffca 100644
> --- a/migration/savevm.c
> +++ b/migration/savevm.c
> @@ -1030,15 +1030,27 @@ static int vmstate_save(QEMUFile *f, SaveStateEntry 
> *se, JSONWriter *vmdesc,
>                          Error **errp)
>  {
>      int ret;
> +    const bool has_old_style = se->ops && se->ops->save_state;
>  
> -    if ((!se->ops || !se->ops->save_state) && !se->vmsd) {
> +    if (!has_old_style && !se->vmsd) {
>          return 0;
> +    } else if (has_old_style && se->vmsd) {
> +        error_report("%s: '%s' (section_id=%u): unexpected: both vmsd (%s) 
> and"
> +                     " old-style save_state are set", __func__, se->idstr,
> +                     se->section_id, se->vmsd->name);
> +        return -EINVAL;
>      }
> +
>      if (se->vmsd && !vmstate_section_needed(se->vmsd, se->opaque)) {
>          trace_savevm_section_skip(se->idstr, se->section_id);
>          return 0;
>      }
>  
> +    if (has_old_style && se->ops->is_active && 
> !se->ops->is_active(se->opaque)) {
> +        trace_savevm_section_skip(se->idstr, se->section_id);
> +        return 0;
> +    }
> +
>      trace_savevm_section_start(se->idstr, se->section_id);
>      save_section_header(f, se, QEMU_VM_SECTION_FULL);
>      if (vmdesc) {
> -- 
> 2.20.1
> 

-- 
Peter Xu


Reply via email to