]>
Commit | Line | Data |
---|---|---|
5919ec14 FE |
1 | From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
2 | From: Fiona Ebner <f.ebner@proxmox.com> | |
3 | Date: Fri, 28 Jul 2023 10:47:48 +0200 | |
4 | Subject: [PATCH] migration/block-dirty-bitmap: fix loading bitmap when there | |
5 | is an iothread | |
6 | ||
7 | The bdrv_create_dirty_bitmap() function (which is also called by | |
8 | bdrv_dirty_bitmap_create_successor()) uses bdrv_getlength(bs). This is | |
9 | a wrapper around a coroutine, and thus uses bdrv_poll_co(). Polling | |
10 | tries to release the AioContext which will trigger an assert() if it | |
11 | hasn't been acquired before. | |
12 | ||
13 | The issue does not happen for migration, because there we are in a | |
14 | coroutine already, so the wrapper will just call bdrv_co_getlength() | |
15 | directly without polling. | |
16 | ||
17 | Signed-off-by: Fiona Ebner <f.ebner@proxmox.com> | |
18 | --- | |
19 | migration/block-dirty-bitmap.c | 6 ++++++ | |
20 | 1 file changed, 6 insertions(+) | |
21 | ||
22 | diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c | |
23 | index fe73aa94b1..7eaf498439 100644 | |
24 | --- a/migration/block-dirty-bitmap.c | |
25 | +++ b/migration/block-dirty-bitmap.c | |
26 | @@ -805,8 +805,11 @@ static int dirty_bitmap_load_start(QEMUFile *f, DBMLoadState *s) | |
27 | "destination", bdrv_dirty_bitmap_name(s->bitmap)); | |
28 | return -EINVAL; | |
29 | } else { | |
30 | + AioContext *ctx = bdrv_get_aio_context(s->bs); | |
31 | + aio_context_acquire(ctx); | |
32 | s->bitmap = bdrv_create_dirty_bitmap(s->bs, granularity, | |
33 | s->bitmap_name, &local_err); | |
34 | + aio_context_release(ctx); | |
35 | if (!s->bitmap) { | |
36 | error_report_err(local_err); | |
37 | return -EINVAL; | |
38 | @@ -833,7 +836,10 @@ static int dirty_bitmap_load_start(QEMUFile *f, DBMLoadState *s) | |
39 | ||
40 | bdrv_disable_dirty_bitmap(s->bitmap); | |
41 | if (flags & DIRTY_BITMAP_MIG_START_FLAG_ENABLED) { | |
42 | + AioContext *ctx = bdrv_get_aio_context(s->bs); | |
43 | + aio_context_acquire(ctx); | |
44 | bdrv_dirty_bitmap_create_successor(s->bitmap, &local_err); | |
45 | + aio_context_release(ctx); | |
46 | if (local_err) { | |
47 | error_report_err(local_err); | |
48 | return -EINVAL; |