qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v5 1/3] multifd: Create property multifd-sync-after-each-sect


From: Markus Armbruster
Subject: Re: [PATCH v5 1/3] multifd: Create property multifd-sync-after-each-section
Date: Wed, 15 Feb 2023 13:06:43 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/28.2 (gnu/linux)

Juan Quintela <quintela@redhat.com> writes:

> Markus Armbruster <armbru@redhat.com> wrote:
>> Juan Quintela <quintela@redhat.com> writes:
>>
>>> We used to synchronize all channels at the end of each RAM section
>>> sent.  That is not needed, so preparing to only synchronize once every
>>> full round in latests patches.
>>>
>>> Notice that we initialize the property as true.  We will change the
>>> default when we introduce the new mechanism.
>>>
>>> Signed-off-by: Juan Quintela <quintela@redhat.com>
>>> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
>>> Signed-off-by: Juan Quintela <quintela@redhat.com>
>>>
>>> ---
>>>
>>> Rename each-iteration to after-each-section
>>>
>>> Signed-off-by: Juan Quintela <quintela@redhat.com>
>>> ---
>>>  qapi/migration.json   | 10 +++++++++-
>>>  migration/migration.h |  1 +
>>>  hw/core/machine.c     |  1 +
>>>  migration/migration.c | 15 +++++++++++++--
>>>  4 files changed, 24 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/qapi/migration.json b/qapi/migration.json
>>> index c84fa10e86..2907241b9c 100644
>>> --- a/qapi/migration.json
>>> +++ b/qapi/migration.json
>>> @@ -478,6 +478,13 @@
>>>  #                    should not affect the correctness of postcopy 
>>> migration.
>>>  #                    (since 7.1)
>>>  #
>>> +# @multifd-sync-after-each-section: Synchronize channels after each
>>> +#                                   section is sent.
>>
>> What does it mean to synchronize channels?
>>
>> When would I want to, and why?
>>
>>> +#                                                     We used to do
>>> +#                                   that in the past, but it is
>>> +#                                   suboptimal.
>>
>> This isn't particularly helpful, I'm afraid.
>>
>>> +#                                   Default value is true until all code 
>>> is in.
>>
>> As far as I can tell, it's actually *unused* for now, and a later patch
>> will put it to use ...
>
> We (well, libvert preffers) want capabilities to be false by default.
> When I introduce a new capability/parameter:
> - Patch1: I introduce the capability/parameter, it does nothing yet.
> - Patch2: I conditionalize the old code on this capability.
>           Default value is true (old code).
> - Patch3: I introduce the new code to implement the feature.
>           At this point I change the default.
>
> Depending on complexity, Patch2 and 3 can be a series, but you get the
> idea O:-)

I'm fine with this approach, as long as commit messages and comments
reflect reality :)

>>> +#                                   (since 8.0)
>
> Retry.  What about:
>
> # @multifd-sync-after-each-section: flush each channel after each
> #                                   section sent.  This assures that
> #                                   we can't mix pages from one
> #                                   iteration through the dirty bitmap
> #                                   with pages for the following
> #                                   iteration.  We really only need to
> #                                   do this flush after we have go
> #                                   trhough all the dirty bitmap.  For

s/trhough/through/

> #                                   historical reasons, we do that after
> #                                   each section.  This is suboptimal
> #                                   (we flush too many times).
> #                                   Default value is true until the code
> #                                   to implement it is in tree.
> #                                   (since 8.0)
>
>
> Better?

Yes, except the comment suggests value false does something, which isn't
true, yet.

Possible solutions:

1. Accept only configurations that work as advertized:

   Patch1: add code to reject value false with a suitable "not
   implemented" error message.  Since the behavior is temporary within a
   single series, documenting this feels optional.

   Patch2: no change.

   Patch3: drop the code rejecting false.

2. Document configurations that don't yet work as advertized:

   Patch1: doc comment states the capability is not yet implemented.

   Patch2: no change.

   Patch3: drop the comment.

No need to mess with documenting temporary default true in either case.

>>> +bool migrate_multifd_sync_after_each_section(void)
>>> +{
>>> +    MigrationState *s = migrate_get_current();
>>> +
>>> +    return true;
>>> +    // We will change this when code gets in.
>>> +    return 
>>> s->enabled_capabilities[MIGRATION_CAPABILITY_MULTIFD_SYNC_AFTER_EACH_SECTION];
>>
>> ... here.
>>
>> No warning about unreachable code?  Checking... nope, gcc seems to not
>> to care.
>
> Yeap.  Gcc thinks this is ok.
> In others try's I have done:
>
>     return true || 
> s->enabled_capabilities[MIGRATION_CAPABILITY_MULTIFD_SYNC_AFTER_EACH_SECTION];
>
> If you preffer I can change to this, not strong opinions.

Matter of taste, you pick what you like best.

I'd simply start with

      return true;              /* TODO implement */

and replace it with the real expression when its callers are ready for
it.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]