From patchwork Thu Sep 10 10:24:51 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liran Schour X-Patchwork-Id: 33311 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by bilbo.ozlabs.org (Postfix) with ESMTPS id 1DC09B7257 for ; Thu, 10 Sep 2009 21:16:44 +1000 (EST) Received: from localhost ([127.0.0.1]:58042 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Mlhdp-0000KG-7T for incoming@patchwork.ozlabs.org; Thu, 10 Sep 2009 07:16:41 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MlgQF-000563-An for qemu-devel@nongnu.org; Thu, 10 Sep 2009 05:58:35 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MlgQA-00055L-CS for qemu-devel@nongnu.org; Thu, 10 Sep 2009 05:58:35 -0400 Received: from [199.232.76.173] (port=44792 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MlgQA-00055I-7A for qemu-devel@nongnu.org; Thu, 10 Sep 2009 05:58:30 -0400 Received: from mtagate5.de.ibm.com ([195.212.17.165]:55903) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1MlgQ9-00086E-CK for qemu-devel@nongnu.org; Thu, 10 Sep 2009 05:58:29 -0400 Received: from d12nrmr1607.megacenter.de.ibm.com (d12nrmr1607.megacenter.de.ibm.com [9.149.167.49]) by mtagate5.de.ibm.com (8.13.1/8.13.1) with ESMTP id n8A9wRJL011881 for ; Thu, 10 Sep 2009 09:58:27 GMT Received: from d12av03.megacenter.de.ibm.com (d12av03.megacenter.de.ibm.com [9.149.165.213]) by d12nrmr1607.megacenter.de.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id n8A9wR7S2760722 for ; Thu, 10 Sep 2009 11:58:27 +0200 Received: from d12av03.megacenter.de.ibm.com (loopback [127.0.0.1]) by d12av03.megacenter.de.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id n8A9wRkB025559 for ; Thu, 10 Sep 2009 11:58:27 +0200 Received: from localhost.localdomain (im4-64s.haifa.ibm.com [9.148.27.41]) by d12av03.megacenter.de.ibm.com (8.12.11.20060308/8.12.11) with ESMTP id n8A9wQSR025552 for ; Thu, 10 Sep 2009 11:58:26 +0200 From: lirans@il.ibm.com To: qemu-devel@nongnu.org Date: Thu, 10 Sep 2009 13:24:51 +0300 Message-Id: <12525782911135-git-send-email-lirans@il.ibm.com> X-Mailer: git-send-email 1.5.2.4 X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6, seldom 2.4 (older, 4) Subject: [Qemu-devel] [PATCH 1/3] Expose a mechanisem to trace block writes X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org To support live migration without shared storage we need to be able to trace writes to disk while migrating. This Patch expose handler registration for above components to be notified about block writes. diff --git a/block.c b/block.c index cefbe77..b13da08 100644 --- a/block.c +++ b/block.c @@ -63,6 +63,8 @@ BlockDriverState *bdrv_first; static BlockDriver *first_drv; +static BlockDriverDirtyHandler *bdrv_dirty_handler = NULL; + int path_is_absolute(const char *path) { const char *p; @@ -613,6 +615,10 @@ int bdrv_write(BlockDriverState *bs, int64_t sector_num, if (bdrv_check_request(bs, sector_num, nb_sectors)) return -EIO; + if(bdrv_dirty_handler != NULL) { + bdrv_dirty_handler(bs, sector_num, nb_sectors); + } + return drv->bdrv_write(bs, sector_num, buf, nb_sectors); } @@ -1144,6 +1150,11 @@ int bdrv_write_compressed(BlockDriverState *bs, int64_t sector_num, return -ENOTSUP; if (bdrv_check_request(bs, sector_num, nb_sectors)) return -EIO; + + if(bdrv_dirty_handler != NULL) { + bdrv_dirty_handler(bs, sector_num, nb_sectors); + } + return drv->bdrv_write_compressed(bs, sector_num, buf, nb_sectors); } @@ -1338,7 +1349,11 @@ BlockDriverAIOCB *bdrv_aio_writev(BlockDriverState *bs, int64_t sector_num, return NULL; if (bdrv_check_request(bs, sector_num, nb_sectors)) return NULL; - + + if(bdrv_dirty_handler != NULL) { + bdrv_dirty_handler(bs, sector_num, nb_sectors); + } + ret = drv->bdrv_aio_writev(bs, sector_num, qiov, nb_sectors, cb, opaque); @@ -1632,6 +1647,17 @@ BlockDriverAIOCB *bdrv_aio_ioctl(BlockDriverState *bs, return NULL; } +void register_bdrv_dirty_tracking(BlockDriverDirtyHandler *dirty_handler) +{ + bdrv_dirty_handler = dirty_handler; +} + +void unregister_bdrv_dirty_tracking(void) +{ + bdrv_dirty_handler = NULL; +} + + void *qemu_blockalign(BlockDriverState *bs, size_t size) { return qemu_memalign((bs && bs->buffer_alignment) ? bs->buffer_alignment : 512, size); diff --git a/block.h b/block.h index 71e87fc..7f7db12 100644 --- a/block.h +++ b/block.h @@ -79,6 +79,8 @@ void bdrv_register(BlockDriver *bdrv); typedef struct BlockDriverAIOCB BlockDriverAIOCB; typedef void BlockDriverCompletionFunc(void *opaque, int ret); +typedef void BlockDriverDirtyHandler(BlockDriverState *bs, int64_t sector, + int sector_num); BlockDriverAIOCB *bdrv_aio_readv(BlockDriverState *bs, int64_t sector_num, QEMUIOVector *iov, int nb_sectors, BlockDriverCompletionFunc *cb, void *opaque); @@ -165,4 +167,7 @@ int bdrv_put_buffer(BlockDriverState *bs, const uint8_t *buf, int bdrv_get_buffer(BlockDriverState *bs, uint8_t *buf, int64_t pos, int size); +void register_bdrv_dirty_tracking(BlockDriverDirtyHandler *dirty_handler); +void unregister_bdrv_dirty_tracking(void); + #endif diff --git a/block_int.h b/block_int.h index 830b7e9..c066485 100644 --- a/block_int.h +++ b/block_int.h @@ -156,6 +156,7 @@ struct BlockDriverState { int cyls, heads, secs, translation; int type; char device_name[32]; + void *dirty_control; BlockDriverState *next; void *private; };