All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: Emanuele Giuseppe Esposito <eesposit@redhat.com>
Cc: qemu-block@nongnu.org, Hanna Reitz <hreitz@redhat.com>,
	Paolo Bonzini <pbonzini@redhat.com>, John Snow <jsnow@redhat.com>,
	Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>,
	Wen Congyang <wencongyang2@huawei.com>,
	Xie Changlong <xiechanglong.d@gmail.com>,
	Markus Armbruster <armbru@redhat.com>,
	Stefan Hajnoczi <stefanha@redhat.com>, Fam Zheng <fam@euphon.net>,
	qemu-devel@nongnu.org,
	Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
Subject: Re: [PATCH v12 16/21] blockjob: protect iostatus field in BlockJob struct
Date: Thu, 6 Oct 2022 18:48:26 +0200	[thread overview]
Message-ID: <Yz8G2kWGcs+i7lXc@redhat.com> (raw)
In-Reply-To: <20220926093214.506243-17-eesposit@redhat.com>

Am 26.09.2022 um 11:32 hat Emanuele Giuseppe Esposito geschrieben:
> iostatus is the only field (together with .job) that needs
> protection using the job mutex.
> 
> It is set in the main loop (GLOBAL_STATE functions) but read
> in I/O code (block_job_error_action).
> 
> In order to protect it, change block_job_iostatus_set_err
> to block_job_iostatus_set_err_locked(), always called under
> job lock.
> 
> Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
> Reviewed-by: Kevin Wolf <kwolf@redhat.com>
> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
> ---
>  block/mirror.c | 7 +++++--
>  blockjob.c     | 5 +++--
>  2 files changed, 8 insertions(+), 4 deletions(-)
> 
> diff --git a/block/mirror.c b/block/mirror.c
> index c6bf7f40ce..7e32ee1d31 100644
> --- a/block/mirror.c
> +++ b/block/mirror.c
> @@ -893,7 +893,7 @@ static int coroutine_fn mirror_run(Job *job, Error **errp)
>      MirrorBlockJob *s = container_of(job, MirrorBlockJob, common.job);
>      BlockDriverState *bs = s->mirror_top_bs->backing->bs;
>      BlockDriverState *target_bs = blk_bs(s->target);
> -    bool need_drain = true;
> +    bool need_drain = true, iostatus;

iostatus isn't really a bool, it's BlockDeviceIoStatus.

>      int64_t length;
>      int64_t target_length;
>      BlockDriverInfo bdi;
> @@ -1016,8 +1016,11 @@ static int coroutine_fn mirror_run(Job *job, Error **errp)
>           * We do so every BLKOCK_JOB_SLICE_TIME nanoseconds, or when there is
>           * an error, or when the source is clean, whichever comes first. */
>          delta = qemu_clock_get_ns(QEMU_CLOCK_REALTIME) - s->last_pause_ns;
> +        WITH_JOB_LOCK_GUARD() {
> +            iostatus = s->common.iostatus;
> +        }
>          if (delta < BLOCK_JOB_SLICE_TIME &&
> -            s->common.iostatus == BLOCK_DEVICE_IO_STATUS_OK) {
> +            iostatus == BLOCK_DEVICE_IO_STATUS_OK) {

Your code actually happens to work because the one value that you
compare it against is BLOCK_DEVICE_IO_STATUS_OK, which is 0, so it maps
to false and everything else to true, but... it's still not right. :-)

>              if (s->in_flight >= MAX_IN_FLIGHT || s->buf_free_count == 0 ||
>                  (cnt == 0 && s->in_flight > 0)) {
>                  trace_mirror_yield(s, cnt, s->buf_free_count, s->in_flight);

Kevin



  reply	other threads:[~2022-10-06 18:13 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-26  9:31 [PATCH v12 00/21] job: replace AioContext lock with job_mutex Emanuele Giuseppe Esposito
2022-09-26  9:31 ` [PATCH v12 01/21] job.c: make job_mutex and job_lock/unlock() public Emanuele Giuseppe Esposito
2022-09-26  9:31 ` [PATCH v12 02/21] job.h: categorize fields in struct Job Emanuele Giuseppe Esposito
2022-09-26  9:31 ` [PATCH v12 03/21] job.c: API functions not used outside should be static Emanuele Giuseppe Esposito
2022-09-26  9:31 ` [PATCH v12 04/21] aio-wait.h: introduce AIO_WAIT_WHILE_UNLOCKED Emanuele Giuseppe Esposito
2022-09-26  9:31 ` [PATCH v12 05/21] job.c: add job_lock/unlock while keeping job.h intact Emanuele Giuseppe Esposito
2022-09-26  9:31 ` [PATCH v12 06/21] job: move and update comments from blockjob.c Emanuele Giuseppe Esposito
2022-09-26  9:32 ` [PATCH v12 07/21] blockjob: introduce block_job _locked() APIs Emanuele Giuseppe Esposito
2022-09-26  9:32 ` [PATCH v12 08/21] jobs: add job lock in find_* functions Emanuele Giuseppe Esposito
2022-09-26  9:32 ` [PATCH v12 09/21] jobs: use job locks also in the unit tests Emanuele Giuseppe Esposito
2022-09-26  9:32 ` [PATCH v12 10/21] block/mirror.c: use of job helpers in drivers Emanuele Giuseppe Esposito
2022-09-26  9:32 ` [PATCH v12 11/21] jobs: group together API calls under the same job lock Emanuele Giuseppe Esposito
2022-09-26  9:32 ` [PATCH v12 12/21] job: detect change of aiocontext within job coroutine Emanuele Giuseppe Esposito
2022-09-26  9:32 ` [PATCH v12 13/21] jobs: protect job.aio_context with BQL and job_mutex Emanuele Giuseppe Esposito
2022-09-26 11:53   ` Vladimir Sementsov-Ogievskiy
2022-09-26  9:32 ` [PATCH v12 14/21] blockjob.h: categorize fields in struct BlockJob Emanuele Giuseppe Esposito
2022-09-26  9:32 ` [PATCH v12 15/21] blockjob: rename notifier callbacks as _locked Emanuele Giuseppe Esposito
2022-09-26  9:32 ` [PATCH v12 16/21] blockjob: protect iostatus field in BlockJob struct Emanuele Giuseppe Esposito
2022-10-06 16:48   ` Kevin Wolf [this message]
2022-09-26  9:32 ` [PATCH v12 17/21] job.h: categorize JobDriver callbacks that need the AioContext lock Emanuele Giuseppe Esposito
2022-09-26  9:32 ` [PATCH v12 18/21] job.c: enable job lock/unlock and remove Aiocontext locks Emanuele Giuseppe Esposito
2022-09-26 12:24   ` Vladimir Sementsov-Ogievskiy
2022-09-26  9:32 ` [PATCH v12 19/21] block_job_query: remove atomic read Emanuele Giuseppe Esposito
2022-09-26  9:32 ` [PATCH v12 20/21] blockjob: remove unused functions Emanuele Giuseppe Esposito
2022-09-26  9:32 ` [PATCH v12 21/21] job: " Emanuele Giuseppe Esposito
2022-09-26 12:34   ` Vladimir Sementsov-Ogievskiy
2022-10-06 17:42 ` [PATCH v12 00/21] job: replace AioContext lock with job_mutex 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=Yz8G2kWGcs+i7lXc@redhat.com \
    --to=kwolf@redhat.com \
    --cc=armbru@redhat.com \
    --cc=eesposit@redhat.com \
    --cc=fam@euphon.net \
    --cc=hreitz@redhat.com \
    --cc=jsnow@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    --cc=vsementsov@virtuozzo.com \
    --cc=vsementsov@yandex-team.ru \
    --cc=wencongyang2@huawei.com \
    --cc=xiechanglong.d@gmail.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.