[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-block] [PATCH v22 19/30] qcow2: add persistent dirty bitmaps s
From: |
Max Reitz |
Subject: |
Re: [Qemu-block] [PATCH v22 19/30] qcow2: add persistent dirty bitmaps support |
Date: |
Fri, 30 Jun 2017 04:23:02 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.0 |
On 2017-06-30 04:18, Eric Blake wrote:
> On 06/28/2017 07:05 AM, Vladimir Sementsov-Ogievskiy wrote:
>> Store persistent dirty bitmaps in qcow2 image.
>>
>> Signed-off-by: Vladimir Sementsov-Ogievskiy <address@hidden>
>> Reviewed-by: Max Reitz <address@hidden>
>> ---
>> block/qcow2-bitmap.c | 475
>> +++++++++++++++++++++++++++++++++++++++++++++++++++
>> block/qcow2.c | 9 +
>> block/qcow2.h | 1 +
>> 3 files changed, 485 insertions(+)
>>
>
>> +
>> +/* store_bitmap_data()
>> + * Store bitmap to image, filling bitmap table accordingly.
>> + */
>> +static uint64_t *store_bitmap_data(BlockDriverState *bs,
>> + BdrvDirtyBitmap *bitmap,
>> + uint32_t *bitmap_table_size, Error
>> **errp)
>> +{
>> + int ret;
>> + BDRVQcow2State *s = bs->opaque;
>> + int64_t sector;
>> + uint64_t sbc;
>> + uint64_t bm_size = bdrv_dirty_bitmap_size(bitmap);
>
> This grabs the size (currently in sectors, although I plan to fix it to
> be in bytes)...
>
>> + const char *bm_name = bdrv_dirty_bitmap_name(bitmap);
>> + uint8_t *buf = NULL;
>> + BdrvDirtyBitmapIter *dbi;
>> + uint64_t *tb;
>> + uint64_t tb_size =
>> + size_to_clusters(s,
>> + bdrv_dirty_bitmap_serialization_size(bitmap, 0, bm_size));
>
> ...then finds out how many bytes are required to serialize the entire
> image, where bm_size should be the same as before...
>
>> + while ((sector = bdrv_dirty_iter_next(dbi)) != -1) {
>> + uint64_t cluster = sector / sbc;
>> + uint64_t end, write_size;
>> + int64_t off;
>> +
>> + sector = cluster * sbc;
>> + end = MIN(bm_size, sector + sbc);
>> + write_size =
>> + bdrv_dirty_bitmap_serialization_size(bitmap, sector, end -
>> sector);
>
> But here, rather than tackling the entire image at once, you are
> subdividing your queries along arbitrary lines. But nowhere do I see a
> call to bdrv_dirty_bitmap_serialization_align() to make sure your
> end-sector value is properly aligned; if it is not aligned, you will
> trigger an assertion failure here...
It's 4:21 am here, so I cannot claim to be right, but if I remember
correctly, it will automatically aligned because sbc is the number of
bits (and thus sectors) a bitmap cluster covers.
>
>> + assert(write_size <= s->cluster_size);
>> +
>> + off = qcow2_alloc_clusters(bs, s->cluster_size);
>> + if (off < 0) {
>> + error_setg_errno(errp, -off,
>> + "Failed to allocate clusters for bitmap '%s'",
>> + bm_name);
>> + goto fail;
>> + }
>> + tb[cluster] = off;
>> +
>> + bdrv_dirty_bitmap_serialize_part(bitmap, buf, sector, end - sector);
>
> ...and again here, during serialization_chunk().
>
> I don't know if that means you need a v23 series, or if we can just
> patch it in as a followup (perhaps by having me add the usage during my
> byte-based dirty-bitmap series). I guess it depends on whether we can
> come up with any bitmap granularity (between 512 bytes and 2M is all the
> more we are currently supporting, right?) that differs from the qcow2
> cluster granularity in a manner that iteration by qcow2 clusters is no
> longer guaranteed to be bitmap-granularity aligned, and thus trigger an
> assertion failure on your code as-is.
>
> I also think it's pretty gross to be calculating the iteration bounds by
> sectors rather than bytes, when we are really worried about clusters
> (it's easier to track just bytes/clusters than it is to track
> bytes/sectors/clusters) - but that one is more along the lines of the
> sector-to-byte conversions I've been tackling, so I won't insist on you
> changing it if there is no other reason for a v23.
I'm for fixing it later. I would have announced the series "applied" an
hour ago if I hadn't had to bisect iotest 055 breakage...
Max
signature.asc
Description: OpenPGP digital signature
- [Qemu-block] [PATCH v22 27/30] block/dirty-bitmap: add bdrv_remove_persistent_dirty_bitmap, (continued)
- [Qemu-block] [PATCH v22 27/30] block/dirty-bitmap: add bdrv_remove_persistent_dirty_bitmap, Vladimir Sementsov-Ogievskiy, 2017/06/28
- [Qemu-block] [PATCH v22 28/30] qcow2: add .bdrv_remove_persistent_dirty_bitmap, Vladimir Sementsov-Ogievskiy, 2017/06/28
- [Qemu-block] [PATCH v22 25/30] qmp: add x-debug-block-dirty-bitmap-sha256, Vladimir Sementsov-Ogievskiy, 2017/06/28
- [Qemu-block] [PATCH v22 08/30] qcow2: add bitmaps extension, Vladimir Sementsov-Ogievskiy, 2017/06/28
- [Qemu-block] [PATCH v22 16/30] block: bdrv_close: release bitmaps after drv->bdrv_close, Vladimir Sementsov-Ogievskiy, 2017/06/28
- [Qemu-block] [PATCH v22 09/30] block/dirty-bitmap: fix comment for BlockDirtyBitmap.disabled field, Vladimir Sementsov-Ogievskiy, 2017/06/28
- [Qemu-block] [PATCH v22 01/30] specs/qcow2: fix bitmap granularity qemu-specific note, Vladimir Sementsov-Ogievskiy, 2017/06/28
- [Qemu-block] [PATCH v22 24/30] qmp: add autoload parameter to block-dirty-bitmap-add, Vladimir Sementsov-Ogievskiy, 2017/06/28
- [Qemu-block] [PATCH v22 19/30] qcow2: add persistent dirty bitmaps support, Vladimir Sementsov-Ogievskiy, 2017/06/28
[Qemu-block] [PATCH v22 22/30] qcow2: add .bdrv_can_store_new_dirty_bitmap, Vladimir Sementsov-Ogievskiy, 2017/06/28
[Qemu-block] [PATCH v22 07/30] qcow2-refcount: rename inc_refcounts() and make it public, Vladimir Sementsov-Ogievskiy, 2017/06/28
Re: [Qemu-block] [PATCH v22 00/30] qcow2: persistent dirty bitmaps, Paolo Bonzini, 2017/06/28
Re: [Qemu-block] [Qemu-devel] [PATCH v22 00/30] qcow2: persistent dirty bitmaps, John Snow, 2017/06/29
Re: [Qemu-block] [PATCH v22 00/30] qcow2: persistent dirty bitmaps, Max Reitz, 2017/06/29