summaryrefslogtreecommitdiffstats
path: root/blockjob.c
diff options
context:
space:
mode:
authorEmanuele Giuseppe Esposito2022-09-26 11:32:06 +0200
committerKevin Wolf2022-10-07 12:11:41 +0200
commit3ed4f708fe12537066d21f3dd111af013f7a6b8c (patch)
tree356bc8ca58f2ba05692c3a7c117f95a91661d8a8 /blockjob.c
parentjob: detect change of aiocontext within job coroutine (diff)
downloadqemu-3ed4f708fe12537066d21f3dd111af013f7a6b8c.tar.gz
qemu-3ed4f708fe12537066d21f3dd111af013f7a6b8c.tar.xz
qemu-3ed4f708fe12537066d21f3dd111af013f7a6b8c.zip
jobs: protect job.aio_context with BQL and job_mutex
In order to make it thread safe, implement a "fake rwlock", where we allow reads under BQL *or* job_mutex held, but writes only under BQL *and* job_mutex. The only write we have is in child_job_set_aio_ctx, which always happens under drain (so the job is paused). For this reason, introduce job_set_aio_context and make sure that the context is set under BQL, job_mutex and drain. Also make sure all other places where the aiocontext is read are protected. The reads in commit.c and mirror.c are actually safe, because always done under BQL. Note: at this stage, job_{lock/unlock} and job lock guard macros are *nop*. Suggested-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> Message-Id: <20220926093214.506243-14-eesposit@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'blockjob.c')
-rw-r--r--blockjob.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/blockjob.c b/blockjob.c
index 96fb9d9f73..c8919cef9b 100644
--- a/blockjob.c
+++ b/blockjob.c
@@ -162,12 +162,13 @@ static void child_job_set_aio_ctx(BdrvChild *c, AioContext *ctx,
bdrv_set_aio_context_ignore(sibling->bs, ctx, ignore);
}
- job->job.aio_context = ctx;
+ job_set_aio_context(&job->job, ctx);
}
static AioContext *child_job_get_parent_aio_context(BdrvChild *c)
{
BlockJob *job = c->opaque;
+ GLOBAL_STATE_CODE();
return job->job.aio_context;
}