From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51735) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bAVom-0005VH-9Q for qemu-devel@nongnu.org; Wed, 08 Jun 2016 01:14:22 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bAVok-0000N0-3L for qemu-devel@nongnu.org; Wed, 08 Jun 2016 01:14:15 -0400 Received: from mail.ispras.ru ([83.149.199.45]:60322) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bAVoj-0000Lj-Mt for qemu-devel@nongnu.org; Wed, 08 Jun 2016 01:14:14 -0400 From: Pavel Dovgalyuk Date: Wed, 08 Jun 2016 08:14:04 +0300 Message-ID: <20160608051404.1688.65453.stgit@PASHA-ISP> In-Reply-To: <20160608051352.1688.7877.stgit@PASHA-ISP> References: <20160608051352.1688.7877.stgit@PASHA-ISP> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] [PATCH 2/3] replay: allow replay stopping and restarting List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com, jasowang@redhat.com, agraf@suse.de, david@gibson.dropbear.id.au This patch fixes bug with stopping and restarting replay through monitor. Signed-off-by: Pavel Dovgalyuk --- block/blkreplay.c | 18 +++++++++++++----- cpus.c | 1 + include/sysemu/replay.h | 2 ++ replay/replay-internal.h | 2 -- vl.c | 1 + 5 files changed, 17 insertions(+), 7 deletions(-) diff --git a/block/blkreplay.c b/block/blkreplay.c index 42f1813..438170c 100644 --- a/block/blkreplay.c +++ b/block/blkreplay.c @@ -70,6 +70,14 @@ static void blkreplay_bh_cb(void *opaque) g_free(req); } +static uint64_t blkreplay_next_id(void) +{ + if (replay_events_enabled()) { + return request_id++; + } + return 0; +} + static void block_request_create(uint64_t reqid, BlockDriverState *bs, Coroutine *co) { @@ -84,7 +92,7 @@ static void block_request_create(uint64_t reqid, BlockDriverState *bs, static int coroutine_fn blkreplay_co_readv(BlockDriverState *bs, int64_t sector_num, int nb_sectors, QEMUIOVector *qiov) { - uint64_t reqid = request_id++; + uint64_t reqid = blkreplay_next_id(); int ret = bdrv_co_readv(bs->file->bs, sector_num, nb_sectors, qiov); block_request_create(reqid, bs, qemu_coroutine_self()); qemu_coroutine_yield(); @@ -95,7 +103,7 @@ static int coroutine_fn blkreplay_co_readv(BlockDriverState *bs, static int coroutine_fn blkreplay_co_writev(BlockDriverState *bs, int64_t sector_num, int nb_sectors, QEMUIOVector *qiov) { - uint64_t reqid = request_id++; + uint64_t reqid = blkreplay_next_id(); int ret = bdrv_co_writev(bs->file->bs, sector_num, nb_sectors, qiov); block_request_create(reqid, bs, qemu_coroutine_self()); qemu_coroutine_yield(); @@ -106,7 +114,7 @@ static int coroutine_fn blkreplay_co_writev(BlockDriverState *bs, static int coroutine_fn blkreplay_co_write_zeroes(BlockDriverState *bs, int64_t sector_num, int nb_sectors, BdrvRequestFlags flags) { - uint64_t reqid = request_id++; + uint64_t reqid = blkreplay_next_id(); int ret = bdrv_co_write_zeroes(bs->file->bs, sector_num, nb_sectors, flags); block_request_create(reqid, bs, qemu_coroutine_self()); qemu_coroutine_yield(); @@ -117,7 +125,7 @@ static int coroutine_fn blkreplay_co_write_zeroes(BlockDriverState *bs, static int coroutine_fn blkreplay_co_discard(BlockDriverState *bs, int64_t sector_num, int nb_sectors) { - uint64_t reqid = request_id++; + uint64_t reqid = blkreplay_next_id(); int ret = bdrv_co_discard(bs->file->bs, sector_num, nb_sectors); block_request_create(reqid, bs, qemu_coroutine_self()); qemu_coroutine_yield(); @@ -127,7 +135,7 @@ static int coroutine_fn blkreplay_co_discard(BlockDriverState *bs, static int coroutine_fn blkreplay_co_flush(BlockDriverState *bs) { - uint64_t reqid = request_id++; + uint64_t reqid = blkreplay_next_id(); int ret = bdrv_co_flush(bs->file->bs); block_request_create(reqid, bs, qemu_coroutine_self()); qemu_coroutine_yield(); diff --git a/cpus.c b/cpus.c index 326742f..34f951f 100644 --- a/cpus.c +++ b/cpus.c @@ -742,6 +742,7 @@ static int do_vm_stop(RunState state) runstate_set(state); vm_state_notify(0, state); qapi_event_send_stop(&error_abort); + replay_disable_events(); } bdrv_drain_all(); diff --git a/include/sysemu/replay.h b/include/sysemu/replay.h index 0a88393..52430d3 100644 --- a/include/sysemu/replay.h +++ b/include/sysemu/replay.h @@ -105,6 +105,8 @@ bool replay_checkpoint(ReplayCheckpoint checkpoint); /*! Disables storing events in the queue */ void replay_disable_events(void); +/*! Enables storing events in the queue */ +void replay_enable_events(void); /*! Returns true when saving events is enabled */ bool replay_events_enabled(void); /*! Adds bottom half event to the queue */ diff --git a/replay/replay-internal.h b/replay/replay-internal.h index efbf14c..310c4b7 100644 --- a/replay/replay-internal.h +++ b/replay/replay-internal.h @@ -119,8 +119,6 @@ void replay_read_next_clock(unsigned int kind); void replay_init_events(void); /*! Clears internal data structures for events handling */ void replay_finish_events(void); -/*! Enables storing events in the queue */ -void replay_enable_events(void); /*! Flushes events queue */ void replay_flush_events(void); /*! Clears events list before loading new VM state */ diff --git a/vl.c b/vl.c index 2f74fe8..b361ca8 100644 --- a/vl.c +++ b/vl.c @@ -765,6 +765,7 @@ void vm_start(void) if (runstate_is_running()) { qapi_event_send_stop(&error_abort); } else { + replay_enable_events(); cpu_enable_ticks(); runstate_set(RUN_STATE_RUNNING); vm_state_notify(1, RUN_STATE_RUNNING);