[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 11/20] test-bdrv-drain: Test node deletion in sub
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PATCH v2 11/20] test-bdrv-drain: Test node deletion in subtree recursion |
Date: |
Tue, 29 May 2018 19:21:47 +0200 |
If bdrv_do_drained_begin() polls during its subtree recursion, the graph
can change and mess up the bs->children iteration. Test that this
doesn't happen.
Signed-off-by: Kevin Wolf <address@hidden>
---
tests/test-bdrv-drain.c | 38 +++++++++++++++++++++++++++++---------
1 file changed, 29 insertions(+), 9 deletions(-)
diff --git a/tests/test-bdrv-drain.c b/tests/test-bdrv-drain.c
index df438f0084..4b788e323e 100644
--- a/tests/test-bdrv-drain.c
+++ b/tests/test-bdrv-drain.c
@@ -880,7 +880,8 @@ static void coroutine_fn test_co_delete_by_drain(void
*opaque)
* If @detach_instead_of_delete is set, the BDS is not going to be
* deleted but will only detach all of its children.
*/
-static void do_test_delete_by_drain(bool detach_instead_of_delete)
+static void do_test_delete_by_drain(bool detach_instead_of_delete,
+ enum drain_type drain_type)
{
BlockBackend *blk;
BlockDriverState *bs, *child_bs, *null_bs;
@@ -936,9 +937,23 @@ static void do_test_delete_by_drain(bool
detach_instead_of_delete)
* test_co_delete_by_drain() resuming. Thus, @bs will be deleted
* and the coroutine will exit while this drain operation is still
* in progress. */
- bdrv_ref(child_bs);
- bdrv_drain(child_bs);
- bdrv_unref(child_bs);
+ switch (drain_type) {
+ case BDRV_DRAIN:
+ bdrv_ref(child_bs);
+ bdrv_drain(child_bs);
+ bdrv_unref(child_bs);
+ break;
+ case BDRV_SUBTREE_DRAIN:
+ /* Would have to ref/unref bs here for !detach_instead_of_delete, but
+ * then the whole test becomes pointless because the graph changes
+ * don't occur during the drain any more. */
+ assert(detach_instead_of_delete);
+ bdrv_subtree_drained_begin(bs);
+ bdrv_subtree_drained_end(bs);
+ break;
+ default:
+ g_assert_not_reached();
+ }
while (!dbdd.done) {
aio_poll(qemu_get_aio_context(), true);
@@ -951,15 +966,19 @@ static void do_test_delete_by_drain(bool
detach_instead_of_delete)
}
}
-
static void test_delete_by_drain(void)
{
- do_test_delete_by_drain(false);
+ do_test_delete_by_drain(false, BDRV_DRAIN);
}
static void test_detach_by_drain(void)
{
- do_test_delete_by_drain(true);
+ do_test_delete_by_drain(true, BDRV_DRAIN);
+}
+
+static void test_detach_by_drain_subtree(void)
+{
+ do_test_delete_by_drain(true, BDRV_SUBTREE_DRAIN);
}
@@ -1010,8 +1029,9 @@ int main(int argc, char **argv)
g_test_add_func("/bdrv-drain/blockjob/drain_subtree",
test_blockjob_drain_subtree);
- g_test_add_func("/bdrv-drain/deletion", test_delete_by_drain);
- g_test_add_func("/bdrv-drain/detach", test_detach_by_drain);
+ g_test_add_func("/bdrv-drain/deletion/drain", test_delete_by_drain);
+ g_test_add_func("/bdrv-drain/detach/drain", test_detach_by_drain);
+ g_test_add_func("/bdrv-drain/detach/drain_subtree",
test_detach_by_drain_subtree);
ret = g_test_run();
qemu_event_destroy(&done_event);
--
2.13.6
- [Qemu-devel] [PATCH v2 00/20] Drain fixes and cleanups, part 3, Kevin Wolf, 2018/05/29
- [Qemu-devel] [PATCH v2 02/20] block: Use bdrv_do_drain_begin/end in bdrv_drain_all(), Kevin Wolf, 2018/05/29
- [Qemu-devel] [PATCH v2 01/20] test-bdrv-drain: bdrv_drain() works with cross-AioContext events, Kevin Wolf, 2018/05/29
- [Qemu-devel] [PATCH v2 03/20] block: Remove 'recursive' parameter from bdrv_drain_invoke(), Kevin Wolf, 2018/05/29
- [Qemu-devel] [PATCH v2 04/20] block: Don't manually poll in bdrv_drain_all(), Kevin Wolf, 2018/05/29
- [Qemu-devel] [PATCH v2 05/20] tests/test-bdrv-drain: bdrv_drain_all() works in coroutines now, Kevin Wolf, 2018/05/29
- [Qemu-devel] [PATCH v2 06/20] block: Avoid unnecessary aio_poll() in AIO_WAIT_WHILE(), Kevin Wolf, 2018/05/29
- [Qemu-devel] [PATCH v2 08/20] block: Remove bdrv_drain_recurse(), Kevin Wolf, 2018/05/29
- [Qemu-devel] [PATCH v2 07/20] block: Really pause block jobs on drain, Kevin Wolf, 2018/05/29
- [Qemu-devel] [PATCH v2 09/20] test-bdrv-drain: Add test for node deletion, Kevin Wolf, 2018/05/29
- [Qemu-devel] [PATCH v2 11/20] test-bdrv-drain: Test node deletion in subtree recursion,
Kevin Wolf <=
- [Qemu-devel] [PATCH v2 10/20] block: Drain recursively with a single BDRV_POLL_WHILE(), Kevin Wolf, 2018/05/29
- [Qemu-devel] [PATCH v2 12/20] block: Don't poll in parent drain callbacks, Kevin Wolf, 2018/05/29
- [Qemu-devel] [PATCH v2 13/20] test-bdrv-drain: Graph change through parent callback, Kevin Wolf, 2018/05/29
- [Qemu-devel] [PATCH v2 14/20] block: Defer .bdrv_drain_begin callback to polling phase, Kevin Wolf, 2018/05/29
- [Qemu-devel] [PATCH v2 16/20] block: Allow AIO_WAIT_WHILE with NULL ctx, Kevin Wolf, 2018/05/29
- [Qemu-devel] [PATCH v2 15/20] test-bdrv-drain: Test that bdrv_drain_invoke() doesn't poll, Kevin Wolf, 2018/05/29
- [Qemu-devel] [PATCH v2 17/20] block: Move bdrv_drain_all_begin() out of coroutine context, Kevin Wolf, 2018/05/29
- [Qemu-devel] [PATCH v2 19/20] block: Allow graph changes in bdrv_drain_all_begin/end sections, Kevin Wolf, 2018/05/29
- [Qemu-devel] [PATCH v2 20/20] test-bdrv-drain: Test graph changes in drain_all section, Kevin Wolf, 2018/05/29
- [Qemu-devel] [PATCH v2 18/20] block: ignore_bds_parents parameter for drain functions, Kevin Wolf, 2018/05/29