From: Marcelo Tosatti <mtosatti@redhat.com>
To: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
Cc: Kevin Wolf <kwolf@redhat.com>,
Paolo Bonzini <pbonzini@redhat.com>,
qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH v4 7/8] block: core copy-on-read logic
Date: Fri, 2 Dec 2011 15:13:19 -0200 [thread overview]
Message-ID: <20111202171319.GA4839@amt.cnet> (raw)
In-Reply-To: <1322048878-26348-8-git-send-email-stefanha@linux.vnet.ibm.com>
On Wed, Nov 23, 2011 at 11:47:57AM +0000, Stefan Hajnoczi wrote:
> Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
> ---
> block.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> trace-events | 1 +
> 2 files changed, 73 insertions(+), 0 deletions(-)
>
> diff --git a/block.c b/block.c
> index c30c8f2..a598a19 100644
> --- a/block.c
> +++ b/block.c
> @@ -1469,6 +1469,61 @@ int bdrv_pwrite_sync(BlockDriverState *bs, int64_t offset,
> return 0;
> }
>
> +static int coroutine_fn bdrv_co_copy_on_readv(BlockDriverState *bs,
> + int64_t sector_num, int nb_sectors, QEMUIOVector *qiov)
> +{
> + /* Perform I/O through a temporary buffer so that users who scribble over
> + * their read buffer while the operation is in progress do not end up
> + * modifying the image file. This is critical for zero-copy guest I/O
> + * where anything might happen inside guest memory.
> + */
> + void *bounce_buffer;
> +
> + struct iovec iov;
> + QEMUIOVector bounce_qiov;
> + int64_t cluster_sector_num;
> + int cluster_nb_sectors;
> + size_t skip_bytes;
> + int ret;
> +
> + /* Cover entire cluster so no additional backing file I/O is required when
> + * allocating cluster in the image file.
> + */
> + round_to_clusters(bs, sector_num, nb_sectors,
> + &cluster_sector_num, &cluster_nb_sectors);
> +
> + trace_bdrv_co_copy_on_readv(bs, sector_num, nb_sectors,
> + cluster_sector_num, cluster_nb_sectors);
> +
> + iov.iov_len = cluster_nb_sectors * BDRV_SECTOR_SIZE;
> + iov.iov_base = bounce_buffer = qemu_blockalign(bs, iov.iov_len);
> + qemu_iovec_init_external(&bounce_qiov, &iov, 1);
> +
> + ret = bs->drv->bdrv_co_readv(bs, cluster_sector_num, cluster_nb_sectors,
> + &bounce_qiov);
> + if (ret < 0) {
> + goto err;
> + }
> +
> + ret = bs->drv->bdrv_co_writev(bs, cluster_sector_num, cluster_nb_sectors,
> + &bounce_qiov);
> + if (ret < 0) {
> + /* It might be okay to ignore write errors for guest requests. If this
> + * is a deliberate copy-on-read then we don't want to ignore the error.
> + * Simply report it in all cases.
> + */
> + goto err;
> + }
> +
> + skip_bytes = (sector_num - cluster_sector_num) * BDRV_SECTOR_SIZE;
> + qemu_iovec_from_buffer(qiov, bounce_buffer + skip_bytes,
> + nb_sectors * BDRV_SECTOR_SIZE);
> +
> +err:
> + qemu_vfree(bounce_buffer);
> + return ret;
> +}
> +
> /*
> * Handle a read request in coroutine context
> */
> @@ -1496,7 +1551,24 @@ static int coroutine_fn bdrv_co_do_readv(BlockDriverState *bs,
> }
>
> tracked_request_begin(&req, bs, sector_num, nb_sectors, false);
> +
> + if (bs->copy_on_read) {
> + int pnum;
> +
> + ret = bdrv_co_is_allocated(bs, sector_num, nb_sectors, &pnum);
> + if (ret < 0) {
> + goto out;
> + }
Stefan,
It is not clear where support for shared backing files would fit.
Let us consider the following block copy example:
1) Original chain:
[ BASE ] -> [ IMAGE-1 ] -> [ IMAGE-2 ] -> [ IMAGE-3 ]
2) Final chain:
[ BASE ] -> [ IMAGE-3 ]
I was talking to Kevin and we don't have code/monitor command to the
switch from 1) to 2). But that is a separate issue.
Question is, how do you plan to stream the contents of IMAGE-1 and
IMAGE-2 (but not BASE), into IMAGE-3 ? That is an important use case.
Also, do you have status on the external COW file work, for raw images?
Thanks
next prev parent reply other threads:[~2011-12-02 17:13 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-11-23 11:47 [Qemu-devel] [PATCH v4 0/8] block: generic copy-on-read Stefan Hajnoczi
2011-11-23 11:47 ` [Qemu-devel] [PATCH v4 1/8] qemu-common: add QEMU_ALIGN_DOWN() and QEMU_ALIGN_UP() macros Stefan Hajnoczi
2011-11-23 11:47 ` [Qemu-devel] [PATCH v4 2/8] coroutine: add qemu_co_queue_restart_all() Stefan Hajnoczi
2011-11-23 11:47 ` [Qemu-devel] [PATCH v4 3/8] block: add request tracking Stefan Hajnoczi
2011-12-05 12:17 ` Marcelo Tosatti
2011-12-05 12:20 ` Paolo Bonzini
2011-12-05 16:09 ` Marcelo Tosatti
2011-12-05 16:20 ` Stefan Hajnoczi
2011-12-05 16:31 ` Marcelo Tosatti
2011-11-23 11:47 ` [Qemu-devel] [PATCH v4 4/8] block: add bdrv_set_copy_on_read() Stefan Hajnoczi
2011-11-23 11:47 ` [Qemu-devel] [PATCH v4 5/8] block: wait for overlapping requests Stefan Hajnoczi
2011-11-23 11:47 ` [Qemu-devel] [PATCH v4 6/8] block: request overlap detection Stefan Hajnoczi
2011-11-23 11:47 ` [Qemu-devel] [PATCH v4 7/8] block: core copy-on-read logic Stefan Hajnoczi
2011-12-02 17:13 ` Marcelo Tosatti [this message]
2011-12-05 11:35 ` Stefan Hajnoczi
2011-11-23 11:47 ` [Qemu-devel] [PATCH v4 8/8] block: add -drive copy-on-read=on|off Stefan Hajnoczi
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=20111202171319.GA4839@amt.cnet \
--to=mtosatti@redhat.com \
--cc=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 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.