qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Fabiano Rosas <farosas@suse.de>
To: qemu-devel@nongnu.org
Cc: Juan Quintela <quintela@redhat.com>, Peter Xu <peterx@redhat.com>,
	Leonardo Bras <leobras@redhat.com>
Subject: [PATCH v6 03/10] migration: Fix possible race when shutting down to_dst_file
Date: Mon, 11 Sep 2023 14:13:13 -0300	[thread overview]
Message-ID: <20230911171320.24372-4-farosas@suse.de> (raw)
In-Reply-To: <20230911171320.24372-1-farosas@suse.de>

It's not safe to call qemu_file_shutdown() on the to_dst_file without
first checking for the file's presence under the lock. The cleanup of
this file happens at postcopy_pause() and migrate_fd_cleanup() which
are not necessarily running in the same thread as migrate_fd_cancel().

Reviewed-by: Peter Xu <peterx@redhat.com>
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
 migration/migration.c | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/migration/migration.c b/migration/migration.c
index 85c171f32c..5e6a766235 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -1245,7 +1245,7 @@ static void migrate_fd_error(MigrationState *s, const Error *error)
 static void migrate_fd_cancel(MigrationState *s)
 {
     int old_state ;
-    QEMUFile *f = migrate_get_current()->to_dst_file;
+
     trace_migrate_fd_cancel();
 
     WITH_QEMU_LOCK_GUARD(&s->qemu_file_lock) {
@@ -1271,11 +1271,13 @@ static void migrate_fd_cancel(MigrationState *s)
      * If we're unlucky the migration code might be stuck somewhere in a
      * send/write while the network has failed and is waiting to timeout;
      * if we've got shutdown(2) available then we can force it to quit.
-     * The outgoing qemu file gets closed in migrate_fd_cleanup that is
-     * called in a bh, so there is no race against this cancel.
      */
-    if (s->state == MIGRATION_STATUS_CANCELLING && f) {
-        qemu_file_shutdown(f);
+    if (s->state == MIGRATION_STATUS_CANCELLING) {
+        WITH_QEMU_LOCK_GUARD(&s->qemu_file_lock) {
+            if (s->to_dst_file) {
+                qemu_file_shutdown(s->to_dst_file);
+            }
+        }
     }
     if (s->state == MIGRATION_STATUS_CANCELLING && s->block_inactive) {
         Error *local_err = NULL;
@@ -1519,12 +1521,14 @@ void qmp_migrate_pause(Error **errp)
 {
     MigrationState *ms = migrate_get_current();
     MigrationIncomingState *mis = migration_incoming_get_current();
-    int ret;
+    int ret = 0;
 
     if (ms->state == MIGRATION_STATUS_POSTCOPY_ACTIVE) {
         /* Source side, during postcopy */
         qemu_mutex_lock(&ms->qemu_file_lock);
-        ret = qemu_file_shutdown(ms->to_dst_file);
+        if (ms->to_dst_file) {
+            ret = qemu_file_shutdown(ms->to_dst_file);
+        }
         qemu_mutex_unlock(&ms->qemu_file_lock);
         if (ret) {
             error_setg(errp, "Failed to pause source migration");
-- 
2.35.3



  parent reply	other threads:[~2023-09-11 17:15 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-09-11 17:13 [PATCH v6 00/10] Fix segfault on migration return path Fabiano Rosas
2023-09-11 17:13 ` [PATCH v6 01/10] migration: Fix possible race when setting rp_state.error Fabiano Rosas
2023-09-11 17:13 ` [PATCH v6 02/10] migration: Fix possible races when shutting down the return path Fabiano Rosas
2023-09-11 17:13 ` Fabiano Rosas [this message]
2023-09-11 17:13 ` [PATCH v6 04/10] migration: Remove redundant cleanup of postcopy_qemufile_src Fabiano Rosas
2023-09-11 17:13 ` [PATCH v6 05/10] migration: Consolidate return path closing code Fabiano Rosas
2023-09-11 17:13 ` [PATCH v6 06/10] migration: Replace the return path retry logic Fabiano Rosas
2023-09-11 17:13 ` [PATCH v6 07/10] migration: Move return path cleanup to main migration thread Fabiano Rosas
2023-09-11 17:13 ` [PATCH v6 08/10] migration/yank: Use channel features Fabiano Rosas
2023-09-11 20:46   ` Philippe Mathieu-Daudé
2023-09-13 20:05   ` Peter Xu
2024-01-22 20:08     ` Fabiano Rosas
2024-01-23  1:27       ` Peter Xu
2023-09-11 17:13 ` [PATCH v6 09/10] migration/yank: Keep track of registered yank instances Fabiano Rosas
2023-09-13 20:13   ` Peter Xu
2023-09-13 21:53     ` Fabiano Rosas
2023-09-13 23:48       ` Peter Xu
2023-09-14 13:23         ` Fabiano Rosas
2023-09-14 14:57           ` Peter Xu
2023-09-25  7:38             ` Lukas Straub
2023-09-25 12:20               ` Fabiano Rosas
2023-09-25 15:32                 ` Lukas Straub
2023-09-11 17:13 ` [PATCH v6 10/10] migration: Add a wrapper to cleanup migration files Fabiano Rosas

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=20230911171320.24372-4-farosas@suse.de \
    --to=farosas@suse.de \
    --cc=leobras@redhat.com \
    --cc=peterx@redhat.com \
    --cc=qemu-devel@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).