From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50751) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZDPHt-00084b-Je for qemu-devel@nongnu.org; Thu, 09 Jul 2015 23:47:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZDPHq-0007Ay-E6 for qemu-devel@nongnu.org; Thu, 09 Jul 2015 23:47:45 -0400 Received: from mx1.redhat.com ([209.132.183.28]:36282) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZDPHq-0007Aj-7d for qemu-devel@nongnu.org; Thu, 09 Jul 2015 23:47:42 -0400 From: Fam Zheng Date: Fri, 10 Jul 2015 11:46:46 +0800 Message-Id: <1436500012-32593-10-git-send-email-famz@redhat.com> In-Reply-To: <1436500012-32593-1-git-send-email-famz@redhat.com> References: <1436500012-32593-1-git-send-email-famz@redhat.com> Subject: [Qemu-devel] [PATCH v3 09/15] blockjob: Move BlockJobDeferToMainLoopData into BlockJob List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , famz@redhat.com, John Snow , Jeff Cody , Max Reitz , vsementsov@parallels.com, stefanha@redhat.com This will bind the BH data to block job data and is therefore easier to manage, for example during cancellation. Signed-off-by: Fam Zheng --- blockjob.c | 34 +++++++++++++++------------------- include/block/blockjob.h | 16 ++++++++++++++-- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/blockjob.c b/blockjob.c index 11b48f5..e057dd5 100644 --- a/blockjob.c +++ b/blockjob.c @@ -92,6 +92,10 @@ void block_job_completed(BlockJob *job, int ret) assert(!job->completed); job->completed = true; job->ret = ret; + if (job->defer_to_main_loop_data.bh) { + qemu_bh_delete(job->defer_to_main_loop_data.bh); + job->defer_to_main_loop_data.bh = NULL; + } job->cb(job->opaque, ret); block_job_release(bs); } @@ -344,44 +348,36 @@ BlockErrorAction block_job_error_action(BlockJob *job, BlockDriverState *bs, return action; } -typedef struct { - BlockJob *job; - QEMUBH *bh; - AioContext *aio_context; - BlockJobDeferToMainLoopFn *fn; - void *opaque; -} BlockJobDeferToMainLoopData; - static void block_job_defer_to_main_loop_bh(void *opaque) { - BlockJobDeferToMainLoopData *data = opaque; + BlockJob *job = opaque; + /* Copy the struct in case job get released in data.fn() */ + BlockJobDeferToMainLoopData data = job->defer_to_main_loop_data; AioContext *aio_context; - qemu_bh_delete(data->bh); + qemu_bh_delete(data.bh); /* Prevent race with block_job_defer_to_main_loop() */ - aio_context_acquire(data->aio_context); + aio_context_acquire(data.aio_context); /* Fetch BDS AioContext again, in case it has changed */ - aio_context = bdrv_get_aio_context(data->job->bs); + aio_context = bdrv_get_aio_context(job->bs); aio_context_acquire(aio_context); - data->fn(data->job, data->opaque); + data.fn(job, data.opaque); aio_context_release(aio_context); - aio_context_release(data->aio_context); - - g_free(data); + aio_context_release(data.aio_context); } void block_job_defer_to_main_loop(BlockJob *job, BlockJobDeferToMainLoopFn *fn, void *opaque) { - BlockJobDeferToMainLoopData *data = g_malloc(sizeof(*data)); - data->job = job; - data->bh = qemu_bh_new(block_job_defer_to_main_loop_bh, data); + BlockJobDeferToMainLoopData *data = &job->defer_to_main_loop_data; + assert(!data->bh); + data->bh = qemu_bh_new(block_job_defer_to_main_loop_bh, job); data->aio_context = bdrv_get_aio_context(job->bs); data->fn = fn; data->opaque = opaque; diff --git a/include/block/blockjob.h b/include/block/blockjob.h index 40d0776..5bac2e2 100644 --- a/include/block/blockjob.h +++ b/include/block/blockjob.h @@ -64,6 +64,15 @@ typedef struct BlockJobDriver { void (*txn_abort)(BlockJob *job); } BlockJobDriver; +typedef void BlockJobDeferToMainLoopFn(BlockJob *job, void *opaque); + +typedef struct { + QEMUBH *bh; + AioContext *aio_context; + BlockJobDeferToMainLoopFn *fn; + void *opaque; +} BlockJobDeferToMainLoopData; + /** * BlockJob: * @@ -83,6 +92,11 @@ struct BlockJob { Coroutine *co; /** + * The data used by block_job_defer_to_main_loop. + */ + BlockJobDeferToMainLoopData defer_to_main_loop_data; + + /** * Set to true if the job should cancel itself. The flag must * always be tested just before toggling the busy flag from false * to true. After a job has been cancelled, it should only yield @@ -359,8 +373,6 @@ BlockErrorAction block_job_error_action(BlockJob *job, BlockDriverState *bs, BlockdevOnError on_err, int is_read, int error); -typedef void BlockJobDeferToMainLoopFn(BlockJob *job, void *opaque); - /** * block_job_defer_to_main_loop: * @job: The job -- 2.4.3