From patchwork Fri Jul 22 08:46:26 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Frediano Ziglio X-Patchwork-Id: 106236 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 5B17BB6F71 for ; Fri, 22 Jul 2011 18:47:04 +1000 (EST) Received: from localhost ([::1]:57699 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QkBNk-0003qi-1X for incoming@patchwork.ozlabs.org; Fri, 22 Jul 2011 04:46:52 -0400 Received: from eggs.gnu.org ([140.186.70.92]:56320) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QkBNb-0003gV-RI for qemu-devel@nongnu.org; Fri, 22 Jul 2011 04:46:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QkBNZ-0002HX-Vj for qemu-devel@nongnu.org; Fri, 22 Jul 2011 04:46:43 -0400 Received: from mail-ww0-f53.google.com ([74.125.82.53]:33733) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QkBNZ-00025G-RH for qemu-devel@nongnu.org; Fri, 22 Jul 2011 04:46:41 -0400 Received: by mail-ww0-f53.google.com with SMTP id 26so1778685wwf.10 for ; Fri, 22 Jul 2011 01:46:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; bh=QfutlxnkLY8flz6z3u0buBx2Q3ZkvF2EF6MAL0JNrEk=; b=YlrqQqW+X8b3+fFLEjZGNzPGC22SeCRXEy3rp0DIumyBChhZtZYW2HeGRHGOhBGhod 9LYVMF4jarQT6b9E2O2HpiIs4yK7VqsgitiTqFx7gf4biUt3GVsgAm65ebqh3MmpIvZg Q1+drTkiK9Wng2KmrXR8rUVrETuQA9AXWP8dw= Received: by 10.227.160.140 with SMTP id n12mr998030wbx.69.1311324401219; Fri, 22 Jul 2011 01:46:41 -0700 (PDT) Received: from localhost.localdomain (rockhall.torservers.net [77.247.181.163]) by mx.google.com with ESMTPS id gd1sm1720338wbb.27.2011.07.22.01.46.34 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 22 Jul 2011 01:46:40 -0700 (PDT) From: Frediano Ziglio To: qemu-devel@nongnu.org Date: Fri, 22 Jul 2011 10:46:26 +0200 Message-Id: <1311324390-27830-2-git-send-email-freddy77@gmail.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1311324390-27830-1-git-send-email-freddy77@gmail.com> References: <1311324390-27830-1-git-send-email-freddy77@gmail.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-Received-From: 74.125.82.53 Cc: Kevin Wolf , Frediano Ziglio Subject: [Qemu-devel] [PATCH 1/5] qcow: allocate QCowAIOCB structure using stack X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org instead of calling qemi_aio_get use stack Signed-off-by: Frediano Ziglio --- block/qcow.c | 52 ++++++++++++++++------------------------------------ block/qcow2.c | 38 +++++++++++--------------------------- 2 files changed, 27 insertions(+), 63 deletions(-) diff --git a/block/qcow.c b/block/qcow.c index 6447c2a..d19ef04 100644 --- a/block/qcow.c +++ b/block/qcow.c @@ -503,28 +503,12 @@ typedef struct QCowAIOCB { BlockDriverAIOCB *hd_aiocb; } QCowAIOCB; -static void qcow_aio_cancel(BlockDriverAIOCB *blockacb) -{ - QCowAIOCB *acb = container_of(blockacb, QCowAIOCB, common); - if (acb->hd_aiocb) - bdrv_aio_cancel(acb->hd_aiocb); - qemu_aio_release(acb); -} - -static AIOPool qcow_aio_pool = { - .aiocb_size = sizeof(QCowAIOCB), - .cancel = qcow_aio_cancel, -}; - static QCowAIOCB *qcow_aio_setup(BlockDriverState *bs, int64_t sector_num, QEMUIOVector *qiov, int nb_sectors, - int is_write) + int is_write, QCowAIOCB *acb) { - QCowAIOCB *acb; - - acb = qemu_aio_get(&qcow_aio_pool, bs, NULL, NULL); - if (!acb) - return NULL; + memset(acb, 0, sizeof(*acb)); + acb->common.bs = bs; acb->hd_aiocb = NULL; acb->sector_num = sector_num; acb->qiov = qiov; @@ -543,9 +527,8 @@ static QCowAIOCB *qcow_aio_setup(BlockDriverState *bs, return acb; } -static int qcow_aio_read_cb(void *opaque) +static int qcow_aio_read_cb(QCowAIOCB *acb) { - QCowAIOCB *acb = opaque; BlockDriverState *bs = acb->common.bs; BDRVQcowState *s = bs->opaque; int index_in_cluster; @@ -634,29 +617,27 @@ static int qcow_co_readv(BlockDriverState *bs, int64_t sector_num, int nb_sectors, QEMUIOVector *qiov) { BDRVQcowState *s = bs->opaque; - QCowAIOCB *acb; + QCowAIOCB acb; int ret; - acb = qcow_aio_setup(bs, sector_num, qiov, nb_sectors, 0); + qcow_aio_setup(bs, sector_num, qiov, nb_sectors, 0, &acb); qemu_co_mutex_lock(&s->lock); do { - ret = qcow_aio_read_cb(acb); + ret = qcow_aio_read_cb(&acb); } while (ret > 0); qemu_co_mutex_unlock(&s->lock); - if (acb->qiov->niov > 1) { - qemu_iovec_from_buffer(acb->qiov, acb->orig_buf, acb->qiov->size); - qemu_vfree(acb->orig_buf); + if (acb.qiov->niov > 1) { + qemu_iovec_from_buffer(acb.qiov, acb.orig_buf, acb.qiov->size); + qemu_vfree(acb.orig_buf); } - qemu_aio_release(acb); return ret; } -static int qcow_aio_write_cb(void *opaque) +static int qcow_aio_write_cb(QCowAIOCB *acb) { - QCowAIOCB *acb = opaque; BlockDriverState *bs = acb->common.bs; BDRVQcowState *s = bs->opaque; int index_in_cluster; @@ -714,23 +695,22 @@ static int qcow_co_writev(BlockDriverState *bs, int64_t sector_num, int nb_sectors, QEMUIOVector *qiov) { BDRVQcowState *s = bs->opaque; - QCowAIOCB *acb; + QCowAIOCB acb; int ret; s->cluster_cache_offset = -1; /* disable compressed cache */ - acb = qcow_aio_setup(bs, sector_num, qiov, nb_sectors, 1); + qcow_aio_setup(bs, sector_num, qiov, nb_sectors, 1, &acb); qemu_co_mutex_lock(&s->lock); do { - ret = qcow_aio_write_cb(acb); + ret = qcow_aio_write_cb(&acb); } while (ret > 0); qemu_co_mutex_unlock(&s->lock); - if (acb->qiov->niov > 1) { - qemu_vfree(acb->orig_buf); + if (acb.qiov->niov > 1) { + qemu_vfree(acb.orig_buf); } - qemu_aio_release(acb); return ret; } diff --git a/block/qcow2.c b/block/qcow2.c index f07d550..edc068e 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -388,17 +388,6 @@ typedef struct QCowAIOCB { QLIST_ENTRY(QCowAIOCB) next_depend; } QCowAIOCB; -static void qcow2_aio_cancel(BlockDriverAIOCB *blockacb) -{ - QCowAIOCB *acb = container_of(blockacb, QCowAIOCB, common); - qemu_aio_release(acb); -} - -static AIOPool qcow2_aio_pool = { - .aiocb_size = sizeof(QCowAIOCB), - .cancel = qcow2_aio_cancel, -}; - /* * Returns 0 when the request is completed successfully, 1 when there is still * a part left to do and -errno in error cases. @@ -528,13 +517,10 @@ static int qcow2_aio_read_cb(QCowAIOCB *acb) static QCowAIOCB *qcow2_aio_setup(BlockDriverState *bs, int64_t sector_num, QEMUIOVector *qiov, int nb_sectors, BlockDriverCompletionFunc *cb, - void *opaque, int is_write) + void *opaque, int is_write, QCowAIOCB *acb) { - QCowAIOCB *acb; - - acb = qemu_aio_get(&qcow2_aio_pool, bs, cb, opaque); - if (!acb) - return NULL; + memset(acb, 0, sizeof(*acb)); + acb->common.bs = bs; acb->sector_num = sector_num; acb->qiov = qiov; acb->is_write = is_write; @@ -554,19 +540,18 @@ static int qcow2_co_readv(BlockDriverState *bs, int64_t sector_num, int nb_sectors, QEMUIOVector *qiov) { BDRVQcowState *s = bs->opaque; - QCowAIOCB *acb; + QCowAIOCB acb; int ret; - acb = qcow2_aio_setup(bs, sector_num, qiov, nb_sectors, NULL, NULL, 0); + qcow2_aio_setup(bs, sector_num, qiov, nb_sectors, NULL, NULL, 0, &acb); qemu_co_mutex_lock(&s->lock); do { - ret = qcow2_aio_read_cb(acb); + ret = qcow2_aio_read_cb(&acb); } while (ret > 0); qemu_co_mutex_unlock(&s->lock); - qemu_iovec_destroy(&acb->hd_qiov); - qemu_aio_release(acb); + qemu_iovec_destroy(&acb.hd_qiov); return ret; } @@ -670,20 +655,19 @@ static int qcow2_co_writev(BlockDriverState *bs, QEMUIOVector *qiov) { BDRVQcowState *s = bs->opaque; - QCowAIOCB *acb; + QCowAIOCB acb; int ret; - acb = qcow2_aio_setup(bs, sector_num, qiov, nb_sectors, NULL, NULL, 1); + qcow2_aio_setup(bs, sector_num, qiov, nb_sectors, NULL, NULL, 1, &acb); s->cluster_cache_offset = -1; /* disable compressed cache */ qemu_co_mutex_lock(&s->lock); do { - ret = qcow2_aio_write_cb(acb); + ret = qcow2_aio_write_cb(&acb); } while (ret > 0); qemu_co_mutex_unlock(&s->lock); - qemu_iovec_destroy(&acb->hd_qiov); - qemu_aio_release(acb); + qemu_iovec_destroy(&acb.hd_qiov); return ret; }