From 107ad619739795199df98c56d0ad4db14fec3722 Mon Sep 17 00:00:00 2001 From: John Snow Date: Fri, 27 Sep 2019 20:18:44 +0100 Subject: [PATCH 1/6] blockdev: reduce aio_context locked sections in bitmap add/remove RH-Author: John Snow Message-id: <20190927201846.6823-2-jsnow@redhat.com> Patchwork-id: 90908 O-Subject: [RHEL-AV-8.1.0 qemu-kvm PATCH 1/3] blockdev: reduce aio_context locked sections in bitmap add/remove Bugzilla: 1756413 RH-Acked-by: Maxim Levitsky RH-Acked-by: Max Reitz RH-Acked-by: Stefano Garzarella From: Vladimir Sementsov-Ogievskiy Commit 0a6c86d024c52 returned these locks back to add/remove functionality, to protect from intersection of persistent bitmap related IO with other IO. But other bitmap-related functions called here are unrelated to the problem, and there are no needs to keep these calls inside critical sections. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: John Snow Signed-off-by: John Snow Reviewed-by: Max Reitz Message-id: 20190708220502.12977-2-jsnow@redhat.com Signed-off-by: John Snow (cherry picked from commit 2899f41eef2806cf8eb119811c9d6fcf15ce80f6) Signed-off-by: John Snow Signed-off-by: Danilo C. L. de Paula --- blockdev.c | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/blockdev.c b/blockdev.c index 4d141e9..0124825 100644 --- a/blockdev.c +++ b/blockdev.c @@ -2811,7 +2811,6 @@ 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"); @@ -2847,16 +2846,20 @@ void qmp_block_dirty_bitmap_add(const char *node, const char *name, } if (persistent) { - aio_context = bdrv_get_aio_context(bs); + AioContext *aio_context = bdrv_get_aio_context(bs); + bool ok; + aio_context_acquire(aio_context); - if (!bdrv_can_store_new_dirty_bitmap(bs, name, granularity, errp)) { - goto out; + ok = bdrv_can_store_new_dirty_bitmap(bs, name, granularity, errp); + aio_context_release(aio_context); + if (!ok) { + return; } } bitmap = bdrv_create_dirty_bitmap(bs, granularity, name, errp); if (bitmap == NULL) { - goto out; + return; } if (disabled) { @@ -2864,10 +2867,6 @@ void qmp_block_dirty_bitmap_add(const char *node, const char *name, } bdrv_dirty_bitmap_set_persistence(bitmap, persistent); - out: - if (aio_context) { - aio_context_release(aio_context); - } } void qmp_block_dirty_bitmap_remove(const char *node, const char *name, @@ -2875,8 +2874,6 @@ 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) { @@ -2889,20 +2886,19 @@ void qmp_block_dirty_bitmap_remove(const char *node, const char *name, } if (bdrv_dirty_bitmap_get_persistence(bitmap)) { - aio_context = bdrv_get_aio_context(bs); + AioContext *aio_context = bdrv_get_aio_context(bs); + Error *local_err = NULL; + aio_context_acquire(aio_context); bdrv_remove_persistent_dirty_bitmap(bs, name, &local_err); + aio_context_release(aio_context); if (local_err != NULL) { error_propagate(errp, local_err); - goto out; + return; } } bdrv_release_dirty_bitmap(bs, bitmap); - out: - if (aio_context) { - aio_context_release(aio_context); - } } /** -- 1.8.3.1