From: Jeff Cody <jcody@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: qemu-devel@nongnu.org, qemu-block@nongnu.org, jsnow@redhat.com,
stefanha@redhat.com
Subject: Re: [Qemu-devel] [PATCH 03/11] blockjob: introduce block_job_early_fail
Date: Tue, 9 May 2017 12:37:36 -0400 [thread overview]
Message-ID: <20170509163736.GE16494@localhost.localdomain> (raw)
In-Reply-To: <20170508141310.8674-4-pbonzini@redhat.com>
On Mon, May 08, 2017 at 04:13:02PM +0200, Paolo Bonzini wrote:
> Outside blockjob.c, block_job_unref is only used when a block job fails
> to start, and block_job_ref is not used at all. The reference counting
> thus is pretty well hidden. Introduce a separate function to be used
> by block jobs; because block_job_ref and block_job_unref now become
> static, move them earlier in blockjob.c.
>
> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
> Reviewed-by: John Snow <jsnow@redhat.com>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> block/backup.c | 2 +-
> block/commit.c | 2 +-
> block/mirror.c | 2 +-
> blockjob.c | 47 ++++++++++++++++++++++++++------------------
> include/block/blockjob_int.h | 15 +++-----------
> tests/test-blockjob.c | 10 +++++-----
> 6 files changed, 39 insertions(+), 39 deletions(-)
>
> diff --git a/block/backup.c b/block/backup.c
> index a4fb2884f9..5387fbd84e 100644
> --- a/block/backup.c
> +++ b/block/backup.c
> @@ -692,7 +692,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
> }
> if (job) {
> backup_clean(&job->common);
> - block_job_unref(&job->common);
> + block_job_early_fail(&job->common);
> }
>
> return NULL;
> diff --git a/block/commit.c b/block/commit.c
> index 91d2c344f6..99e41c6e50 100644
> --- a/block/commit.c
> +++ b/block/commit.c
> @@ -426,7 +426,7 @@ fail:
> if (commit_top_bs) {
> bdrv_set_backing_hd(overlay_bs, top, &error_abort);
> }
> - block_job_unref(&s->common);
> + block_job_early_fail(&s->common);
> }
>
>
> diff --git a/block/mirror.c b/block/mirror.c
> index 9f5eb692fd..6a6619ca71 100644
> --- a/block/mirror.c
> +++ b/block/mirror.c
> @@ -1252,7 +1252,7 @@ fail:
>
> g_free(s->replaces);
> blk_unref(s->target);
> - block_job_unref(&s->common);
> + block_job_early_fail(&s->common);
> }
>
> bdrv_child_try_set_perm(mirror_top_bs->backing, 0, BLK_PERM_ALL,
> diff --git a/blockjob.c b/blockjob.c
> index 71187d0c9e..5a722c3635 100644
> --- a/blockjob.c
> +++ b/blockjob.c
> @@ -106,6 +106,32 @@ BlockJob *block_job_get(const char *id)
> return NULL;
> }
>
> +static void block_job_ref(BlockJob *job)
> +{
> + ++job->refcnt;
> +}
> +
> +static void block_job_attached_aio_context(AioContext *new_context,
> + void *opaque);
> +static void block_job_detach_aio_context(void *opaque);
> +
> +static void block_job_unref(BlockJob *job)
> +{
> + if (--job->refcnt == 0) {
> + BlockDriverState *bs = blk_bs(job->blk);
> + bs->job = NULL;
> + block_job_remove_all_bdrv(job);
> + blk_remove_aio_context_notifier(job->blk,
> + block_job_attached_aio_context,
> + block_job_detach_aio_context, job);
> + blk_unref(job->blk);
> + error_free(job->blocker);
> + g_free(job->id);
> + QLIST_REMOVE(job, job_list);
> + g_free(job);
> + }
> +}
> +
> static void block_job_attached_aio_context(AioContext *new_context,
> void *opaque)
> {
> @@ -293,26 +319,9 @@ void block_job_start(BlockJob *job)
> bdrv_coroutine_enter(blk_bs(job->blk), job->co);
> }
>
> -void block_job_ref(BlockJob *job)
> -{
> - ++job->refcnt;
> -}
> -
> -void block_job_unref(BlockJob *job)
> +void block_job_early_fail(BlockJob *job)
> {
> - if (--job->refcnt == 0) {
> - BlockDriverState *bs = blk_bs(job->blk);
> - bs->job = NULL;
> - block_job_remove_all_bdrv(job);
> - blk_remove_aio_context_notifier(job->blk,
> - block_job_attached_aio_context,
> - block_job_detach_aio_context, job);
> - blk_unref(job->blk);
> - error_free(job->blocker);
> - g_free(job->id);
> - QLIST_REMOVE(job, job_list);
> - g_free(job);
> - }
> + block_job_unref(job);
> }
>
> static void block_job_completed_single(BlockJob *job)
> diff --git a/include/block/blockjob_int.h b/include/block/blockjob_int.h
> index bfcc5d1241..45cdfd4ac1 100644
> --- a/include/block/blockjob_int.h
> +++ b/include/block/blockjob_int.h
> @@ -156,21 +156,12 @@ void block_job_sleep_ns(BlockJob *job, QEMUClockType type, int64_t ns);
> void block_job_yield(BlockJob *job);
>
> /**
> - * block_job_ref:
> + * block_job_early_fail:
> * @bs: The block device.
> *
> - * Grab a reference to the block job. Should be paired with block_job_unref.
> + * The block job could not be started, free it.
> */
> -void block_job_ref(BlockJob *job);
> -
> -/**
> - * block_job_unref:
> - * @bs: The block device.
> - *
> - * Release reference to the block job and release resources if it is the last
> - * reference.
> - */
> -void block_job_unref(BlockJob *job);
> +void block_job_early_fail(BlockJob *job);
>
> /**
> * block_job_completed:
> diff --git a/tests/test-blockjob.c b/tests/test-blockjob.c
> index 740e740398..23bdf1a932 100644
> --- a/tests/test-blockjob.c
> +++ b/tests/test-blockjob.c
> @@ -116,11 +116,11 @@ static void test_job_ids(void)
> job[1] = do_test_id(blk[1], "id0", false);
>
> /* But once job[0] finishes we can reuse its ID */
> - block_job_unref(job[0]);
> + block_job_early_fail(job[0]);
> job[1] = do_test_id(blk[1], "id0", true);
>
> /* No job ID specified, defaults to the backend name ('drive1') */
> - block_job_unref(job[1]);
> + block_job_early_fail(job[1]);
> job[1] = do_test_id(blk[1], NULL, true);
>
> /* Duplicate job ID */
> @@ -133,9 +133,9 @@ static void test_job_ids(void)
> /* This one is valid */
> job[2] = do_test_id(blk[2], "id_2", true);
>
> - block_job_unref(job[0]);
> - block_job_unref(job[1]);
> - block_job_unref(job[2]);
> + block_job_early_fail(job[0]);
> + block_job_early_fail(job[1]);
> + block_job_early_fail(job[2]);
>
> destroy_blk(blk[0]);
> destroy_blk(blk[1]);
> --
> 2.12.2
>
>
Reviewed-by: Jeff Cody <jcody@redhat.com>
next prev parent reply other threads:[~2017-05-09 16:37 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-08 14:12 [Qemu-devel] [PATCH v2 00/11] Preparation for block job mutex Paolo Bonzini
2017-05-08 14:13 ` [Qemu-devel] [PATCH 01/11] blockjob: remove unnecessary check Paolo Bonzini
2017-05-09 16:23 ` Jeff Cody
2017-05-08 14:13 ` [Qemu-devel] [PATCH 02/11] blockjob: remove iostatus_reset callback Paolo Bonzini
2017-05-09 16:26 ` Jeff Cody
2017-05-08 14:13 ` [Qemu-devel] [PATCH 03/11] blockjob: introduce block_job_early_fail Paolo Bonzini
2017-05-09 16:37 ` Jeff Cody [this message]
2017-05-08 14:13 ` [Qemu-devel] [PATCH 04/11] blockjob: introduce block_job_pause/resume_all Paolo Bonzini
2017-05-09 17:00 ` Jeff Cody
2017-05-08 14:13 ` [Qemu-devel] [PATCH 05/11] blockjob: separate monitor and blockjob APIs Paolo Bonzini
2017-05-09 17:06 ` Jeff Cody
2017-05-09 17:09 ` Paolo Bonzini
2017-05-08 14:13 ` [Qemu-devel] [PATCH 06/11] blockjob: move iostatus reset inside block_job_user_resume Paolo Bonzini
2017-05-09 17:10 ` Jeff Cody
2017-05-08 14:13 ` [Qemu-devel] [PATCH 07/11] blockjob: introduce block_job_cancel_async, check iostatus invariants Paolo Bonzini
2017-05-08 14:13 ` [Qemu-devel] [PATCH 08/11] blockjob: group BlockJob transaction functions together Paolo Bonzini
2017-05-08 14:13 ` [Qemu-devel] [PATCH 09/11] blockjob: strengthen a bit test-blockjob-txn Paolo Bonzini
2017-05-08 14:13 ` [Qemu-devel] [PATCH 10/11] blockjob: reorganize block_job_completed_txn_abort Paolo Bonzini
2017-05-08 14:13 ` [Qemu-devel] [PATCH 11/11] blockjob: use deferred_to_main_loop to indicate the coroutine has ended Paolo Bonzini
2017-05-21 13:17 ` [Qemu-devel] [PATCH v2 00/11] Preparation for block job mutex Paolo Bonzini
2017-05-22 9:09 ` [Qemu-devel] [Qemu-block] " Stefan Hajnoczi
2017-05-23 1:57 ` [Qemu-devel] " Jeff Cody
-- strict thread matches above, loose matches on Subject: below --
2017-04-19 14:42 [Qemu-devel] [PATCH for 2.10 " Paolo Bonzini
2017-04-19 14:42 ` [Qemu-devel] [PATCH 03/11] blockjob: introduce block_job_early_fail Paolo Bonzini
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=20170509163736.GE16494@localhost.localdomain \
--to=jcody@redhat.com \
--cc=jsnow@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.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.