From: Emanuele Giuseppe Esposito <eesposit@redhat.com>
To: qemu-block@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>, Fam Zheng <fam@euphon.net>,
Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>,
Wen Congyang <wencongyang2@huawei.com>,
Xie Changlong <xiechanglong.d@gmail.com>,
Emanuele Giuseppe Esposito <eesposit@redhat.com>,
Markus Armbruster <armbru@redhat.com>,
qemu-devel@nongnu.org, Hanna Reitz <hreitz@redhat.com>,
Stefan Hajnoczi <stefanha@redhat.com>,
Paolo Bonzini <pbonzini@redhat.com>, John Snow <jsnow@redhat.com>
Subject: [PATCH v6 12/18] block_job: rename block_job functions called with job_mutex held
Date: Mon, 14 Mar 2022 09:37:01 -0400 [thread overview]
Message-ID: <20220314133707.2206082-13-eesposit@redhat.com> (raw)
In-Reply-To: <20220314133707.2206082-1-eesposit@redhat.com>
Just as for the job API, rename block_job functions that are
always called under job lock.
No functional change intended.
Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
---
block.c | 3 ++-
block/backup.c | 4 ++--
blockdev.c | 12 +++++++-----
blockjob.c | 39 ++++++++++++++++++++++-----------------
include/block/blockjob.h | 29 ++++++++++++++++++-----------
monitor/qmp-cmds.c | 5 +++--
qemu-img.c | 2 +-
7 files changed, 55 insertions(+), 39 deletions(-)
diff --git a/block.c b/block.c
index 9cf3416bea..23416b7fc7 100644
--- a/block.c
+++ b/block.c
@@ -6168,7 +6168,8 @@ XDbgBlockGraph *bdrv_get_xdbg_block_graph(Error **errp)
}
WITH_JOB_LOCK_GUARD() {
- for (job = block_job_next(NULL); job; job = block_job_next(job)) {
+ for (job = block_job_next_locked(NULL); job;
+ job = block_job_next_locked(job)) {
GSList *el;
xdbg_graph_add_node(gr, job, X_DBG_BLOCK_GRAPH_NODE_TYPE_BLOCK_JOB,
diff --git a/block/backup.c b/block/backup.c
index 5cfd0b999c..02e0f59ef1 100644
--- a/block/backup.c
+++ b/block/backup.c
@@ -316,8 +316,8 @@ static void coroutine_fn backup_set_speed(BlockJob *job, int64_t speed)
BackupBlockJob *s = container_of(job, BackupBlockJob, common);
/*
- * block_job_set_speed() is called first from block_job_create(), when we
- * don't yet have s->bcs.
+ * block_job_set_speed_locked() is called first from block_job_create(),
+ * when we don't yet have s->bcs.
*/
if (s->bcs) {
block_copy_set_speed(s->bcs, speed);
diff --git a/blockdev.c b/blockdev.c
index 1ac9dac1b0..9602401b03 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -152,7 +152,8 @@ void blockdev_mark_auto_del(BlockBackend *blk)
JOB_LOCK_GUARD();
- for (job = block_job_next(NULL); job; job = block_job_next(job)) {
+ for (job = block_job_next_locked(NULL); job;
+ job = block_job_next_locked(job)) {
if (block_job_has_bdrv(job, blk_bs(blk))) {
AioContext *aio_context = job->job.aio_context;
aio_context_acquire(aio_context);
@@ -3325,7 +3326,7 @@ static BlockJob *find_block_job_locked(const char *id,
*aio_context = NULL;
- job = block_job_get(id);
+ job = block_job_get_locked(id);
if (!job) {
error_set(errp, ERROR_CLASS_DEVICE_NOT_ACTIVE,
"Block job '%s' not found", id);
@@ -3350,7 +3351,7 @@ void qmp_block_job_set_speed(const char *device, int64_t speed, Error **errp)
return;
}
- block_job_set_speed(job, speed, errp);
+ block_job_set_speed_locked(job, speed, errp);
aio_context_release(aio_context);
}
@@ -3755,7 +3756,8 @@ BlockJobInfoList *qmp_query_block_jobs(Error **errp)
JOB_LOCK_GUARD();
- for (job = block_job_next(NULL); job; job = block_job_next(job)) {
+ for (job = block_job_next_locked(NULL); job;
+ job = block_job_next_locked(job)) {
BlockJobInfo *value;
AioContext *aio_context;
@@ -3764,7 +3766,7 @@ BlockJobInfoList *qmp_query_block_jobs(Error **errp)
}
aio_context = block_job_get_aio_context(job);
aio_context_acquire(aio_context);
- value = block_job_query(job, errp);
+ value = block_job_query_locked(job, errp);
aio_context_release(aio_context);
if (!value) {
qapi_free_BlockJobInfoList(head);
diff --git a/blockjob.c b/blockjob.c
index 02a98630c9..0745f4e745 100644
--- a/blockjob.c
+++ b/blockjob.c
@@ -59,7 +59,7 @@ static bool is_block_job(Job *job)
job_type(job) == JOB_TYPE_STREAM;
}
-BlockJob *block_job_next(BlockJob *bjob)
+BlockJob *block_job_next_locked(BlockJob *bjob)
{
Job *job = bjob ? &bjob->job : NULL;
GLOBAL_STATE_CODE();
@@ -71,7 +71,7 @@ BlockJob *block_job_next(BlockJob *bjob)
return job ? container_of(job, BlockJob, job) : NULL;
}
-BlockJob *block_job_get(const char *id)
+BlockJob *block_job_get_locked(const char *id)
{
Job *job = job_get_locked(id);
GLOBAL_STATE_CODE();
@@ -256,7 +256,8 @@ int block_job_add_bdrv(BlockJob *job, const char *name, BlockDriverState *bs,
return 0;
}
-static void block_job_on_idle(Notifier *n, void *opaque)
+/* Called with job_mutex lock held. */
+static void block_job_on_idle_locked(Notifier *n, void *opaque)
{
aio_wait_kick();
}
@@ -277,7 +278,7 @@ static bool job_timer_pending(Job *job)
return timer_pending(&job->sleep_timer);
}
-bool block_job_set_speed(BlockJob *job, int64_t speed, Error **errp)
+bool block_job_set_speed_locked(BlockJob *job, int64_t speed, Error **errp)
{
const BlockJobDriver *drv = block_job_driver(job);
int64_t old_speed = job->speed;
@@ -319,7 +320,7 @@ int64_t block_job_ratelimit_get_delay(BlockJob *job, uint64_t n)
return ratelimit_calculate_delay(&job->limit, n);
}
-BlockJobInfo *block_job_query(BlockJob *job, Error **errp)
+BlockJobInfo *block_job_query_locked(BlockJob *job, Error **errp)
{
BlockJobInfo *info;
uint64_t progress_current, progress_total;
@@ -364,7 +365,8 @@ static void block_job_iostatus_set_err(BlockJob *job, int error)
}
}
-static void block_job_event_cancelled(Notifier *n, void *opaque)
+/* Called with job_mutex lock held. */
+static void block_job_event_cancelled_locked(Notifier *n, void *opaque)
{
BlockJob *job = opaque;
uint64_t progress_current, progress_total;
@@ -383,7 +385,8 @@ static void block_job_event_cancelled(Notifier *n, void *opaque)
job->speed);
}
-static void block_job_event_completed(Notifier *n, void *opaque)
+/* Called with job_mutex lock held. */
+static void block_job_event_completed_locked(Notifier *n, void *opaque)
{
BlockJob *job = opaque;
const char *msg = NULL;
@@ -409,7 +412,8 @@ static void block_job_event_completed(Notifier *n, void *opaque)
msg);
}
-static void block_job_event_pending(Notifier *n, void *opaque)
+/* Called with job_mutex lock held. */
+static void block_job_event_pending_locked(Notifier *n, void *opaque)
{
BlockJob *job = opaque;
@@ -421,7 +425,8 @@ static void block_job_event_pending(Notifier *n, void *opaque)
job->job.id);
}
-static void block_job_event_ready(Notifier *n, void *opaque)
+/* Called with job_mutex lock held. */
+static void block_job_event_ready_locked(Notifier *n, void *opaque)
{
BlockJob *job = opaque;
uint64_t progress_current, progress_total;
@@ -471,11 +476,11 @@ void *block_job_create(const char *job_id, const BlockJobDriver *driver,
ratelimit_init(&job->limit);
- job->finalize_cancelled_notifier.notify = block_job_event_cancelled;
- job->finalize_completed_notifier.notify = block_job_event_completed;
- job->pending_notifier.notify = block_job_event_pending;
- job->ready_notifier.notify = block_job_event_ready;
- job->idle_notifier.notify = block_job_on_idle;
+ job->finalize_cancelled_notifier.notify = block_job_event_cancelled_locked;
+ job->finalize_completed_notifier.notify = block_job_event_completed_locked;
+ job->pending_notifier.notify = block_job_event_pending_locked;
+ job->ready_notifier.notify = block_job_event_ready_locked;
+ job->idle_notifier.notify = block_job_on_idle_locked;
WITH_JOB_LOCK_GUARD() {
notifier_list_add(&job->job.on_finalize_cancelled,
@@ -498,7 +503,7 @@ void *block_job_create(const char *job_id, const BlockJobDriver *driver,
bdrv_op_unblock(bs, BLOCK_OP_TYPE_DATAPLANE, job->blocker);
WITH_JOB_LOCK_GUARD() {
- ret = block_job_set_speed(job, speed, errp);
+ ret = block_job_set_speed_locked(job, speed, errp);
}
if (!ret) {
goto fail;
@@ -511,7 +516,7 @@ fail:
return NULL;
}
-void block_job_iostatus_reset(BlockJob *job)
+void block_job_iostatus_reset_locked(BlockJob *job)
{
GLOBAL_STATE_CODE();
if (job->iostatus == BLOCK_DEVICE_IO_STATUS_OK) {
@@ -526,7 +531,7 @@ void block_job_user_resume(Job *job)
BlockJob *bjob = container_of(job, BlockJob, job);
GLOBAL_STATE_CODE();
WITH_JOB_LOCK_GUARD() {
- block_job_iostatus_reset(bjob);
+ block_job_iostatus_reset_locked(bjob);
}
}
diff --git a/include/block/blockjob.h b/include/block/blockjob.h
index 6525e16fd5..000f5a1d21 100644
--- a/include/block/blockjob.h
+++ b/include/block/blockjob.h
@@ -46,7 +46,7 @@ typedef struct BlockJob {
/** Status that is published by the query-block-jobs QMP API */
BlockDeviceIoStatus iostatus;
- /** Speed that was set with @block_job_set_speed. */
+ /** Speed that was set with @block_job_set_speed_locked. */
int64_t speed;
/** Rate limiting data structure for implementing @speed. */
@@ -82,25 +82,27 @@ typedef struct BlockJob {
*/
/**
- * block_job_next:
+ * block_job_next_locked:
* @job: A block job, or %NULL.
*
* Get the next element from the list of block jobs after @job, or the
* first one if @job is %NULL.
*
* Returns the requested job, or %NULL if there are no more jobs left.
+ * Called with job_mutex lock held.
*/
-BlockJob *block_job_next(BlockJob *job);
+BlockJob *block_job_next_locked(BlockJob *job);
/**
- * block_job_get:
+ * block_job_get_locked:
* @id: The id of the block job.
*
* Get the block job identified by @id (which must not be %NULL).
*
* Returns the requested job, or %NULL if it doesn't exist.
+ * Called with job_mutex lock held.
*/
-BlockJob *block_job_get(const char *id);
+BlockJob *block_job_get_locked(const char *id);
/**
* block_job_add_bdrv:
@@ -135,32 +137,37 @@ void block_job_remove_all_bdrv(BlockJob *job);
bool block_job_has_bdrv(BlockJob *job, BlockDriverState *bs);
/**
- * block_job_set_speed:
+ * block_job_set_speed_locked:
* @job: The job to set the speed for.
* @speed: The new value
* @errp: Error object.
*
* Set a rate-limiting parameter for the job; the actual meaning may
* vary depending on the job type.
+ *
+ * Called with job_mutex lock held. May temporarly release the lock.
*/
-bool block_job_set_speed(BlockJob *job, int64_t speed, Error **errp);
+bool block_job_set_speed_locked(BlockJob *job, int64_t speed, Error **errp);
/**
- * block_job_query:
+ * block_job_query_locked:
* @job: The job to get information about.
*
* Return information about a job.
+ * Called with job_mutex lock held.
*/
-BlockJobInfo *block_job_query(BlockJob *job, Error **errp);
+BlockJobInfo *block_job_query_locked(BlockJob *job, Error **errp);
/**
- * block_job_iostatus_reset:
+ * block_job_iostatus_reset_locked:
* @job: The job whose I/O status should be reset.
*
* Reset I/O status on @job and on BlockDriverState objects it uses,
* other than job->blk.
+ *
+ * Called with job_mutex lock held.
*/
-void block_job_iostatus_reset(BlockJob *job);
+void block_job_iostatus_reset_locked(BlockJob *job);
/*
* block_job_get_aio_context:
diff --git a/monitor/qmp-cmds.c b/monitor/qmp-cmds.c
index 2bb41a8a41..95f482e34d 100644
--- a/monitor/qmp-cmds.c
+++ b/monitor/qmp-cmds.c
@@ -135,8 +135,9 @@ void qmp_cont(Error **errp)
}
WITH_JOB_LOCK_GUARD() {
- for (job = block_job_next(NULL); job; job = block_job_next(job)) {
- block_job_iostatus_reset(job);
+ for (job = block_job_next_locked(NULL); job;
+ job = block_job_next_locked(job)) {
+ block_job_iostatus_reset_locked(job);
}
}
diff --git a/qemu-img.c b/qemu-img.c
index 315c9c2a31..222c9fdf5c 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -1083,7 +1083,7 @@ static int img_commit(int argc, char **argv)
}
WITH_JOB_LOCK_GUARD() {
- job = block_job_get("commit");
+ job = block_job_get_locked("commit");
}
assert(job);
run_block_job(job, &local_err);
--
2.31.1
next prev parent reply other threads:[~2022-03-14 14:36 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-14 13:36 [PATCH v6 00/18] job: replace AioContext lock with job_mutex Emanuele Giuseppe Esposito
2022-03-14 13:36 ` [PATCH v6 01/18] job.c: make job_mutex and job_lock/unlock() public Emanuele Giuseppe Esposito
2022-03-14 13:36 ` [PATCH v6 02/18] job.h: categorize fields in struct Job Emanuele Giuseppe Esposito
2022-06-03 16:00 ` Kevin Wolf
2022-06-07 13:20 ` Emanuele Giuseppe Esposito
2022-06-07 15:41 ` Paolo Bonzini
2022-06-08 7:28 ` Emanuele Giuseppe Esposito
2022-03-14 13:36 ` [PATCH v6 03/18] job.c: API functions not used outside should be static Emanuele Giuseppe Esposito
2022-06-09 9:16 ` Stefan Hajnoczi
2022-03-14 13:36 ` [PATCH v6 04/18] aio-wait.h: introduce AIO_WAIT_WHILE_UNLOCKED Emanuele Giuseppe Esposito
2022-03-14 13:36 ` [PATCH v6 05/18] job.h: add _locked duplicates for job API functions called with and without job_mutex Emanuele Giuseppe Esposito
2022-06-03 16:17 ` Kevin Wolf
2022-06-07 13:23 ` Emanuele Giuseppe Esposito
2022-06-09 9:32 ` Stefan Hajnoczi
2022-03-14 13:36 ` [PATCH v6 06/18] jobs: protect jobs with job_lock/unlock Emanuele Giuseppe Esposito
2022-06-03 16:40 ` Kevin Wolf
2022-06-07 13:17 ` Emanuele Giuseppe Esposito
2022-03-14 13:36 ` [PATCH v6 07/18] jobs: add job lock in find_* functions Emanuele Giuseppe Esposito
2022-03-14 13:36 ` [PATCH v6 08/18] jobs: use job locks also in the unit tests Emanuele Giuseppe Esposito
2022-03-14 13:36 ` [PATCH v6 09/18] block/mirror.c: use of job helpers in drivers to avoid TOC/TOU Emanuele Giuseppe Esposito
2022-03-14 13:36 ` [PATCH v6 10/18] jobs: rename static functions called with job_mutex held Emanuele Giuseppe Esposito
2022-06-09 9:47 ` Stefan Hajnoczi
2022-03-14 13:37 ` [PATCH v6 11/18] job.h: rename job API " Emanuele Giuseppe Esposito
2022-06-09 9:48 ` Stefan Hajnoczi
2022-03-14 13:37 ` Emanuele Giuseppe Esposito [this message]
2022-06-09 9:47 ` [PATCH v6 12/18] block_job: rename block_job " Stefan Hajnoczi
2022-03-14 13:37 ` [PATCH v6 13/18] job.h: define unlocked functions Emanuele Giuseppe Esposito
2022-06-09 9:41 ` Stefan Hajnoczi
2022-03-14 13:37 ` [PATCH v6 14/18] commit and mirror: create new nodes using bdrv_get_aio_context, and not the job aiocontext Emanuele Giuseppe Esposito
2022-03-14 13:37 ` [PATCH v6 15/18] job: detect change of aiocontext within job coroutine Emanuele Giuseppe Esposito
2022-06-03 16:59 ` Kevin Wolf
2022-06-07 13:28 ` Emanuele Giuseppe Esposito
2022-03-14 13:37 ` [PATCH v6 16/18] jobs: protect job.aio_context with BQL and job_mutex Emanuele Giuseppe Esposito
2022-03-14 13:37 ` [PATCH v6 17/18] job.c: enable job lock/unlock and remove Aiocontext locks Emanuele Giuseppe Esposito
2022-03-14 13:37 ` [PATCH v6 18/18] block_job_query: remove atomic read Emanuele Giuseppe Esposito
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=20220314133707.2206082-13-eesposit@redhat.com \
--to=eesposit@redhat.com \
--cc=armbru@redhat.com \
--cc=fam@euphon.net \
--cc=hreitz@redhat.com \
--cc=jsnow@redhat.com \
--cc=kwolf@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=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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).