All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: Fiona Ebner <f.ebner@proxmox.com>
Cc: qemu-devel@nongnu.org, qemu-block@nongnu.org, armbru@redhat.com,
	eblake@redhat.com, hreitz@redhat.com, vsementsov@yandex-team.ru,
	jsnow@redhat.com, den@virtuozzo.com, t.lamprecht@proxmox.com,
	alexander.ivanov@virtuozzo.com
Subject: Re: [PATCH v3 5/9] mirror: implement mirror_change method
Date: Tue, 24 Oct 2023 13:04:49 +0200	[thread overview]
Message-ID: <ZTek0Qlg2KFFzY2e@redhat.com> (raw)
In-Reply-To: <e84fc767-e50c-4578-9640-44365c96f814@proxmox.com>

Am 23.10.2023 um 16:14 hat Fiona Ebner geschrieben:
> Am 23.10.23 um 14:59 schrieb Kevin Wolf:
> > Am 23.10.2023 um 13:37 hat Fiona Ebner geschrieben: 
> >>>> +    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));
> >>>> +    }
> >>>
> >>> The error path is strange. We return an error, but the new mode is still
> >>> set. On the other hand, this is probably also the old mode unless
> >>> someone added a new value to the enum, so it didn't actually change. And
> >>> because this function is the only place that changes copy_mode and we're
> >>> holding the BQL, the case can't even happen and this could be an
> >>> assertion.
> >>>
> >>
> >> AFAIU and testing seem to confirm this, the new mode is only set when
> >> the current mode is MIRROR_COPY_MODE_BACKGROUND. The error is only set
> >> when the current mode is not MIRROR_COPY_MODE_BACKGROUND and thus when
> >> the mode wasn't changed.
> > 
> > Yes, the new mode is only set when it was MIRROR_COPY_MODE_BACKGROUND,
> > that's the meaning of cmpxchg.
> > 
> > And now that I checked the return value of qatomic_cmpxchg(), it's not
> > the actual value, but it returns the second parameter (the expected old
> > value). As this is a constant in our call, that's what we'll always get
> > back. So the whole check is pointless, even as an assertion. It's
> > trivially true, and I expect it's even obvious enough for the compiler
> > that it might just optimise it away.
> > 
> 
> From testing, I can see that it returns the current value, not the
> second parameter. I.e. if I am in MIRROR_COPY_MODE_WRITE_BLOCKING, it
> will return MIRROR_COPY_MODE_WRITE_BLOCKING. (Of course, I have to
> comment out the other check to reach the cmpxchg call while in that mode).

You're right, I misread. Sorry for the noise.

> > Just qatomic_cmpxchg(&s->copy_mode, MIRROR_COPY_MODE_BACKGROUND,
> > change_opts->copy_mode); without using the (constant) result should be
> > enough.
> > 
> >> Adding a new copy mode shouldn't cause issues either? It's just not
> >> going to be supported to change away from that mode (or to that mode,
> >> because of the change_opts->copy_mode != MIRROR_COPY_MODE_WRITE_BLOCKING
> >> check above) without adapting the code first.
> > 
> > The checks above won't prevent NEW_MODE -> WRITE_BLOCKING. Of course,
> > the cmpxchg() won't actually do anything as long as we still have
> > BACKGROUND there as the expected old value. So in this case, QMP would
> > probably return success, but we would stay in NEW_MODE.
> > 
> 
> No, that's the whole point of the check. It would fail with the error,
> saying that it expected the current mode to be background and not the
> new mode.

Yes, this makes sense now.

> > That's different from what I thought (I didn't really realise that we
> > have a cmpxchg here and not just a xchg), but also not entirely right.
> > 
> > Of course, all of this is hypothetical. I'm not aware of any desire to
> > add a new copy mode.
> > 
> >> Of course, if we want to allow switching from active to background mode,
> >> the function needs to be adapted too.
> >>
> >> I wanted to make it more future-proof for the case where it might not be
> >> the only place changing the value and based it on what Vladimir
> >> suggested in the review of v2:
> >> https://lists.nongnu.org/archive/html/qemu-devel/2023-10/msg03552.html
> > 
> > As long as all of these places are GLOBAL_STATE_CODE(), we should be
> > fine. If we get iothread code that changes it, too, I think your code
> > becomes racy because the value could be changed by the iothread between
> > the first check if we already have the new value and the actual change.
> > 
> 
> Right, but I think the only issue would be if the mode changes from
> MIRROR_COPY_MODE_BACKGROUND to MIRROR_COPY_MODE_WRITE_BLOCKING between
> the checks, because then the QMP call would fail with the error that the
> mode was not the expected MIRROR_COPY_MODE_BACKGROUND. But arguably,
> that is still correct. If we are already in the requested mode at the
> time of the first check, we're fine.
> 
> Still, I'll add the GLOBAL_STATE_CODE() and a comment for the future :)

Thanks, sounds good.

Kevin



  reply	other threads:[~2023-10-24 11:06 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-10-13  9:21 [PATCH v3 0/9] mirror: allow switching from background to active mode Fiona Ebner
2023-10-13  9:21 ` [PATCH v3 1/9] blockjob: introduce block-job-change QMP command Fiona Ebner
2023-10-18 15:52   ` Kevin Wolf
2023-10-23  9:31     ` Fiona Ebner
2023-10-23 13:42       ` Kevin Wolf
2023-10-13  9:21 ` [PATCH v3 2/9] block/mirror: set actively_synced even after the job is ready Fiona Ebner
2023-10-13  9:21 ` [PATCH v3 3/9] block/mirror: move dirty bitmap to filter Fiona Ebner
2023-10-13  9:21 ` [PATCH v3 4/9] block/mirror: determine copy_to_target only once Fiona Ebner
2023-10-13  9:21 ` [PATCH v3 5/9] mirror: implement mirror_change method Fiona Ebner
2023-10-18  9:38   ` Markus Armbruster
2023-10-18 16:59   ` Kevin Wolf
2023-10-23 11:37     ` Fiona Ebner
2023-10-23 12:59       ` Kevin Wolf
2023-10-23 14:14         ` Fiona Ebner
2023-10-24 11:04           ` Kevin Wolf [this message]
2023-10-13  9:21 ` [PATCH v3 6/9] qapi/block-core: use JobType for BlockJobInfo's type Fiona Ebner
2023-10-18  9:37   ` Markus Armbruster
2023-10-13  9:21 ` [PATCH v3 7/9] qapi/block-core: turn BlockJobInfo into a union Fiona Ebner
2023-10-13  9:21 ` [PATCH v3 8/9] blockjob: query driver-specific info via a new 'query' driver method Fiona Ebner
2023-10-13  9:21 ` [PATCH v3 9/9] mirror: return mirror-specific information upon query Fiona Ebner
2023-10-18  9:41 ` [PATCH v3 0/9] mirror: allow switching from background to active mode Markus Armbruster
2023-10-18  9:45   ` Fiona Ebner
2023-11-03  9:37     ` Markus Armbruster
2023-10-19 13:36 ` Kevin Wolf
2023-10-23 11:39   ` Fiona Ebner
2023-10-25 12:27     ` Fiona Ebner
2023-10-25 15:20       ` Kevin Wolf

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=ZTek0Qlg2KFFzY2e@redhat.com \
    --to=kwolf@redhat.com \
    --cc=alexander.ivanov@virtuozzo.com \
    --cc=armbru@redhat.com \
    --cc=den@virtuozzo.com \
    --cc=eblake@redhat.com \
    --cc=f.ebner@proxmox.com \
    --cc=hreitz@redhat.com \
    --cc=jsnow@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=t.lamprecht@proxmox.com \
    --cc=vsementsov@yandex-team.ru \
    /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.