123 lines
4.0 KiB
Diff
123 lines
4.0 KiB
Diff
|
From 107ad619739795199df98c56d0ad4db14fec3722 Mon Sep 17 00:00:00 2001
|
||
|
From: John Snow <jsnow@redhat.com>
|
||
|
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 <jsnow@redhat.com>
|
||
|
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 <mlevitsk@redhat.com>
|
||
|
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||
|
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||
|
|
||
|
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
||
|
|
||
|
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 <vsementsov@virtuozzo.com>
|
||
|
Reviewed-by: John Snow <jsnow@redhat.com>
|
||
|
Signed-off-by: John Snow <jsnow@redhat.com>
|
||
|
Reviewed-by: Max Reitz <mreitz@redhat.com>
|
||
|
Message-id: 20190708220502.12977-2-jsnow@redhat.com
|
||
|
Signed-off-by: John Snow <jsnow@redhat.com>
|
||
|
(cherry picked from commit 2899f41eef2806cf8eb119811c9d6fcf15ce80f6)
|
||
|
Signed-off-by: John Snow <jsnow@redhat.com>
|
||
|
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||
|
---
|
||
|
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
|
||
|
|