From patchwork Mon Jul 15 14:42:51 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Hajnoczi X-Patchwork-Id: 259078 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 905FF2C0095 for ; Tue, 16 Jul 2013 01:08:40 +1000 (EST) Received: from localhost ([::1]:35092 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Uyk1e-0001sA-1L for incoming@patchwork.ozlabs.org; Mon, 15 Jul 2013 10:45:18 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57673) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Uyjzx-0008Eq-80 for qemu-devel@nongnu.org; Mon, 15 Jul 2013 10:43:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Uyjzs-0001mf-HG for qemu-devel@nongnu.org; Mon, 15 Jul 2013 10:43:33 -0400 Received: from mx1.redhat.com ([209.132.183.28]:17022) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Uyjzs-0001mF-9D for qemu-devel@nongnu.org; Mon, 15 Jul 2013 10:43:28 -0400 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r6FEhQf5023673 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 15 Jul 2013 10:43:27 -0400 Received: from localhost (ovpn-112-19.ams2.redhat.com [10.36.112.19]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r6FEhMom010209; Mon, 15 Jul 2013 10:43:25 -0400 From: Stefan Hajnoczi To: Date: Mon, 15 Jul 2013 22:42:51 +0800 Message-Id: <1373899382-13514-3-git-send-email-stefanha@redhat.com> In-Reply-To: <1373899382-13514-1-git-send-email-stefanha@redhat.com> References: <1373899382-13514-1-git-send-email-stefanha@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 209.132.183.28 Cc: Kevin Wolf , Paolo Bonzini , Stefan Hajnoczi Subject: [Qemu-devel] [PATCH v2 02/13] block: add BlockDevOps->drain_threads_cb() 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 There are times when the QEMU main loop wishes to drain I/O requests. Up until now bdrv_drain_all() meant that no new guest I/O will be processed until the next event loop iteration. This is no longer true with dataplane since it runs outside the QEMU global mutex. The BlockDevOps->drain_threads_cb() interface allows the device model to drain and stop threads. Once draining completes, the QEMU main loop can be sure that no further I/O will take place until next main loop iteration. Signed-off-by: Stefan Hajnoczi --- block.c | 6 ++++++ include/block/block.h | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/block.c b/block.c index 183fec8..7c5931d 100644 --- a/block.c +++ b/block.c @@ -1431,6 +1431,12 @@ void bdrv_drain_all(void) BlockDriverState *bs; bool busy; + QTAILQ_FOREACH(bs, &bdrv_states, list) { + if (bs->dev_ops && bs->dev_ops->drain_threads_cb) { + bs->dev_ops->drain_threads_cb(bs->dev_opaque); + } + } + do { busy = qemu_aio_wait(); diff --git a/include/block/block.h b/include/block/block.h index dd8eca1..977d5f6 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -60,6 +60,15 @@ typedef struct BlockDevOps { * Runs when the size changed (e.g. monitor command block_resize) */ void (*resize_cb)(void *opaque); + /* + * Notifies the device model to drain any emulation threads + * + * Upon return, there must be no new or pending requests outside the QEMU + * main loop. The device model may restart emulation threads after this + * main loop iteration, for example in a hardware register handler + * function. + */ + void (*drain_threads_cb)(void *opaque); } BlockDevOps; #define BDRV_O_RDWR 0x0002