@samitouri / QOSamiQemu / commits / ac8547ced7

migration: factor out vmstate_save_field() from vmstate_save_state()

Simplify vmstate_save_state() which is rather big, and simplify further refactoring. Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> Reviewed-by: Peter Xu <peterx@redhat.com> Link: https://lore.kernel.org/qemu-devel/20260304212303.667141-8-vsementsov@yandex-team.ru Signed-off-by: Fabiano Rosas <farosas@suse.de>

Vladimir Sementsov-Ogievskiy committed Mar 5, 2026 at 00:22 UTC ac8547ced7fc0ecc2ff8a0312980904e78ac7df0
1 file changed +25 -15
migration/vmstate.c
+25 -15
@@ -26,6 +26,9 @@ static int vmstate_subsection_save(QEMUFile *f, const VMStateDescription *vmsd,
26 Error **errp);
27 static int vmstate_subsection_load(QEMUFile *f, const VMStateDescription *vmsd,
28 void *opaque, Error **errp);
29 +static int vmstate_save_state_v(QEMUFile *f, const VMStateDescription *vmsd,
30 + void *opaque, JSONWriter *vmdesc,
31 + int version_id, Error **errp);
32
33 /* Whether this field should exist for either save or load the VM? */
34 static bool
@@ -455,6 +458,26 @@ static bool vmstate_pre_save(const VMStateDescription *vmsd, void *opaque,
458 return true;
459 }
460
461 +static bool vmstate_save_field(QEMUFile *f, void *pv, size_t size,
462 + const VMStateField *field,
463 + JSONWriter *vmdesc, Error **errp)
464 +{
465 + if (field->flags & VMS_STRUCT) {
466 + return vmstate_save_state(f, field->vmsd, pv, vmdesc, errp) >= 0;
467 + } else if (field->flags & VMS_VSTRUCT) {
468 + return vmstate_save_state_v(f, field->vmsd, pv, vmdesc,
469 + field->struct_version_id,
470 + errp) >= 0;
471 + }
472 +
473 + if (field->info->put(f, pv, size, field, vmdesc) < 0) {
474 + error_setg(errp, "put failed");
475 + return false;
476 + }
477 +
478 + return true;
479 +}
480 +
481 static int vmstate_save_state_v(QEMUFile *f, const VMStateDescription *vmsd,
482 void *opaque, JSONWriter *vmdesc,
483 int version_id, Error **errp)
@@ -548,21 +571,8 @@ static int vmstate_save_state_v(QEMUFile *f, const VMStateDescription *vmsd,
571 vmsd_desc_field_start(vmsd, vmdesc_loop, inner_field,
572 i, max_elems);
573
551 - if (inner_field->flags & VMS_STRUCT) {
552 - ret = vmstate_save_state(f, inner_field->vmsd,
553 - curr_elem, vmdesc_loop, errp);
554 - } else if (inner_field->flags & VMS_VSTRUCT) {
555 - ret = vmstate_save_state_v(f, inner_field->vmsd,
556 - curr_elem, vmdesc_loop,
557 - inner_field->struct_version_id,
558 - errp);
559 - } else {
560 - ret = inner_field->info->put(f, curr_elem, size,
561 - inner_field, vmdesc_loop);
562 - if (ret < 0) {
563 - error_setg(errp, "put failed");
564 - }
565 - }
574 + ret = vmstate_save_field(f, curr_elem, size, inner_field,
575 + vmdesc_loop, errp) ? 0 : -EINVAL;
576
577 written_bytes = qemu_file_transferred(f) - old_offset;
578 vmsd_desc_field_end(vmsd, vmdesc_loop, inner_field,