Skip to contentSkip to conversation

Reorganize and fix monitor resume after migration

PATCH Applied Jan Kiszka 3 participants 3 messages Aug 5, 2011

lore
Share & tools
lore

Jan Kiszka

author
#0 lore raw

PATCH 1/1 Reorganize and fix monitor resume after migration

From: Jan Kiszka <[email protected]>

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).

---
 migration.c |   19 +++++++++----------
 1 files changed, 9 insertions(+), 10 deletions(-)
migration.c +9 -10
index 2a15b98..756fa62 100644
@@ -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);
 }
Signature · 1 line
1.7.3.4
Tested-by on v1 1/1
#1 lore raw

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Quoted 7 lines · Jan Kiszka

From: Jan Kiszka <[email protected]>

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.

Quoted 6 lines

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).

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-----

#2 lore raw
In reply to Jan Kiszka
Quoted 7 lines · Jan Kiszka

From: Jan Kiszka<[email protected]>

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.

Quoted 6 lines

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).

Applied. Thanks.

Regards,

Anthony Liguori

Quoted 53 lines
---
  migration.c |   19 +++++++++----------
  1 files changed, 9 insertions(+), 10 deletions(-)
migration.c +9 -10
index 2a15b98..756fa62 100644
@@ -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);
  }