qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] Reorganize and fix monitor resume after migrati


From: Anthony Liguori
Subject: Re: [Qemu-devel] [PATCH] Reorganize and fix monitor resume after migration
Date: Fri, 05 Aug 2011 11:58:14 -0500
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.17) Gecko/20110516 Lightning/1.0b2 Thunderbird/3.1.10

On 08/05/2011 02:11 AM, Jan Kiszka wrote:
From: Jan Kiszka<address@hidden>

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<address@hidden>

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);
  }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]