[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC PATCH v2 07/14] job.c: move inner aiocontext lock in callbacks
From: |
Emanuele Giuseppe Esposito |
Subject: |
[RFC PATCH v2 07/14] job.c: move inner aiocontext lock in callbacks |
Date: |
Thu, 4 Nov 2021 10:53:27 -0400 |
Instead of having the lock in job_tnx_apply, move it inside
in the callback. This will be helpful for next commits, when
we introduce job_lock/unlock pairs.
job_transition_to_pending() and job_needs_finalize() do not
need to be protected by the aiocontext lock.
No functional change intended.
Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
---
job.c | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/job.c b/job.c
index ce5066522f..7856fa734b 100644
--- a/job.c
+++ b/job.c
@@ -170,7 +170,6 @@ static void job_txn_del_job(Job *job)
static int job_txn_apply(Job *job, int fn(Job *))
{
- AioContext *inner_ctx;
Job *other_job, *next;
JobTxn *txn = job->txn;
int rc = 0;
@@ -185,10 +184,7 @@ static int job_txn_apply(Job *job, int fn(Job *))
aio_context_release(job->aio_context);
QLIST_FOREACH_SAFE(other_job, &txn->jobs, txn_list, next) {
- inner_ctx = other_job->aio_context;
- aio_context_acquire(inner_ctx);
rc = fn(other_job);
- aio_context_release(inner_ctx);
if (rc) {
break;
}
@@ -820,11 +816,15 @@ static void job_clean(Job *job)
static int job_finalize_single(Job *job)
{
+ AioContext *ctx = job->aio_context;
+
assert(job_is_completed(job));
/* Ensure abort is called for late-transactional failures */
job_update_rc(job);
+ aio_context_acquire(ctx);
+
if (!job->ret) {
job_commit(job);
} else {
@@ -832,6 +832,8 @@ static int job_finalize_single(Job *job)
}
job_clean(job);
+ aio_context_release(ctx);
+
if (job->cb) {
job->cb(job->opaque, job->ret);
}
@@ -952,11 +954,16 @@ static void job_completed_txn_abort(Job *job)
static int job_prepare(Job *job)
{
+ AioContext *ctx = job->aio_context;
assert(qemu_in_main_thread());
+
if (job->ret == 0 && job->driver->prepare) {
+ aio_context_acquire(ctx);
job->ret = job->driver->prepare(job);
+ aio_context_release(ctx);
job_update_rc(job);
}
+
return job->ret;
}
--
2.27.0
- [RFC PATCH v2 00/14] job: replace AioContext lock with job_mutex, Emanuele Giuseppe Esposito, 2021/11/04
- [RFC PATCH v2 03/14] job.h: define locked functions, Emanuele Giuseppe Esposito, 2021/11/04
- [RFC PATCH v2 02/14] job.h: categorize fields in struct Job, Emanuele Giuseppe Esposito, 2021/11/04
- [RFC PATCH v2 01/14] job.c: make job_lock/unlock public, Emanuele Giuseppe Esposito, 2021/11/04
- [RFC PATCH v2 04/14] job.h: define unlocked functions, Emanuele Giuseppe Esposito, 2021/11/04
- [RFC PATCH v2 05/14] block/mirror.c: use of job helpers in drivers to avoid TOC/TOU, Emanuele Giuseppe Esposito, 2021/11/04
- [RFC PATCH v2 06/14] job.c: make job_event_* functions static, Emanuele Giuseppe Esposito, 2021/11/04
- [RFC PATCH v2 09/14] jobs: remove aiocontext locks since the functions are under BQL, Emanuele Giuseppe Esposito, 2021/11/04
- [RFC PATCH v2 08/14] aio-wait.h: introduce AIO_WAIT_WHILE_UNLOCKED, Emanuele Giuseppe Esposito, 2021/11/04
- [RFC PATCH v2 07/14] job.c: move inner aiocontext lock in callbacks,
Emanuele Giuseppe Esposito <=
- [RFC PATCH v2 11/14] block_job_query: remove atomic read, Emanuele Giuseppe Esposito, 2021/11/04
- [RFC PATCH v2 12/14] jobs: use job locks and helpers also in the unit tests, Emanuele Giuseppe Esposito, 2021/11/04
- [RFC PATCH v2 14/14] job.c: enable job lock/unlock and remove Aiocontext locks, Emanuele Giuseppe Esposito, 2021/11/04
- [RFC PATCH v2 10/14] jobs: protect jobs with job_lock/unlock, Emanuele Giuseppe Esposito, 2021/11/04
- [RFC PATCH v2 13/14] jobs: add job lock in find_* functions, Emanuele Giuseppe Esposito, 2021/11/04