From: Pavel Dovgalyuk <Pavel.Dovgaluk@ispras.ru>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com, peter.maydell@linaro.org, war2jordan@live.com,
crosthwaite.peter@gmail.com, boost.lists@gmail.com,
artem.k.pisarenko@gmail.com, quintela@redhat.com,
ciro.santilli@gmail.com, jasowang@redhat.com, mst@redhat.com,
armbru@redhat.com, mreitz@redhat.com,
maria.klimushenkova@ispras.ru, dovgaluk@ispras.ru,
kraxel@redhat.com, pavel.dovgaluk@ispras.ru,
thomas.dullien@googlemail.com, pbonzini@redhat.com,
alex.bennee@linaro.org, dgilbert@redhat.com, rth@twiddle.net
Subject: [Qemu-devel] [PATCH v8 18/20] replay: add BH oneshot event for block layer
Date: Tue, 18 Dec 2018 14:22:39 +0300 [thread overview]
Message-ID: <20181218112239.11727.86110.stgit@pasha-VirtualBox> (raw)
In-Reply-To: <20181218112056.11727.96529.stgit@pasha-VirtualBox>
Replay is capable of recording normal BH events, but sometimes
there are single use callbacks scheduled with aio_bh_schedule_oneshot
function. This patch enables recording and replaying such callbacks.
Block layer uses these events for calling the completion function.
Replaying these calls makes the execution deterministic.
Signed-off-by: Pavel Dovgalyuk <Pavel.Dovgaluk@ispras.ru>
--
v6:
- moved stub function to the separate file for fixing linux-user build
---
block/block-backend.c | 5 +++--
include/sysemu/replay.h | 3 +++
replay/replay-events.c | 16 ++++++++++++++++
replay/replay-internal.h | 1 +
replay/replay.c | 2 +-
stubs/Makefile.objs | 1 +
stubs/replay-user.c | 9 +++++++++
7 files changed, 34 insertions(+), 3 deletions(-)
create mode 100644 stubs/replay-user.c
diff --git a/block/block-backend.c b/block/block-backend.c
index 60d37a0..41ee871 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -17,6 +17,7 @@
#include "block/throttle-groups.h"
#include "sysemu/blockdev.h"
#include "sysemu/sysemu.h"
+#include "sysemu/replay.h"
#include "qapi/error.h"
#include "qapi/qapi-events-block.h"
#include "qemu/id.h"
@@ -1380,8 +1381,8 @@ static BlockAIOCB *blk_aio_prwv(BlockBackend *blk, int64_t offset, int bytes,
acb->has_returned = true;
if (acb->rwco.ret != NOT_DONE) {
- aio_bh_schedule_oneshot(blk_get_aio_context(blk),
- blk_aio_complete_bh, acb);
+ replay_bh_schedule_oneshot_event(blk_get_aio_context(blk),
+ blk_aio_complete_bh, acb);
}
return &acb->common;
diff --git a/include/sysemu/replay.h b/include/sysemu/replay.h
index 05cb40a..5c71858 100644
--- a/include/sysemu/replay.h
+++ b/include/sysemu/replay.h
@@ -157,6 +157,9 @@ bool replay_events_enabled(void);
void replay_flush_events(void);
/*! Adds bottom half event to the queue */
void replay_bh_schedule_event(QEMUBH *bh);
+/* Adds oneshot bottom half event to the queue */
+void replay_bh_schedule_oneshot_event(AioContext *ctx,
+ QEMUBHFunc *cb, void *opaque);
/*! Adds input event to the queue */
void replay_input_event(QemuConsole *src, InputEvent *evt);
/*! Adds input sync event to the queue */
diff --git a/replay/replay-events.c b/replay/replay-events.c
index d9a2d49..60e8c21 100644
--- a/replay/replay-events.c
+++ b/replay/replay-events.c
@@ -37,6 +37,9 @@ static void replay_run_event(Event *event)
case REPLAY_ASYNC_EVENT_BH:
aio_bh_call(event->opaque);
break;
+ case REPLAY_ASYNC_EVENT_BH_ONESHOT:
+ ((QEMUBHFunc*)event->opaque)(event->opaque2);
+ break;
case REPLAY_ASYNC_EVENT_INPUT:
qemu_input_event_send_impl(NULL, (InputEvent *)event->opaque);
qapi_free_InputEvent((InputEvent *)event->opaque);
@@ -132,6 +135,17 @@ void replay_bh_schedule_event(QEMUBH *bh)
}
}
+void replay_bh_schedule_oneshot_event(AioContext *ctx,
+ QEMUBHFunc *cb, void *opaque)
+{
+ if (events_enabled) {
+ uint64_t id = replay_get_current_step();
+ replay_add_event(REPLAY_ASYNC_EVENT_BH_ONESHOT, cb, opaque, id);
+ } else {
+ aio_bh_schedule_oneshot(ctx, cb, opaque);
+ }
+}
+
void replay_add_input_event(struct InputEvent *event)
{
replay_add_event(REPLAY_ASYNC_EVENT_INPUT, event, NULL, 0);
@@ -162,6 +176,7 @@ static void replay_save_event(Event *event, int checkpoint)
/* save event-specific data */
switch (event->event_kind) {
case REPLAY_ASYNC_EVENT_BH:
+ case REPLAY_ASYNC_EVENT_BH_ONESHOT:
replay_put_qword(event->id);
break;
case REPLAY_ASYNC_EVENT_INPUT:
@@ -217,6 +232,7 @@ static Event *replay_read_event(int checkpoint)
/* Events that has not to be in the queue */
switch (replay_state.read_event_kind) {
case REPLAY_ASYNC_EVENT_BH:
+ case REPLAY_ASYNC_EVENT_BH_ONESHOT:
if (replay_state.read_event_id == -1) {
replay_state.read_event_id = replay_get_qword();
}
diff --git a/replay/replay-internal.h b/replay/replay-internal.h
index e37b201..af2b941 100644
--- a/replay/replay-internal.h
+++ b/replay/replay-internal.h
@@ -51,6 +51,7 @@ enum ReplayEvents {
enum ReplayAsyncEventKind {
REPLAY_ASYNC_EVENT_BH,
+ REPLAY_ASYNC_EVENT_BH_ONESHOT,
REPLAY_ASYNC_EVENT_INPUT,
REPLAY_ASYNC_EVENT_INPUT_SYNC,
REPLAY_ASYNC_EVENT_CHAR_READ,
diff --git a/replay/replay.c b/replay/replay.c
index 3996499..fdf1778 100644
--- a/replay/replay.c
+++ b/replay/replay.c
@@ -22,7 +22,7 @@
/* Current version of the replay mechanism.
Increase it when file format changes. */
-#define REPLAY_VERSION 0xe02007
+#define REPLAY_VERSION 0xe02008
/* Size of replay log header */
#define HEADER_SIZE (sizeof(uint32_t) + sizeof(uint64_t))
diff --git a/stubs/Makefile.objs b/stubs/Makefile.objs
index 5dd0aee..8e8df1e 100644
--- a/stubs/Makefile.objs
+++ b/stubs/Makefile.objs
@@ -24,6 +24,7 @@ stub-obj-y += monitor.o
stub-obj-y += notify-event.o
stub-obj-y += qtest.o
stub-obj-y += replay.o
+stub-obj-y += replay-user.o
stub-obj-y += runstate-check.o
stub-obj-y += set-fd-handler.o
stub-obj-y += slirp.o
diff --git a/stubs/replay-user.c b/stubs/replay-user.c
new file mode 100644
index 0000000..2ad9e27
--- /dev/null
+++ b/stubs/replay-user.c
@@ -0,0 +1,9 @@
+#include "qemu/osdep.h"
+#include "sysemu/replay.h"
+#include "sysemu/sysemu.h"
+
+void replay_bh_schedule_oneshot_event(AioContext *ctx,
+ QEMUBHFunc *cb, void *opaque)
+{
+ aio_bh_schedule_oneshot(ctx, cb, opaque);
+}
next prev parent reply other threads:[~2018-12-18 11:22 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-12-18 11:20 [Qemu-devel] [PATCH v8 00/20] Fixing record/replay and adding reverse debugging Pavel Dovgalyuk
2018-12-18 11:21 ` [Qemu-devel] [PATCH v8 01/20] replay: add missing fix for internal function Pavel Dovgalyuk
2018-12-18 11:21 ` [Qemu-devel] [PATCH v8 02/20] block: implement bdrv_snapshot_goto for blkreplay Pavel Dovgalyuk
2018-12-18 11:21 ` [Qemu-devel] [PATCH v8 03/20] replay: disable default snapshot for record/replay Pavel Dovgalyuk
2018-12-18 11:21 ` [Qemu-devel] [PATCH v8 04/20] replay: update docs for record/replay with block devices Pavel Dovgalyuk
2018-12-18 11:21 ` [Qemu-devel] [PATCH v8 05/20] replay: don't drain/flush bdrv queue while RR is working Pavel Dovgalyuk
2018-12-18 11:21 ` [Qemu-devel] [PATCH v8 06/20] replay: finish record/replay before closing the disks Pavel Dovgalyuk
2018-12-18 11:21 ` [Qemu-devel] [PATCH v8 07/20] qcow2: introduce icount field for snapshots Pavel Dovgalyuk
2018-12-18 11:21 ` [Qemu-devel] [PATCH v8 08/20] migration: " Pavel Dovgalyuk
2018-12-19 12:48 ` Markus Armbruster
2018-12-21 10:39 ` Pavel Dovgalyuk
2018-12-18 11:21 ` [Qemu-devel] [PATCH v8 09/20] replay: provide and accessor for rr filename Pavel Dovgalyuk
2018-12-18 11:21 ` [Qemu-devel] [PATCH v8 10/20] replay: introduce info hmp/qmp command Pavel Dovgalyuk
2018-12-19 12:43 ` Markus Armbruster
2018-12-21 8:07 ` Pavel Dovgalyuk
2018-12-18 11:21 ` [Qemu-devel] [PATCH v8 11/20] replay: introduce breakpoint at the specified step Pavel Dovgalyuk
2018-12-19 13:06 ` Markus Armbruster
2018-12-18 11:22 ` [Qemu-devel] [PATCH v8 12/20] replay: implement replay-seek command to proceed to the desired step Pavel Dovgalyuk
2018-12-19 13:08 ` Markus Armbruster
2018-12-18 11:22 ` [Qemu-devel] [PATCH v8 13/20] replay: refine replay-time module Pavel Dovgalyuk
2018-12-18 11:22 ` [Qemu-devel] [PATCH v8 14/20] replay: flush rr queue before loading the vmstate Pavel Dovgalyuk
2018-12-18 11:22 ` [Qemu-devel] [PATCH v8 15/20] gdbstub: add reverse step support in replay mode Pavel Dovgalyuk
2018-12-18 11:22 ` [Qemu-devel] [PATCH v8 16/20] gdbstub: add reverse continue " Pavel Dovgalyuk
2018-12-18 11:22 ` [Qemu-devel] [PATCH v8 17/20] replay: describe reverse debugging in docs/replay.txt Pavel Dovgalyuk
2018-12-18 11:22 ` Pavel Dovgalyuk [this message]
2018-12-18 11:22 ` [Qemu-devel] [PATCH v8 19/20] replay: init rtc after enabling the replay Pavel Dovgalyuk
2018-12-18 11:22 ` [Qemu-devel] [PATCH v8 20/20] replay: document development rules Pavel Dovgalyuk
2018-12-18 17:23 ` Artem Pisarenko
2018-12-24 18:24 ` [Qemu-devel] [PATCH v8 00/20] Fixing record/replay and adding reverse debugging no-reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181218112239.11727.86110.stgit@pasha-VirtualBox \
--to=pavel.dovgaluk@ispras.ru \
--cc=alex.bennee@linaro.org \
--cc=armbru@redhat.com \
--cc=artem.k.pisarenko@gmail.com \
--cc=boost.lists@gmail.com \
--cc=ciro.santilli@gmail.com \
--cc=crosthwaite.peter@gmail.com \
--cc=dgilbert@redhat.com \
--cc=dovgaluk@ispras.ru \
--cc=jasowang@redhat.com \
--cc=kraxel@redhat.com \
--cc=kwolf@redhat.com \
--cc=maria.klimushenkova@ispras.ru \
--cc=mreitz@redhat.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=rth@twiddle.net \
--cc=thomas.dullien@googlemail.com \
--cc=war2jordan@live.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).