From: Juan Quintela <quintela@redhat.com>
To: qemu-devel@nongnu.org
Cc: Leonardo Bras <leobras@redhat.com>, Peter Xu <peterx@redhat.com>,
Juan Quintela <quintela@redhat.com>,
Thomas Huth <thuth@redhat.com>,
Li Zhijian <lizhijian@fujitsu.com>,
Fabiano Rosas <farosas@suse.de>,
qemu-s390x@nongnu.org
Subject: [PULL 11/11] migration: Unify and trace vmstate field_exists() checks
Date: Wed, 4 Oct 2023 14:40:38 +0200 [thread overview]
Message-ID: <20231004124038.16002-12-quintela@redhat.com> (raw)
In-Reply-To: <20231004124038.16002-1-quintela@redhat.com>
From: Peter Xu <peterx@redhat.com>
For both save/load we actually share the logic on deciding whether a field
should exist. Merge the checks into a helper and use it for both save and
load. When doing so, add documentations and reformat the code to make it
much easier to read.
The real benefit here (besides code cleanups) is we add a trace-point for
this; this is a known spot where we can easily break migration
compatibilities between binaries, and this trace point will be critical for
us to identify such issues.
For example, this will be handy when debugging things like:
https://gitlab.com/qemu-project/qemu/-/issues/932
Reviewed-by: Fabiano Rosas <farosas@suse.de>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Peter Xu <peterx@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
Message-ID: <20230906204722.514474-1-peterx@redhat.com>
---
migration/vmstate.c | 34 ++++++++++++++++++++++++++--------
migration/trace-events | 1 +
2 files changed, 27 insertions(+), 8 deletions(-)
diff --git a/migration/vmstate.c b/migration/vmstate.c
index 4cde30bf2d..1cf9e45b85 100644
--- a/migration/vmstate.c
+++ b/migration/vmstate.c
@@ -26,6 +26,30 @@ static int vmstate_subsection_save(QEMUFile *f, const VMStateDescription *vmsd,
static int vmstate_subsection_load(QEMUFile *f, const VMStateDescription *vmsd,
void *opaque);
+/* Whether this field should exist for either save or load the VM? */
+static bool
+vmstate_field_exists(const VMStateDescription *vmsd, const VMStateField *field,
+ void *opaque, int version_id)
+{
+ bool result;
+
+ if (field->field_exists) {
+ /* If there's the function checker, that's the solo truth */
+ result = field->field_exists(opaque, version_id);
+ trace_vmstate_field_exists(vmsd->name, field->name, field->version_id,
+ version_id, result);
+ } else {
+ /*
+ * Otherwise, we only save/load if field version is same or older.
+ * For example, when loading from an old binary with old version,
+ * we ignore new fields with newer version_ids.
+ */
+ result = field->version_id <= version_id;
+ }
+
+ return result;
+}
+
static int vmstate_n_elems(void *opaque, const VMStateField *field)
{
int n_elems = 1;
@@ -105,10 +129,7 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
}
while (field->name) {
trace_vmstate_load_state_field(vmsd->name, field->name);
- if ((field->field_exists &&
- field->field_exists(opaque, version_id)) ||
- (!field->field_exists &&
- field->version_id <= version_id)) {
+ if (vmstate_field_exists(vmsd, field, opaque, version_id)) {
void *first_elem = opaque + field->offset;
int i, n_elems = vmstate_n_elems(opaque, field);
int size = vmstate_size(opaque, field);
@@ -349,10 +370,7 @@ int vmstate_save_state_v(QEMUFile *f, const VMStateDescription *vmsd,
}
while (field->name) {
- if ((field->field_exists &&
- field->field_exists(opaque, version_id)) ||
- (!field->field_exists &&
- field->version_id <= version_id)) {
+ if (vmstate_field_exists(vmsd, field, opaque, version_id)) {
void *first_elem = opaque + field->offset;
int i, n_elems = vmstate_n_elems(opaque, field);
int size = vmstate_size(opaque, field);
diff --git a/migration/trace-events b/migration/trace-events
index 3e9649ab2a..002abe3a4e 100644
--- a/migration/trace-events
+++ b/migration/trace-events
@@ -66,6 +66,7 @@ vmstate_save_state_loop(const char *name, const char *field, int n_elems) "%s/%s
vmstate_save_state_top(const char *idstr) "%s"
vmstate_subsection_save_loop(const char *name, const char *sub) "%s/%s"
vmstate_subsection_save_top(const char *idstr) "%s"
+vmstate_field_exists(const char *vmsd, const char *name, int field_version, int version, int result) "%s:%s field_version %d version %d result %d"
# vmstate-types.c
get_qtailq(const char *name, int version_id) "%s v%d"
--
2.41.0
next prev parent reply other threads:[~2023-10-04 12:42 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-04 12:40 [PULL 00/11] Migration 20231004 patches Juan Quintela
2023-10-04 12:40 ` [PULL 01/11] migration/vmstate: Introduce vmstate_save_state_with_err Juan Quintela
2023-10-04 12:40 ` [PULL 02/11] migration: Update error description outside migration.c Juan Quintela
2023-10-04 12:40 ` [PULL 03/11] MAINTAINERS: Add entry for rdma migration Juan Quintela
2023-10-04 12:40 ` [PULL 04/11] migration: Add co-maintainers for migration Juan Quintela
2023-10-04 12:40 ` [PULL 05/11] migration/rdma: zore out head.repeat to make the error more clear Juan Quintela
2023-10-04 12:40 ` [PULL 06/11] i386/a-b-bootblock: factor test memory addresses out into constants Juan Quintela
2023-10-04 12:40 ` [PULL 07/11] i386/a-b-bootblock: zero the first byte of each page on start Juan Quintela
2023-10-04 12:40 ` [PULL 08/11] s390x/a-b-bios: " Juan Quintela
2023-10-04 12:40 ` [PULL 09/11] migration: file URI Juan Quintela
2023-10-04 13:45 ` Fabiano Rosas
2023-10-04 13:47 ` Juan Quintela
2023-10-04 14:04 ` Fabiano Rosas
2023-10-04 14:20 ` Juan Quintela
2023-10-04 12:40 ` [PULL 10/11] migration: file URI offset Juan Quintela
2023-10-04 12:40 ` Juan Quintela [this message]
2023-10-04 18:33 ` [PULL 00/11] Migration 20231004 patches Stefan Hajnoczi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231004124038.16002-12-quintela@redhat.com \
--to=quintela@redhat.com \
--cc=farosas@suse.de \
--cc=leobras@redhat.com \
--cc=lizhijian@fujitsu.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-s390x@nongnu.org \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).