diff mbox

Reorganize and fix monitor resume after migration

Message ID 4E3B979E.8030402@web.de
State New
Headers show

Commit Message

Jan Kiszka Aug. 5, 2011, 7:11 a.m. UTC
From: Jan Kiszka <jan.kiszka@siemens.com>

If migration failed in migrate_fd_put_buffer, the monitor may have been
resumed not only in the error path of that function but also once again
in migrate_fd_put_ready which is called unconditionally by
migrate_fd_connect.

Fix this by establishing a cleaner policy: the monitor shall be resumed
when the migration file is closed, either via callback
(migrate_fd_close) or in migrate_fd_cleanup if no file is open (i.e. no
callback invoked).

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 migration.c |   19 +++++++++----------
 1 files changed, 9 insertions(+), 10 deletions(-)

Comments

Michael Tokarev Aug. 5, 2011, 7:28 a.m. UTC | #1
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

05.08.2011 11:11, Jan Kiszka wrote:
> From: Jan Kiszka <jan.kiszka@siemens.com>
> 
> If migration failed in migrate_fd_put_buffer, the monitor may have been
> resumed not only in the error path of that function but also once again
> in migrate_fd_put_ready which is called unconditionally by
> migrate_fd_connect.
> 
> Fix this by establishing a cleaner policy: the monitor shall be resumed
> when the migration file is closed, either via callback
> (migrate_fd_close) or in migrate_fd_cleanup if no file is open (i.e. no
> callback invoked).
> 
> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>

Reported-By: Michael Tokarev <mjt@tls.msk.ru>
Tested-By: Michael Tokarev <mjt@tls.msk.ru>

This is a good candidate for 0.12, 0.14 and 0.15... ;)

Thank you !

/mjt
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)

iJwEAQECAAYFAk47m5UACgkQUlPFrXTwyDgUKAP/ZsVlWiCKmcMhRSItuR6rIT/K
k/JY4FwARVpBdv6zVFPsLX4UgsPbC6QfUsYjgZtWhSaiboyi7rRAj75OEipYjBqu
IWgBXmXwt6ATxsxC7ffrUtO15QXABmaQyYjBGI+EzJZdKPuzjEfm5wFgHr0+epDn
4svPOur4pC6ttDT3Ldc=
=sHNU
-----END PGP SIGNATURE-----
Anthony Liguori Aug. 5, 2011, 4:58 p.m. UTC | #2
On 08/05/2011 02:11 AM, Jan Kiszka wrote:
> From: Jan Kiszka<jan.kiszka@siemens.com>
>
> If migration failed in migrate_fd_put_buffer, the monitor may have been
> resumed not only in the error path of that function but also once again
> in migrate_fd_put_ready which is called unconditionally by
> migrate_fd_connect.
>
> Fix this by establishing a cleaner policy: the monitor shall be resumed
> when the migration file is closed, either via callback
> (migrate_fd_close) or in migrate_fd_cleanup if no file is open (i.e. no
> callback invoked).
>
> Signed-off-by: Jan Kiszka<jan.kiszka@siemens.com>

Applied.  Thanks.

Regards,

Anthony Liguori

> ---
>   migration.c |   19 +++++++++----------
>   1 files changed, 9 insertions(+), 10 deletions(-)
>
> diff --git a/migration.c b/migration.c
> index 2a15b98..756fa62 100644
> --- a/migration.c
> +++ b/migration.c
> @@ -292,18 +292,17 @@ int migrate_fd_cleanup(FdMigrationState *s)
>               ret = -1;
>           }
>           s->file = NULL;
> +    } else {
> +        if (s->mon) {
> +            monitor_resume(s->mon);
> +        }
>       }
>
> -    if (s->fd != -1)
> +    if (s->fd != -1) {
>           close(s->fd);
> -
> -    /* Don't resume monitor until we've flushed all of the buffers */
> -    if (s->mon) {
> -        monitor_resume(s->mon);
> +        s->fd = -1;
>       }
>
> -    s->fd = -1;
> -
>       return ret;
>   }
>
> @@ -330,9 +329,6 @@ ssize_t migrate_fd_put_buffer(void *opaque, const void *data, size_t size)
>       if (ret == -EAGAIN) {
>           qemu_set_fd_handler2(s->fd, NULL, NULL, migrate_fd_put_notify, s);
>       } else if (ret<  0) {
> -        if (s->mon) {
> -            monitor_resume(s->mon);
> -        }
>           s->state = MIG_STATE_ERROR;
>           notifier_list_notify(&migration_state_notifiers, NULL);
>       }
> @@ -458,6 +454,9 @@ int migrate_fd_close(void *opaque)
>   {
>       FdMigrationState *s = opaque;
>
> +    if (s->mon) {
> +        monitor_resume(s->mon);
> +    }
>       qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL);
>       return s->close(s);
>   }
diff mbox

Patch

diff --git a/migration.c b/migration.c
index 2a15b98..756fa62 100644
--- a/migration.c
+++ b/migration.c
@@ -292,18 +292,17 @@  int migrate_fd_cleanup(FdMigrationState *s)
             ret = -1;
         }
         s->file = NULL;
+    } else {
+        if (s->mon) {
+            monitor_resume(s->mon);
+        }
     }
 
-    if (s->fd != -1)
+    if (s->fd != -1) {
         close(s->fd);
-
-    /* Don't resume monitor until we've flushed all of the buffers */
-    if (s->mon) {
-        monitor_resume(s->mon);
+        s->fd = -1;
     }
 
-    s->fd = -1;
-
     return ret;
 }
 
@@ -330,9 +329,6 @@  ssize_t migrate_fd_put_buffer(void *opaque, const void *data, size_t size)
     if (ret == -EAGAIN) {
         qemu_set_fd_handler2(s->fd, NULL, NULL, migrate_fd_put_notify, s);
     } else if (ret < 0) {
-        if (s->mon) {
-            monitor_resume(s->mon);
-        }
         s->state = MIG_STATE_ERROR;
         notifier_list_notify(&migration_state_notifiers, NULL);
     }
@@ -458,6 +454,9 @@  int migrate_fd_close(void *opaque)
 {
     FdMigrationState *s = opaque;
 
+    if (s->mon) {
+        monitor_resume(s->mon);
+    }
     qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL);
     return s->close(s);
 }