From patchwork Wed Dec 12 13:46:35 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 205520 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 3D4BE2C0091 for ; Thu, 13 Dec 2012 00:49:14 +1100 (EST) Received: from localhost ([::1]:53020 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TimgS-0002IX-E2 for incoming@patchwork.ozlabs.org; Wed, 12 Dec 2012 08:49:12 -0500 Received: from eggs.gnu.org ([208.118.235.92]:59132) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TimfH-0000Wy-8u for qemu-devel@nongnu.org; Wed, 12 Dec 2012 08:48:06 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TimfA-0003ru-Tk for qemu-devel@nongnu.org; Wed, 12 Dec 2012 08:47:59 -0500 Received: from mail-ie0-f170.google.com ([209.85.223.170]:64684) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TimfA-0003rq-Mv for qemu-devel@nongnu.org; Wed, 12 Dec 2012 08:47:52 -0500 Received: by mail-ie0-f170.google.com with SMTP id k10so1815435iea.15 for ; Wed, 12 Dec 2012 05:47:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=NpTuKMi5sKJi2B1jADt9uGclMQBtx1XWb30TjBn5etE=; b=Sxs2Fg+r1mi8Lsx2WVjiArmT/c+AJMqfoPdrN+zqhXXu5oNKt4If4BoB5Xyw8dS1Fb mNDYvROdQ3PW+j+PvyltfwVfLRQS0+pC7HloWHqXyO1BIXbnwiOATYkrDzCg70+YqwRE SNNYGTzeK63Iuw2+CP0eTOBDcfKUCleuWqX6eowhOGyW/8BemtouvG1nBmtHczTcfgIh rG/hxaf+heHJ8Ph5CQlY/JaLZBtHZmXtqY2g8JVyPmKuEWUWxBezkW3tcvYyLYTqqxN7 Od1H/0g2V6r/3YXgybT8NKJSN4IhqVOlTOM8TDTASbJuUmxzd3KpXDWcpbfTDZW0Csyo LM6w== Received: by 10.50.77.166 with SMTP id t6mr13432545igw.72.1355320072058; Wed, 12 Dec 2012 05:47:52 -0800 (PST) Received: from yakj.usersys.redhat.com (93-34-219-150.ip51.fastwebnet.it. [93.34.219.150]) by mx.google.com with ESMTPS id fv6sm1786818igc.17.2012.12.12.05.47.48 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 12 Dec 2012 05:47:50 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Wed, 12 Dec 2012 14:46:35 +0100 Message-Id: <1355319999-30627-17-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.0.1 In-Reply-To: <1355319999-30627-1-git-send-email-pbonzini@redhat.com> References: <1355319999-30627-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 209.85.223.170 Cc: kwolf@redhat.com, jcody@redhat.com, stefanha@redhat.com Subject: [Qemu-devel] [PATCH 16/20] block: split bdrv_enable_dirty_tracking and bdrv_disable_dirty_tracking X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Signed-off-by: Paolo Bonzini Reviewed-by: Eric Blake --- block-migration.c | 17 +++-------------- block.c | 22 +++++++++++----------- block.h | 3 ++- block/mirror.c | 4 ++-- 4 files changed, 18 insertions(+), 28 deletions(-) diff --git a/block-migration.c b/block-migration.c index 1e1d25e..bf995f5 100644 --- a/block-migration.c +++ b/block-migration.c @@ -260,15 +260,6 @@ static int mig_save_device_bulk(QEMUFile *f, BlkMigDevState *bmds) return (bmds->cur_sector >= total_sectors); } -static void set_dirty_tracking(int enable) -{ - BlkMigDevState *bmds; - - QSIMPLEQ_FOREACH(bmds, &block_mig_state.bmds_list, entry) { - bdrv_set_dirty_tracking(bmds->bs, enable ? BLOCK_SIZE : 0); - } -} - static void init_blk_migration_it(void *opaque, BlockDriverState *bs) { BlkMigDevState *bmds; @@ -289,6 +280,7 @@ static void init_blk_migration_it(void *opaque, BlockDriverState *bs) alloc_aio_bitmap(bmds); drive_get_ref(drive_get_by_blockdev(bs)); bdrv_set_in_use(bs, 1); + bdrv_enable_dirty_tracking(bs, BLOCK_SIZE); block_mig_state.total_sector_sum += sectors; @@ -527,10 +519,9 @@ static void blk_mig_cleanup(void) bdrv_drain_all(); - set_dirty_tracking(0); - while ((bmds = QSIMPLEQ_FIRST(&block_mig_state.bmds_list)) != NULL) { QSIMPLEQ_REMOVE_HEAD(&block_mig_state.bmds_list, entry); + bdrv_disable_dirty_tracking(bmds->bs); bdrv_set_in_use(bmds->bs, 0); drive_put_ref(drive_get_by_blockdev(bmds->bs)); g_free(bmds->aio_bitmap); @@ -556,10 +547,8 @@ static int block_save_setup(QEMUFile *f, void *opaque) DPRINTF("Enter save live setup submitted %d transferred %d\n", block_mig_state.submitted, block_mig_state.transferred); - init_blk_migration(f); - /* start track dirty blocks */ - set_dirty_tracking(1); + init_blk_migration(f); ret = flush_blks(f); if (ret) { diff --git a/block.c b/block.c index 09f9ca9..66e30aa 100644 --- a/block.c +++ b/block.c @@ -4220,22 +4220,22 @@ void *qemu_blockalign(BlockDriverState *bs, size_t size) return qemu_memalign((bs && bs->buffer_alignment) ? bs->buffer_alignment : 512, size); } -void bdrv_set_dirty_tracking(BlockDriverState *bs, int granularity) +void bdrv_enable_dirty_tracking(BlockDriverState *bs, int granularity) { int64_t bitmap_size; assert((granularity & (granularity - 1)) == 0); + granularity >>= BDRV_SECTOR_BITS; + assert(!bs->dirty_bitmap); + bitmap_size = (bdrv_getlength(bs) >> BDRV_SECTOR_BITS); + bs->dirty_bitmap = hbitmap_alloc(bitmap_size, ffs(granularity) - 1); +} - if (granularity) { - granularity >>= BDRV_SECTOR_BITS; - assert(!bs->dirty_bitmap); - bitmap_size = (bdrv_getlength(bs) >> BDRV_SECTOR_BITS); - bs->dirty_bitmap = hbitmap_alloc(bitmap_size, ffs(granularity) - 1); - } else { - if (bs->dirty_bitmap) { - hbitmap_free(bs->dirty_bitmap); - bs->dirty_bitmap = NULL; - } +void bdrv_disable_dirty_tracking(BlockDriverState *bs) +{ + if (bs->dirty_bitmap) { + hbitmap_free(bs->dirty_bitmap); + bs->dirty_bitmap = NULL; } } diff --git a/block.h b/block.h index b57896a..78a39fb 100644 --- a/block.h +++ b/block.h @@ -355,7 +355,8 @@ void bdrv_set_buffer_alignment(BlockDriverState *bs, int align); void *qemu_blockalign(BlockDriverState *bs, size_t size); struct HBitmapIter; -void bdrv_set_dirty_tracking(BlockDriverState *bs, int granularity); +void bdrv_enable_dirty_tracking(BlockDriverState *bs, int granularity); +void bdrv_disable_dirty_tracking(BlockDriverState *bs); int bdrv_get_dirty(BlockDriverState *bs, int64_t sector); void bdrv_set_dirty(BlockDriverState *bs, int64_t cur_sector, int nr_sectors); void bdrv_reset_dirty(BlockDriverState *bs, int64_t cur_sector, int nr_sectors); diff --git a/block/mirror.c b/block/mirror.c index 23f87d2..99c5bd1 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -467,7 +467,7 @@ immediate_exit: g_free(s->buf); g_free(s->cow_bitmap); g_free(s->in_flight_bitmap); - bdrv_set_dirty_tracking(bs, 0); + bdrv_disable_dirty_tracking(bs); bdrv_iostatus_disable(s->target); if (s->should_complete && ret == 0) { if (bdrv_get_flags(s->target) != bdrv_get_flags(s->common.bs)) { @@ -570,7 +570,7 @@ void mirror_start(BlockDriverState *bs, BlockDriverState *target, s->granularity = granularity; s->buf_size = MAX(buf_size, granularity); - bdrv_set_dirty_tracking(bs, granularity); + bdrv_enable_dirty_tracking(bs, granularity); bdrv_set_enable_write_cache(s->target, true); bdrv_set_on_error(s->target, on_target_error, on_target_error); bdrv_iostatus_enable(s->target);