From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:38339) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Th1QC-0002yi-TD for qemu-devel@nongnu.org; Fri, 07 Dec 2012 12:09:14 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Th1Q5-0007Yv-At for qemu-devel@nongnu.org; Fri, 07 Dec 2012 12:09:08 -0500 Received: from mx1.redhat.com ([209.132.183.28]:5521) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Th1Q5-0007Yk-3j for qemu-devel@nongnu.org; Fri, 07 Dec 2012 12:09:01 -0500 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id qB7H90AT028798 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 7 Dec 2012 12:09:00 -0500 From: Kevin Wolf Date: Fri, 7 Dec 2012 18:08:48 +0100 Message-Id: <1354900129-5745-8-git-send-email-kwolf@redhat.com> In-Reply-To: <1354900129-5745-1-git-send-email-kwolf@redhat.com> References: <1354900129-5745-1-git-send-email-kwolf@redhat.com> Subject: [Qemu-devel] [PATCH 7/8] qcow2: Execute run_dependent_requests() without lock List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com There's no reason for run_dependent_requests() to hold s->lock, and a later patch will require that in fact the lock is not held. Also, before this patch, run_dependent_requests() not only does what its name suggests, but also removes the l2meta from the list of in-flight requests. When changing this, it becomes an one-liner, so just inline it completely. Signed-off-by: Kevin Wolf --- block/qcow2.c | 36 ++++++++++++++++-------------------- 1 files changed, 16 insertions(+), 20 deletions(-) diff --git a/block/qcow2.c b/block/qcow2.c index dbcc0ff..8520bda 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -745,21 +745,6 @@ fail: return ret; } -static void run_dependent_requests(BDRVQcowState *s, QCowL2Meta *m) -{ - /* Take the request off the list of running requests */ - if (m->nb_clusters != 0) { - QLIST_REMOVE(m, next_in_flight); - } - - /* Restart all dependent requests */ - if (!qemu_co_queue_empty(&m->dependent_requests)) { - qemu_co_mutex_unlock(&s->lock); - qemu_co_queue_restart_all(&m->dependent_requests); - qemu_co_mutex_lock(&s->lock); - } -} - static coroutine_fn int qcow2_co_writev(BlockDriverState *bs, int64_t sector_num, int remaining_sectors, @@ -845,7 +830,15 @@ static coroutine_fn int qcow2_co_writev(BlockDriverState *bs, goto fail; } - run_dependent_requests(s, l2meta); + /* Take the request off the list of running requests */ + if (l2meta->nb_clusters != 0) { + QLIST_REMOVE(l2meta, next_in_flight); + } + + qemu_co_mutex_unlock(&s->lock); + qemu_co_queue_restart_all(&l2meta->dependent_requests); + qemu_co_mutex_lock(&s->lock); + g_free(l2meta); l2meta = NULL; } @@ -858,13 +851,16 @@ static coroutine_fn int qcow2_co_writev(BlockDriverState *bs, ret = 0; fail: + qemu_co_mutex_unlock(&s->lock); + if (l2meta != NULL) { - run_dependent_requests(s, l2meta); + if (l2meta->nb_clusters != 0) { + QLIST_REMOVE(l2meta, next_in_flight); + } + qemu_co_queue_restart_all(&l2meta->dependent_requests); g_free(l2meta); } - qemu_co_mutex_unlock(&s->lock); - qemu_iovec_destroy(&hd_qiov); qemu_vfree(cluster_data); trace_qcow2_writev_done_req(qemu_coroutine_self(), ret); @@ -1152,7 +1148,7 @@ static int preallocate(BlockDriverState *bs) /* There are no dependent requests, but we need to remove our request * from the list of in-flight requests */ if (meta != NULL) { - run_dependent_requests(bs->opaque, meta); + QLIST_REMOVE(meta, next_in_flight); } /* TODO Preallocate data if requested */ -- 1.7.6.5