From: Fabiano Rosas <farosas@suse.de>
To: Alexandr Moshkov <dtalexundeer@yandex-team.ru>, qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>,
"yc-core@yandex-team.ru" <yc-core@yandex-team.ru>,
Peter Xu <peterx@redhat.com>,
Alexandr Moshkov <dtalexundeer@yandex-team.ru>
Subject: Re: [PATCH v3] vmstate: fix subsection load name check
Date: Thu, 12 Mar 2026 11:15:14 -0300 [thread overview]
Message-ID: <878qbxyw0d.fsf@suse.de> (raw)
In-Reply-To: <20260312102626.891359-1-dtalexundeer@yandex-team.ru>
Alexandr Moshkov <dtalexundeer@yandex-team.ru> writes:
Sorry, but I'll have to nitpick on the commit message, I can't parse
this without looking at the code.
> When loading a subset, its name is checked for the parent prefix. The
What do you mean by subset?
> following bug may occur here:
>
> Let's say there is a vmstate named "virtio-blk", it has a subsection
> named "virtio-blk/subsection", and it also has another vmstate named
> "virtio" in the fields.
> Then, during the migration, when trying to load this subsection for
What is "this subsection" in this context? 'virtio-blk/subsection' ? Or do
you mean the 'virtio' field.
> "virtio", the prefix condition will pass for "virtio-blk/subsection" and
What's "the prefix condition" exactly? Could you be more explicit?
> then the migration will break, because this vmstate does not have such a
> subsection.
>
> In other words, if a field inside vmstate1 is set via vmstate2 with a
> name that is a prefix of the parent vmstate, then the field can "steal"
> a subsection belonging to the parent state.
>
This is what I read from the above paragraph. Is this it?
vmstate1 "abc" vmstate2 "abcdef"
field -> vmstate2
subsection
> Looks like it happens because migration stream for "virtio-blk" looks
> like this:
>
> [virtio-blk header] [virtio-blk fields] [virtio-blk subsections]
>
> "virtio-blk" contains "virtio" field, so migration stream is:
>
> [virtio-blk header] [virtio header] [virtio fields] [virtio
> subsections] [virtio-blk subsections]
>
So the code sees the [virtio-blk subsections] as a continuation of the
preceding [virtio subsections] because the string "virtio", which is the
parent of [virtio subsection] is matched in the string "virtio-blk"?
> And when we load the subsections of the "virtio" device,
> vmstate_subsection_load() uses qemu_peek_byte() to try to figure out if
> this is his subsection. This is where we encounter an error.
>
> Thus, the error occurs due to the fact that vmsd does not know how many
> subsections it has when loading (this does not appear anywhere in the
> migration stream), so it tries to load all the appropriate ones by
> names.
>
> To fix this issue, we call vmstate_get_subsection() and, in case of
> fail, ignore it, pop the VMSD stack and will try to define this
> subsection for outer VMSD
>
> Signed-off-by: Alexandr Moshkov <dtalexundeer@yandex-team.ru>
> ---
> migration/vmstate.c | 4 +---
> 1 file changed, 1 insertion(+), 3 deletions(-)
>
> diff --git a/migration/vmstate.c b/migration/vmstate.c
> index 4d28364f7b..8f3a69c26e 100644
> --- a/migration/vmstate.c
> +++ b/migration/vmstate.c
> @@ -639,9 +639,7 @@ static int vmstate_subsection_load(QEMUFile *f, const VMStateDescription *vmsd,
> sub_vmsd = vmstate_get_subsection(vmsd->subsections, idstr);
> if (sub_vmsd == NULL) {
> trace_vmstate_subsection_load_bad(vmsd->name, idstr, "(lookup)");
> - error_setg(errp, "VM subsection '%s' in '%s' does not exist",
> - idstr, vmsd->name);
> - return -ENOENT;
> + return 0;
> }
> qemu_file_skip(f, 1); /* subsection */
> qemu_file_skip(f, 1); /* len */
next prev parent reply other threads:[~2026-03-12 14:16 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-12 10:26 [PATCH v3] vmstate: fix subsection load name check Alexandr Moshkov
2026-03-12 11:19 ` Peter Maydell
2026-03-12 14:21 ` Alexandr Moshkov
2026-03-12 13:27 ` Vladimir Sementsov-Ogievskiy
2026-03-12 14:15 ` Fabiano Rosas
2026-03-12 14:15 ` Fabiano Rosas [this message]
2026-03-12 14:32 ` Alexandr Moshkov
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=878qbxyw0d.fsf@suse.de \
--to=farosas@suse.de \
--cc=dtalexundeer@yandex-team.ru \
--cc=peter.maydell@linaro.org \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=vsementsov@yandex-team.ru \
--cc=yc-core@yandex-team.ru \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.