All of lore.kernel.org
 help / color / mirror / Atom feed
From: Fabiano Rosas <farosas@suse.de>
To: Peter Xu <peterx@redhat.com>
Cc: qemu-devel@nongnu.org, Juan Quintela <quintela@redhat.com>,
	Wei Wang <wei.w.wang@intel.com>,
	Leonardo Bras <leobras@redhat.com>,
	Lukas Straub <lukasstraub2@web.de>
Subject: Re: [PATCH v3 10/10] migration: Add a wrapper to cleanup migration files
Date: Wed, 16 Aug 2023 11:57:17 -0300	[thread overview]
Message-ID: <87r0o3kpbm.fsf@suse.de> (raw)
In-Reply-To: <ZNzcek7oqn+ccoQ+@x1n>

Peter Xu <peterx@redhat.com> writes:

> On Tue, Aug 15, 2023 at 07:31:28PM -0300, Fabiano Rosas wrote:
>> Peter Xu <peterx@redhat.com> writes:
>> 
>> > On Fri, Aug 11, 2023 at 12:08:36PM -0300, Fabiano Rosas wrote:
>> >> We currently have a pattern for cleaning up a migration QEMUFile:
>> >> 
>> >>   qemu_mutex_lock(&s->qemu_file_lock);
>> >>   file = s->file_name;
>> >>   s->file_name = NULL;
>> >>   qemu_mutex_unlock(&s->qemu_file_lock);
>> >> 
>> >>   migration_ioc_unregister_yank_from_file(file);
>> >>   qemu_file_shutdown(file);
>> >>   qemu_fclose(file);
>> >> 
>> >> There are some considerations for this sequence:
>> >> 
>> >> - we must clear the pointer under the lock, to avoid TOC/TOU bugs;
>> >> - the shutdown() and close() expect be given a non-null parameter;
>> >> - a close() in one thread should not race with a shutdown() in another;
>> >> 
>> >> Create a wrapper function to make sure everything works correctly.
>> >> 
>> >> Note: the return path did not used to call
>> >>       migration_ioc_unregister_yank_from_file(), but I added it
>> >>       nonetheless for uniformity.
>> >> 
>> >> Signed-off-by: Fabiano Rosas <farosas@suse.de>
>> >
>> > This definitely looks cleaner.  Probably can be squashed together with
>> > previous patch?  If you could double check whether we can just drop the
>> > shutdown() all over the places when close() altogether, it'll be even
>> > nicer (I hope I didn't miss any real reasons to explicitly do that).
>> >
>> >> diff --git a/util/yank.c b/util/yank.c
>> >> index abf47c346d..4b6afbf589 100644
>> >> --- a/util/yank.c
>> >> +++ b/util/yank.c
>> >> @@ -146,8 +146,6 @@ void yank_unregister_function(const YankInstance *instance,
>> >>              return;
>> >>          }
>> >>      }
>> >> -
>> >> -    abort();
>> >
>> > I think we can't silently do this.  This check is very strict and I guess
>> > you removed it because you hit a crash.  What's the crash?  Can we just
>> > pair the yank reg/unreg?
>> >
>> 
>> Well, the abort() is the crash. It just means that we looped and didn't
>> find the handler to unregister. It looks harmless to me. I should have
>> mentioned this in the commit message.
>
> Yeah, trust me I wanted to remove that for quite a few times. :) But then I
> normally decided to try harder to find what's missing; and so far indeed I
> found that the cleanest way is always pair the reg/unreg.
>
>> 
>> I could certainly add a yank handler to the rp_state.from_dst_file. But
>> then I have no idea what will happen if we try to yank the return path
>> at a random moment.
>
> I think the idea was it should be registered always when the channel is
> created, and then unregistered when the channel is destroyed.  They should
> just pair, alongside with the channel's lifecycle?
>
>> 
>> Side note: I see that yank does a qio_channel_shutdown() without the
>> controversial setting of -EIO. Which means it is probably succeptible to
>> the same race described in the qemu_file_shutdown() code.
>
> Are you looking outside migration code (I saw nbd_teardown_connection()
> does have one)?
>
> For migration IIUC it's always via migration_ioc_unregister_yank().

I'm talking about the actual yank action, not the unregister.

migration_yank_iochannel() calls qio_channel_shutdown() in the same way
as qemu_file_shutdown(), but unlike the latter, it doesn't set
f->last_error = -EIO. Which means that in theory, we could yank and
still try to use the QEMUFile.

In other words, what commit a555b8092a ("qemu-file: Don't do IO after
shutdown") did does not apply to yank because yank didn't exit at the
time.


  reply	other threads:[~2023-08-16 15:01 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-11 15:08 [PATCH v3 00/10] Fix segfault on migration return path Fabiano Rosas
2023-08-11 15:08 ` [PATCH v3 01/10] migration: Fix possible race when setting rp_state.error Fabiano Rosas
2023-08-15 21:49   ` Peter Xu
2023-08-11 15:08 ` [PATCH v3 02/10] migration: Fix possible race when shutting return path Fabiano Rosas
2023-08-11 15:08 ` [PATCH v3 03/10] migration: Fix possible race when checking to_dst_file for errors Fabiano Rosas
2023-08-15 21:49   ` Peter Xu
2023-08-11 15:08 ` [PATCH v3 04/10] migration: Fix possible race when shutting down to_dst_file Fabiano Rosas
2023-08-15 21:51   ` Peter Xu
2023-08-11 15:08 ` [PATCH v3 05/10] migration: Remove redundant cleanup of postcopy_qemufile_src Fabiano Rosas
2023-08-15 21:56   ` Peter Xu
2023-08-11 15:08 ` [PATCH v3 06/10] migration: Consolidate return path closing code Fabiano Rosas
2023-08-15 21:57   ` Peter Xu
2023-08-11 15:08 ` [PATCH v3 07/10] migration: Replace the return path retry logic Fabiano Rosas
2023-08-15 21:58   ` Peter Xu
2023-08-11 15:08 ` [PATCH v3 08/10] migration: Move return path cleanup to main migration thread Fabiano Rosas
2023-08-15 22:02   ` Peter Xu
2023-08-11 15:08 ` [PATCH v3 09/10] migration: Be consistent about shutdown of source shared files Fabiano Rosas
2023-08-15 22:08   ` Peter Xu
2023-08-15 22:19     ` Fabiano Rosas
2023-08-15 22:34       ` Peter Xu
2023-08-11 15:08 ` [PATCH v3 10/10] migration: Add a wrapper to cleanup migration files Fabiano Rosas
2023-08-15 22:15   ` Peter Xu
2023-08-15 22:31     ` Fabiano Rosas
2023-08-16 14:26       ` Peter Xu
2023-08-16 14:57         ` Fabiano Rosas [this message]
2023-08-16 15:26           ` Peter Xu

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=87r0o3kpbm.fsf@suse.de \
    --to=farosas@suse.de \
    --cc=leobras@redhat.com \
    --cc=lukasstraub2@web.de \
    --cc=peterx@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --cc=wei.w.wang@intel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.