From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33029) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Yy9wC-0002im-Kl for qemu-devel@nongnu.org; Thu, 28 May 2015 22:22:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Yy9wB-0001VB-O6 for qemu-devel@nongnu.org; Thu, 28 May 2015 22:22:20 -0400 From: Fam Zheng Date: Fri, 29 May 2015 10:22:13 +0800 Message-Id: <1432866133-21111-1-git-send-email-famz@redhat.com> Subject: [Qemu-devel] [PATCH] mirror: Skip block_job_defer_to_main_loop if already in the main context List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , pbonzini@redhat.com, Jeff Cody , stefanha@redhat.com, qemu-block@nongnu.org mirror_exit does the replacing, which requires source and target to be in sync, unfortunately we can't guarantee that before we have a complete block pause mechanism. So for non-dataplane block jobs, let's do the old thing as pre commit 5a7e7a0ba (block: let mirror blockjob run in BDS AioContext) - directly call mirror_exit(). Dataplane case is taken care of in separate patches. Suggested-by: Paolo Bonzini Signed-off-by: Fam Zheng --- block/mirror.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/block/mirror.c b/block/mirror.c index 58f391a..112393a 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -565,7 +565,11 @@ immediate_exit: data = g_malloc(sizeof(*data)); data->ret = ret; - block_job_defer_to_main_loop(&s->common, mirror_exit, data); + if (bs->aio_context == qemu_get_aio_context()) { + mirror_exit(&s->common, data); + } else { + block_job_defer_to_main_loop(&s->common, mirror_exit, data); + } } static void mirror_set_speed(BlockJob *job, int64_t speed, Error **errp) -- 2.4.2