Re: [PATCH v2 07/16] migration: factor out vmstate_save_field() from vmstate_save_state()

2026-03-04 Thread Vladimir Sementsov-Ogievskiy

On 03.03.26 18:38, Peter Xu wrote:

On Sat, Feb 21, 2026 at 12:02:05AM +0300, Vladimir Sementsov-Ogievskiy wrote:

Simplify vmstate_save_state() which is rather big, and simplify further
refactoring.

Signed-off-by: Vladimir Sementsov-Ogievskiy 


I wonder how hard it is to have this helper also cover the rest in the loop
over elements, on e.g. VMS_ARRAY_OF_POINTER, vmdesc_loop being able to
change, and all the nullptr handling.

I had a feeling that you intentionally skipped those because it'll not be
as trivial


Yes, at least it would make me to dig deeper and understand the logic
around vmdesc and vmdesc_loop :) So I decided to limit the change to
what I need for further conversion to bool+errp.


- I think it's fine, but IIUC we can always figure a way out.
Can be done later.  Agree this is an improvement already,

Reviewed-by: Peter Xu 

--
Best regards,
Vladimir



Re: [PATCH v2 07/16] migration: factor out vmstate_save_field() from vmstate_save_state()

2026-03-03 Thread Peter Xu
On Sat, Feb 21, 2026 at 12:02:05AM +0300, Vladimir Sementsov-Ogievskiy wrote:
> Simplify vmstate_save_state() which is rather big, and simplify further
> refactoring.
> 
> Signed-off-by: Vladimir Sementsov-Ogievskiy 

I wonder how hard it is to have this helper also cover the rest in the loop
over elements, on e.g. VMS_ARRAY_OF_POINTER, vmdesc_loop being able to
change, and all the nullptr handling.

I had a feeling that you intentionally skipped those because it'll not be
as trivial - I think it's fine, but IIUC we can always figure a way out.
Can be done later.  Agree this is an improvement already,

Reviewed-by: Peter Xu 

> ---
>  migration/vmstate.c | 40 +---
>  1 file changed, 25 insertions(+), 15 deletions(-)
> 
> diff --git a/migration/vmstate.c b/migration/vmstate.c
> index 810b131f18..d8c30830d6 100644
> --- a/migration/vmstate.c
> +++ b/migration/vmstate.c
> @@ -26,6 +26,9 @@ static int vmstate_subsection_save(QEMUFile *f, const 
> VMStateDescription *vmsd,
> Error **errp);
>  static int vmstate_subsection_load(QEMUFile *f, const VMStateDescription 
> *vmsd,
> void *opaque, Error **errp);
> +static int vmstate_save_state_v(QEMUFile *f, const VMStateDescription *vmsd,
> +void *opaque, JSONWriter *vmdesc,
> +int version_id, Error **errp);
>  
>  /* Whether this field should exist for either save or load the VM? */
>  static bool
> @@ -450,6 +453,26 @@ static bool vmstate_pre_save(const VMStateDescription 
> *vmsd, void *opaque,
>  return true;
>  }
>  
> +static bool vmstate_save_field(QEMUFile *f, void *pv, size_t size,
> +   const VMStateField *field,
> +   JSONWriter *vmdesc, Error **errp)
> +{
> +if (field->flags & VMS_STRUCT) {
> +return vmstate_save_state(f, field->vmsd, pv, vmdesc, errp) >= 0;
> +} else if (field->flags & VMS_VSTRUCT) {
> +return vmstate_save_state_v(f, field->vmsd, pv, vmdesc,
> +field->struct_version_id,
> +errp) >= 0;
> +}
> +
> +if (field->info->put(f, pv, size, field, vmdesc) < 0) {
> +error_setg(errp, "put failed");
> +return false;
> +}
> +
> +return true;
> +}
> +
>  static int vmstate_save_state_v(QEMUFile *f, const VMStateDescription *vmsd,
>  void *opaque, JSONWriter *vmdesc,
>  int version_id, Error **errp)
> @@ -542,21 +565,8 @@ static int vmstate_save_state_v(QEMUFile *f, const 
> VMStateDescription *vmsd,
>  vmsd_desc_field_start(vmsd, vmdesc_loop, inner_field,
>i, max_elems);
>  
> -if (inner_field->flags & VMS_STRUCT) {
> -ret = vmstate_save_state(f, inner_field->vmsd,
> - curr_elem, vmdesc_loop, errp);
> -} else if (inner_field->flags & VMS_VSTRUCT) {
> -ret = vmstate_save_state_v(f, inner_field->vmsd,
> -   curr_elem, vmdesc_loop,
> -   
> inner_field->struct_version_id,
> -   errp);
> -} else {
> -ret = inner_field->info->put(f, curr_elem, size,
> - inner_field, vmdesc_loop);
> -if (ret < 0) {
> -error_setg(errp, "put failed");
> -}
> -}
> +ret = vmstate_save_field(f, curr_elem, size, inner_field,
> + vmdesc_loop, errp) ? 0 : -EINVAL;
>  
>  written_bytes = qemu_file_transferred(f) - old_offset;
>  vmsd_desc_field_end(vmsd, vmdesc_loop, inner_field,
> -- 
> 2.52.0
> 

-- 
Peter Xu