All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
To: John Snow <jsnow@redhat.com>,
	qemu-block@nongnu.org, qemu-devel@nongnu.org, famz@redhat.com
Cc: kwolf@redhat.com, peter.maydell@linaro.org, lirans@il.ibm.com,
	quintela@redhat.com, armbru@redhat.com, mreitz@redhat.com,
	stefanha@redhat.com, den@openvz.org, amit.shah@redhat.com,
	pbonzini@redhat.com, dgilbert@redhat.com
Subject: Re: [Qemu-devel] [PATCH v8 04/14] block/dirty-bitmap: add bdrv_dirty_bitmap_set_frozen
Date: Fri, 17 Nov 2017 17:46:58 +0300	[thread overview]
Message-ID: <fac1abb3-f783-ec93-3a60-13dbd666d26e@virtuozzo.com> (raw)
In-Reply-To: <a593e984-5d1e-a95c-9b80-dbe82227b8f9@redhat.com>

14.11.2017 02:32, John Snow wrote:
>
> On 10/30/2017 12:32 PM, Vladimir Sementsov-Ogievskiy wrote:
>> Make it possible to set bitmap 'frozen' without a successor.
>> This is needed to protect the bitmap during outgoing bitmap postcopy
>> migration.
>>
>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>> ---
>>   include/block/dirty-bitmap.h |  1 +
>>   block/dirty-bitmap.c         | 22 ++++++++++++++++++++--
>>   2 files changed, 21 insertions(+), 2 deletions(-)
>>
>> diff --git a/include/block/dirty-bitmap.h b/include/block/dirty-bitmap.h
>> index a9e2a92e4f..ae6d697850 100644
>> --- a/include/block/dirty-bitmap.h
>> +++ b/include/block/dirty-bitmap.h
>> @@ -39,6 +39,7 @@ uint32_t bdrv_get_default_bitmap_granularity(BlockDriverState *bs);
>>   uint32_t bdrv_dirty_bitmap_granularity(const BdrvDirtyBitmap *bitmap);
>>   bool bdrv_dirty_bitmap_enabled(BdrvDirtyBitmap *bitmap);
>>   bool bdrv_dirty_bitmap_frozen(BdrvDirtyBitmap *bitmap);
>> +void bdrv_dirty_bitmap_set_frozen(BdrvDirtyBitmap *bitmap, bool frozen);
>>   const char *bdrv_dirty_bitmap_name(const BdrvDirtyBitmap *bitmap);
>>   int64_t bdrv_dirty_bitmap_size(const BdrvDirtyBitmap *bitmap);
>>   DirtyBitmapStatus bdrv_dirty_bitmap_status(BdrvDirtyBitmap *bitmap);
>> diff --git a/block/dirty-bitmap.c b/block/dirty-bitmap.c
>> index 7578863aa1..67fc6bd6e0 100644
>> --- a/block/dirty-bitmap.c
>> +++ b/block/dirty-bitmap.c
>> @@ -40,6 +40,8 @@ struct BdrvDirtyBitmap {
>>       QemuMutex *mutex;
>>       HBitmap *bitmap;            /* Dirty bitmap implementation */
>>       HBitmap *meta;              /* Meta dirty bitmap */
>> +    bool frozen;                /* Bitmap is frozen, it can't be modified
>> +                                   through QMP */
> I hesitate, because this now means that we have two independent bits of
> state we need to update and maintain consistency with.

it was your proposal)))

https://lists.gnu.org/archive/html/qemu-devel/2017-07/msg01172.html

"
Your new use case here sounds like Frozen to me, but it simply does not
have an anonymous successor to force it to be recognized as "frozen." We
can add a `bool protected` or `bool frozen` field to force recognition
of this status and adjust the json documentation accordingly.

I think then we'd have four recognized states:

FROZEN: Cannot be reset/deleted. Bitmap is in-use by a block job or
other internal process. Bitmap is otherwise ACTIVE.
DISABLED: Not recording any writes (by choice.)
READONLY: Not able to record any writes (by necessity.)
ACTIVE: Normal bitmap status.

Sound right?
"


>
> Before:
>
> Frozen: "Bitmap has a successor and is no longer itself recording
> writes, though we are guaranteed to have a successor doing so on our
> behalf."
>
> After:
>
> Frozen: "Bitmap may or may not have a successor, but it is disabled with
> an even more limited subset of tasks than a traditionally disabled bitmap."
>
> This changes the meaning of "frozen" a little, and I am not sure that is
> a problem as such, but it does make the interface seem a little
> "fuzzier" than it did prior.
>
>>       BdrvDirtyBitmap *successor; /* Anonymous child; implies frozen status */
>>       char *name;                 /* Optional non-empty unique ID */
>>       int64_t size;               /* Size of the bitmap, in bytes */
>> @@ -183,13 +185,22 @@ const char *bdrv_dirty_bitmap_name(const BdrvDirtyBitmap *bitmap)
>>   /* Called with BQL taken.  */
>>   bool bdrv_dirty_bitmap_frozen(BdrvDirtyBitmap *bitmap)
>>   {
>> -    return bitmap->successor;
>> +    return bitmap->frozen;
>> +}
> Are there any cases where we will be unfrozen, but actually have a
> successor now? If so, under what circumstances does that happen?
>
>> +
>> +/* Called with BQL taken.  */
>> +void bdrv_dirty_bitmap_set_frozen(BdrvDirtyBitmap *bitmap, bool frozen)
>> +{
>> +    qemu_mutex_lock(bitmap->mutex);
>> +    assert(bitmap->successor == NULL);
>> +    bitmap->frozen = frozen;
>> +    qemu_mutex_unlock(bitmap->mutex);
>>   }
>>   
> OK, so we can only "set frozen" (or unset) if we don't have a successor.
>
>>   /* Called with BQL taken.  */
>>   bool bdrv_dirty_bitmap_enabled(BdrvDirtyBitmap *bitmap)
>>   {
>> -    return !(bitmap->disabled || bitmap->successor);
>> +    return !(bitmap->disabled || (bitmap->successor != NULL));
>>   }
>>   
> I guess this just makes 'successor' more obviously non-boolean, which is
> fine.
>
>>   /* Called with BQL taken.  */
>> @@ -234,6 +245,7 @@ int bdrv_dirty_bitmap_create_successor(BlockDriverState *bs,
>>   
>>       /* Install the successor and freeze the parent */
>>       bitmap->successor = child;
>> +    bitmap->frozen = true;
>>       return 0;
>>   }
>>   
>> @@ -266,6 +278,8 @@ BdrvDirtyBitmap *bdrv_dirty_bitmap_abdicate(BlockDriverState *bs,
>>       name = bitmap->name;
>>       bitmap->name = NULL;
>>       successor->name = name;
>> +    assert(bitmap->frozen);
>> +    bitmap->frozen = false;
>>       bitmap->successor = NULL;
>>       successor->persistent = bitmap->persistent;
>>       bitmap->persistent = false;
>> @@ -298,6 +312,8 @@ BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap(BlockDriverState *bs,
>>           return NULL;
>>       }
>>       bdrv_release_dirty_bitmap(bs, successor);
>> +    assert(parent->frozen);
>> +    parent->frozen = false;
>>       parent->successor = NULL;
>>   
>>       return parent;
>> @@ -439,6 +455,8 @@ void bdrv_dirty_bitmap_release_successor(BlockDriverState *bs,
>>   
>>       if (parent->successor) {
>>           bdrv_release_dirty_bitmap_locked(bs, parent->successor);
>> +        assert(parent->frozen);
>> +        parent->frozen = false;
>>           parent->successor = NULL;
>>       }
>>   
>>
> Tentatively:
>
> Reviewed-by: John Snow <jsnow@redhat.com>
>
> Fam, any thoughts?
>
> --John


-- 
Best regards,
Vladimir

  reply	other threads:[~2017-11-17 14:47 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-10-30 16:32 [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration Vladimir Sementsov-Ogievskiy
2017-10-30 16:32 ` [Qemu-devel] [PATCH v8 01/14] block/dirty-bitmap: add bdrv_dirty_bitmap_enable_successor() Vladimir Sementsov-Ogievskiy
2017-11-10  0:47   ` John Snow
2017-10-30 16:32 ` [Qemu-devel] [PATCH v8 02/14] block/dirty-bitmap: add locked version of bdrv_release_dirty_bitmap Vladimir Sementsov-Ogievskiy
2017-11-10 22:52   ` John Snow
2017-11-16  8:56     ` Vladimir Sementsov-Ogievskiy
2017-11-16 18:18       ` John Snow
2017-11-17  8:07     ` Vladimir Sementsov-Ogievskiy
2017-11-17 18:25       ` John Snow
2017-11-20  9:30         ` Vladimir Sementsov-Ogievskiy
2017-10-30 16:32 ` [Qemu-devel] [PATCH v8 03/14] block/dirty-bitmap: add bdrv_dirty_bitmap_release_successor Vladimir Sementsov-Ogievskiy
2017-11-13 22:17   ` John Snow
2017-10-30 16:32 ` [Qemu-devel] [PATCH v8 04/14] block/dirty-bitmap: add bdrv_dirty_bitmap_set_frozen Vladimir Sementsov-Ogievskiy
2017-11-13 23:32   ` John Snow
2017-11-17 14:46     ` Vladimir Sementsov-Ogievskiy [this message]
2017-11-17 17:20       ` John Snow
2017-11-17 17:30         ` Vladimir Sementsov-Ogievskiy
2017-11-17 23:46           ` John Snow
2017-11-20  9:40             ` Vladimir Sementsov-Ogievskiy
2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 05/14] migration: introduce postcopy-only pending Vladimir Sementsov-Ogievskiy
2017-10-30 17:31   ` Dr. David Alan Gilbert
2017-10-30 18:17     ` Vladimir Sementsov-Ogievskiy
2017-10-30 18:19   ` [Qemu-devel] [PATCH v8.1 " Vladimir Sementsov-Ogievskiy
2017-11-14  0:09     ` John Snow
2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 06/14] qapi: add dirty-bitmaps migration capability Vladimir Sementsov-Ogievskiy
2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 07/14] migration: include migrate_dirty_bitmaps in migrate_postcopy Vladimir Sementsov-Ogievskiy
2017-11-14  0:19   ` John Snow
2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 08/14] migration/qemu-file: add qemu_put_counted_string() Vladimir Sementsov-Ogievskiy
2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 09/14] migration: add is_active_iterate handler Vladimir Sementsov-Ogievskiy
2017-11-14  0:29   ` John Snow
2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 10/14] migration: add postcopy migration of dirty bitmaps Vladimir Sementsov-Ogievskiy
2017-11-15  1:58   ` John Snow
2017-11-16 10:24     ` Vladimir Sementsov-Ogievskiy
2017-11-17  0:36       ` John Snow
2017-11-17  0:47       ` John Snow
2017-11-16 16:50     ` Dr. David Alan Gilbert
2017-11-17  1:27       ` John Snow
2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 11/14] iotests: add default node-name Vladimir Sementsov-Ogievskiy
2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 12/14] iotests: add dirty bitmap migration test Vladimir Sementsov-Ogievskiy
2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 13/14] iotests: add dirty bitmap postcopy test Vladimir Sementsov-Ogievskiy
2017-10-30 16:33 ` [Qemu-devel] [PATCH v8 14/14] iotests: add persistent bitmap migration test Vladimir Sementsov-Ogievskiy
2017-10-30 16:54 ` [Qemu-devel] [PATCH v8 00/14] Dirty bitmaps postcopy migration no-reply
2017-10-30 16:55 ` no-reply
2017-10-30 18:22 ` Vladimir Sementsov-Ogievskiy

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=fac1abb3-f783-ec93-3a60-13dbd666d26e@virtuozzo.com \
    --to=vsementsov@virtuozzo.com \
    --cc=amit.shah@redhat.com \
    --cc=armbru@redhat.com \
    --cc=den@openvz.org \
    --cc=dgilbert@redhat.com \
    --cc=famz@redhat.com \
    --cc=jsnow@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=lirans@il.ibm.com \
    --cc=mreitz@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --cc=stefanha@redhat.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.