diff mbox

[02/11] migration: qemu_savevm_state_cleanup() in cleanup

Message ID 20180103054043.25719-3-peterx@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Peter Xu Jan. 3, 2018, 5:40 a.m. UTC
Moving existing callers all into migrate_fd_cleanup().  It simplifies
migration_thread() a bit.

Signed-off-by: Peter Xu <peterx@redhat.com>
---
 migration/migration.c | 10 ++--------
 1 file changed, 2 insertions(+), 8 deletions(-)

Comments

Juan Quintela Jan. 3, 2018, 9:15 a.m. UTC | #1
Peter Xu <peterx@redhat.com> wrote:
> Moving existing callers all into migrate_fd_cleanup().  It simplifies
> migration_thread() a bit.
>
> Signed-off-by: Peter Xu <peterx@redhat.com>

Reviewed-by: Juan Quintela <quintela@redhat.com>

I am trying to see if we can call migrate_fd_cleanup() twice.  As far as
I can see, we are not doing it.  But, and it is a big but, we are not
checking that we are not calling qemu_savevm_state_cleanup() twice.  If
that happens, we can get double frees and similar.

I put the reviewed-by anyways, because I *think* that we are doing it
right now, and otherwise, we should make sure that we are not calling it
twice, not papering over it.

Once here, I have notice that we call block_cleanup_parameters() in
*three* places.  We call notifier_list_notify() on two of this places (I
can't see any good reason *why* we don't call the notifier for
migrate_fd_cancel).

So, still more review/cleanups to do on this arera.

Later, Juan.

> ---
>  migration/migration.c | 10 ++--------
>  1 file changed, 2 insertions(+), 8 deletions(-)
>
> diff --git a/migration/migration.c b/migration/migration.c
> index 0ee4b4c27c..edbda43246 100644
> --- a/migration/migration.c
> +++ b/migration/migration.c
> @@ -1077,6 +1077,8 @@ static void migrate_fd_cleanup(void *opaque)
>      qemu_bh_delete(s->cleanup_bh);
>      s->cleanup_bh = NULL;
>  
> +    qemu_savevm_state_cleanup();
> +
>      if (s->to_dst_file) {
>          Error *local_err = NULL;
>  
> @@ -2290,13 +2292,6 @@ static void *migration_thread(void *opaque)
>      end_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
>  
>      qemu_mutex_lock_iothread();
> -    /*
> -     * The resource has been allocated by migration will be reused in COLO
> -     * process, so don't release them.
> -     */
> -    if (!enable_colo) {
> -        qemu_savevm_state_cleanup();
> -    }
>      if (s->state == MIGRATION_STATUS_COMPLETED) {
>          uint64_t transferred_bytes = qemu_ftell(s->to_dst_file);
>          s->total_time = end_time - s->total_time;
> @@ -2312,7 +2307,6 @@ static void *migration_thread(void *opaque)
>          if (s->state == MIGRATION_STATUS_ACTIVE) {
>              assert(enable_colo);
>              migrate_start_colo_process(s);
> -            qemu_savevm_state_cleanup();
>              /*
>              * Fixme: we will run VM in COLO no matter its old running state.
>              * After exited COLO, we will keep running.
Peter Xu Jan. 3, 2018, 9:36 a.m. UTC | #2
On Wed, Jan 03, 2018 at 10:15:41AM +0100, Juan Quintela wrote:
> Peter Xu <peterx@redhat.com> wrote:
> > Moving existing callers all into migrate_fd_cleanup().  It simplifies
> > migration_thread() a bit.
> >
> > Signed-off-by: Peter Xu <peterx@redhat.com>
> 
> Reviewed-by: Juan Quintela <quintela@redhat.com>

Thanks.

> 
> I am trying to see if we can call migrate_fd_cleanup() twice.  As far as
> I can see, we are not doing it.  But, and it is a big but, we are not
> checking that we are not calling qemu_savevm_state_cleanup() twice.  If
> that happens, we can get double frees and similar.
> 
> I put the reviewed-by anyways, because I *think* that we are doing it
> right now, and otherwise, we should make sure that we are not calling it
> twice, not papering over it.
> 
> Once here, I have notice that we call block_cleanup_parameters() in
> *three* places.  We call notifier_list_notify() on two of this places (I
> can't see any good reason *why* we don't call the notifier for
> migrate_fd_cancel).

Indeed.

IMHO we can remove two calls of block_cleanup_parameters(), only keep
the one in migrate_fd_cleanup(), and remove on notifier_list_notify()
in migrate_fd_error() (these can be two more patches).  What do you
think?
Juan Quintela Jan. 3, 2018, 10:21 a.m. UTC | #3
Peter Xu <peterx@redhat.com> wrote:
> On Wed, Jan 03, 2018 at 10:15:41AM +0100, Juan Quintela wrote:
>> Peter Xu <peterx@redhat.com> wrote:
>> > Moving existing callers all into migrate_fd_cleanup().  It simplifies
>> > migration_thread() a bit.
>> >
>> > Signed-off-by: Peter Xu <peterx@redhat.com>
>> 
>> Reviewed-by: Juan Quintela <quintela@redhat.com>
>
> Thanks.
>
>> 
>> I am trying to see if we can call migrate_fd_cleanup() twice.  As far as
>> I can see, we are not doing it.  But, and it is a big but, we are not
>> checking that we are not calling qemu_savevm_state_cleanup() twice.  If
>> that happens, we can get double frees and similar.
>> 
>> I put the reviewed-by anyways, because I *think* that we are doing it
>> right now, and otherwise, we should make sure that we are not calling it
>> twice, not papering over it.
>> 
>> Once here, I have notice that we call block_cleanup_parameters() in
>> *three* places.  We call notifier_list_notify() on two of this places (I
>> can't see any good reason *why* we don't call the notifier for
>> migrate_fd_cancel).
>
> Indeed.
>
> IMHO we can remove two calls of block_cleanup_parameters(), only keep
> the one in migrate_fd_cleanup(), and remove on notifier_list_notify()
> in migrate_fd_error() (these can be two more patches).  What do you
> think?

I think we need to make sure that we have a function that we always
call at the end.  I think that we have that on migration_fd_cleanup(),
so put everything there should be ok, no?

Later, Juan.
Peter Xu Jan. 3, 2018, 10:26 a.m. UTC | #4
On Wed, Jan 03, 2018 at 11:21:31AM +0100, Juan Quintela wrote:
> Peter Xu <peterx@redhat.com> wrote:
> > On Wed, Jan 03, 2018 at 10:15:41AM +0100, Juan Quintela wrote:
> >> Peter Xu <peterx@redhat.com> wrote:
> >> > Moving existing callers all into migrate_fd_cleanup().  It simplifies
> >> > migration_thread() a bit.
> >> >
> >> > Signed-off-by: Peter Xu <peterx@redhat.com>
> >> 
> >> Reviewed-by: Juan Quintela <quintela@redhat.com>
> >
> > Thanks.
> >
> >> 
> >> I am trying to see if we can call migrate_fd_cleanup() twice.  As far as
> >> I can see, we are not doing it.  But, and it is a big but, we are not
> >> checking that we are not calling qemu_savevm_state_cleanup() twice.  If
> >> that happens, we can get double frees and similar.
> >> 
> >> I put the reviewed-by anyways, because I *think* that we are doing it
> >> right now, and otherwise, we should make sure that we are not calling it
> >> twice, not papering over it.
> >> 
> >> Once here, I have notice that we call block_cleanup_parameters() in
> >> *three* places.  We call notifier_list_notify() on two of this places (I
> >> can't see any good reason *why* we don't call the notifier for
> >> migrate_fd_cancel).
> >
> > Indeed.
> >
> > IMHO we can remove two calls of block_cleanup_parameters(), only keep
> > the one in migrate_fd_cleanup(), and remove on notifier_list_notify()
> > in migrate_fd_error() (these can be two more patches).  What do you
> > think?
> 
> I think we need to make sure that we have a function that we always
> call at the end.  I think that we have that on migration_fd_cleanup(),
> so put everything there should be ok, no?

IMHO that's exactly what I mean, no? :)

For notifier_list_notify(), it's different - I just remove the extra
one in migrate_fd_error() because it'll be called in
migrate_fd_cleanup() as well, which is a duplicate.
Juan Quintela Jan. 3, 2018, 11:18 a.m. UTC | #5
Peter Xu <peterx@redhat.com> wrote:
> On Wed, Jan 03, 2018 at 11:21:31AM +0100, Juan Quintela wrote:
>> Peter Xu <peterx@redhat.com> wrote:
>> > On Wed, Jan 03, 2018 at 10:15:41AM +0100, Juan Quintela wrote:
>> >> Peter Xu <peterx@redhat.com> wrote:
>> >> > Moving existing callers all into migrate_fd_cleanup().  It simplifies
>> >> > migration_thread() a bit.
>> >> >
>> >> > Signed-off-by: Peter Xu <peterx@redhat.com>
>> >> 
>> >> Reviewed-by: Juan Quintela <quintela@redhat.com>
>> >
>> > Thanks.
>> >
>> >> 
>> >> I am trying to see if we can call migrate_fd_cleanup() twice.  As far as
>> >> I can see, we are not doing it.  But, and it is a big but, we are not
>> >> checking that we are not calling qemu_savevm_state_cleanup() twice.  If
>> >> that happens, we can get double frees and similar.
>> >> 
>> >> I put the reviewed-by anyways, because I *think* that we are doing it
>> >> right now, and otherwise, we should make sure that we are not calling it
>> >> twice, not papering over it.
>> >> 
>> >> Once here, I have notice that we call block_cleanup_parameters() in
>> >> *three* places.  We call notifier_list_notify() on two of this places (I
>> >> can't see any good reason *why* we don't call the notifier for
>> >> migrate_fd_cancel).
>> >
>> > Indeed.
>> >
>> > IMHO we can remove two calls of block_cleanup_parameters(), only keep
>> > the one in migrate_fd_cleanup(), and remove on notifier_list_notify()
>> > in migrate_fd_error() (these can be two more patches).  What do you
>> > think?
>> 
>> I think we need to make sure that we have a function that we always
>> call at the end.  I think that we have that on migration_fd_cleanup(),
>> so put everything there should be ok, no?
>
> IMHO that's exactly what I mean, no? :)
>
> For notifier_list_notify(), it's different - I just remove the extra
> one in migrate_fd_error() because it'll be called in
> migrate_fd_cleanup() as well, which is a duplicate.

then what call the one when we do a cancel?  the one in cleanup also?

Thanks, Juan.
Peter Xu Jan. 3, 2018, 11:39 a.m. UTC | #6
On Wed, Jan 03, 2018 at 12:18:54PM +0100, Juan Quintela wrote:
> Peter Xu <peterx@redhat.com> wrote:
> > On Wed, Jan 03, 2018 at 11:21:31AM +0100, Juan Quintela wrote:
> >> Peter Xu <peterx@redhat.com> wrote:
> >> > On Wed, Jan 03, 2018 at 10:15:41AM +0100, Juan Quintela wrote:
> >> >> Peter Xu <peterx@redhat.com> wrote:
> >> >> > Moving existing callers all into migrate_fd_cleanup().  It simplifies
> >> >> > migration_thread() a bit.
> >> >> >
> >> >> > Signed-off-by: Peter Xu <peterx@redhat.com>
> >> >> 
> >> >> Reviewed-by: Juan Quintela <quintela@redhat.com>
> >> >
> >> > Thanks.
> >> >
> >> >> 
> >> >> I am trying to see if we can call migrate_fd_cleanup() twice.  As far as
> >> >> I can see, we are not doing it.  But, and it is a big but, we are not
> >> >> checking that we are not calling qemu_savevm_state_cleanup() twice.  If
> >> >> that happens, we can get double frees and similar.
> >> >> 
> >> >> I put the reviewed-by anyways, because I *think* that we are doing it
> >> >> right now, and otherwise, we should make sure that we are not calling it
> >> >> twice, not papering over it.
> >> >> 
> >> >> Once here, I have notice that we call block_cleanup_parameters() in
> >> >> *three* places.  We call notifier_list_notify() on two of this places (I
> >> >> can't see any good reason *why* we don't call the notifier for
> >> >> migrate_fd_cancel).
> >> >
> >> > Indeed.
> >> >
> >> > IMHO we can remove two calls of block_cleanup_parameters(), only keep
> >> > the one in migrate_fd_cleanup(), and remove on notifier_list_notify()
> >> > in migrate_fd_error() (these can be two more patches).  What do you
> >> > think?
> >> 
> >> I think we need to make sure that we have a function that we always
> >> call at the end.  I think that we have that on migration_fd_cleanup(),
> >> so put everything there should be ok, no?
> >
> > IMHO that's exactly what I mean, no? :)
> >
> > For notifier_list_notify(), it's different - I just remove the extra
> > one in migrate_fd_error() because it'll be called in
> > migrate_fd_cleanup() as well, which is a duplicate.
> 
> then what call the one when we do a cancel?  the one in cleanup also?

Yes, IIUC migrate_fd_cancel() tells the thread to cancel, then the
migrate_fd_cleanup() is called there (finally in the bottom half of
main loop, of course).
diff mbox

Patch

diff --git a/migration/migration.c b/migration/migration.c
index 0ee4b4c27c..edbda43246 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -1077,6 +1077,8 @@  static void migrate_fd_cleanup(void *opaque)
     qemu_bh_delete(s->cleanup_bh);
     s->cleanup_bh = NULL;
 
+    qemu_savevm_state_cleanup();
+
     if (s->to_dst_file) {
         Error *local_err = NULL;
 
@@ -2290,13 +2292,6 @@  static void *migration_thread(void *opaque)
     end_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
 
     qemu_mutex_lock_iothread();
-    /*
-     * The resource has been allocated by migration will be reused in COLO
-     * process, so don't release them.
-     */
-    if (!enable_colo) {
-        qemu_savevm_state_cleanup();
-    }
     if (s->state == MIGRATION_STATUS_COMPLETED) {
         uint64_t transferred_bytes = qemu_ftell(s->to_dst_file);
         s->total_time = end_time - s->total_time;
@@ -2312,7 +2307,6 @@  static void *migration_thread(void *opaque)
         if (s->state == MIGRATION_STATUS_ACTIVE) {
             assert(enable_colo);
             migrate_start_colo_process(s);
-            qemu_savevm_state_cleanup();
             /*
             * Fixme: we will run VM in COLO no matter its old running state.
             * After exited COLO, we will keep running.