From: Eric Blake <eblake@redhat.com>
To: John Snow <jsnow@redhat.com>,
qemu-devel@nongnu.org, qemu-block@nongnu.org
Cc: Max Reitz <mreitz@redhat.com>, Kevin Wolf <kwolf@redhat.com>,
Markus Armbruster <armbru@redhat.com>,
vsementsov@virtuozzo.com
Subject: Re: [Qemu-devel] [PATCH] blockdev: acquire aio_context for bitmap add/remove
Date: Tue, 12 Feb 2019 13:36:18 -0600 [thread overview]
Message-ID: <ddc2f850-e7b9-e8f8-4fc1-a3b62a5164e5@redhat.com> (raw)
In-Reply-To: <20190206170205.13061-1-jsnow@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 3295 bytes --]
On 2/6/19 11:02 AM, John Snow wrote:
> When bitmaps are persistent, they may incur a disk read or write when bitmaps
> are added or removed. For configurations like virtio-dataplane, failing to
> acquire this lock will abort QEMU when disk IO occurs.
>
> We used to acquire aio_context as part of the bitmap lookup, so re-introduce
> the lock for just the cases that have an IO penalty.
>
> Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1672010
> Reported-By: Aihua Liang <aliang@redhat.com>
> Signed-off-by: John Snow <jsnow@redhat.com>
> ---
> blockdev.c | 24 +++++++++++++++++++-----
> 1 file changed, 19 insertions(+), 5 deletions(-)
>
> diff --git a/blockdev.c b/blockdev.c
> index fb18e9c975..ce458de037 100644
> --- a/blockdev.c
> +++ b/blockdev.c
> @@ -2820,6 +2820,7 @@ void qmp_block_dirty_bitmap_add(const char *node, const char *name,
> {
> BlockDriverState *bs;
> BdrvDirtyBitmap *bitmap;
> + AioContext *aio_context = NULL;
>
> if (!name || name[0] == '\0') {
> error_setg(errp, "Bitmap name cannot be empty");
> @@ -2854,10 +2855,12 @@ void qmp_block_dirty_bitmap_add(const char *node, const char *name,
> disabled = false;
> }
>
> - if (persistent &&
> - !bdrv_can_store_new_dirty_bitmap(bs, name, granularity, errp))
> - {
> - return;
> + if (persistent) {
> + aio_context = bdrv_get_aio_context(bs);
> + aio_context_acquire(aio_context);
> + if (!bdrv_can_store_new_dirty_bitmap(bs, name, granularity, errp)) {
> + goto out;
> + }
> }
>
> bitmap = bdrv_create_dirty_bitmap(bs, granularity, name, errp);
if (bitmap == NULL) {
return;
}
Oops - this early return fails to release the aio context.
> @@ -2870,6 +2873,10 @@ void qmp_block_dirty_bitmap_add(const char *node, const char *name,
> }
>
> bdrv_dirty_bitmap_set_persistance(bitmap, persistent);
> + out:
> + if (aio_context) {
> + aio_context_release(aio_context);
> + }
> }
>
> void qmp_block_dirty_bitmap_remove(const char *node, const char *name,
> @@ -2878,6 +2885,7 @@ void qmp_block_dirty_bitmap_remove(const char *node, const char *name,
> BlockDriverState *bs;
> BdrvDirtyBitmap *bitmap;
> Error *local_err = NULL;
> + AioContext *aio_context = NULL;
>
> bitmap = block_dirty_bitmap_lookup(node, name, &bs, errp);
> if (!bitmap || !bs) {
> @@ -2892,14 +2900,20 @@ void qmp_block_dirty_bitmap_remove(const char *node, const char *name,
> }
>
> if (bdrv_dirty_bitmap_get_persistance(bitmap)) {
> + aio_context = bdrv_get_aio_context(bs);
> + aio_context_acquire(aio_context);
> bdrv_remove_persistent_dirty_bitmap(bs, name, &local_err);
> if (local_err != NULL) {
> error_propagate(errp, local_err);
> - return;
> + goto out;
> }
> }
>
> bdrv_release_dirty_bitmap(bs, bitmap);
> + out:
> + if (aio_context) {
> + aio_context_release(aio_context);
> + }
> }
>
> /**
>
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3226
Virtualization: qemu.org | libvirt.org
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
next prev parent reply other threads:[~2019-02-12 19:51 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-02-06 17:02 [Qemu-devel] [PATCH] blockdev: acquire aio_context for bitmap add/remove John Snow
2019-02-06 17:19 ` Vladimir Sementsov-Ogievskiy
2019-02-11 20:25 ` John Snow
2019-02-12 19:36 ` Eric Blake [this message]
2019-02-12 19:43 ` John Snow
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=ddc2f850-e7b9-e8f8-4fc1-a3b62a5164e5@redhat.com \
--to=eblake@redhat.com \
--cc=armbru@redhat.com \
--cc=jsnow@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=vsementsov@virtuozzo.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.