[prev in list] [next in list] [prev in thread] [next in thread] 

List:       libvir-list
Subject:    Re: [RFC 04/15] qapi: block-job-change: make copy-mode parameter optional
From:       Vladimir Sementsov-Ogievskiy <vsementsov () yandex-team ! ru>
Date:       2024-03-28 10:56:35
Message-ID: 842e4bd6-a7e4-463c-b319-e959e1204943 () yandex-team ! ru
[Download RAW message or body]

On 28.03.24 12:24, Markus Armbruster wrote:
> Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> writes:
> 
> > We are going to add more parameters to change. We want to make possible
> > to change only one or any subset of available options. So all the
> > options should be optional.
> > 
> > Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
> > ---
> > block/mirror.c       | 5 +++++
> > qapi/block-core.json | 2 +-
> > 2 files changed, 6 insertions(+), 1 deletion(-)
> > 
> > diff --git a/block/mirror.c b/block/mirror.c
> > index a177502e4f..2d0cd22c06 100644
> > --- a/block/mirror.c
> > +++ b/block/mirror.c
> > @@ -1265,6 +1265,11 @@ static void mirror_change(BlockJob *job, JobChangeOptions \
> > *opts, 
> > GLOBAL_STATE_CODE();
> > 
> > +    if (!change_opts->has_copy_mode) {
> > +        /* Nothing to do */
> 
> I doubt the comment is useful.
> 
> > +        return;
> > +    }
> > +
> > if (qatomic_read(&s->copy_mode) == change_opts->copy_mode) {
> > return;
> > }
> 
> if (change_opts->copy_mode != MIRROR_COPY_MODE_WRITE_BLOCKING) {
> error_setg(errp, "Change to copy mode '%s' is not implemented",
> MirrorCopyMode_str(change_opts->copy_mode));
> return;
> }
> 
> current = qatomic_cmpxchg(&s->copy_mode, MIRROR_COPY_MODE_BACKGROUND,
> change_opts->copy_mode);
> if (current != MIRROR_COPY_MODE_BACKGROUND) {
> error_setg(errp, "Expected current copy mode '%s', got '%s'",
> MirrorCopyMode_str(MIRROR_COPY_MODE_BACKGROUND),
> MirrorCopyMode_str(current));
> }
> 
> Now I'm curious: what could be changing @copy_mode behind our backs
> here?
> 

For now - nothing. But it may be read from another thread, so it's declared as atomic \
access.

So, we can check it with qatomic_read() instead, check the value first, and write \
then with qatomic_set().

But, I think it would be extra optimization (if it is). The operation is not often, \
and cmpxchg looks like a correct way to conditionally change atomic variable (even \
being a bit too safe)	.

> > diff --git a/qapi/block-core.json b/qapi/block-core.json
> > index 67dd0ef038..6041e7bd8f 100644
> > --- a/qapi/block-core.json
> > +++ b/qapi/block-core.json
> > @@ -3071,7 +3071,7 @@
> ##
> # @BlockJobChangeOptionsMirror:
> #
> # @copy-mode: Switch to this copy mode.  Currently, only the switch
> #     from 'background' to 'write-blocking' is implemented.
> #
> > # Since: 8.2
> > ##
> > { 'struct': 'JobChangeOptionsMirror',
> > -  'data': { 'copy-mode' : 'MirrorCopyMode' } }
> > +  'data': { '*copy-mode' : 'MirrorCopyMode' } }
> > 
> > ##
> > # @JobChangeOptions:
> 
> A member becoming optional is backward compatible.  Okay.
> 
> We may want to document "(optional since 9.1)".  We haven't done so in
> the past.

Will do, I think it's useful.

> 
> The doc comment needs to spell out how absent members are handled.
> 

Will add.

-- 
Best regards,
Vladimir
_______________________________________________
Devel mailing list -- devel@lists.libvirt.org
To unsubscribe send an email to devel-leave@lists.libvirt.org


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic