All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Xu <peterx@redhat.com>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: "Arun Menon" <armenon@redhat.com>,
	qemu-devel@nongnu.org, "Fabiano Rosas" <farosas@suse.de>,
	"David Hildenbrand" <david@redhat.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Marc-André Lureau" <marcandre.lureau@redhat.com>,
	"Akihiko Odaki" <odaki@rsg.ci.i.u-tokyo.ac.jp>
Subject: Re: [PULL 02/45] migration: push Error **errp into vmstate_load_state()
Date: Tue, 21 Oct 2025 14:09:43 -0400	[thread overview]
Message-ID: <aPfMZ4ugzwbAy_93@x1.local> (raw)
In-Reply-To: <CAFEAcA_BAxh8BAYPAbPEp_P98gMUdZqZ=2XZHrmGQ+GyEViF_Q@mail.gmail.com>

On Tue, Oct 21, 2025 at 06:22:55PM +0100, Peter Maydell wrote:
> On Tue, 21 Oct 2025 at 18:05, Peter Xu <peterx@redhat.com> wrote:
> >
> > On Tue, Oct 21, 2025 at 05:49:51PM +0100, Peter Maydell wrote:
> > > I suppose so, but that seems like something in practice
> > > we make a lot of use of. It's really handy to be able to
> > > say "this is how you obtain the integer you wanted to put
> > > in the migration stream" -- we do a fair amount of that
> > > in target/arm/machine.c for instance. But those don't
> > > need to return a failure, I suppose.
> >
> > That's exactly what pre_save() / post_load() should do, IMHO.
> >
> > Taking example of the arm's case here:
> >
> > static int put_fpscr(QEMUFile *f, void *opaque, size_t size,
> >                      const VMStateField *field, JSONWriter *vmdesc)
> > {
> >     ARMCPU *cpu = opaque;
> >     CPUARMState *env = &cpu->env;
> >     uint32_t fpscr = vfp_fpcr_fpsr_needed(opaque) ? 0 : vfp_get_fpscr(env);
> >
> >     qemu_put_be32(f, fpscr);
> >     return 0;
> > }
> >
> > The .pre_save() should be exactly the logic that generalize whatever we
> > have had in QEMU's structs into a pure uint32_t, put that into a temp
> > u32. Then migration should be able to transfer that using whatever way it
> > prefers.  When using qemufile API, it should use vmstate_info_uint32 so as
> > to not open-code qemu_put_be32().
> 
> I think this is very ugly, because it means that the device state
> struct ends up with a pile of extra fields whose only purpose
> is to be temporarily used during migration. Having a function
> which does the "figure out the value at the point where we want it"
> is a much nicer API because it keeps the migration related
> complication in the migration code, and keeps it out of the
> data structures that all the rest of the code has to work with.

It'll be a temporary struct, can be allocated only in a pre_save() and
freed in a post_save(), for example.  And IIUC most of the devices do not
need it when there're already good representation of the data for migration
within the device object.  AFAICT, the latter is the common case.

> 
> > Now, we have a major issue with qemufile and all the APIs that bound to it
> > when we want to move the IO layers from qemufile to iochannels, exactly
> > because we lack such abstraction layer, where we mixed up "this is how you
> > obtain the integer" and "send this integer to the wire" operations in one
> > API.
> 
> Yeah, this is unfortunate. But I don't think the solution is
> to require a lot of extra device state struct fields to carry
> temporary data for migration. It would be better to have an
> API similar to the existing get/put functions but which
> passes the data back to the caller instead of calling
> qemu_put_be32() itself.

Yes.  I feel like what we said do not conflict with each other.

What you mentioned looks like a per-field version of VMSD's pre/post hooks,
so AFAIU get() is almost a post_load(), and put() is almost a pre_save(),
only that it will be per-vmsd-field, rather than per-vmsd.

The important part is IO path separations, IMHO.

Thanks,

-- 
Peter Xu



  reply	other threads:[~2025-10-21 18:10 UTC|newest]

Thread overview: 69+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-10-03 15:39 [PULL 00/45] Staging patches Peter Xu
2025-10-03 15:39 ` [PULL 01/45] migration: push Error **errp into vmstate_subsection_load() Peter Xu
2025-10-03 15:39 ` [PULL 02/45] migration: push Error **errp into vmstate_load_state() Peter Xu
2025-10-21 15:43   ` Peter Maydell
2025-10-21 16:16     ` Peter Xu
2025-10-21 16:21       ` Peter Maydell
2025-10-21 16:46         ` Peter Xu
2025-10-21 16:49           ` Peter Maydell
2025-10-21 17:05             ` Peter Xu
2025-10-21 17:22               ` Peter Maydell
2025-10-21 18:09                 ` Peter Xu [this message]
2025-10-23 21:50       ` Arun Menon
2025-10-24 15:48         ` Peter Xu
2025-10-03 15:39 ` [PULL 03/45] migration: push Error **errp into qemu_loadvm_state_header() Peter Xu
2025-10-03 15:39 ` [PULL 04/45] migration: push Error **errp into vmstate_load() Peter Xu
2025-10-03 15:39 ` [PULL 05/45] migration: push Error **errp into loadvm_process_command() Peter Xu
2025-10-03 15:39 ` [PULL 06/45] migration: push Error **errp into loadvm_handle_cmd_packaged() Peter Xu
2025-10-03 15:39 ` [PULL 07/45] migration: push Error **errp into qemu_loadvm_state() Peter Xu
2025-10-03 15:39 ` [PULL 08/45] migration: push Error **errp into qemu_load_device_state() Peter Xu
2025-10-03 15:39 ` [PULL 09/45] migration: push Error **errp into qemu_loadvm_state_main() Peter Xu
2025-10-03 15:39 ` [PULL 10/45] migration: push Error **errp into qemu_loadvm_section_start_full() Peter Xu
2025-10-03 15:39 ` [PULL 11/45] migration: push Error **errp into qemu_loadvm_section_part_end() Peter Xu
2025-10-03 15:39 ` [PULL 12/45] migration: Update qemu_file_get_return_path() docs and remove dead checks Peter Xu
2025-10-03 15:39 ` [PULL 13/45] migration: make loadvm_postcopy_handle_resume() void Peter Xu
2025-10-03 15:39 ` [PULL 14/45] migration: push Error **errp into ram_postcopy_incoming_init() Peter Xu
2025-10-03 15:39 ` [PULL 15/45] migration: push Error **errp into loadvm_postcopy_handle_advise() Peter Xu
2025-10-03 15:39 ` [PULL 16/45] migration: push Error **errp into loadvm_postcopy_handle_listen() Peter Xu
2025-10-03 15:39 ` [PULL 17/45] migration: push Error **errp into loadvm_postcopy_handle_run() Peter Xu
2025-10-03 15:39 ` [PULL 18/45] migration: push Error **errp into loadvm_postcopy_ram_handle_discard() Peter Xu
2025-10-03 15:39 ` [PULL 19/45] migration: push Error **errp into loadvm_handle_recv_bitmap() Peter Xu
2025-10-03 15:39 ` [PULL 20/45] migration: Return -1 on memory allocation failure in ram.c Peter Xu
2025-10-03 15:39 ` [PULL 21/45] migration: push Error **errp into loadvm_process_enable_colo() Peter Xu
2025-10-03 15:39 ` [PULL 22/45] migration: push Error **errp into loadvm_postcopy_handle_switchover_start() Peter Xu
2025-10-03 15:39 ` [PULL 23/45] migration: Capture error in postcopy_ram_listen_thread() Peter Xu
2025-10-21 14:53   ` Peter Maydell
2025-10-21 15:37     ` Peter Xu
2025-10-28  5:46       ` Arun Menon
2025-10-03 15:39 ` [PULL 24/45] migration: Remove error variant of vmstate_save_state() function Peter Xu
2025-10-03 15:39 ` [PULL 25/45] migration: Add error-parameterized function variants in VMSD struct Peter Xu
2025-10-03 15:39 ` [PULL 26/45] backends/tpm: Propagate vTPM error on migration failure Peter Xu
2025-10-03 15:39 ` [PULL 27/45] io/crypto: Move tls premature termination handling into QIO layer Peter Xu
2025-10-10  8:00   ` iotest 233 is failing (was: [PULL 27/45] io/crypto: Move tls premature termination handling into QIO layer) Thomas Huth
2025-10-10  8:35     ` iotest 233 is failing Thomas Huth
2025-10-03 15:39 ` [PULL 28/45] migration: Make migration_has_failed() work even for CANCELLING Peter Xu
2025-10-03 15:39 ` [PULL 29/45] migration: HMP: Adjust the order of output fields Peter Xu
2025-10-03 15:39 ` [PULL 30/45] migration/multifd/tls: Cleanup BYE message processing on sender side Peter Xu
2025-10-03 15:39 ` [PULL 31/45] migration: Fix state transition in postcopy_start() error handling Peter Xu
2025-10-03 15:39 ` [PULL 32/45] migration: ensure APIC is loaded prior to VFIO PCI devices Peter Xu
2025-10-03 15:39 ` [PULL 33/45] include/system/memory.h: Clarify address_space_destroy() behaviour Peter Xu
2025-10-03 15:39 ` [PULL 34/45] memory: New AS helper to serialize destroy+free Peter Xu
2025-10-03 15:39 ` [PULL 35/45] physmem: Destroy all CPU AddressSpaces on unrealize Peter Xu
2025-10-03 15:39 ` [PULL 36/45] migration: simplify error reporting after channel read Peter Xu
2025-10-03 15:39 ` [PULL 37/45] migration: multi-mode notifier Peter Xu
2025-11-13 20:28   ` Matthew Rosato
2025-11-13 21:04     ` Peter Xu
2025-10-03 15:39 ` [PULL 38/45] migration: add cpr_walk_fd Peter Xu
2025-10-03 15:39 ` [PULL 39/45] oslib: qemu_clear_cloexec Peter Xu
2025-10-03 15:39 ` [PULL 40/45] migration: cpr-exec-command parameter Peter Xu
2025-10-23 15:41   ` Peter Maydell
2025-10-23 16:08     ` Peter Xu
2025-10-03 15:39 ` [PULL 41/45] migration: cpr-exec save and load Peter Xu
2025-10-21 14:59   ` Peter Maydell
2025-10-03 15:39 ` [PULL 42/45] migration: cpr-exec mode Peter Xu
2025-10-21 15:34   ` Peter Maydell
2025-10-21 15:59     ` Peter Xu
2025-10-03 15:39 ` [PULL 43/45] migration: cpr-exec docs Peter Xu
2025-10-03 15:39 ` [PULL 44/45] vfio: cpr-exec mode Peter Xu
2025-10-03 15:39 ` [PULL 45/45] migration-test: test cpr-exec Peter Xu
2025-10-04 17:53 ` [PULL 00/45] Staging patches Richard Henderson

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=aPfMZ4ugzwbAy_93@x1.local \
    --to=peterx@redhat.com \
    --cc=armenon@redhat.com \
    --cc=david@redhat.com \
    --cc=farosas@suse.de \
    --cc=marcandre.lureau@redhat.com \
    --cc=odaki@rsg.ci.i.u-tokyo.ac.jp \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /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.