[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 40/45] block: allow customizing the granularity o
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH v2 40/45] block: allow customizing the granularity of the dirty bitmap |
Date: |
Wed, 26 Sep 2012 17:56:46 +0200 |
Signed-off-by: Paolo Bonzini <address@hidden>
---
v1->v2: change argument bdrv_set_dirty_tracking from sectors
to bytes.
block-migration.c | 5 +++--
block.c | 17 ++++++++++-------
block.h | 5 +----
block/mirror.c | 14 ++++----------
qapi-schema.json | 4 +++-
5 file modificati, 21 inserzioni(+), 24 rimozioni(-)
diff --git a/block-migration.c b/block-migration.c
index 07eafd3..d5f0669 100644
--- a/block-migration.c
+++ b/block-migration.c
@@ -23,7 +23,8 @@
#include "blockdev.h"
#include <assert.h>
-#define BLOCK_SIZE (BDRV_SECTORS_PER_DIRTY_CHUNK << BDRV_SECTOR_BITS)
+#define BLOCK_SIZE (1 << 20)
+#define BDRV_SECTORS_PER_DIRTY_CHUNK (BLOCK_SIZE >> BDRV_SECTOR_BITS)
#define BLK_MIG_FLAG_DEVICE_BLOCK 0x01
#define BLK_MIG_FLAG_EOS 0x02
@@ -264,7 +265,7 @@ 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);
+ bdrv_set_dirty_tracking(bmds->bs, enable ? BLOCK_SIZE : 0);
}
}
diff --git a/block.c b/block.c
index 6fe6491..b488c14 100644
--- a/block.c
+++ b/block.c
@@ -2670,6 +2670,8 @@ BlockInfo *bdrv_query_info(BlockDriverState *bs)
info->has_dirty = true;
info->dirty = g_malloc0(sizeof(*info->dirty));
info->dirty->count = bdrv_get_dirty_count(bs);
+ info->dirty->granularity =
+ ((int64_t) BDRV_SECTOR_SIZE <<
hbitmap_granularity(bs->dirty_bitmap));
}
if (bs->drv) {
@@ -4009,16 +4011,17 @@ 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 enable)
+void bdrv_set_dirty_tracking(BlockDriverState *bs, int granularity)
{
int64_t bitmap_size;
- if (enable) {
- if (!bs->dirty_bitmap) {
- bitmap_size = (bdrv_getlength(bs) >> BDRV_SECTOR_BITS);
- bs->dirty_bitmap = hbitmap_alloc(bitmap_size,
- BDRV_LOG_SECTORS_PER_DIRTY_CHUNK);
- }
+ assert((granularity & (granularity - 1)) == 0);
+
+ 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);
diff --git a/block.h b/block.h
index e586d67..b0985e2 100644
--- a/block.h
+++ b/block.h
@@ -348,11 +348,8 @@ int bdrv_img_create(const char *filename, const char *fmt,
void bdrv_set_buffer_alignment(BlockDriverState *bs, int align);
void *qemu_blockalign(BlockDriverState *bs, size_t size);
-#define BDRV_SECTORS_PER_DIRTY_CHUNK (1 <<
BDRV_LOG_SECTORS_PER_DIRTY_CHUNK)
-#define BDRV_LOG_SECTORS_PER_DIRTY_CHUNK 11
-
struct HBitmapIter;
-void bdrv_set_dirty_tracking(BlockDriverState *bs, int enable);
+void bdrv_set_dirty_tracking(BlockDriverState *bs, int granularity);
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 179406b..eba6259 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -17,14 +17,8 @@
#include "qemu/ratelimit.h"
#include "bitmap.h"
-enum {
- /*
- * Size of data buffer for populating the image file. This should be large
- * enough to process multiple clusters in a single call, so that populating
- * contiguous regions of the image is efficient.
- */
- BLOCK_SIZE = 512 * BDRV_SECTORS_PER_DIRTY_CHUNK, /* in bytes */
-};
+#define BLOCK_SIZE (1 << 20)
+#define BDRV_SECTORS_PER_DIRTY_CHUNK (BLOCK_SIZE >> BDRV_SECTOR_BITS)
#define SLICE_TIME 100000000ULL /* ns */
@@ -273,7 +267,7 @@ static void coroutine_fn mirror_run(void *opaque)
immediate_exit:
g_free(s->buf);
g_free(s->cow_bitmap);
- bdrv_set_dirty_tracking(bs, false);
+ bdrv_set_dirty_tracking(bs, 0);
bdrv_iostatus_disable(s->target);
if (s->complete && ret == 0) {
bdrv_swap(s->target, s->common.bs);
@@ -358,7 +352,7 @@ void mirror_start(BlockDriverState *bs, BlockDriverState
*target,
s->mode = mode;
s->buf_size = BLOCK_SIZE;
- bdrv_set_dirty_tracking(bs, true);
+ bdrv_set_dirty_tracking(bs, BLOCK_SIZE);
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);
diff --git a/qapi-schema.json b/qapi-schema.json
index 2947206..dc28685 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -628,10 +628,12 @@
#
# @count: number of dirty sectors according to the dirty bitmap
#
+# @granularity: granularity of the dirty bitmap in bytes
+#
# Since: 1.3
##
{ 'type': 'BlockDirtyInfo',
- 'data': {'count': 'int'} }
+ 'data': {'count': 'int', 'granularity': 'int'} }
##
# @BlockInfo:
--
1.7.12
- [Qemu-devel] [PATCH v2 28/45] mirror: implement completion, (continued)
- [Qemu-devel] [PATCH v2 28/45] mirror: implement completion, Paolo Bonzini, 2012/09/26
- [Qemu-devel] [PATCH v2 15/45] stream: add on-error argument, Paolo Bonzini, 2012/09/26
- [Qemu-devel] [PATCH v2 30/45] iostatus: forward block_job_iostatus_reset to block job, Paolo Bonzini, 2012/09/26
- [Qemu-devel] [PATCH v2 31/45] mirror: add support for on-source-error/on-target-error, Paolo Bonzini, 2012/09/26
- [Qemu-devel] [PATCH v2 29/45] qemu-iotests: add mirroring test case, Paolo Bonzini, 2012/09/26
- [Qemu-devel] [PATCH v2 25/45] block: introduce BLOCK_JOB_READY event, Paolo Bonzini, 2012/09/26
- [Qemu-devel] [PATCH v2 40/45] block: allow customizing the granularity of the dirty bitmap,
Paolo Bonzini <=
- [Qemu-devel] [PATCH v2 33/45] qemu-iotests: add testcases for mirroring on-source-error/on-target-error, Paolo Bonzini, 2012/09/26
- Re: [Qemu-devel] [PATCH v2 00/45] Block job improvements for 1.3, Kevin Wolf, 2012/09/27