From: Fam Zheng <famz@redhat.com>
To: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
Cc: Peter Xu <peterx@redhat.com>,
qemu-stable@nongnu.org, Juan Quintela <quintela@redhat.com>,
qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 2/3] migration: Cancel migration at exit
Date: Fri, 15 Sep 2017 16:52:47 +0800 [thread overview]
Message-ID: <20170915085247.GH17199@lemon> (raw)
In-Reply-To: <20170915084234.GA2170@work-vm>
On Fri, 09/15 09:42, Dr. David Alan Gilbert wrote:
> * Fam Zheng (famz@redhat.com) wrote:
> > On Fri, 09/15 16:03, Peter Xu wrote:
> > > On Fri, Sep 15, 2017 at 01:44:03PM +0800, Fam Zheng wrote:
> > > > bdrv_close_all() would abort() due to op blockers added by BMDS, clean
> > > > up migration states when main loop quits to avoid that.
> > > >
> > > > Signed-off-by: Fam Zheng <famz@redhat.com>
> > > > ---
> > > > include/migration/misc.h | 1 +
> > > > migration/migration.c | 7 ++++++-
> > > > vl.c | 3 +++
> > > > 3 files changed, 10 insertions(+), 1 deletion(-)
> > > >
> > > > diff --git a/include/migration/misc.h b/include/migration/misc.h
> > > > index c079b7771b..b9a26b0898 100644
> > > > --- a/include/migration/misc.h
> > > > +++ b/include/migration/misc.h
> > > > @@ -54,5 +54,6 @@ bool migration_has_failed(MigrationState *);
> > > > /* ...and after the device transmission */
> > > > bool migration_in_postcopy_after_devices(MigrationState *);
> > > > void migration_global_dump(Monitor *mon);
> > > > +void migrate_cancel(void);
> > > >
> > > > #endif
> > > > diff --git a/migration/migration.c b/migration/migration.c
> > > > index 959e8ec88e..2c844945c7 100644
> > > > --- a/migration/migration.c
> > > > +++ b/migration/migration.c
> > > > @@ -1274,11 +1274,16 @@ void qmp_migrate(const char *uri, bool has_blk, bool blk,
> > > > }
> > > > }
> > > >
> > > > -void qmp_migrate_cancel(Error **errp)
> > > > +void migrate_cancel(void)
> > > > {
> > > > migrate_fd_cancel(migrate_get_current());
> > > > }
> > > >
> > > > +void qmp_migrate_cancel(Error **errp)
> > > > +{
> > > > + migrate_cancel();
> > > > +}
> > > > +
> > >
> > > Nit: I would prefer just call migrate_fd_cancel() below, since I don't
> > > see much point to introduce migrate_cancel() which only calls
> > > migrate_fd_cancel()...
> >
> > migrate_get_current() is a migration internal IMHO. But that can be moved to
> > migrate_fd_cancel() so the parameter is dropped.
> >
> > >
> > > > void qmp_migrate_set_cache_size(int64_t value, Error **errp)
> > > > {
> > > > MigrationState *s = migrate_get_current();
> > > > diff --git a/vl.c b/vl.c
> > > > index fb1f05b937..abbe61f40b 100644
> > > > --- a/vl.c
> > > > +++ b/vl.c
> > > > @@ -87,6 +87,7 @@ int main(int argc, char **argv)
> > > > #include "sysemu/blockdev.h"
> > > > #include "hw/block/block.h"
> > > > #include "migration/misc.h"
> > > > +#include "migration/savevm.h"
> > > > #include "migration/snapshot.h"
> > > > #include "migration/global_state.h"
> > > > #include "sysemu/tpm.h"
> > > > @@ -4799,6 +4800,8 @@ int main(int argc, char **argv, char **envp)
> > > > iothread_stop_all();
> > > >
> > > > pause_all_vcpus();
> > > > + migrate_cancel();
> > >
> > > IIUC this is an async cancel, so when reach here the migration thread
> > > can still be alive. Then...
> > >
> > > > + qemu_savevm_state_cleanup();
> > >
> > > ... Here calling qemu_savevm_state_cleanup() may be problematic if
> > > migration thread has not yet quitted.
> > >
> > > I'm thinking whether we should make migrate_fd_cancel() wait until the
> > > migration thread finishes (state change to CANCELLED). Then the
> > > migration thread will do the cleanup, and here we can avoid calling
> > > qemu_savevm_state_cleanup() as well.
> >
> > But if the migration thread is stuck and CANCELLED is never reached, we'll hang
> > here?
>
> I'm not sure I see an easy fix; I agree with Peter that calling
> migrate_cancel() followed by qemu_savevm_state_cleanup() is racy,
> because the cancel just forces the state to CANCELLING before coming
> back to you, and the migration thread asynchronously starts to
> fail/cleanup.
>
> migrate_cancel() can forcibly unblock some cases because it calls
> shutdown(2) on the network fd, but there are other ways for a migration
> to hang.
>
> Having said that, the migration thread does it's calls
> to qemu_savevm_state_cleanup under the lock_iothread;
> Do we have that lock at this point?
Yes we do. Main loop releases the lock only during poll(), other parts of
main() all have the lock.
Fam
next prev parent reply other threads:[~2017-09-15 8:52 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-09-15 5:44 [Qemu-devel] [PATCH 0/3] migration: Fix crash by cleaning up before quit Fam Zheng
2017-09-15 5:44 ` [Qemu-devel] [PATCH 1/3] migration: Allow ram_save_cleanup to be called with empty state Fam Zheng
2017-09-15 6:41 ` Peter Xu
2017-09-15 6:49 ` Fam Zheng
2017-09-15 6:56 ` Peter Xu
2017-09-15 7:02 ` Fam Zheng
2017-09-15 7:58 ` Peter Xu
2017-09-15 5:44 ` [Qemu-devel] [PATCH 2/3] migration: Cancel migration at exit Fam Zheng
2017-09-15 8:03 ` Peter Xu
2017-09-15 8:20 ` Fam Zheng
2017-09-15 8:37 ` Peter Xu
2017-09-15 8:42 ` Dr. David Alan Gilbert
2017-09-15 8:52 ` Fam Zheng [this message]
2017-09-15 9:22 ` Dr. David Alan Gilbert
2017-09-18 7:31 ` Peter Xu
2017-09-18 10:00 ` Dr. David Alan Gilbert
2017-09-19 8:26 ` Peter Xu
2017-09-15 5:44 ` [Qemu-devel] [PATCH 3/3] iotests: Add "quit during block migration" case 195 Fam Zheng
2017-09-15 17:29 ` Eric Blake
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=20170915085247.GH17199@lemon \
--to=famz@redhat.com \
--cc=dgilbert@redhat.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-stable@nongnu.org \
--cc=quintela@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).