Am Mi., 18. März 2026 um 00:23 Uhr schrieb Peter Xu <[email protected]>: > > Introduce a helper to do both the JSON blob dump and vmstate dump. This > further shrinks the function a bit. More importantly, we'll need to dump > two fields in one loop very soon in the future with the JSON blob. > > Signed-off-by: Peter Xu <[email protected]>
Reviewed-by: Alexander Mikhalitsyn <[email protected]> > --- > migration/vmstate.c | 38 +++++++++++++++++++++++++++----------- > 1 file changed, 27 insertions(+), 11 deletions(-) > > diff --git a/migration/vmstate.c b/migration/vmstate.c > index caa7b50bce..5a6b352764 100644 > --- a/migration/vmstate.c > +++ b/migration/vmstate.c > @@ -514,6 +514,30 @@ static bool vmstate_save_field(QEMUFile *f, void *pv, > size_t size, > return true; > } > > +/* > + * Dump a whole VMSD field, including its JSON blob separately when @vmdesc > + * is specified. > + */ > +static inline bool > +vmstate_save_field_with_vmdesc(QEMUFile *f, void *pv, size_t size, > + const VMStateDescription *vmsd, > + const VMStateField *field, JSONWriter *vmdesc, > + int i, int max, Error **errp) > +{ > + uint64_t old_offset, written_bytes; > + bool ok; > + > + vmsd_desc_field_start(vmsd, vmdesc, field, i, max); > + > + old_offset = qemu_file_transferred(f); > + ok = vmstate_save_field(f, pv, size, field, vmdesc, errp); > + written_bytes = qemu_file_transferred(f) - old_offset; > + > + vmsd_desc_field_end(vmsd, vmdesc, field, written_bytes); > + > + return ok; > +} > + > static bool vmstate_save_vmsd_v(QEMUFile *f, const VMStateDescription *vmsd, > void *opaque, JSONWriter *vmdesc, > int version_id, Error **errp) > @@ -542,7 +566,6 @@ static bool vmstate_save_vmsd_v(QEMUFile *f, const > VMStateDescription *vmsd, > void *first_elem = opaque + field->offset; > int i, n_elems = vmstate_n_elems(opaque, field); > int size = vmstate_size(opaque, field); > - uint64_t old_offset, written_bytes; > JSONWriter *vmdesc_loop = vmdesc; > bool is_prev_null = false; > > @@ -558,7 +581,6 @@ static bool vmstate_save_vmsd_v(QEMUFile *f, const > VMStateDescription *vmsd, > bool is_null; > int max_elems = n_elems - i; > > - old_offset = qemu_file_transferred(f); > if (field->flags & VMS_ARRAY_OF_POINTER) { > assert(curr_elem); > curr_elem = *(void **)curr_elem; > @@ -606,15 +628,9 @@ static bool vmstate_save_vmsd_v(QEMUFile *f, const > VMStateDescription *vmsd, > } > } > > - vmsd_desc_field_start(vmsd, vmdesc_loop, inner_field, > - i, max_elems); > - > - ok = vmstate_save_field(f, curr_elem, size, inner_field, > - vmdesc_loop, errp); > - > - written_bytes = qemu_file_transferred(f) - old_offset; > - vmsd_desc_field_end(vmsd, vmdesc_loop, inner_field, > - written_bytes); > + ok = vmstate_save_field_with_vmdesc(f, curr_elem, size, vmsd, > + inner_field, vmdesc_loop, > + i, max_elems, errp); > > /* If we used a fake temp field.. free it now */ > if (is_null) { > -- > 2.50.1 >
