From patchwork Mon Oct 7 12:09:21 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Hajnoczi X-Patchwork-Id: 11177301 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 59FEC13BD for ; Mon, 7 Oct 2019 12:11:22 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id EAB2E20867 for ; Mon, 7 Oct 2019 12:11:21 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org EAB2E20867 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:43808 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iHRrE-0002fz-IE for patchwork-qemu-devel@patchwork.kernel.org; Mon, 07 Oct 2019 08:11:20 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47768) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iHRpq-0000sd-4x for qemu-devel@nongnu.org; Mon, 07 Oct 2019 08:09:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iHRpo-0003YD-Op for qemu-devel@nongnu.org; Mon, 07 Oct 2019 08:09:54 -0400 Received: from mx1.redhat.com ([209.132.183.28]:29195) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iHRpl-0003V7-IO; Mon, 07 Oct 2019 08:09:49 -0400 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B5F4150F63; Mon, 7 Oct 2019 12:09:46 +0000 (UTC) Received: from localhost (unknown [10.36.118.98]) by smtp.corp.redhat.com (Postfix) with ESMTP id E21A3196B2; Mon, 7 Oct 2019 12:09:38 +0000 (UTC) From: Stefan Hajnoczi To: qemu-devel@nongnu.org Subject: [PATCH 00/16] io_uring: add Linux io_uring AIO engine Date: Mon, 7 Oct 2019 13:09:21 +0100 Message-Id: <20191007120937.5862-1-stefanha@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Mon, 07 Oct 2019 12:09:47 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: oleksandr@redhat.com, Kevin Wolf , qemu-block@nongnu.org, Julia Suvorova , Julia Suvorova , Markus Armbruster , Max Reitz , Stefan Hajnoczi , Paolo Bonzini , Fam Zheng , Aarushi Mehta Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" v10: * Dropped kernel submission queue polling, it requires root and has additional limitations. It should be benchmarked and considered for inclusion later, maybe even together with kernel side changes. * Add io_uring_register_files() return value to trace_luring_fd_register() * Fix indentation in luring_fd_unregister() * Set s->fd_reg.fd_array to NULL after g_free() to avoid dangling pointers * Simplify fd registration code * Add luring_fd_unregister() and call it from file-posix.c to prevent fd leaks * Add trace_luring_fd_unregister() trace event * Add missing space to qemu-img command-line documentation * Update MAINTAINERS file [Julia] * Rename MAX_EVENTS to MAX_ENTRIES [Julia] * Define ioq_submit() before callers so the prototype isn't necessary [Julia] * Declare variables at the beginning of the block in luring_init() [Julia] This patch series is a rebased and cleaned up version of Aarushi Mehta's v9 patch series written for Google Summer of Code 2019: https://lists.gnu.org/archive/html/qemu-devel/2019-08/msg00179.html It adds a new AIO engine that uses the new Linux io_uring API. This is the successor to Linux AIO with a number of improvements: 1. Both O_DIRECT and buffered I/O work 2. fdatasync(2) is supported (no need for a separate thread pool!) 3. True async behavior so the syscall doesn't block (Linux AIO got there to some degree...) 4. Advanced performance optimizations are available (file registration, memory buffer registration, completion polling, submission polling). Since Aarushi has been busy, I have resolved code review comments from v9. Booting a guest works with -drive aio=io_uring and -drive aio=io_uring,cache=none with a raw file on XFS. I currently recommend using -drive aio=io_uring only with host block devices (like NVMe devices). As of Linux v5.4-rc1 I still hit kernel bugs when using image files on ext4 or XFS. Aarushi Mehta (16): configure: permit use of io_uring qapi/block-core: add option for io_uring block/block: add BDRV flag for io_uring block/io_uring: implements interfaces for io_uring stubs: add stubs for io_uring interface util/async: add aio interfaces for io_uring blockdev: adds bdrv_parse_aio to use io_uring block/file-posix.c: extend to use io_uring block: add trace events for io_uring block/io_uring: adds userspace completion polling qemu-io: adds option to use aio engine qemu-img: adds option to use aio engine for benchmarking qemu-nbd: adds option for aio engines tests/qemu-iotests: enable testing with aio options tests/qemu-iotests: use AIOMODE with various tests block/io_uring: adds fd registration MAINTAINERS | 9 + qapi/block-core.json | 4 +- configure | 27 ++ block/Makefile.objs | 3 + stubs/Makefile.objs | 1 + include/block/aio.h | 16 +- include/block/block.h | 2 + include/block/raw-aio.h | 13 + block.c | 22 ++ block/file-posix.c | 117 +++++-- block/io_uring.c | 581 ++++++++++++++++++++++++++++++++++ blockdev.c | 12 +- qemu-img.c | 11 +- qemu-io.c | 25 +- qemu-nbd.c | 12 +- stubs/io_uring.c | 32 ++ util/async.c | 36 +++ block/trace-events | 14 + qemu-img-cmds.hx | 4 +- qemu-img.texi | 5 +- qemu-nbd.texi | 4 +- tests/qemu-iotests/028 | 3 +- tests/qemu-iotests/058 | 2 +- tests/qemu-iotests/089 | 4 +- tests/qemu-iotests/091 | 7 +- tests/qemu-iotests/109 | 3 +- tests/qemu-iotests/147 | 5 +- tests/qemu-iotests/181 | 10 +- tests/qemu-iotests/183 | 7 +- tests/qemu-iotests/185 | 17 +- tests/qemu-iotests/200 | 3 +- tests/qemu-iotests/201 | 10 +- tests/qemu-iotests/check | 15 +- tests/qemu-iotests/common.rc | 14 + tests/qemu-iotests/iotests.py | 12 +- 35 files changed, 982 insertions(+), 80 deletions(-) create mode 100644 block/io_uring.c create mode 100644 stubs/io_uring.c