Hi Peter

On 2025-08-08 13:05, Peter Xu wrote:
> On Fri, Aug 08, 2025 at 01:08:39PM +0200, Juraj Marcin wrote:
> > Hi Peter,
> > 
> > On 2025-08-07 16:57, Peter Xu wrote:
> > > On Thu, Aug 07, 2025 at 01:49:11PM +0200, Juraj Marcin wrote:
> > > > From: Juraj Marcin <jmar...@redhat.com>
> > > > 
> > > > This patch allows joining the migration listen thread. This is done in
> > > > preparation for the introduction of "postcopy-setup" state at the
> > > > beginning of a postcopy migration, when destination can fail gracefully
> > > > and source side then resume to a running state.
> > > > 
> > > > In case of such failure, to gracefully perform all cleanup in the main
> > > > migration thread, we need to wait for the listen thread to exit, which
> > > > can be done by joining it.
> > > > 
> > > > Signed-off-by: Juraj Marcin <jmar...@redhat.com>
> > > > ---
> > > >  migration/migration.c | 1 +
> > > >  migration/savevm.c    | 2 +-
> > > >  2 files changed, 2 insertions(+), 1 deletion(-)
> > > > 
> > > > diff --git a/migration/migration.c b/migration/migration.c
> > > > index e5ce2940d5..8174e811eb 100644
> > > > --- a/migration/migration.c
> > > > +++ b/migration/migration.c
> > > > @@ -901,6 +901,7 @@ process_incoming_migration_co(void *opaque)
> > > >               * Postcopy was started, cleanup should happen at the end 
> > > > of the
> > > >               * postcopy thread.
> > > >               */
> > > > +            qemu_thread_detach(&mis->listen_thread);
> > > >              trace_process_incoming_migration_co_postcopy_end_main();
> > > >              goto out;
> > > >          }
> > > > diff --git a/migration/savevm.c b/migration/savevm.c
> > > > index fabbeb296a..d2360be53c 100644
> > > > --- a/migration/savevm.c
> > > > +++ b/migration/savevm.c
> > > > @@ -2217,7 +2217,7 @@ static int 
> > > > loadvm_postcopy_handle_listen(MigrationIncomingState *mis)
> > > >      mis->have_listen_thread = true;
> > > >      postcopy_thread_create(mis, &mis->listen_thread,
> > > >                             MIGRATION_THREAD_DST_LISTEN,
> > > > -                           postcopy_ram_listen_thread, 
> > > > QEMU_THREAD_DETACHED);
> > > > +                           postcopy_ram_listen_thread, 
> > > > QEMU_THREAD_JOINABLE);
> > > 
> > > This is good; I actually forgot it used to be detached..
> > > 
> > > Instead of proactively detach it above, could we always properly join it
> > 
> > However, after the main thread finishes loading device state from the
> > package, process_incoming_migration_co() exits, and IIUC main thread is
> > then no longer occupied with migration. So, if we should instead join
> > the listen thread, we probably should yield the coroutine until the
> > listen thread can be joined, so we are not blocking the main thread?
> 
> Or could we schedule a bottom half at the end of
> postcopy_ram_listen_thread() to join itself?  We could move something over
> into the BH:
> 
>     ... join() ...
>     mis->have_listen_thread = false;
>     migration_incoming_state_destroy();
>     object_unref(OBJECT(migr));

That sounds like a good idea, I will certainly try that, thank you.

Best regards,

Juraj Marcin

> 
> > 
> > > (and hopefully every migration thread)?  Then we could drop patch 1 too.
> > 
> > If I haven't missed any, there are no detached migration threads except
> > listen and get dirty rate threads.
> 
> Yep.
> 
> From mgmt pov, IMHO it's always good we create joinable threads.  But we
> can leave the calc_dirty_rate thread until necessary.
> 
> -- 
> Peter Xu
> 


Reply via email to