From patchwork Fri Jun 6 16:13:33 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Hajnoczi X-Patchwork-Id: 356924 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)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id E21881400E9 for ; Sat, 7 Jun 2014 02:19:41 +1000 (EST) Received: from localhost ([::1]:48155 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wswrj-0001KG-FM for incoming@patchwork.ozlabs.org; Fri, 06 Jun 2014 12:19:39 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49438) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wswn1-0004VP-Ms for qemu-devel@nongnu.org; Fri, 06 Jun 2014 12:14:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Wswmw-0004RZ-GD for qemu-devel@nongnu.org; Fri, 06 Jun 2014 12:14:47 -0400 Received: from mx1.redhat.com ([209.132.183.28]:55622) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wswmw-0004RP-7i for qemu-devel@nongnu.org; Fri, 06 Jun 2014 12:14:42 -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 s56GEZnc012909 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 6 Jun 2014 12:14:36 -0400 Received: from localhost (ovpn-112-25.ams2.redhat.com [10.36.112.25]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s56GEXVO003286; Fri, 6 Jun 2014 12:14:34 -0400 From: Stefan Hajnoczi To: Date: Fri, 6 Jun 2014 18:13:33 +0200 Message-Id: <1402071243-16702-13-git-send-email-stefanha@redhat.com> In-Reply-To: <1402071243-16702-1-git-send-email-stefanha@redhat.com> References: <1402071243-16702-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: Peter Maydell , Peter Lieven , Stefan Hajnoczi Subject: [Qemu-devel] [PULL 12/42] nfs: implement .bdrv_detach/attach_aio_context() 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 Drop the assumption that we're using the main AioContext. The following functions need to be converted: * qemu_bh_new() -> aio_bh_new() * qemu_aio_set_fd_handler() -> aio_set_fd_handler() * qemu_aio_wait() -> aio_poll() The .bdrv_detach/attach_aio_context() interfaces also need to be implemented to move the fd handler from the old to the new AioContext. Cc: Peter Lieven Signed-off-by: Stefan Hajnoczi Reviewed-by: Peter Lieven --- block/nfs.c | 81 +++++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 57 insertions(+), 24 deletions(-) diff --git a/block/nfs.c b/block/nfs.c index 539bd95..bd9177f 100644 --- a/block/nfs.c +++ b/block/nfs.c @@ -40,6 +40,7 @@ typedef struct NFSClient { struct nfsfh *fh; int events; bool has_zero_init; + AioContext *aio_context; } NFSClient; typedef struct NFSRPC { @@ -49,6 +50,7 @@ typedef struct NFSRPC { struct stat *st; Coroutine *co; QEMUBH *bh; + NFSClient *client; } NFSRPC; static void nfs_process_read(void *arg); @@ -58,10 +60,11 @@ static void nfs_set_events(NFSClient *client) { int ev = nfs_which_events(client->context); if (ev != client->events) { - qemu_aio_set_fd_handler(nfs_get_fd(client->context), - (ev & POLLIN) ? nfs_process_read : NULL, - (ev & POLLOUT) ? nfs_process_write : NULL, - client); + aio_set_fd_handler(client->aio_context, + nfs_get_fd(client->context), + (ev & POLLIN) ? nfs_process_read : NULL, + (ev & POLLOUT) ? nfs_process_write : NULL, + client); } client->events = ev; @@ -84,7 +87,8 @@ static void nfs_process_write(void *arg) static void nfs_co_init_task(NFSClient *client, NFSRPC *task) { *task = (NFSRPC) { - .co = qemu_coroutine_self(), + .co = qemu_coroutine_self(), + .client = client, }; } @@ -116,7 +120,8 @@ nfs_co_generic_cb(int ret, struct nfs_context *nfs, void *data, error_report("NFS Error: %s", nfs_get_error(nfs)); } if (task->co) { - task->bh = qemu_bh_new(nfs_co_generic_bh_cb, task); + task->bh = aio_bh_new(task->client->aio_context, + nfs_co_generic_bh_cb, task); qemu_bh_schedule(task->bh); } } @@ -224,13 +229,34 @@ static QemuOptsList runtime_opts = { }, }; +static void nfs_detach_aio_context(BlockDriverState *bs) +{ + NFSClient *client = bs->opaque; + + aio_set_fd_handler(client->aio_context, + nfs_get_fd(client->context), + NULL, NULL, NULL); + client->events = 0; +} + +static void nfs_attach_aio_context(BlockDriverState *bs, + AioContext *new_context) +{ + NFSClient *client = bs->opaque; + + client->aio_context = new_context; + nfs_set_events(client); +} + static void nfs_client_close(NFSClient *client) { if (client->context) { if (client->fh) { nfs_close(client->context, client->fh); } - qemu_aio_set_fd_handler(nfs_get_fd(client->context), NULL, NULL, NULL); + aio_set_fd_handler(client->aio_context, + nfs_get_fd(client->context), + NULL, NULL, NULL); nfs_destroy_context(client->context); } memset(client, 0, sizeof(NFSClient)); @@ -345,6 +371,8 @@ static int nfs_file_open(BlockDriverState *bs, QDict *options, int flags, QemuOpts *opts; Error *local_err = NULL; + client->aio_context = bdrv_get_aio_context(bs); + opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort); qemu_opts_absorb_qdict(opts, options, &local_err); if (local_err) { @@ -368,6 +396,8 @@ static int nfs_file_create(const char *url, QEMUOptionParameter *options, int64_t total_size = 0; NFSClient *client = g_malloc0(sizeof(NFSClient)); + client->aio_context = qemu_get_aio_context(); + /* Read out options */ while (options && options->name) { if (!strcmp(options->name, "size")) { @@ -407,7 +437,7 @@ static int64_t nfs_get_allocated_file_size(BlockDriverState *bs) while (!task.complete) { nfs_set_events(client); - qemu_aio_wait(); + aio_poll(client->aio_context, true); } return (task.ret < 0 ? task.ret : st.st_blocks * st.st_blksize); @@ -420,22 +450,25 @@ static int nfs_file_truncate(BlockDriverState *bs, int64_t offset) } static BlockDriver bdrv_nfs = { - .format_name = "nfs", - .protocol_name = "nfs", - - .instance_size = sizeof(NFSClient), - .bdrv_needs_filename = true, - .bdrv_has_zero_init = nfs_has_zero_init, - .bdrv_get_allocated_file_size = nfs_get_allocated_file_size, - .bdrv_truncate = nfs_file_truncate, - - .bdrv_file_open = nfs_file_open, - .bdrv_close = nfs_file_close, - .bdrv_create = nfs_file_create, - - .bdrv_co_readv = nfs_co_readv, - .bdrv_co_writev = nfs_co_writev, - .bdrv_co_flush_to_disk = nfs_co_flush, + .format_name = "nfs", + .protocol_name = "nfs", + + .instance_size = sizeof(NFSClient), + .bdrv_needs_filename = true, + .bdrv_has_zero_init = nfs_has_zero_init, + .bdrv_get_allocated_file_size = nfs_get_allocated_file_size, + .bdrv_truncate = nfs_file_truncate, + + .bdrv_file_open = nfs_file_open, + .bdrv_close = nfs_file_close, + .bdrv_create = nfs_file_create, + + .bdrv_co_readv = nfs_co_readv, + .bdrv_co_writev = nfs_co_writev, + .bdrv_co_flush_to_disk = nfs_co_flush, + + .bdrv_detach_aio_context = nfs_detach_aio_context, + .bdrv_attach_aio_context = nfs_attach_aio_context, }; static void nfs_block_init(void)