From patchwork Wed Jun 8 05:14:04 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pavel Dovgalyuk X-Patchwork-Id: 9163295 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 7AC0C604DB for ; Wed, 8 Jun 2016 05:14:50 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6E2472824F for ; Wed, 8 Jun 2016 05:14:50 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 62F202836B; Wed, 8 Jun 2016 05:14:50 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id DFD452824F for ; Wed, 8 Jun 2016 05:14:49 +0000 (UTC) Received: from localhost ([::1]:54511 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bAVpI-0005aP-R3 for patchwork-qemu-devel@patchwork.kernel.org; Wed, 08 Jun 2016 01:14:48 -0400 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 Received: from [10.10.150.28] (unknown [85.142.117.224]) by mail.ispras.ru (Postfix) with ESMTPSA id 2BD3754007F; Wed, 8 Jun 2016 08:14:02 +0300 (MSK) To: qemu-devel@nongnu.org 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> User-Agent: StGit/0.16 MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 83.149.199.45 Subject: [Qemu-devel] [PATCH 2/3] replay: allow replay stopping and restarting X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: pbonzini@redhat.com, jasowang@redhat.com, agraf@suse.de, david@gibson.dropbear.id.au Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP 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);