@samitouri / QOSamiQemu / commits / 1417266b1b

migration: vmstate_save/load_state(): refactor tracing errors

To simplify further changes (convertion to bool+errp APIs), let's rework some error paths: - get rid of int ret in traces, as we are moving to bool+errp APIs - split traces to _fail / _success (seems better than add boolean result to the message). - prefer short error paths (return immediately on error) - around trace_vmstate_load_field_error(), do not call qemu_file_set_error(), if the erroc comes from qemu_file_get_error() 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-6-vsementsov@yandex-team.ru Signed-off-by: Fabiano Rosas <farosas@suse.de>

Vladimir Sementsov-Ogievskiy committed Mar 5, 2026 at 00:22 UTC 1417266b1bcee80af618e7d0ab49187ff784dc69
2 files changed +19 -12
migration/trace-events
+4 -2
@@ -56,13 +56,15 @@ postcopy_page_req_sync(void *host_addr) "sync page req %p"
56 # vmstate.c
57 vmstate_load_field_error(const char *field, int ret) "field \"%s\" load failed, ret = %d"
58 vmstate_load_state(const char *name, int version_id) "%s v%d"
59 -vmstate_load_state_end(const char *name, const char *reason, int val) "%s %s/%d"
59 +vmstate_load_state_fail(const char *name, const char *reason) "%s %s"
60 +vmstate_load_state_success(const char *name) "%s"
61 vmstate_load_state_field(const char *name, const char *field, bool exists) "%s:%s exists=%d"
62 vmstate_n_elems(const char *name, int n_elems) "%s: %d"
63 vmstate_subsection_load(const char *parent) "%s"
64 vmstate_subsection_load_bad(const char *parent, const char *sub, const char *sub2) "%s: %s/%s"
65 vmstate_subsection_load_good(const char *parent) "%s"
65 -vmstate_save_state_pre_save_res(const char *name, int res) "%s/%d"
66 +vmstate_save_state_pre_save_fail(const char *name) "%s"
67 +vmstate_save_state_pre_save_success(const char *name) "%s"
68 vmstate_save_state_loop(const char *name, const char *field, int n_elems) "%s/%s[%d]"
69 vmstate_save_state_top(const char *idstr) "%s"
70 vmstate_subsection_save_loop(const char *name, const char *sub) "%s/%s"
migration/vmstate.c
+15 -10
@@ -144,7 +144,7 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
144 error_setg(errp, "%s: incoming version_id %d is too new "
145 "for local version_id %d",
146 vmsd->name, version_id, vmsd->version_id);
147 - trace_vmstate_load_state_end(vmsd->name, "too new", -EINVAL);
147 + trace_vmstate_load_state_fail(vmsd->name, "too new");
148 return -EINVAL;
149 }
150
@@ -152,7 +152,7 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
152 error_setg(errp, "%s: incoming version_id %d is too old "
153 "for local minimum version_id %d",
154 vmsd->name, version_id, vmsd->minimum_version_id);
155 - trace_vmstate_load_state_end(vmsd->name, "too old", -EINVAL);
155 + trace_vmstate_load_state_fail(vmsd->name, "too old");
156 return -EINVAL;
157 }
158
@@ -240,10 +240,10 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
240 error_setg(errp,
241 "Failed to load %s state: stream error: %d",
242 vmsd->name, ret);
243 + trace_vmstate_load_field_error(field->name, ret);
244 + return ret;
245 }
244 - }
245 -
246 - if (ret < 0) {
246 + } else {
247 qemu_file_set_error(f, ret);
248 trace_vmstate_load_field_error(field->name, ret);
249 return ret;
@@ -269,7 +269,8 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
269 error_prepend(errp, "post load hook failed for: %s, version_id: "
270 "%d, minimum_version: %d: ", vmsd->name,
271 vmsd->version_id, vmsd->minimum_version_id);
272 - ret = -EINVAL;
272 + trace_vmstate_load_state_fail(vmsd->name, "post-load");
273 + return -EINVAL;
274 }
275 } else if (vmsd->post_load) {
276 ret = vmsd->post_load(opaque, version_id);
@@ -279,12 +280,14 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
280 "minimum_version: %d, ret: %d",
281 vmsd->name, vmsd->version_id, vmsd->minimum_version_id,
282 ret);
283 + trace_vmstate_load_state_fail(vmsd->name, "post-load");
284 + return ret;
285 }
286 }
287
285 - trace_vmstate_load_state_end(vmsd->name, "end", ret);
288 + trace_vmstate_load_state_success(vmsd->name);
289
287 - return ret;
290 + return 0;
291 }
292
293 static int vmfield_name_num(const VMStateField *start,
@@ -444,20 +447,22 @@ static int vmstate_save_state_v(QEMUFile *f, const VMStateDescription *vmsd,
447
448 if (vmsd->pre_save_errp) {
449 ret = vmsd->pre_save_errp(opaque, errp) ? 0 : -EINVAL;
447 - trace_vmstate_save_state_pre_save_res(vmsd->name, ret);
450 if (ret < 0) {
451 error_prepend(errp, "pre-save for %s failed: ", vmsd->name);
452 + trace_vmstate_save_state_pre_save_fail(vmsd->name);
453 return ret;
454 }
455 } else if (vmsd->pre_save) {
456 ret = vmsd->pre_save(opaque);
454 - trace_vmstate_save_state_pre_save_res(vmsd->name, ret);
457 if (ret) {
458 error_setg(errp, "pre-save failed: %s", vmsd->name);
459 + trace_vmstate_save_state_pre_save_fail(vmsd->name);
460 return ret;
461 }
462 }
463
464 + trace_vmstate_save_state_pre_save_success(vmsd->name);
465 +
466 if (vmdesc) {
467 json_writer_str(vmdesc, "vmsd_name", vmsd->name);
468 json_writer_int64(vmdesc, "version", version_id);