From: Max Reitz <mreitz@redhat.com>
To: Fam Zheng <famz@redhat.com>, qemu-devel@nongnu.org
Cc: kwolf@redhat.com,
Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>,
jsnow@redhat.com, qemu-block@nongnu.org
Subject: Re: [Qemu-devel] [PATCH v4 08/15] tests: Add test code for meta bitmap
Date: Fri, 11 Mar 2016 15:58:16 +0100 [thread overview]
Message-ID: <56E2DD08.1080907@redhat.com> (raw)
In-Reply-To: <1457412306-18940-9-git-send-email-famz@redhat.com>
[-- Attachment #1.1: Type: text/plain, Size: 6689 bytes --]
On 08.03.2016 05:44, Fam Zheng wrote:
> Signed-off-by: Fam Zheng <famz@redhat.com>
> Reviewed-by: John Snow <jsnow@redhat.com>
> ---
> tests/test-hbitmap.c | 116 +++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 116 insertions(+)
>
> diff --git a/tests/test-hbitmap.c b/tests/test-hbitmap.c
> index abe1427..c00c2b5 100644
> --- a/tests/test-hbitmap.c
> +++ b/tests/test-hbitmap.c
> @@ -12,6 +12,7 @@
> #include "qemu/osdep.h"
> #include <glib.h>
> #include "qemu/hbitmap.h"
> +#include "block/block.h"
>
> #define LOG_BITS_PER_LONG (BITS_PER_LONG == 32 ? 5 : 6)
>
> @@ -21,6 +22,7 @@
>
> typedef struct TestHBitmapData {
> HBitmap *hb;
> + HBitmap *meta;
> unsigned long *bits;
> size_t size;
> size_t old_size;
> @@ -92,6 +94,14 @@ static void hbitmap_test_init(TestHBitmapData *data,
> }
> }
>
> +static void hbitmap_test_init_meta(TestHBitmapData *data,
> + uint64_t size, int granularity,
> + int meta_chunk)
> +{
> + hbitmap_test_init(data, size, granularity);
> + data->meta = hbitmap_create_meta(data->hb, meta_chunk);
> +}
> +
> static inline size_t hbitmap_test_array_size(size_t bits)
> {
> size_t n = (bits + BITS_PER_LONG - 1) / BITS_PER_LONG;
> @@ -134,6 +144,9 @@ static void hbitmap_test_teardown(TestHBitmapData *data,
> const void *unused)
> {
> if (data->hb) {
> + if (data->meta) {
> + hbitmap_free_meta(data->hb);
> + }
> hbitmap_free(data->hb);
> data->hb = NULL;
> }
> @@ -635,6 +648,103 @@ static void test_hbitmap_truncate_shrink_large(TestHBitmapData *data,
> hbitmap_test_truncate(data, size, -diff, 0);
> }
>
> +static void hbitmap_check_meta(TestHBitmapData *data,
> + int64_t start, int count)
> +{
> + int64_t i;
> +
> + for (i = 0; i < data->size; i++) {
> + if (i >= start && i < start + count) {
> + g_assert(hbitmap_get(data->meta, i));
> + } else {
> + g_assert(!hbitmap_get(data->meta, i));
> + }
> + }
> +}
> +
> +static void hbitmap_test_meta(TestHBitmapData *data,
> + int64_t start, int count,
> + int64_t check_start, int check_count)
> +{
> + hbitmap_reset_all(data->hb);
> + hbitmap_reset_all(data->meta);
> +
> + /* Test "unset" -> "unset" will not update meta. */
> + hbitmap_reset(data->hb, start, count);
> + hbitmap_check_meta(data, 0, 0);
> +
> + /* Test "unset" -> "set" will update meta */
> + hbitmap_set(data->hb, start, count);
> + hbitmap_check_meta(data, check_start, check_count);
> +
> + /* Test "set" -> "set" will not update meta */
> + hbitmap_reset_all(data->meta);
> + hbitmap_set(data->hb, start, count);
> + hbitmap_check_meta(data, 0, 0);
Well, but if you'd do an hbitmap_set(data->hb, start, count + 1), then
it would update meta, right?
I forgot to mention in my reply to patch 7 that the check whether
anything in the range passed to hbitmap_set() has been changed in order
to determine whether all of that range should be set in the meta bitmap
seemed a bit excessive. I don't think this will hurt anyone, but still.
(So this is not a NACK, just a question.)
Max
> +
> + /* Test "set" -> "unset" will update meta */
> + hbitmap_reset_all(data->meta);
> + hbitmap_reset(data->hb, start, count);
> + hbitmap_check_meta(data, check_start, check_count);
> +}
> +
> +static void hbitmap_test_meta_do(TestHBitmapData *data, int chunk_size)
> +{
> + uint64_t size = chunk_size * 100;
> + hbitmap_test_init_meta(data, size, 0, chunk_size);
> +
> + hbitmap_test_meta(data, 0, 1, 0, chunk_size);
> + hbitmap_test_meta(data, 0, chunk_size, 0, chunk_size);
> + hbitmap_test_meta(data, chunk_size - 1, 1, 0, chunk_size);
> + hbitmap_test_meta(data, chunk_size - 1, 2, 0, chunk_size * 2);
> + hbitmap_test_meta(data, chunk_size - 1, chunk_size + 1, 0, chunk_size * 2);
> + hbitmap_test_meta(data, chunk_size - 1, chunk_size + 2, 0, chunk_size * 3);
> + hbitmap_test_meta(data, 7 * chunk_size - 1, chunk_size + 2,
> + 6 * chunk_size, chunk_size * 3);
> + hbitmap_test_meta(data, size - 1, 1, size - chunk_size, chunk_size);
> + hbitmap_test_meta(data, 0, size, 0, size);
> +}
> +
> +static void test_hbitmap_meta_byte(TestHBitmapData *data, const void *unused)
> +{
> + hbitmap_test_meta_do(data, BITS_PER_BYTE);
> +}
> +
> +static void test_hbitmap_meta_word(TestHBitmapData *data, const void *unused)
> +{
> + hbitmap_test_meta_do(data, BITS_PER_LONG);
> +}
> +
> +static void test_hbitmap_meta_sector(TestHBitmapData *data, const void *unused)
> +{
> + hbitmap_test_meta_do(data, BDRV_SECTOR_SIZE * BITS_PER_BYTE);
> +}
> +
> +/**
> + * Create an HBitmap and test set/unset.
> + */
> +static void test_hbitmap_meta_one(TestHBitmapData *data, const void *unused)
> +{
> + int i;
> + int64_t offsets[] = {
> + 0, 1, L1 - 1, L1, L1 + 1, L2 - 1, L2, L2 + 1, L3 - 1, L3, L3 + 1
> + };
> +
> + hbitmap_test_init_meta(data, L3 * 2, 0, 1);
> + for (i = 0; i < ARRAY_SIZE(offsets); i++) {
> + hbitmap_test_meta(data, offsets[i], 1, offsets[i], 1);
> + hbitmap_test_meta(data, offsets[i], L1, offsets[i], L1);
> + hbitmap_test_meta(data, offsets[i], L2, offsets[i], L2);
> + }
> +}
> +
> +static void test_hbitmap_meta_zero(TestHBitmapData *data, const void *unused)
> +{
> + hbitmap_test_init_meta(data, 0, 0, 1);
> +
> + hbitmap_check_meta(data, 0, 0);
> +}
> +
> static void hbitmap_test_add(const char *testpath,
> void (*test_func)(TestHBitmapData *data, const void *user_data))
> {
> @@ -684,6 +794,12 @@ int main(int argc, char **argv)
> test_hbitmap_truncate_grow_large);
> hbitmap_test_add("/hbitmap/truncate/shrink/large",
> test_hbitmap_truncate_shrink_large);
> +
> + hbitmap_test_add("/hbitmap/meta/zero", test_hbitmap_meta_zero);
> + hbitmap_test_add("/hbitmap/meta/one", test_hbitmap_meta_one);
> + hbitmap_test_add("/hbitmap/meta/byte", test_hbitmap_meta_byte);
> + hbitmap_test_add("/hbitmap/meta/word", test_hbitmap_meta_word);
> + hbitmap_test_add("/hbitmap/meta/sector", test_hbitmap_meta_sector);
> g_test_run();
>
> return 0;
>
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]
next prev parent reply other threads:[~2016-03-11 14:58 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-08 4:44 [Qemu-devel] [PATCH v4 00/15] Dirty bitmap changes for migration/persistence work Fam Zheng
2016-03-08 4:44 ` [Qemu-devel] [PATCH v4 01/15] backup: Use Bitmap to replace "s->bitmap" Fam Zheng
2016-03-08 4:44 ` [Qemu-devel] [PATCH v4 02/15] block: Include hbitmap.h in block.h Fam Zheng
2016-03-08 4:44 ` [Qemu-devel] [PATCH v4 03/15] typedefs: Add BdrvDirtyBitmap Fam Zheng
2016-03-08 4:44 ` [Qemu-devel] [PATCH v4 04/15] block: Move block dirty bitmap code to separate files Fam Zheng
2016-03-08 4:44 ` [Qemu-devel] [PATCH v4 05/15] block: Remove unused typedef of BlockDriverDirtyHandler Fam Zheng
2016-03-08 4:44 ` [Qemu-devel] [PATCH v4 06/15] block: Hide HBitmap in block dirty bitmap interface Fam Zheng
2016-03-11 13:54 ` Max Reitz
2016-03-11 14:27 ` Max Reitz
2016-03-08 4:44 ` [Qemu-devel] [PATCH v4 07/15] HBitmap: Introduce "meta" bitmap to track bit changes Fam Zheng
2016-03-11 14:48 ` Max Reitz
2016-03-08 4:44 ` [Qemu-devel] [PATCH v4 08/15] tests: Add test code for meta bitmap Fam Zheng
2016-03-11 14:58 ` Max Reitz [this message]
2016-06-03 2:38 ` Fam Zheng
2016-03-08 4:45 ` [Qemu-devel] [PATCH v4 09/15] block: Support meta dirty bitmap Fam Zheng
2016-03-11 15:17 ` Max Reitz
2016-06-03 2:42 ` Fam Zheng
2016-03-08 4:45 ` [Qemu-devel] [PATCH v4 10/15] block: Add two dirty bitmap getters Fam Zheng
2016-03-08 4:45 ` [Qemu-devel] [PATCH v4 11/15] block: Assert that bdrv_release_dirty_bitmap succeeded Fam Zheng
2016-03-11 15:25 ` Max Reitz
2016-03-08 4:45 ` [Qemu-devel] [PATCH v4 12/15] hbitmap: serialization Fam Zheng
2016-03-11 16:27 ` Max Reitz
2016-03-14 11:58 ` Vladimir Sementsov-Ogievskiy
2016-03-08 4:45 ` [Qemu-devel] [PATCH v4 13/15] block: BdrvDirtyBitmap serialization interface Fam Zheng
2016-03-08 4:45 ` [Qemu-devel] [PATCH v4 14/15] tests: Add test code for hbitmap serialization Fam Zheng
2016-03-08 4:45 ` [Qemu-devel] [PATCH v4 15/15] block: More operations for meta dirty bitmap Fam Zheng
2016-03-11 16:32 ` Max Reitz
2016-03-11 13:57 ` [Qemu-devel] [PATCH v4 00/15] Dirty bitmap changes for migration/persistence work Max Reitz
2016-03-11 19:30 ` John Snow
2016-05-25 14:45 ` Vladimir Sementsov-Ogievskiy
2016-05-26 0:47 ` Fam Zheng
2016-06-02 11:43 ` Vladimir Sementsov-Ogievskiy
2016-06-02 22:49 ` John Snow
2016-06-03 2:22 ` Fam Zheng
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=56E2DD08.1080907@redhat.com \
--to=mreitz@redhat.com \
--cc=famz@redhat.com \
--cc=jsnow@redhat.com \
--cc=kwolf@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=vsementsov@virtuozzo.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.