qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Pavel Dovgalyuk" <dovgaluk@ispras.ru>
To: "'Alex Bennée'" <alex.bennee@linaro.org>,
	"'Pavel Dovgalyuk'" <Pavel.Dovgaluk@ispras.ru>
Cc: qemu-devel@nongnu.org, 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,
	kraxel@redhat.com, thomas.dullien@googlemail.com,
	pbonzini@redhat.com, mreitz@redhat.com, dgilbert@redhat.com,
	rth@twiddle.net
Subject: Re: [Qemu-devel] [PATCH v5 23/24] replay: add BH oneshot event for block layer
Date: Tue, 31 Jul 2018 10:00:39 +0300	[thread overview]
Message-ID: <000201d4289c$30cff010$926fd030$@ru> (raw)
In-Reply-To: <87y3dxsyq9.fsf@linaro.org>

> From: Alex Bennée [mailto:alex.bennee@linaro.org]
> Pavel Dovgalyuk <Pavel.Dovgaluk@ispras.ru> writes:
> 
> > 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>
> > ---
> >  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/replay.c           |    6 ++++++
> >  6 files changed, 29 insertions(+), 2 deletions(-)
> >
> > diff --git a/block/block-backend.c b/block/block-backend.c
> > index f2f75a9..232d114 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"
> > @@ -1370,7 +1371,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 8118b00..945bc74 100644
> > --- a/include/sysemu/replay.h
> > +++ b/include/sysemu/replay.h
> > @@ -152,6 +152,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..0ac8a5c 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 08ef2ec..0c0ed16 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 6e82764..061b1e2 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/replay.c b/stubs/replay.c
> > index 781974e..cbdac80 100644
> > --- a/stubs/replay.c
> > +++ b/stubs/replay.c
> > @@ -90,3 +90,9 @@ bool replay_reverse_continue(void)
> >  {
> >      return false;
> >  }
> > +
> > +void replay_bh_schedule_oneshot_event(AioContext *ctx,
> > +    QEMUBHFunc *cb,void *opaque)
> > +{
> > +    aio_bh_schedule_oneshot(ctx, cb, opaque);
> > +}
> 
> It seems wrong to have something in stubs that actively does stuff.
> Isn't this meant to be a bunch of NOPs?

I thinks stubs are meant to be functions that are used by qemu-img and other tools.
As I replaced aio_bh_schedule_oneshot with replay_bh_schedule_oneshot_event,
the tools should not notice this. Therefore the stub performs this call.

Pavel Dovgalyuk

  reply	other threads:[~2018-07-31  7:00 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-07-25 12:13 [Qemu-devel] [PATCH v5 00/24] Fixing record/replay and adding reverse debugging Pavel Dovgalyuk
2018-07-25 12:13 ` [Qemu-devel] [PATCH v5 01/24] block: implement bdrv_snapshot_goto for blkreplay Pavel Dovgalyuk
2018-07-25 12:13 ` [Qemu-devel] [PATCH v5 02/24] replay: disable default snapshot for record/replay Pavel Dovgalyuk
2018-07-25 12:13 ` [Qemu-devel] [PATCH v5 03/24] replay: update docs for record/replay with block devices Pavel Dovgalyuk
2018-07-25 12:13 ` [Qemu-devel] [PATCH v5 04/24] replay: don't drain/flush bdrv queue while RR is working Pavel Dovgalyuk
2018-07-25 12:13 ` [Qemu-devel] [PATCH v5 05/24] replay: finish record/replay before closing the disks Pavel Dovgalyuk
2018-07-25 12:13 ` [Qemu-devel] [PATCH v5 06/24] qcow2: introduce icount field for snapshots Pavel Dovgalyuk
2018-07-25 12:13 ` [Qemu-devel] [PATCH v5 07/24] migration: " Pavel Dovgalyuk
2018-07-25 12:14 ` [Qemu-devel] [PATCH v5 08/24] replay: introduce info hmp/qmp command Pavel Dovgalyuk
2018-07-25 14:56   ` Dr. David Alan Gilbert
2018-07-31  6:54     ` Pavel Dovgalyuk
2018-07-25 12:14 ` [Qemu-devel] [PATCH v5 09/24] replay: introduce breakpoint at the specified step Pavel Dovgalyuk
2018-07-25 12:14 ` [Qemu-devel] [PATCH v5 10/24] replay: implement replay-seek command to proceed to the desired step Pavel Dovgalyuk
2018-07-25 12:14 ` [Qemu-devel] [PATCH v5 11/24] replay: flush events when exiting Pavel Dovgalyuk
2018-07-25 12:15 ` [Qemu-devel] [PATCH v5 12/24] timer: remove replay clock probe in deadline calculation Pavel Dovgalyuk
2018-07-25 12:15 ` [Qemu-devel] [PATCH v5 13/24] replay: refine replay-time module Pavel Dovgalyuk
2018-07-25 12:15 ` [Qemu-devel] [PATCH v5 14/24] translator: fix breakpoint processing Pavel Dovgalyuk
2018-07-25 12:16 ` [Qemu-devel] [PATCH v5 15/24] replay: flush rr queue before loading the vmstate Pavel Dovgalyuk
2018-07-25 12:16 ` [Qemu-devel] [PATCH v5 16/24] gdbstub: add reverse step support in replay mode Pavel Dovgalyuk
2018-07-25 12:16 ` [Qemu-devel] [PATCH v5 17/24] gdbstub: add reverse continue " Pavel Dovgalyuk
2018-07-25 12:16 ` [Qemu-devel] [PATCH v5 18/24] replay: describe reverse debugging in docs/replay.txt Pavel Dovgalyuk
2018-07-25 12:16 ` [Qemu-devel] [PATCH v5 19/24] replay: allow loading any snapshots before recording Pavel Dovgalyuk
2018-07-25 12:16 ` [Qemu-devel] [PATCH v5 20/24] ps2: prevent changing irq state on save and load Pavel Dovgalyuk
2018-07-25 12:16 ` [Qemu-devel] [PATCH v5 21/24] replay: wake up vCPU when replaying Pavel Dovgalyuk
2018-07-25 12:16 ` [Qemu-devel] [PATCH v5 22/24] replay: replay BH for IDE trim operation Pavel Dovgalyuk
2018-07-25 12:29   ` Paolo Bonzini
2018-07-25 12:17 ` [Qemu-devel] [PATCH v5 23/24] replay: add BH oneshot event for block layer Pavel Dovgalyuk
2018-07-26 15:36   ` Alex Bennée
2018-07-26 17:20     ` Alex Bennée
2018-07-27  4:52     ` Pavel Dovgalyuk
2018-07-27 16:44       ` Alex Bennée
2018-08-02  5:50         ` Pavel Dovgalyuk
2018-07-26 17:17   ` Alex Bennée
2018-07-31  7:00     ` Pavel Dovgalyuk [this message]
2018-08-01 16:54     ` Paolo Bonzini
2018-07-25 12:17 ` [Qemu-devel] [PATCH v5 24/24] slirp: fix ipv6 timers Pavel Dovgalyuk
2018-07-25 13:44   ` Samuel Thibault
2018-07-26  7:08     ` Pavel Dovgalyuk
2018-07-26  7:35       ` Samuel Thibault
2018-07-26  7:37         ` Pavel Dovgalyuk
2018-07-26  7:40           ` Samuel Thibault
2018-07-26  8:07       ` Samuel Thibault
2018-07-26  8:37         ` Pavel Dovgalyuk
2018-07-26  9:15           ` Samuel Thibault
2018-07-31  6:58             ` Pavel Dovgalyuk
2018-08-01 19:22               ` Samuel Thibault
2018-07-25 14:15 ` [Qemu-devel] [PATCH v5 00/24] Fixing record/replay and adding reverse debugging no-reply
2018-08-07 23:13 ` Ciro Santilli
2018-09-12  8:14   ` dovgaluk

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='000201d4289c$30cff010$926fd030$@ru' \
    --to=dovgaluk@ispras.ru \
    --cc=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=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).