[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH v3 07/19] test-bdrv-drain: Test AIO_WAIT_WHILE() in
From: |
Kevin Wolf |
Subject: |
[Qemu-block] [PATCH v3 07/19] test-bdrv-drain: Test AIO_WAIT_WHILE() in completion callback |
Date: |
Thu, 20 Sep 2018 18:19:46 +0200 |
This is a regression test for a deadlock that occurred in block job
completion callbacks (via job_defer_to_main_loop) because the AioContext
lock was taken twice: once in job_finish_sync() and then again in
job_defer_to_main_loop_bh(). This would cause AIO_WAIT_WHILE() to hang.
Signed-off-by: Kevin Wolf <address@hidden>
Reviewed-by: Fam Zheng <address@hidden>
---
tests/test-bdrv-drain.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/tests/test-bdrv-drain.c b/tests/test-bdrv-drain.c
index 57da22a096..c3c17b9ff7 100644
--- a/tests/test-bdrv-drain.c
+++ b/tests/test-bdrv-drain.c
@@ -774,6 +774,15 @@ typedef struct TestBlockJob {
bool should_complete;
} TestBlockJob;
+static int test_job_prepare(Job *job)
+{
+ TestBlockJob *s = container_of(job, TestBlockJob, common.job);
+
+ /* Provoke an AIO_WAIT_WHILE() call to verify there is no deadlock */
+ blk_flush(s->common.blk);
+ return 0;
+}
+
static int coroutine_fn test_job_run(Job *job, Error **errp)
{
TestBlockJob *s = container_of(job, TestBlockJob, common.job);
@@ -804,6 +813,7 @@ BlockJobDriver test_job_driver = {
.drain = block_job_drain,
.run = test_job_run,
.complete = test_job_complete,
+ .prepare = test_job_prepare,
},
};
--
2.13.6
- [Qemu-block] [PATCH v3 04/19] test-bdrv-drain: Drain with block jobs in an I/O thread, (continued)
- [Qemu-block] [PATCH v3 04/19] test-bdrv-drain: Drain with block jobs in an I/O thread, Kevin Wolf, 2018/09/20
- [Qemu-block] [PATCH v3 05/19] test-blockjob: Acquire AioContext around job_cancel_sync(), Kevin Wolf, 2018/09/20
- [Qemu-block] [PATCH v3 08/19] block: Add missing locking in bdrv_co_drain_bh_cb(), Kevin Wolf, 2018/09/20
- [Qemu-block] [PATCH v3 11/19] block-backend: Decrease in_flight only after callback, Kevin Wolf, 2018/09/20
- [Qemu-block] [PATCH v3 12/19] blockjob: Lie better in child_job_drained_poll(), Kevin Wolf, 2018/09/20
- [Qemu-block] [PATCH v3 06/19] job: Use AIO_WAIT_WHILE() in job_finish_sync(), Kevin Wolf, 2018/09/20
- [Qemu-block] [PATCH v3 09/19] block-backend: Add .drained_poll callback, Kevin Wolf, 2018/09/20
- [Qemu-block] [PATCH v3 13/19] block: Remove aio_poll() in bdrv_drain_poll variants, Kevin Wolf, 2018/09/20
- [Qemu-block] [PATCH v3 10/19] block-backend: Fix potential double blk_delete(), Kevin Wolf, 2018/09/20
- [Qemu-block] [PATCH v3 07/19] test-bdrv-drain: Test AIO_WAIT_WHILE() in completion callback,
Kevin Wolf <=
- [Qemu-block] [PATCH v3 14/19] test-bdrv-drain: Test nested poll in bdrv_drain_poll_top_level(), Kevin Wolf, 2018/09/20
- [Qemu-block] [PATCH v3 16/19] test-bdrv-drain: AIO_WAIT_WHILE() in job .commit/.abort, Kevin Wolf, 2018/09/20
- [Qemu-block] [PATCH v3 15/19] job: Avoid deadlocks in job_completed_txn_abort(), Kevin Wolf, 2018/09/20
- [Qemu-block] [PATCH v3 17/19] test-bdrv-drain: Fix outdated comments, Kevin Wolf, 2018/09/20
- [Qemu-block] [PATCH v3 19/19] test-bdrv-drain: Test draining job source child and parent, Kevin Wolf, 2018/09/20
- [Qemu-block] [PATCH v3 18/19] block: Use a single global AioWait, Kevin Wolf, 2018/09/20