[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] block/io: Check for replay-enabled in bdrv_drain_all_begin()
From: |
Peter Maydell |
Subject: |
[PATCH] block/io: Check for replay-enabled in bdrv_drain_all_begin() |
Date: |
Tue, 20 Dec 2022 17:46:38 +0000 |
In commit da0bd74434 we refactored bdrv_drain_all_begin() to pull out
the non-polling part into bdrv_drain_all_begin_nopoll(). This change
broke record-and-replay, because the "return early if replay enabled"
check is now in the sub-function bdrv_drain_all_begin_nopoll(), and
so it only causes us to return from that function, and not from the
calling bdrv_drain_all_begin().
Fix the regression by checking whether replay is enabled in both
functions.
The breakage and fix can be tested via 'make check-avocado': the
tests/avocado/reverse_debugging.py:ReverseDebugging_X86_64.test_x86_64_pc
tests/avocado/reverse_debugging.py:ReverseDebugging_AArch64.test_aarch64_virt
tests were both broken by this.
Fixes: da0bd744344adb1f285 ("block: Factor out bdrv_drain_all_begin_nopoll()")
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
Thanks to Fabiano for doing the bisect on this.
---
block/io.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/block/io.c b/block/io.c
index d87788dfbbf..a09b1b34abf 100644
--- a/block/io.c
+++ b/block/io.c
@@ -506,6 +506,15 @@ void bdrv_drain_all_begin(void)
return;
}
+ /*
+ * bdrv queue is managed by record/replay,
+ * waiting for finishing the I/O requests may
+ * be infinite
+ */
+ if (replay_events_enabled()) {
+ return;
+ }
+
bdrv_drain_all_begin_nopoll();
/* Now poll the in-flight requests */
--
2.25.1
- [PATCH] block/io: Check for replay-enabled in bdrv_drain_all_begin(),
Peter Maydell <=