From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MB36Z-0001OA-FO for qemu-devel@nongnu.org; Mon, 01 Jun 2009 04:42:51 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MB36U-0001Lo-3W for qemu-devel@nongnu.org; Mon, 01 Jun 2009 04:42:51 -0400 Received: from [199.232.76.173] (port=45956 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MB36T-0001Ll-SK for qemu-devel@nongnu.org; Mon, 01 Jun 2009 04:42:45 -0400 Received: from mx2.redhat.com ([66.187.237.31]:36087) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MB36T-0007G9-6u for qemu-devel@nongnu.org; Mon, 01 Jun 2009 04:42:45 -0400 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n518gh9C018879 for ; Mon, 1 Jun 2009 04:42:44 -0400 Message-ID: <4A23949B.3020900@redhat.com> Date: Mon, 01 Jun 2009 11:43:07 +0300 From: Dor Laor MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------010509020100000105020302" Subject: [Qemu-devel] [PATCH][STABLE] Call missing qemu_bh_delete at the end of raw_aio_em_cb callback. Reply-To: dlaor@redhat.com List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel , Glauber Costa This is a multi-part message in MIME format. --------------010509020100000105020302 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit --------------010509020100000105020302 Content-Type: text/plain; name="0001--Call-missing-qemu_bh_delete-at-the-end-of-raw_aio_.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename*0="0001--Call-missing-qemu_bh_delete-at-the-end-of-raw_aio_.pat"; filename*1="ch" >>From 8e2e406e1220f9eedb042919c431c963af1433e4 Mon Sep 17 00:00:00 2001 From: Dor Laor Date: Mon, 1 Jun 2009 00:22:28 +0300 Subject: [PATCH] [PATCH] Call missing qemu_bh_delete at the end of raw_aio_em_cb callback. Without it, these cb's does not get cleaned and it slows down qemu more and more. (to test, the # of bh->next chain is huge when using cache=off). Thanks Avi for helping with the debug. Signed-off-by: Dor Laor --- block-raw-posix.c | 17 +++++++++++------ 1 files changed, 11 insertions(+), 6 deletions(-) diff --git a/block-raw-posix.c b/block-raw-posix.c index 85ca704..8fce9e6 100644 --- a/block-raw-posix.c +++ b/block-raw-posix.c @@ -439,6 +439,7 @@ typedef struct RawAIOCB { BlockDriverAIOCB common; struct qemu_paiocb aiocb; struct RawAIOCB *next; + QEMUBH *bh; int ret; } RawAIOCB; @@ -593,6 +594,8 @@ static void raw_aio_em_cb(void* opaque) { RawAIOCB *acb = opaque; acb->common.cb(acb->common.opaque, acb->ret); + qemu_bh_delete(acb->bh); + acb->bh = NULL; qemu_aio_release(acb); } @@ -628,11 +631,12 @@ static BlockDriverAIOCB *raw_aio_read(BlockDriverState *bs, BDRVRawState *s = bs->opaque; if (unlikely(s->aligned_buf != NULL && ((uintptr_t) buf % 512))) { - QEMUBH *bh; acb = qemu_aio_get(bs, cb, opaque); acb->ret = raw_pread(bs, 512 * sector_num, buf, 512 * nb_sectors); - bh = qemu_bh_new(raw_aio_em_cb, acb); - qemu_bh_schedule(bh); + acb->bh = qemu_bh_new(raw_aio_em_cb, acb); + if (!acb->bh) + return NULL; + qemu_bh_schedule(acb->bh); return &acb->common; } @@ -659,11 +663,12 @@ static BlockDriverAIOCB *raw_aio_write(BlockDriverState *bs, BDRVRawState *s = bs->opaque; if (unlikely(s->aligned_buf != NULL && ((uintptr_t) buf % 512))) { - QEMUBH *bh; acb = qemu_aio_get(bs, cb, opaque); acb->ret = raw_pwrite(bs, 512 * sector_num, buf, 512 * nb_sectors); - bh = qemu_bh_new(raw_aio_em_cb, acb); - qemu_bh_schedule(bh); + acb->bh = qemu_bh_new(raw_aio_em_cb, acb); + if (!acb->bh) + return NULL; + qemu_bh_schedule(acb->bh); return &acb->common; } -- 1.5.6.6 --------------010509020100000105020302--