From: Stefan Hajnoczi <stefanha@gmail.com>
To: Jagane Sundar <jagane@sundar.org>
Cc: "kwolf@redhat.com" <kwolf@redhat.com>,
"dlaor@redhat.com" <dlaor@redhat.com>,
"Jes.Sorensen@redhat.com" <Jes.Sorensen@redhat.com>,
Marcelo Tosatti <mtosatti@redhat.com>,
"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>,
"avi@redhat.com" <avi@redhat.com>,
"jdenemar@redhat.com" <jdenemar@redhat.com>
Subject: Re: [Qemu-devel] [patch 6/7] QEMU live block copy
Date: Wed, 8 Jun 2011 17:18:16 +0100 [thread overview]
Message-ID: <BANLkTi=2s11YY5o0LaBwhVZC7UNERYw4Qg@mail.gmail.com> (raw)
In-Reply-To: <4DEF90E2.5080202@sundar.org>
On Wed, Jun 8, 2011 at 4:10 PM, Jagane Sundar <jagane@sundar.org> wrote:
> On 6/7/2011 5:15 AM, Stefan Hajnoczi wrote:
>>
>> On Mon, Jun 6, 2011 at 5:55 PM, Marcelo Tosatti<mtosatti@redhat.com>
>> wrote:
>>
>> I haven't reviewed this whole patch yet, but comments below.
>>
>> This patch, like image streaming, may hit deadlocks due to synchronous
>> I/O emulation. I discovered this problem when working on image
>> streaming and it should be solved by getting rid of the asynchronous
>> context concept. The problem is that async I/O emulation will push a
>> new context, preventing existing requests to complete until the
>> current context is popped again. If the image format has dependencies
>> between requests (e.g. QED allocating writes are serialized), then
>> this leads to deadlock because the new request cannot complete until
>> the old one does, but the old one needs to wait for the context to be
>> popped. I think you are not affected by the QED allocating write case
>> since the source image is only read, not written, by live block copy.
>> But you might encounter this problem in other places.
>>
> Hello Stefan,
>
> Can you expand on this some more? I have similar concerns for Livebackup.
>
> At the beginning of your paragraph, did you mean 'asynchronous I/O
> emulation' instead of 'synchronous I/O emulation'?
>
> Also, I don't understand the 'stack' construct that you refer to. When you
> say 'push a new context', are you talking about what happens when a new
> thread picks up a new async I/O req from the VM, and then proceeds to
> execute the I/O req? What is this stack that you refer to?
>
> Any design documents, code snippets that I can look, other pointers welcome.
See async.c.
There is synchronous I/O emulation in block.c for BlockDrivers that
don't support .bdrv_read()/.bdrv_write() but only
.bdrv_aio_readv()/.bdrv_aio_writev(). The way it works is that it
pushes a new I/O context and then issues async I/O. Then it runs a
special event loop waiting for that I/O to complete. After the I/O
completes it pops the context again.
The point of the context is that completions only get called for the
current context. Therefore callers of the synchronous I/O functions
don't need to worry that the state of the world might change during
their "synchronous" operation - only their own I/O operation can
complete. If a pending async I/O completes during synchronous I/O
emulation, its callback is not invoked until the bottom half (BH) is
called after the async context is popped. This guarantees that the
synchronous operation and its caller have completed before I/O
completion callbacks are invoked for pending async I/O.
The problem is that QED allocating writes are serialized and cannot
make progress if a pending request is unable to complete. Preventing
the pending request from completing deadlocks QEMU. The same thing
could happen in other places.
I'm bringing this up in case anyone hits such a deadlock. I think we
can solve this in the future by eliminating the async context concept.
Kevin and I have discussed how that can be done but it's not possible
or trivial to do yet.
Stefan
next prev parent reply other threads:[~2011-06-08 16:18 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-06-06 16:55 [Qemu-devel] [patch 0/7] live block copy (v4) Marcelo Tosatti
2011-06-06 16:55 ` [Qemu-devel] [patch 1/7] add migration_active function Marcelo Tosatti
2011-06-06 16:55 ` [Qemu-devel] [patch 2/7] Add blkmirror block driver Marcelo Tosatti
2011-06-06 21:52 ` malc
2011-06-07 10:25 ` Stefan Hajnoczi
2011-06-06 16:55 ` [Qemu-devel] [patch 3/7] Add error messages for live block copy Marcelo Tosatti
2011-06-06 16:55 ` [Qemu-devel] [patch 4/7] Add blkdebug points " Marcelo Tosatti
2011-06-06 16:55 ` [Qemu-devel] [patch 5/7] Add vmstop code " Marcelo Tosatti
2011-06-06 16:55 ` [Qemu-devel] [patch 6/7] QEMU " Marcelo Tosatti
2011-06-06 17:03 ` [Qemu-devel] [patch 6/7] QEMU live block copy (update) Marcelo Tosatti
2011-06-07 10:15 ` Jiri Denemark
2011-06-15 15:49 ` Marcelo Tosatti
2011-06-15 15:51 ` Marcelo Tosatti
2011-06-07 12:15 ` [Qemu-devel] [patch 6/7] QEMU live block copy Stefan Hajnoczi
2011-06-08 15:10 ` Jagane Sundar
2011-06-08 16:18 ` Stefan Hajnoczi [this message]
2011-06-09 15:42 ` Jagane Sundar
2011-06-15 16:59 ` Marcelo Tosatti
2011-06-06 16:55 ` [Qemu-devel] [patch 7/7] do not allow migration if block copy in progress Marcelo Tosatti
-- strict thread matches above, loose matches on Subject: below --
2011-05-23 21:31 [Qemu-devel] [patch 0/7] live block copy (v3) Marcelo Tosatti
2011-05-23 21:31 ` [Qemu-devel] [patch 6/7] QEMU live block copy Marcelo Tosatti
2011-05-24 19:15 ` Blue Swirl
2011-06-03 15:59 ` Marcelo Tosatti
2011-05-29 8:54 ` Avi Kivity
2011-05-31 16:06 ` Marcelo Tosatti
2011-05-31 16:14 ` Avi Kivity
2011-05-31 16:38 ` Marcelo Tosatti
2011-05-31 16:53 ` Avi Kivity
2011-06-03 16:20 ` Marcelo Tosatti
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='BANLkTi=2s11YY5o0LaBwhVZC7UNERYw4Qg@mail.gmail.com' \
--to=stefanha@gmail.com \
--cc=Jes.Sorensen@redhat.com \
--cc=avi@redhat.com \
--cc=dlaor@redhat.com \
--cc=jagane@sundar.org \
--cc=jdenemar@redhat.com \
--cc=kwolf@redhat.com \
--cc=mtosatti@redhat.com \
--cc=qemu-devel@nongnu.org \
/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).