qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
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,
	quintela@redhat.com, ciro.santilli@gmail.com,
	jasowang@redhat.com, mst@redhat.com, zuban32s@gmail.com,
	armbru@redhat.com, maria.klimushenkova@ispras.ru,
	dovgaluk@ispras.ru, kraxel@redhat.com, pavel.dovgaluk@ispras.ru,
	thomas.dullien@googlemail.com, pbonzini@redhat.com,
	mreitz@redhat.com, alex.bennee@linaro.org, dgilbert@redhat.com,
	rth@twiddle.net
Subject: [Qemu-devel] [PATCH v6 22/25] replay: add BH oneshot event for block layer
Date: Wed, 12 Sep 2018 11:19:56 +0300	[thread overview]
Message-ID: <20180912081956.3228.17903.stgit@pasha-VirtualBox> (raw)
In-Reply-To: <20180912081747.3228.21861.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    |    3 ++-
 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, 33 insertions(+), 2 deletions(-)
 create mode 100644 stubs/replay-user.c

diff --git a/block/block-backend.c b/block/block-backend.c
index fa12063..712bafd 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"
@@ -1369,7 +1370,7 @@ 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),
+        replay_bh_schedule_oneshot_event(blk_get_aio_context(blk),
                                 blk_aio_complete_bh, acb);
     }
 
diff --git a/include/sysemu/replay.h b/include/sysemu/replay.h
index 3130e45..9da90e1 100644
--- a/include/sysemu/replay.h
+++ b/include/sysemu/replay.h
@@ -160,6 +160,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 0964a82..83a7d81 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:
@@ -216,6 +231,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 a857ca4..548d4d8 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 2145686..355e5ae 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 53d3f32..2acbac3 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);
+}

  parent reply	other threads:[~2018-09-12  8:20 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-12  8:17 [Qemu-devel] [PATCH v6 00/25] Fixing record/replay and adding reverse debugging Pavel Dovgalyuk
2018-09-12  8:17 ` [Qemu-devel] [PATCH v6 01/25] block: implement bdrv_snapshot_goto for blkreplay Pavel Dovgalyuk
2018-09-12  8:18 ` [Qemu-devel] [PATCH v6 02/25] replay: disable default snapshot for record/replay Pavel Dovgalyuk
2018-09-12  8:18 ` [Qemu-devel] [PATCH v6 03/25] replay: update docs for record/replay with block devices Pavel Dovgalyuk
2018-09-12  8:18 ` [Qemu-devel] [PATCH v6 04/25] replay: don't drain/flush bdrv queue while RR is working Pavel Dovgalyuk
2018-09-12  8:18 ` [Qemu-devel] [PATCH v6 05/25] replay: finish record/replay before closing the disks Pavel Dovgalyuk
2018-09-12  8:18 ` [Qemu-devel] [PATCH v6 06/25] qcow2: introduce icount field for snapshots Pavel Dovgalyuk
2018-09-12  8:18 ` [Qemu-devel] [PATCH v6 07/25] migration: " Pavel Dovgalyuk
2018-09-12  8:18 ` [Qemu-devel] [PATCH v6 08/25] replay: provide and accessor for rr filename Pavel Dovgalyuk
2018-09-12  8:18 ` [Qemu-devel] [PATCH v6 09/25] replay: introduce info hmp/qmp command Pavel Dovgalyuk
2018-09-12  8:18 ` [Qemu-devel] [PATCH v6 10/25] replay: introduce breakpoint at the specified step Pavel Dovgalyuk
2018-09-12  8:18 ` [Qemu-devel] [PATCH v6 11/25] replay: implement replay-seek command to proceed to the desired step Pavel Dovgalyuk
2018-09-12  8:18 ` [Qemu-devel] [PATCH v6 12/25] replay: flush events when exiting Pavel Dovgalyuk
2018-09-12  8:19 ` [Qemu-devel] [PATCH v6 13/25] replay: refine replay-time module Pavel Dovgalyuk
2018-09-12  8:19 ` [Qemu-devel] [PATCH v6 14/25] translator: fix breakpoint processing Pavel Dovgalyuk
2018-09-12  8:19 ` [Qemu-devel] [PATCH v6 15/25] replay: flush rr queue before loading the vmstate Pavel Dovgalyuk
2018-09-12  8:19 ` [Qemu-devel] [PATCH v6 16/25] gdbstub: add reverse step support in replay mode Pavel Dovgalyuk
2018-09-12  8:19 ` [Qemu-devel] [PATCH v6 17/25] gdbstub: add reverse continue " Pavel Dovgalyuk
2018-09-12  8:19 ` [Qemu-devel] [PATCH v6 18/25] replay: describe reverse debugging in docs/replay.txt Pavel Dovgalyuk
2018-09-12  8:19 ` [Qemu-devel] [PATCH v6 19/25] replay: allow loading any snapshots before recording Pavel Dovgalyuk
2018-09-12  8:19 ` [Qemu-devel] [PATCH v6 20/25] replay: wake up vCPU when replaying Pavel Dovgalyuk
2018-09-13 10:12   ` Paolo Bonzini
2018-09-13 11:06     ` Pavel Dovgalyuk
2018-09-12  8:19 ` [Qemu-devel] [PATCH v6 21/25] replay: replay BH for IDE trim operation Pavel Dovgalyuk
2018-09-13 17:05   ` John Snow
2018-09-14  5:48     ` Pavel Dovgalyuk
2018-09-14  7:27       ` Pavel Dovgalyuk
2018-09-14 14:17         ` John Snow
2018-09-14 14:00       ` John Snow
2018-09-14 15:19         ` Paolo Bonzini
2018-09-14 15:59           ` Peter Maydell
2018-09-12  8:19 ` Pavel Dovgalyuk [this message]
2018-09-13 10:22   ` [Qemu-devel] [PATCH v6 22/25] replay: add BH oneshot event for block layer Paolo Bonzini
2018-09-13 11:13     ` Pavel Dovgalyuk
2018-09-13 13:45       ` Paolo Bonzini
2018-09-14  6:17         ` Pavel Dovgalyuk
2018-09-12  8:20 ` [Qemu-devel] [PATCH v6 23/25] timer: introduce new virtual clock Pavel Dovgalyuk
2018-09-12  8:20 ` [Qemu-devel] [PATCH v6 24/25] slirp: fix ipv6 timers Pavel Dovgalyuk
2018-09-12  8:45   ` Samuel Thibault
2018-09-12  8:20 ` [Qemu-devel] [PATCH v6 25/25] ui: fix virtual timers Pavel Dovgalyuk
2018-09-13 10:27 ` [Qemu-devel] [PATCH v6 00/25] Fixing record/replay and adding reverse debugging Paolo Bonzini
2018-09-13 13:40   ` Pavel Dovgalyuk
2018-09-13 13:46     ` Paolo Bonzini

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=20180912081956.3228.17903.stgit@pasha-VirtualBox \
    --to=pavel.dovgaluk@ispras.ru \
    --cc=alex.bennee@linaro.org \
    --cc=armbru@redhat.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 \
    --cc=zuban32s@gmail.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).