From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=56217 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PZzQy-0001Mw-8u for qemu-devel@nongnu.org; Tue, 04 Jan 2011 00:27:49 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PZzQw-0004bH-QD for qemu-devel@nongnu.org; Tue, 04 Jan 2011 00:27:47 -0500 Received: from e28smtp03.in.ibm.com ([122.248.162.3]:33377) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PZzQv-0004ad-1H for qemu-devel@nongnu.org; Tue, 04 Jan 2011 00:27:46 -0500 Received: from d28relay01.in.ibm.com (d28relay01.in.ibm.com [9.184.220.58]) by e28smtp03.in.ibm.com (8.14.4/8.13.1) with ESMTP id p045Rewp028814 for ; Tue, 4 Jan 2011 10:57:40 +0530 Received: from d28av04.in.ibm.com (d28av04.in.ibm.com [9.184.220.66]) by d28relay01.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id p045RewS3489970 for ; Tue, 4 Jan 2011 10:57:40 +0530 Received: from d28av04.in.ibm.com (loopback [127.0.0.1]) by d28av04.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id p045RdvJ027540 for ; Tue, 4 Jan 2011 16:27:40 +1100 From: Arun R Bharadwaj Date: Tue, 04 Jan 2011 10:57:39 +0530 Message-ID: <20110104052739.15887.60037.stgit@localhost6.localdomain6> In-Reply-To: <20110104052627.15887.43436.stgit@localhost6.localdomain6> References: <20110104052627.15887.43436.stgit@localhost6.localdomain6> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] [PATCH 06/13] Threadlet: Add dequeue_work threadlet API List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: aliguori@us.ibm.com, stefanha@linux.vnet.ibm.com, aneesh.kumar@linux.vnet.ibm.com This patch adds dequeue_work threadlet API and shows how the paio_cancel changes to dequeue_work. Signed-off-by: Arun R Bharadwaj --- posix-aio-compat.c | 46 ++++++++++++++++++++++++++-------------------- 1 files changed, 26 insertions(+), 20 deletions(-) diff --git a/posix-aio-compat.c b/posix-aio-compat.c index ff6e08b..8f1a9b6 100644 --- a/posix-aio-compat.c +++ b/posix-aio-compat.c @@ -574,33 +574,39 @@ static void paio_remove(struct qemu_paiocb *acb) } } -static void paio_cancel(BlockDriverAIOCB *blockacb) +/** + * dequeue_work: Cancel a task queued on the global queue. + * @work: Contains the information of the task that needs to be cancelled. + * + * Returns: 0 if the task is successfully cancelled. + * 1 otherwise. + */ +static int dequeue_work(ThreadletWork *work) { - struct qemu_paiocb *acb = (struct qemu_paiocb *)blockacb; - int active = 0; + int ret = 1; qemu_mutex_lock(&globalqueue.lock); - if (!acb->active) { - QTAILQ_REMOVE(&globalqueue.request_list, &acb->work, node); - acb->ret = -ECANCELED; - } else if (acb->ret == -EINPROGRESS) { - active = 1; - } + QTAILQ_REMOVE(&globalqueue.request_list, work, node); + ret = 0; qemu_mutex_unlock(&globalqueue.lock); - qemu_mutex_lock(&aiocb_mutex); - if (!active) { - acb->ret = -ECANCELED; - } else { - while (acb->ret == -EINPROGRESS) { - /* - * fail safe: if the aio could not be canceled, - * we wait for it - */ - qemu_cond_wait(&aiocb_completion, &aiocb_mutex); + return ret; +} + +static void paio_cancel(BlockDriverAIOCB *blockacb) +{ + struct qemu_paiocb *acb = (struct qemu_paiocb *)blockacb; + if (!acb->active) { + if (dequeue_work(&acb->work) != 0) { + /* Wait for running work item to complete */ + qemu_mutex_lock(&aiocb_mutex); + while (acb->ret == -EINPROGRESS) { + qemu_cond_wait(&aiocb_completion, &aiocb_mutex); + } + qemu_mutex_unlock(&aiocb_mutex); } } - qemu_mutex_unlock(&aiocb_mutex); + paio_remove(acb); }