From: Peter Xu <peterx@redhat.com>
To: "Maciej S. Szmigiero" <mail@maciej.szmigiero.name>
Cc: "Cédric Le Goater" <clg@redhat.com>,
"Alex Williamson" <alex.williamson@redhat.com>,
"Eric Blake" <eblake@redhat.com>,
"Fabiano Rosas" <farosas@suse.de>,
"Markus Armbruster" <armbru@redhat.com>,
"Daniel P. Berrangé" <berrange@redhat.com>,
"Avihai Horon" <avihaih@nvidia.com>,
"Joao Martins" <joao.m.martins@oracle.com>,
qemu-devel@nongnu.org
Subject: Re: [PATCH v3 08/24] migration: Add thread pool of optional load threads
Date: Mon, 16 Dec 2024 11:29:22 -0500 [thread overview]
Message-ID: <Z2BVYvO1359M1i9Q@x1n> (raw)
In-Reply-To: <d45267a6-74a6-4eeb-b8fa-f427db03afde@maciej.szmigiero.name>
On Thu, Dec 12, 2024 at 11:53:24PM +0100, Maciej S. Szmigiero wrote:
> On 12.12.2024 17:38, Peter Xu wrote:
> > On Wed, Dec 11, 2024 at 12:05:23AM +0100, Maciej S. Szmigiero wrote:
> > > > Maybe move it over to migration_object_init()? Then we keep
> > > > qemu_loadvm_state_setup() only invoke the load_setup()s.
> > >
> > > AFAIK migration_object_init() is called unconditionally
> > > at QEMU startup even if there won't me any migration done?
> > >
> > > Creating a load thread pool there seems wasteful if no
> > > incoming migration will ever take place (or will but only
> > > much later).
> >
> > I was expecting an empty pool to not be a major resource, but if that's a
> > concern, yes we can do that until later.
> >
> > [...]
> >
> > > > > > > @@ -3007,6 +3071,19 @@ int qemu_loadvm_state(QEMUFile *f)
> > > > > > > return ret;
> > > > > > > }
> > > > > > > + if (ret == 0) {
> > > > > > > + bql_unlock(); /* Let load threads do work requiring BQL */
> > > > > > > + thread_pool_wait(load_threads);
> > > > > > > + bql_lock();
> > > > > > > +
> > > > > > > + ret = load_threads_ret;
> > > > > > > + }
> > > > > > > + /*
> > > > > > > + * Set this flag unconditionally so we'll catch further attempts to
> > > > > > > + * start additional threads via an appropriate assert()
> > > > > > > + */
> > > > > > > + qatomic_set(&load_threads_abort, true);
> > > >
> > > > I assume this is only for debugging purpose and not required.
> > > >
> > > > Setting "abort all threads" to make sure "nobody will add more thread
> > > > tasks" is pretty awkward, IMHO. If we really want to protect against it
> > > > and fail hard, it might be easier after the thread_pool_wait() we free the
> > > > pool directly (destroy() will see NULL so it'll skip; still need to free
> > > > there in case migration failed before this). Then any enqueue will access
> > > > null pointer on the pool.
> > >
> > > We don't want to destroy the thread pool in the path where the downtime
> > > is still counting.
> >
> > Yeah this makes sense.
> >
> > >
> > > That's why we only do cleanup after the migration is complete.
> > >
> > > The above setting of load_threads_abort flag also makes sure that we abort
> > > load threads if the migration is going to fail for other reasons (non-load
> > > threads related) - in other words, when the above block with thread_pool_wait()
> > > isn't even entered due to ret already containing an earlier error.
> >
> > In that case IIUC we should cleanup the load threads in destroy(), not
> > here? Especially with the comment that's even more confusing.
> >
>
> This flag only asks the threads in pool which are still running to exit ASAP
> (without waiting for them in the "fail for other reasons"
> qemu_loadvm_state() code flow).
I thought we could switch to an Error** model as we talked elsewhere, then
the thread who hits the error should set the quit flag, IIUC.
Even without it..
>
> Setting this flag does *not* do the cleanup of the whole thread pool - this
> only happens in qemu_loadvm_state_cleanup().
... we have two cases here:
Either no error at all, then thread_pool_wait() will wait for all threads
until finished. When reaching here setting this flag shouldn't matter for
the threads because they're all finished.
Or there's error in some thread, then QEMU should be stuck at
thread_pool_wait() anyway, until all threads quit. Again, I thought it
could be the qemu_loadvm_load_thread() that sets the quit flag (rather than
here) so the failed thread will notify all threads to quit.
I just still don't see what's the help of setting it after
thread_pool_wait(), which already marked all threads finished at its
return. That goes back to my question on whether it was only for debugging
(so no new threads to be created after this), rather than the flag to tell
all threads to quit.
Thanks,
--
Peter Xu
next prev parent reply other threads:[~2024-12-16 16:30 UTC|newest]
Thread overview: 140+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-17 19:19 [PATCH v3 00/24] Multifd 🔀 device state transfer support with VFIO consumer Maciej S. Szmigiero
2024-11-17 19:19 ` [PATCH v3 01/24] migration: Clarify that {load, save}_cleanup handlers can run without setup Maciej S. Szmigiero
2024-11-25 19:08 ` Fabiano Rosas
2024-11-26 16:25 ` [PATCH v3 01/24] migration: Clarify that {load,save}_cleanup " Cédric Le Goater
2024-11-17 19:19 ` [PATCH v3 02/24] thread-pool: Remove thread_pool_submit() function Maciej S. Szmigiero
2024-11-25 19:13 ` Fabiano Rosas
2024-11-26 16:25 ` Cédric Le Goater
2024-12-04 19:24 ` Peter Xu
2024-12-06 21:11 ` Maciej S. Szmigiero
2024-11-17 19:19 ` [PATCH v3 03/24] thread-pool: Rename AIO pool functions to *_aio() and data types to *Aio Maciej S. Szmigiero
2024-11-25 19:15 ` Fabiano Rosas
2024-11-26 16:26 ` Cédric Le Goater
2024-12-04 19:26 ` Peter Xu
2024-11-17 19:19 ` [PATCH v3 04/24] thread-pool: Implement generic (non-AIO) pool support Maciej S. Szmigiero
2024-11-25 19:41 ` Fabiano Rosas
2024-11-25 19:55 ` Maciej S. Szmigiero
2024-11-25 20:51 ` Fabiano Rosas
2024-11-26 19:25 ` Cédric Le Goater
2024-11-26 21:21 ` Maciej S. Szmigiero
2024-11-26 19:29 ` Cédric Le Goater
2024-11-26 21:22 ` Maciej S. Szmigiero
2024-12-05 13:10 ` Cédric Le Goater
2024-11-28 10:08 ` Avihai Horon
2024-11-28 12:11 ` Maciej S. Szmigiero
2024-12-04 20:04 ` Peter Xu
2024-11-17 19:20 ` [PATCH v3 05/24] migration: Add MIG_CMD_SWITCHOVER_START and its load handler Maciej S. Szmigiero
2024-11-25 19:46 ` Fabiano Rosas
2024-11-26 19:37 ` Cédric Le Goater
2024-11-26 21:22 ` Maciej S. Szmigiero
2024-12-04 21:29 ` Peter Xu
2024-12-05 19:46 ` Zhang Chen
2024-12-06 18:24 ` Maciej S. Szmigiero
2024-12-06 22:12 ` Peter Xu
2024-12-09 1:43 ` Zhang Chen
2024-11-17 19:20 ` [PATCH v3 06/24] migration: Add qemu_loadvm_load_state_buffer() and its handler Maciej S. Szmigiero
2024-12-04 21:32 ` Peter Xu
2024-12-06 21:12 ` Maciej S. Szmigiero
2024-11-17 19:20 ` [PATCH v3 07/24] migration: Document the BQL behavior of load SaveVMHandlers Maciej S. Szmigiero
2024-12-04 21:38 ` Peter Xu
2024-12-06 18:40 ` Maciej S. Szmigiero
2024-12-06 22:15 ` Peter Xu
2024-11-17 19:20 ` [PATCH v3 08/24] migration: Add thread pool of optional load threads Maciej S. Szmigiero
2024-11-25 19:58 ` Fabiano Rosas
2024-11-27 9:13 ` Cédric Le Goater
2024-11-27 20:16 ` Maciej S. Szmigiero
2024-12-04 22:48 ` Peter Xu
2024-12-05 16:15 ` Peter Xu
2024-12-10 23:05 ` Maciej S. Szmigiero
2024-12-10 23:05 ` Maciej S. Szmigiero
2024-12-12 16:38 ` Peter Xu
2024-12-12 22:53 ` Maciej S. Szmigiero
2024-12-16 16:29 ` Peter Xu [this message]
2024-12-16 23:15 ` Maciej S. Szmigiero
2024-12-17 14:50 ` Peter Xu
2024-11-28 10:26 ` Avihai Horon
2024-11-28 12:11 ` Maciej S. Szmigiero
2024-12-04 22:43 ` Peter Xu
2024-12-10 23:05 ` Maciej S. Szmigiero
2024-12-12 16:55 ` Peter Xu
2024-12-12 22:53 ` Maciej S. Szmigiero
2024-12-16 16:33 ` Peter Xu
2024-12-16 23:15 ` Maciej S. Szmigiero
2024-11-17 19:20 ` [PATCH v3 09/24] migration/multifd: Split packet into header and RAM data Maciej S. Szmigiero
2024-11-26 14:34 ` Fabiano Rosas
2024-12-05 15:29 ` Peter Xu
2024-11-17 19:20 ` [PATCH v3 10/24] migration/multifd: Device state transfer support - receive side Maciej S. Szmigiero
2024-12-05 16:06 ` Peter Xu
2024-12-06 21:12 ` Maciej S. Szmigiero
2024-12-06 21:57 ` Peter Xu
2024-11-17 19:20 ` [PATCH v3 11/24] migration/multifd: Make multifd_send() thread safe Maciej S. Szmigiero
2024-12-05 16:17 ` Peter Xu
2024-12-06 21:12 ` Maciej S. Szmigiero
2024-11-17 19:20 ` [PATCH v3 12/24] migration/multifd: Add an explicit MultiFDSendData destructor Maciej S. Szmigiero
2024-12-05 16:23 ` Peter Xu
2024-11-17 19:20 ` [PATCH v3 13/24] migration/multifd: Device state transfer support - send side Maciej S. Szmigiero
2024-11-26 19:58 ` Fabiano Rosas
2024-11-26 21:22 ` Maciej S. Szmigiero
2024-11-17 19:20 ` [PATCH v3 14/24] migration/multifd: Make MultiFDSendData a struct Maciej S. Szmigiero
2024-11-17 19:20 ` [PATCH v3 15/24] migration/multifd: Add migration_has_device_state_support() Maciej S. Szmigiero
2024-11-26 20:05 ` Fabiano Rosas
2024-11-28 10:33 ` Avihai Horon
2024-11-28 12:12 ` Maciej S. Szmigiero
2024-12-05 16:44 ` Peter Xu
2024-11-17 19:20 ` [PATCH v3 16/24] migration/multifd: Send final SYNC only after device state is complete Maciej S. Szmigiero
2024-11-26 20:52 ` Fabiano Rosas
2024-11-26 21:22 ` Maciej S. Szmigiero
2024-12-05 19:02 ` Peter Xu
2024-12-10 23:05 ` Maciej S. Szmigiero
2024-12-11 13:20 ` Peter Xu
2024-11-17 19:20 ` [PATCH v3 17/24] migration: Add save_live_complete_precopy_thread handler Maciej S. Szmigiero
2024-11-29 14:03 ` Cédric Le Goater
2024-11-29 17:14 ` Maciej S. Szmigiero
2024-11-17 19:20 ` [PATCH v3 18/24] vfio/migration: Don't run load cleanup if load setup didn't run Maciej S. Szmigiero
2024-11-29 14:08 ` Cédric Le Goater
2024-11-29 17:15 ` Maciej S. Szmigiero
2024-12-03 15:09 ` Avihai Horon
2024-12-10 23:04 ` Maciej S. Szmigiero
2024-12-12 14:30 ` Avihai Horon
2024-12-12 22:52 ` Maciej S. Szmigiero
2024-12-19 9:19 ` Cédric Le Goater
2024-11-17 19:20 ` [PATCH v3 19/24] vfio/migration: Add x-migration-multifd-transfer VFIO property Maciej S. Szmigiero
2024-11-29 14:11 ` Cédric Le Goater
2024-11-29 17:15 ` Maciej S. Szmigiero
2024-12-19 9:37 ` Cédric Le Goater
2024-11-17 19:20 ` [PATCH v3 20/24] vfio/migration: Add load_device_config_state_start trace event Maciej S. Szmigiero
2024-11-29 14:26 ` Cédric Le Goater
2024-11-17 19:20 ` [PATCH v3 21/24] vfio/migration: Convert bytes_transferred counter to atomic Maciej S. Szmigiero
2024-11-17 19:20 ` [PATCH v3 22/24] vfio/migration: Multifd device state transfer support - receive side Maciej S. Szmigiero
2024-12-02 17:56 ` Cédric Le Goater
2024-12-10 23:04 ` Maciej S. Szmigiero
2024-12-19 14:13 ` Cédric Le Goater
2024-12-09 9:13 ` Avihai Horon
2024-12-10 23:06 ` Maciej S. Szmigiero
2024-12-12 14:33 ` Avihai Horon
2024-11-17 19:20 ` [PATCH v3 23/24] migration/qemu-file: Define g_autoptr() cleanup function for QEMUFile Maciej S. Szmigiero
2024-11-26 21:01 ` Fabiano Rosas
2024-12-05 19:49 ` Peter Xu
2024-11-17 19:20 ` [PATCH v3 24/24] vfio/migration: Multifd device state transfer support - send side Maciej S. Szmigiero
2024-12-09 9:28 ` Avihai Horon
2024-12-10 23:06 ` Maciej S. Szmigiero
2024-12-12 11:10 ` Cédric Le Goater
2024-12-12 22:52 ` Maciej S. Szmigiero
2024-12-13 11:08 ` Cédric Le Goater
2024-12-13 18:25 ` Maciej S. Szmigiero
2024-12-12 14:54 ` Avihai Horon
2024-12-12 22:53 ` Maciej S. Szmigiero
2024-12-16 17:33 ` Peter Xu
2024-12-19 9:50 ` Cédric Le Goater
2024-12-04 19:10 ` [PATCH v3 00/24] Multifd 🔀 device state transfer support with VFIO consumer Peter Xu
2024-12-06 18:03 ` Maciej S. Szmigiero
2024-12-06 22:20 ` Peter Xu
2024-12-10 23:06 ` Maciej S. Szmigiero
2024-12-12 17:35 ` Peter Xu
2024-12-19 7:55 ` Yanghang Liu
2024-12-19 8:53 ` Cédric Le Goater
2024-12-19 13:00 ` Yanghang Liu
2024-12-05 21:27 ` Cédric Le Goater
2024-12-05 21:42 ` Peter Xu
2024-12-06 10:24 ` Cédric Le Goater
2024-12-06 18:44 ` Maciej S. Szmigiero
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=Z2BVYvO1359M1i9Q@x1n \
--to=peterx@redhat.com \
--cc=alex.williamson@redhat.com \
--cc=armbru@redhat.com \
--cc=avihaih@nvidia.com \
--cc=berrange@redhat.com \
--cc=clg@redhat.com \
--cc=eblake@redhat.com \
--cc=farosas@suse.de \
--cc=joao.m.martins@oracle.com \
--cc=mail@maciej.szmigiero.name \
--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 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).