qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: qemu-devel@nongnu.org, stefanha@linux.vnet.ibm.com
Subject: Re: [Qemu-devel] [PATCH 4/8] block: add a Rwlock to synchronous read/write drivers
Date: Thu, 20 Oct 2011 11:47:48 +0200	[thread overview]
Message-ID: <4E9FEE44.7050905@redhat.com> (raw)
In-Reply-To: <1319036398-14320-5-git-send-email-pbonzini@redhat.com>

Am 19.10.2011 16:59, schrieb Paolo Bonzini:
> The big conversion of bdrv_read/write to coroutines caused the two
> homonymous callbacks in BlockDriver to become reentrant.  It goes
> like this:
> 
> 1) bdrv_read is now called in a coroutine, and calls bdrv_read or
> bdrv_pread.
> 
> 2) the nested bdrv_read goes through the fast path in bdrv_rw_co_entry;
> 
> 3) in the common case when the protocol is file, bdrv_co_do_readv calls
> bdrv_co_readv_em (and from here goes to bdrv_co_io_em), which yields
> until the AIO operation is complete;
> 
> 4) if bdrv_read had been called from a bottom half, the main loop
> is free to iterate again: a device model or another bottom half
> can then come and call bdrv_read again.
> 
> This applies to all four of read/write/flush/discard.  It would also
> apply to is_allocated, but it is not used from within coroutines:
> besides qemu-img.c and qemu-io.c, which operate synchronously, the
> only user is the monitor.  Copy-on-read will introduce a use in the
> block layer, and will require converting it.
> 
> The solution is "simply" to convert all drivers to coroutines!  We
> have nothing to do for the read-only drivers.  For the others, we
> add a Rwlock that is taken around affected operations.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

For the record, we just discussed this on IRC: We'll probably need a
mutex in some/most cases instead. Also, cloop and dmg need locking. That
leaves only bochs and parallels that should be okay without a lock.

We decided to play it the safe way and add locking in every driver and
make it a mutex everywhere.

Kevin

  reply	other threads:[~2011-10-20  9:44 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-10-19 14:59 [Qemu-devel] [PATCH 0/8] finish coroutinization of drivers Paolo Bonzini
2011-10-19 14:59 ` [Qemu-devel] [PATCH 1/8] vpc: detect floppy disk geometries Paolo Bonzini
2011-10-20  9:14   ` Kevin Wolf
2011-10-20 10:13     ` Paolo Bonzini
2011-10-19 14:59 ` [Qemu-devel] [PATCH 2/8] vmdk: fix return values of vmdk_parent_open Paolo Bonzini
2011-10-20  9:16   ` Kevin Wolf
2011-10-19 14:59 ` [Qemu-devel] [PATCH 3/8] vmdk: clean up open Paolo Bonzini
2011-10-20  9:28   ` Kevin Wolf
2011-10-20 10:12     ` Paolo Bonzini
2011-10-20 10:25       ` Kevin Wolf
2011-10-19 14:59 ` [Qemu-devel] [PATCH 4/8] block: add a Rwlock to synchronous read/write drivers Paolo Bonzini
2011-10-20  9:47   ` Kevin Wolf [this message]
2011-10-19 14:59 ` [Qemu-devel] [PATCH 5/8] block: take lock around bdrv_read implementations Paolo Bonzini
2011-10-19 14:59 ` [Qemu-devel] [PATCH 6/8] block: take lock around bdrv_write implementations Paolo Bonzini
2011-10-19 14:59 ` [Qemu-devel] [PATCH 7/8] block: change flush to co_flush Paolo Bonzini
2011-10-20 10:04   ` Kevin Wolf
2011-10-19 14:59 ` [Qemu-devel] [PATCH 8/8] block: change discard to co_discard Paolo Bonzini
2011-10-20 10:08   ` Kevin Wolf

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=4E9FEE44.7050905@redhat.com \
    --to=kwolf@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@linux.vnet.ibm.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).