summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--block/io.c28
-rw-r--r--cpus.c2
2 files changed, 28 insertions, 2 deletions
diff --git a/block/io.c b/block/io.c
index 4f9ee97c2b..834841142a 100644
--- a/block/io.c
+++ b/block/io.c
@@ -33,6 +33,7 @@
#include "qapi/error.h"
#include "qemu/error-report.h"
#include "qemu/main-loop.h"
+#include "sysemu/replay.h"
#define NOT_DONE 0x7fffffff /* used while emulated sync operation in progress */
@@ -600,6 +601,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;
+ }
+
/* AIO_WAIT_WHILE() with a NULL context can only be called from the main
* loop AioContext, so make sure we're in the main context. */
assert(qemu_get_current_aio_context() == qemu_get_aio_context());
@@ -629,6 +639,15 @@ void bdrv_drain_all_end(void)
BlockDriverState *bs = NULL;
int drained_end_counter = 0;
+ /*
+ * bdrv queue is managed by record/replay,
+ * waiting for finishing the I/O requests may
+ * be endless
+ */
+ if (replay_events_enabled()) {
+ return;
+ }
+
while ((bs = bdrv_next_all_states(bs))) {
AioContext *aio_context = bdrv_get_aio_context(bs);
@@ -2124,6 +2143,15 @@ int bdrv_flush_all(void)
BlockDriverState *bs = NULL;
int result = 0;
+ /*
+ * bdrv queue is managed by record/replay,
+ * creating new flush request for stopping
+ * the VM may break the determinism
+ */
+ if (replay_events_enabled()) {
+ return result;
+ }
+
for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
AioContext *aio_context = bdrv_get_aio_context(bs);
int ret;
diff --git a/cpus.c b/cpus.c
index d2c61ff155..367f0657c5 100644
--- a/cpus.c
+++ b/cpus.c
@@ -1097,7 +1097,6 @@ static int do_vm_stop(RunState state, bool send_stop)
}
bdrv_drain_all();
- replay_disable_events();
ret = bdrv_flush_all();
return ret;
@@ -2181,7 +2180,6 @@ int vm_prepare_start(void)
/* We are sending this now, but the CPUs will be resumed shortly later */
qapi_event_send_resume();
- replay_enable_events();
cpu_enable_ticks();
runstate_set(RUN_STATE_RUNNING);
vm_state_notify(1, RUN_STATE_RUNNING);