Message ID | 20221220174638.2156308-1-peter.maydell@linaro.org |
---|---|
State | Accepted |
Commit | 6394578984da00564d6a3515940732ff9b83cd10 |
Headers | show |
Series | block/io: Check for replay-enabled in bdrv_drain_all_begin() | expand |
Peter Maydell <peter.maydell@linaro.org> writes: > 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> Tested-by: Fabiano Rosas <farosas@suse.de>
On Tue, 20 Dec 2022 at 18:46, Fabiano Rosas <farosas@suse.de> wrote: > > Peter Maydell <peter.maydell@linaro.org> writes: > > > 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> > > Tested-by: Fabiano Rosas <farosas@suse.de> Thanks; I've applied this to git since it unbreaks 'make check'. -- PMM
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 */
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(+)