From nobody Sat Apr 12 07:40:49 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580420017804208.78421825244243; Thu, 30 Jan 2020 13:33:37 -0800 (PST) Received: from localhost ([::1]:39296 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHRP-0008SV-GA for importer@patchew.org; Thu, 30 Jan 2020 16:33:35 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:55830) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHPU-0006kt-Dt for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:31:37 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ixHPQ-0004mE-77 for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:31:36 -0500 Received: from us-smtp-1.mimecast.com ([207.211.31.81]:22191 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ixHPQ-0004iq-42 for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:31:32 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-253-wLsCBkhsPFKWi0vUDmQA1w-1; Thu, 30 Jan 2020 16:31:29 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 11A078017CC; Thu, 30 Jan 2020 21:31:28 +0000 (UTC) Received: from localhost (unknown [10.36.118.87]) by smtp.corp.redhat.com (Postfix) with ESMTP id B60FF5C1B2; Thu, 30 Jan 2020 21:31:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580419891; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=lM48J+YDySyDffAEv62+MyKxuBzqVzbkMx2nuDH/eMI=; b=LAJ9OYgXdvFBuiKkar1Dj3mF7mUfwmQS+rV1f1BvrEGM7+x2Wh5Km05NA3jjPbgbiKg/h6 KjXBpkmP53kS5GevixNQD6KjVqf7sinGSTLBPvZOpHM4ooU62yxdCqu8vag9+SvXw3bZ6d EZBs8FFwltvMnhz+5xG5GqTFhfeVdFA= From: Stefan Hajnoczi To: qemu-devel@nongnu.org Subject: [PULL 01/18] block: eliminate BDRV_REQ_NO_SERIALISING Date: Thu, 30 Jan 2020 21:30:57 +0000 Message-Id: <20200130213114.325157-2-stefanha@redhat.com> In-Reply-To: <20200130213114.325157-1-stefanha@redhat.com> References: <20200130213114.325157-1-stefanha@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-MC-Unique: wLsCBkhsPFKWi0vUDmQA1w-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 207.211.31.81 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: Kevin Wolf , Peter Maydell , qemu-block@nongnu.org, Julia Suvorova , Markus Armbruster , Max Reitz , Stefan Hajnoczi , Paolo Bonzini , Fam Zheng , Aarushi Mehta Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Paolo Bonzini It is unused since commit 00e30f0 ("block/backup: use backup-top instead of write notifiers", 2019-10-01), drop it to simplify the code. While at it, drop redundant assertions on flags. Signed-off-by: Paolo Bonzini Message-id: 1578495356-46219-2-git-send-email-pbonzini@redhat.com Message-Id: <1578495356-46219-2-git-send-email-pbonzini@redhat.com> Signed-off-by: Stefan Hajnoczi --- block/io.c | 18 ++++-------------- include/block/block.h | 12 ------------ 2 files changed, 4 insertions(+), 26 deletions(-) diff --git a/block/io.c b/block/io.c index f75777f5ea..b3a67fe1db 100644 --- a/block/io.c +++ b/block/io.c @@ -1445,8 +1445,7 @@ static int coroutine_fn bdrv_aligned_preadv(BdrvChild= *child, * potential fallback support, if we ever implement any read flags * to pass through to drivers. For now, there aren't any * passthrough flags. */ - assert(!(flags & ~(BDRV_REQ_NO_SERIALISING | BDRV_REQ_COPY_ON_READ | - BDRV_REQ_PREFETCH))); + assert(!(flags & ~(BDRV_REQ_COPY_ON_READ | BDRV_REQ_PREFETCH))); =20 /* Handle Copy on Read and associated serialisation */ if (flags & BDRV_REQ_COPY_ON_READ) { @@ -1458,12 +1457,7 @@ static int coroutine_fn bdrv_aligned_preadv(BdrvChil= d *child, bdrv_mark_request_serialising(req, bdrv_get_cluster_size(bs)); } =20 - /* BDRV_REQ_SERIALISING is only for write operation */ - assert(!(flags & BDRV_REQ_SERIALISING)); - - if (!(flags & BDRV_REQ_NO_SERIALISING)) { - bdrv_wait_serialising_requests(req); - } + bdrv_wait_serialising_requests(req); =20 if (flags & BDRV_REQ_COPY_ON_READ) { int64_t pnum; @@ -1711,7 +1705,7 @@ int coroutine_fn bdrv_co_preadv_part(BdrvChild *child, bdrv_inc_in_flight(bs); =20 /* Don't do copy-on-read if we read data before write operation */ - if (atomic_read(&bs->copy_on_read) && !(flags & BDRV_REQ_NO_SERIALISIN= G)) { + if (atomic_read(&bs->copy_on_read)) { flags |=3D BDRV_REQ_COPY_ON_READ; } =20 @@ -1852,8 +1846,6 @@ bdrv_co_write_req_prepare(BdrvChild *child, int64_t o= ffset, uint64_t bytes, return -EPERM; } =20 - /* BDRV_REQ_NO_SERIALISING is only for read operation */ - assert(!(flags & BDRV_REQ_NO_SERIALISING)); assert(!(bs->open_flags & BDRV_O_INACTIVE)); assert((bs->open_flags & BDRV_O_NO_IO) =3D=3D 0); assert(!(flags & ~BDRV_REQ_MASK)); @@ -3222,9 +3214,7 @@ static int coroutine_fn bdrv_co_copy_range_internal( =20 /* BDRV_REQ_SERIALISING is only for write operation */ assert(!(read_flags & BDRV_REQ_SERIALISING)); - if (!(read_flags & BDRV_REQ_NO_SERIALISING)) { - bdrv_wait_serialising_requests(&req); - } + bdrv_wait_serialising_requests(&req); =20 ret =3D src->bs->drv->bdrv_co_copy_range_from(src->bs, src, src_offset, diff --git a/include/block/block.h b/include/block/block.h index e9dcfef7fa..23c76421e4 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -51,18 +51,6 @@ typedef enum { */ BDRV_REQ_MAY_UNMAP =3D 0x4, =20 - /* - * The BDRV_REQ_NO_SERIALISING flag is only valid for reads and means = that - * we don't want wait_serialising_requests() during the read operation. - * - * This flag is used for backup copy-on-write operations, when we need= to - * read old data before write (write notifier triggered). It is okay s= ince - * we already waited for other serializing requests in the initiating = write - * (see bdrv_aligned_pwritev), and it is necessary if the initiating w= rite - * is already serializing (without the flag, the read would deadlock - * waiting for the serialising write to complete). - */ - BDRV_REQ_NO_SERIALISING =3D 0x8, BDRV_REQ_FUA =3D 0x10, BDRV_REQ_WRITE_COMPRESSED =3D 0x20, =20 --=20 2.24.1 From nobody Sat Apr 12 07:40:49 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580420133905664.1281549360949; Thu, 30 Jan 2020 13:35:33 -0800 (PST) Received: from localhost ([::1]:39354 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHTI-0003sO-OA for importer@patchew.org; Thu, 30 Jan 2020 16:35:32 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:55866) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHPV-0006lE-W4 for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:31:39 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ixHPU-0004pz-Jw for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:31:37 -0500 Received: from us-smtp-2.mimecast.com ([207.211.31.81]:38449 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ixHPU-0004mR-G0 for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:31:36 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-29-Gh2ATA1DMfCbOoPsok2cJA-1; Thu, 30 Jan 2020 16:31:31 -0500 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id B425610054E3; Thu, 30 Jan 2020 21:31:29 +0000 (UTC) Received: from localhost (unknown [10.36.118.87]) by smtp.corp.redhat.com (Postfix) with ESMTP id 498CC84BCE; Thu, 30 Jan 2020 21:31:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580419893; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=rCXifKAz8zdxy0qXQ36bHA8fkm12N4h0f95Q6RTvdGc=; b=JmiftbcaTWO+bqn1t+yiUMOCuTj+0ByRsvQLoBHpH67R5kQSTtsgb5GxisG1UIXjge6noA qCP8hsR5HimqJSWVexZ6Uohh+wzB67/ONWg8nphFxMWFrce8ObPGv/Cd/V9SpFF4/0YDzx UQcCRWnZTmB0KHaamAgSLt55M6Ow6lA= From: Stefan Hajnoczi To: qemu-devel@nongnu.org Subject: [PULL 02/18] block/io: wait for serialising requests when a request becomes serialising Date: Thu, 30 Jan 2020 21:30:58 +0000 Message-Id: <20200130213114.325157-3-stefanha@redhat.com> In-Reply-To: <20200130213114.325157-1-stefanha@redhat.com> References: <20200130213114.325157-1-stefanha@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-MC-Unique: Gh2ATA1DMfCbOoPsok2cJA-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 207.211.31.81 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: Kevin Wolf , Peter Maydell , qemu-block@nongnu.org, Julia Suvorova , Markus Armbruster , Max Reitz , Stefan Hajnoczi , Paolo Bonzini , Fam Zheng , Aarushi Mehta Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Paolo Bonzini Marking without waiting would not result in actual serialising behavior. Thus, make a call bdrv_mark_request_serialising sufficient for serialisation to happen. Signed-off-by: Paolo Bonzini Message-id: 1578495356-46219-3-git-send-email-pbonzini@redhat.com Message-Id: <1578495356-46219-3-git-send-email-pbonzini@redhat.com> Signed-off-by: Stefan Hajnoczi --- block/file-posix.c | 1 - block/io.c | 40 +++++++++++++++++---------------------- include/block/block_int.h | 3 +-- 3 files changed, 18 insertions(+), 26 deletions(-) diff --git a/block/file-posix.c b/block/file-posix.c index 1b805bd938..2b08b02d27 100644 --- a/block/file-posix.c +++ b/block/file-posix.c @@ -2753,7 +2753,6 @@ raw_do_pwrite_zeroes(BlockDriverState *bs, int64_t of= fset, int bytes, req->overlap_bytes =3D req->bytes; =20 bdrv_mark_request_serialising(req, bs->bl.request_alignment); - bdrv_wait_serialising_requests(req); } #endif =20 diff --git a/block/io.c b/block/io.c index b3a67fe1db..c466df8ed5 100644 --- a/block/io.c +++ b/block/io.c @@ -41,6 +41,7 @@ #define MAX_BOUNCE_BUFFER (32768 << BDRV_SECTOR_BITS) =20 static void bdrv_parent_cb_resize(BlockDriverState *bs); +static bool coroutine_fn bdrv_wait_serialising_requests(BdrvTrackedRequest= *self); static int coroutine_fn bdrv_co_do_pwrite_zeroes(BlockDriverState *bs, int64_t offset, int bytes, BdrvRequestFlags flags); =20 @@ -715,7 +716,7 @@ static void tracked_request_begin(BdrvTrackedRequest *r= eq, qemu_co_mutex_unlock(&bs->reqs_lock); } =20 -void bdrv_mark_request_serialising(BdrvTrackedRequest *req, uint64_t align) +bool bdrv_mark_request_serialising(BdrvTrackedRequest *req, uint64_t align) { int64_t overlap_offset =3D req->offset & ~(align - 1); uint64_t overlap_bytes =3D ROUND_UP(req->offset + req->bytes, align) @@ -728,18 +729,7 @@ void bdrv_mark_request_serialising(BdrvTrackedRequest = *req, uint64_t align) =20 req->overlap_offset =3D MIN(req->overlap_offset, overlap_offset); req->overlap_bytes =3D MAX(req->overlap_bytes, overlap_bytes); -} - -static bool is_request_serialising_and_aligned(BdrvTrackedRequest *req) -{ - /* - * If the request is serialising, overlap_offset and overlap_bytes are= set, - * so we can check if the request is aligned. Otherwise, don't care and - * return false. - */ - - return req->serialising && (req->offset =3D=3D req->overlap_offset) && - (req->bytes =3D=3D req->overlap_bytes); + return bdrv_wait_serialising_requests(req); } =20 /** @@ -823,7 +813,7 @@ void bdrv_dec_in_flight(BlockDriverState *bs) bdrv_wakeup(bs); } =20 -bool coroutine_fn bdrv_wait_serialising_requests(BdrvTrackedRequest *self) +static bool coroutine_fn bdrv_wait_serialising_requests(BdrvTrackedRequest= *self) { BlockDriverState *bs =3D self->bs; BdrvTrackedRequest *req; @@ -1455,10 +1445,10 @@ static int coroutine_fn bdrv_aligned_preadv(BdrvChi= ld *child, * it ensures that the CoR read and write operations are atomic and * guest writes cannot interleave between them. */ bdrv_mark_request_serialising(req, bdrv_get_cluster_size(bs)); + } else { + bdrv_wait_serialising_requests(req); } =20 - bdrv_wait_serialising_requests(req); - if (flags & BDRV_REQ_COPY_ON_READ) { int64_t pnum; =20 @@ -1851,13 +1841,19 @@ bdrv_co_write_req_prepare(BdrvChild *child, int64_t= offset, uint64_t bytes, assert(!(flags & ~BDRV_REQ_MASK)); =20 if (flags & BDRV_REQ_SERIALISING) { - bdrv_mark_request_serialising(req, bdrv_get_cluster_size(bs)); + waited =3D bdrv_mark_request_serialising(req, bdrv_get_cluster_siz= e(bs)); + /* + * For a misaligned request we should have already waited earlier, + * because we come after bdrv_padding_rmw_read which must be called + * with the request already marked as serialising. + */ + assert(!waited || + (req->offset =3D=3D req->overlap_offset && + req->bytes =3D=3D req->overlap_bytes)); + } else { + bdrv_wait_serialising_requests(req); } =20 - waited =3D bdrv_wait_serialising_requests(req); - - assert(!waited || !req->serialising || - is_request_serialising_and_aligned(req)); assert(req->overlap_offset <=3D offset); assert(offset + bytes <=3D req->overlap_offset + req->overlap_bytes); assert(end_sector <=3D bs->total_sectors || child->perm & BLK_PERM_RES= IZE); @@ -2019,7 +2015,6 @@ static int coroutine_fn bdrv_co_do_zero_pwritev(BdrvC= hild *child, padding =3D bdrv_init_padding(bs, offset, bytes, &pad); if (padding) { bdrv_mark_request_serialising(req, align); - bdrv_wait_serialising_requests(req); =20 bdrv_padding_rmw_read(child, req, &pad, true); =20 @@ -2122,7 +2117,6 @@ int coroutine_fn bdrv_co_pwritev_part(BdrvChild *chil= d, =20 if (bdrv_pad_request(bs, &qiov, &qiov_offset, &offset, &bytes, &pad)) { bdrv_mark_request_serialising(&req, align); - bdrv_wait_serialising_requests(&req); bdrv_padding_rmw_read(child, &req, &pad, false); } =20 diff --git a/include/block/block_int.h b/include/block/block_int.h index dd033d0b37..640fb82c78 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -999,8 +999,7 @@ extern unsigned int bdrv_drain_all_count; void bdrv_apply_subtree_drain(BdrvChild *child, BlockDriverState *new_pare= nt); void bdrv_unapply_subtree_drain(BdrvChild *child, BlockDriverState *old_pa= rent); =20 -bool coroutine_fn bdrv_wait_serialising_requests(BdrvTrackedRequest *self); -void bdrv_mark_request_serialising(BdrvTrackedRequest *req, uint64_t align= ); +bool coroutine_fn bdrv_mark_request_serialising(BdrvTrackedRequest *req, u= int64_t align); BdrvTrackedRequest *coroutine_fn bdrv_co_get_self_request(BlockDriverState= *bs); =20 int get_tmp_filename(char *filename, int size); --=20 2.24.1 From nobody Sat Apr 12 07:40:49 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580420033808263.95889004435355; Thu, 30 Jan 2020 13:33:53 -0800 (PST) Received: from localhost ([::1]:39318 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHRg-0000aA-G3 for importer@patchew.org; Thu, 30 Jan 2020 16:33:52 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:55914) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHPZ-0006ra-RG for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:31:43 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ixHPY-00050T-Dr for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:31:41 -0500 Received: from us-smtp-delivery-1.mimecast.com ([205.139.110.120]:28565 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ixHPY-0004z4-96 for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:31:40 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-312-4gZiXK0JMAyL8Qb98S8e2g-1; Thu, 30 Jan 2020 16:31:37 -0500 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 mimecast-mx01.redhat.com (Postfix) with ESMTPS id 7C9511005513; Thu, 30 Jan 2020 21:31:36 +0000 (UTC) Received: from localhost (unknown [10.36.118.87]) by smtp.corp.redhat.com (Postfix) with ESMTP id CB43B19488; Thu, 30 Jan 2020 21:31:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580419899; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=pQP9OA32VCmZvu+nXMW5sTI/63FgkAGA9WupDP5WqyE=; b=SOZCFPqV0y1RrAsuFb4bJpsLUGi6+QGRl/44tZJJduLL0aVJSpFL/fIf/uVxPWgYNfkdtN IzrYXC94jkqsESvJLAYxbutpl7jsbr2qESeohkirN0KgcQmcJdjRoNAlAaELbjYIakqlCY bqZinMTOT+b4jsZvKXVqMacNTf02n4Q= From: Stefan Hajnoczi To: qemu-devel@nongnu.org Subject: [PULL 03/18] block/io: take bs->reqs_lock in bdrv_mark_request_serialising Date: Thu, 30 Jan 2020 21:30:59 +0000 Message-Id: <20200130213114.325157-4-stefanha@redhat.com> In-Reply-To: <20200130213114.325157-1-stefanha@redhat.com> References: <20200130213114.325157-1-stefanha@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-MC-Unique: 4gZiXK0JMAyL8Qb98S8e2g-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 205.139.110.120 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: Kevin Wolf , Peter Maydell , qemu-block@nongnu.org, Peter Lieven , Julia Suvorova , Markus Armbruster , Max Reitz , Stefan Hajnoczi , Paolo Bonzini , Fam Zheng , Aarushi Mehta Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Paolo Bonzini bdrv_mark_request_serialising is writing the overlap_offset and overlap_bytes fields of BdrvTrackedRequest. Take bs->reqs_lock for the whole duration of it, and not just when waiting for serialising requests, so that tracked_request_overlaps does not look at a half-updated request. The new code does not unlock/relock around retries. This is unnecessary because a retry is always preceded by a CoQueue wait, which already releases and reacquires bs->reqs_lock. Reported-by: Peter Lieven Signed-off-by: Paolo Bonzini Message-id: 1578495356-46219-4-git-send-email-pbonzini@redhat.com Message-Id: <1578495356-46219-4-git-send-email-pbonzini@redhat.com> Signed-off-by: Stefan Hajnoczi --- block/io.c | 112 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 63 insertions(+), 49 deletions(-) diff --git a/block/io.c b/block/io.c index c466df8ed5..1eb2b2bddc 100644 --- a/block/io.c +++ b/block/io.c @@ -41,7 +41,6 @@ #define MAX_BOUNCE_BUFFER (32768 << BDRV_SECTOR_BITS) =20 static void bdrv_parent_cb_resize(BlockDriverState *bs); -static bool coroutine_fn bdrv_wait_serialising_requests(BdrvTrackedRequest= *self); static int coroutine_fn bdrv_co_do_pwrite_zeroes(BlockDriverState *bs, int64_t offset, int bytes, BdrvRequestFlags flags); =20 @@ -716,12 +715,69 @@ static void tracked_request_begin(BdrvTrackedRequest = *req, qemu_co_mutex_unlock(&bs->reqs_lock); } =20 +static bool tracked_request_overlaps(BdrvTrackedRequest *req, + int64_t offset, uint64_t bytes) +{ + /* aaaa bbbb */ + if (offset >=3D req->overlap_offset + req->overlap_bytes) { + return false; + } + /* bbbb aaaa */ + if (req->overlap_offset >=3D offset + bytes) { + return false; + } + return true; +} + +static bool coroutine_fn +bdrv_wait_serialising_requests_locked(BlockDriverState *bs, + BdrvTrackedRequest *self) +{ + BdrvTrackedRequest *req; + bool retry; + bool waited =3D false; + + do { + retry =3D false; + QLIST_FOREACH(req, &bs->tracked_requests, list) { + if (req =3D=3D self || (!req->serialising && !self->serialisin= g)) { + continue; + } + if (tracked_request_overlaps(req, self->overlap_offset, + self->overlap_bytes)) + { + /* Hitting this means there was a reentrant request, for + * example, a block driver issuing nested requests. This = must + * never happen since it means deadlock. + */ + assert(qemu_coroutine_self() !=3D req->co); + + /* If the request is already (indirectly) waiting for us, = or + * will wait for us as soon as it wakes up, then just go on + * (instead of producing a deadlock in the former case). */ + if (!req->waiting_for) { + self->waiting_for =3D req; + qemu_co_queue_wait(&req->wait_queue, &bs->reqs_lock); + self->waiting_for =3D NULL; + retry =3D true; + waited =3D true; + break; + } + } + } + } while (retry); + return waited; +} + bool bdrv_mark_request_serialising(BdrvTrackedRequest *req, uint64_t align) { + BlockDriverState *bs =3D req->bs; int64_t overlap_offset =3D req->offset & ~(align - 1); uint64_t overlap_bytes =3D ROUND_UP(req->offset + req->bytes, align) - overlap_offset; + bool waited; =20 + qemu_co_mutex_lock(&bs->reqs_lock); if (!req->serialising) { atomic_inc(&req->bs->serialising_in_flight); req->serialising =3D true; @@ -729,7 +785,9 @@ bool bdrv_mark_request_serialising(BdrvTrackedRequest *= req, uint64_t align) =20 req->overlap_offset =3D MIN(req->overlap_offset, overlap_offset); req->overlap_bytes =3D MAX(req->overlap_bytes, overlap_bytes); - return bdrv_wait_serialising_requests(req); + waited =3D bdrv_wait_serialising_requests_locked(bs, req); + qemu_co_mutex_unlock(&bs->reqs_lock); + return waited; } =20 /** @@ -783,20 +841,6 @@ static int bdrv_get_cluster_size(BlockDriverState *bs) } } =20 -static bool tracked_request_overlaps(BdrvTrackedRequest *req, - int64_t offset, uint64_t bytes) -{ - /* aaaa bbbb */ - if (offset >=3D req->overlap_offset + req->overlap_bytes) { - return false; - } - /* bbbb aaaa */ - if (req->overlap_offset >=3D offset + bytes) { - return false; - } - return true; -} - void bdrv_inc_in_flight(BlockDriverState *bs) { atomic_inc(&bs->in_flight); @@ -816,45 +860,15 @@ void bdrv_dec_in_flight(BlockDriverState *bs) static bool coroutine_fn bdrv_wait_serialising_requests(BdrvTrackedRequest= *self) { BlockDriverState *bs =3D self->bs; - BdrvTrackedRequest *req; - bool retry; bool waited =3D false; =20 if (!atomic_read(&bs->serialising_in_flight)) { return false; } =20 - do { - retry =3D false; - qemu_co_mutex_lock(&bs->reqs_lock); - QLIST_FOREACH(req, &bs->tracked_requests, list) { - if (req =3D=3D self || (!req->serialising && !self->serialisin= g)) { - continue; - } - if (tracked_request_overlaps(req, self->overlap_offset, - self->overlap_bytes)) - { - /* Hitting this means there was a reentrant request, for - * example, a block driver issuing nested requests. This = must - * never happen since it means deadlock. - */ - assert(qemu_coroutine_self() !=3D req->co); - - /* If the request is already (indirectly) waiting for us, = or - * will wait for us as soon as it wakes up, then just go on - * (instead of producing a deadlock in the former case). */ - if (!req->waiting_for) { - self->waiting_for =3D req; - qemu_co_queue_wait(&req->wait_queue, &bs->reqs_lock); - self->waiting_for =3D NULL; - retry =3D true; - waited =3D true; - break; - } - } - } - qemu_co_mutex_unlock(&bs->reqs_lock); - } while (retry); + qemu_co_mutex_lock(&bs->reqs_lock); + waited =3D bdrv_wait_serialising_requests_locked(bs, self); + qemu_co_mutex_unlock(&bs->reqs_lock); =20 return waited; } --=20 2.24.1 From nobody Sat Apr 12 07:40:49 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580420030365916.7287518191446; Thu, 30 Jan 2020 13:33:50 -0800 (PST) Received: from localhost ([::1]:39312 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHRc-0000Vu-SV for importer@patchew.org; Thu, 30 Jan 2020 16:33:48 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:55999) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHPg-00072o-M0 for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:31:50 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ixHPf-0005Fy-Gg for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:31:48 -0500 Received: from us-smtp-delivery-1.mimecast.com ([207.211.31.120]:33625 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ixHPf-0005Ej-D2 for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:31:47 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-421-vvWMA32yOIW6ftuciUebgA-1; Thu, 30 Jan 2020 16:31:44 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 71EA68017CC; Thu, 30 Jan 2020 21:31:43 +0000 (UTC) Received: from localhost (unknown [10.36.118.87]) by smtp.corp.redhat.com (Postfix) with ESMTP id D03661001B28; Thu, 30 Jan 2020 21:31:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580419907; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=CPsbxOCE4VjalX70gLBLscC7rHlV6VgQq88Us3Vl6CA=; b=KOY/REYluLdq0jMdfsVsLtmb2A89WS+7HZXpmFq13Vi/hY2mwZ70GzG/eBHJjSQUzA0kCC cHA1v757owGCX4p+BWmPWZdXqKwwJpg8ELV1e2NMa+H8aRhV2AydW4wwAbfx61QBhDOH8S kX9C3TqoMLymMtdpqKIbY3RnpXksvHA= From: Stefan Hajnoczi To: qemu-devel@nongnu.org Subject: [PULL 04/18] configure: permit use of io_uring Date: Thu, 30 Jan 2020 21:31:00 +0000 Message-Id: <20200130213114.325157-5-stefanha@redhat.com> In-Reply-To: <20200130213114.325157-1-stefanha@redhat.com> References: <20200130213114.325157-1-stefanha@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-MC-Unique: vvWMA32yOIW6ftuciUebgA-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 207.211.31.120 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: Kevin Wolf , Peter Maydell , Maxim Levitsky , qemu-block@nongnu.org, Julia Suvorova , Markus Armbruster , Max Reitz , Stefan Hajnoczi , Paolo Bonzini , Fam Zheng , Aarushi Mehta , Stefano Garzarella Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Aarushi Mehta Signed-off-by: Aarushi Mehta Reviewed-by: Maxim Levitsky Acked-by: Stefano Garzarella Signed-off-by: Stefan Hajnoczi Message-id: 20200120141858.587874-2-stefanha@redhat.com Message-Id: <20200120141858.587874-2-stefanha@redhat.com> Signed-off-by: Stefan Hajnoczi --- configure | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/configure b/configure index a72a5def57..5095f01728 100755 --- a/configure +++ b/configure @@ -371,6 +371,7 @@ xen=3D"" xen_ctrl_version=3D"" xen_pci_passthrough=3D"" linux_aio=3D"" +linux_io_uring=3D"" cap_ng=3D"" attr=3D"" libattr=3D"" @@ -1253,6 +1254,10 @@ for opt do ;; --enable-linux-aio) linux_aio=3D"yes" ;; + --disable-linux-io-uring) linux_io_uring=3D"no" + ;; + --enable-linux-io-uring) linux_io_uring=3D"yes" + ;; --disable-attr) attr=3D"no" ;; --enable-attr) attr=3D"yes" @@ -1773,6 +1778,7 @@ disabled with --disable-FEATURE, default is enabled i= f available: vde support for vde network netmap support for netmap network linux-aio Linux AIO support + linux-io-uring Linux io_uring support cap-ng libcap-ng support attr attr and xattr support vhost-net vhost-net kernel acceleration support @@ -4005,6 +4011,21 @@ EOF linux_aio=3Dno fi fi +########################################## +# linux-io-uring probe + +if test "$linux_io_uring" !=3D "no" ; then + if $pkg_config liburing; then + linux_io_uring_cflags=3D$($pkg_config --cflags liburing) + linux_io_uring_libs=3D$($pkg_config --libs liburing) + linux_io_uring=3Dyes + else + if test "$linux_io_uring" =3D "yes" ; then + feature_not_found "linux io_uring" "Install liburing devel" + fi + linux_io_uring=3Dno + fi +fi =20 ########################################## # TPM emulation is only on POSIX @@ -6515,6 +6536,7 @@ echo "PIE $pie" echo "vde support $vde" echo "netmap support $netmap" echo "Linux AIO support $linux_aio" +echo "Linux io_uring support $linux_io_uring" echo "ATTR/XATTR support $attr" echo "Install blobs $blobs" echo "KVM support $kvm" @@ -7001,6 +7023,11 @@ fi if test "$linux_aio" =3D "yes" ; then echo "CONFIG_LINUX_AIO=3Dy" >> $config_host_mak fi +if test "$linux_io_uring" =3D "yes" ; then + echo "CONFIG_LINUX_IO_URING=3Dy" >> $config_host_mak + echo "LINUX_IO_URING_CFLAGS=3D$linux_io_uring_cflags" >> $config_host_mak + echo "LINUX_IO_URING_LIBS=3D$linux_io_uring_libs" >> $config_host_mak +fi if test "$attr" =3D "yes" ; then echo "CONFIG_ATTR=3Dy" >> $config_host_mak fi --=20 2.24.1 From nobody Sat Apr 12 07:40:49 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580420132805962.3181431111091; Thu, 30 Jan 2020 13:35:32 -0800 (PST) Received: from localhost ([::1]:39353 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHTH-0003qA-Kt for importer@patchew.org; Thu, 30 Jan 2020 16:35:31 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:56089) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHPp-0007K2-GB for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:31:58 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ixHPn-0005Vb-Bs for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:31:56 -0500 Received: from us-smtp-delivery-1.mimecast.com ([207.211.31.120]:59585 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ixHPn-0005VE-8b for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:31:55 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-293-HrylpGiIMgeHrpWy4XrAxA-1; Thu, 30 Jan 2020 16:31:52 -0500 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id CAF12DB63; Thu, 30 Jan 2020 21:31:50 +0000 (UTC) Received: from localhost (unknown [10.36.118.87]) by smtp.corp.redhat.com (Postfix) with ESMTP id C9E875DA81; Thu, 30 Jan 2020 21:31:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580419914; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=fgw0Zottfvxrx88nu4j0C9iqS2nNrRH+7ihoFZJPjx4=; b=CiBPSPIJ/zBWOX1mlJMaxhd/9Cr7sDRi0ecF6hRVz074E1GNSVSBojSCc+4VtwrDeKWvpi gUjliW7Mfzmliqy/gHeRrUlKfEd0K7/katxPY5ZW5YcI4/6Gr89xYH/uAVU+0/wNfFpqDG /KFIhuWxBDfrowtTF9vxZntZ8P+hFkI= From: Stefan Hajnoczi To: qemu-devel@nongnu.org Subject: [PULL 05/18] qapi/block-core: add option for io_uring Date: Thu, 30 Jan 2020 21:31:01 +0000 Message-Id: <20200130213114.325157-6-stefanha@redhat.com> In-Reply-To: <20200130213114.325157-1-stefanha@redhat.com> References: <20200130213114.325157-1-stefanha@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-MC-Unique: HrylpGiIMgeHrpWy4XrAxA-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 207.211.31.120 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: Kevin Wolf , Peter Maydell , qemu-block@nongnu.org, Julia Suvorova , Markus Armbruster , Max Reitz , Stefan Hajnoczi , Paolo Bonzini , Fam Zheng , Aarushi Mehta , Stefano Garzarella Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Aarushi Mehta Since io_uring is the actual name of the Linux API, we use it as enum value even though the QAPI schema conventions would prefer io-uring. Signed-off-by: Aarushi Mehta Acked-by: Markus Armbruster Acked-by: Stefano Garzarella Signed-off-by: Stefan Hajnoczi Message-id: 20200120141858.587874-3-stefanha@redhat.com Message-Id: <20200120141858.587874-3-stefanha@redhat.com> Signed-off-by: Stefan Hajnoczi --- qapi/block-core.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/qapi/block-core.json b/qapi/block-core.json index 7ff5e5edaf..ef94a29686 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -2851,11 +2851,13 @@ # # @threads: Use qemu's thread pool # @native: Use native AIO backend (only Linux and Windows) +# @io_uring: Use linux io_uring (since 5.0) # # Since: 2.9 ## { 'enum': 'BlockdevAioOptions', - 'data': [ 'threads', 'native' ] } + 'data': [ 'threads', 'native', + { 'name': 'io_uring', 'if': 'defined(CONFIG_LINUX_IO_URING)' }= ] } =20 ## # @BlockdevCacheOptions: --=20 2.24.1 From nobody Sat Apr 12 07:40:49 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580420251055612.3971520588806; Thu, 30 Jan 2020 13:37:31 -0800 (PST) Received: from localhost ([::1]:39400 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHVB-0007Jw-Tn for importer@patchew.org; Thu, 30 Jan 2020 16:37:29 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:56178) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHPz-0007ao-B7 for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:08 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ixHPy-0005o4-3I for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:07 -0500 Received: from us-smtp-2.mimecast.com ([205.139.110.61]:27595 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ixHPx-0005nM-Us for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:06 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-340-HC44HolfOuqDRlsqiIEBUw-1; Thu, 30 Jan 2020 16:32:03 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 4A6C1107ACC5; Thu, 30 Jan 2020 21:32:02 +0000 (UTC) Received: from localhost (unknown [10.36.118.87]) by smtp.corp.redhat.com (Postfix) with ESMTP id 396CF5C296; Thu, 30 Jan 2020 21:31:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580419925; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=HKxpTm+afeyGmu7/9iyHVfWBgCnzk5Y/uzajPhNP/zU=; b=hCSGko+XFkteO3TZ6hiZPRtX8iIJGeNoFnHJo8HbZ8+mbBv3MtQqb41f/wixiPJZ+RhJb7 DR8WvoAmWjOc0IezGwKHDJI6MY51PCUHhKohSMDKtmNw9gobkCmrno+CCV/sEmw9D5aisQ CJPSKpVA/AezA1MdEfZQzxmd9XWW0j4= From: Stefan Hajnoczi To: qemu-devel@nongnu.org Subject: [PULL 06/18] block/block: add BDRV flag for io_uring Date: Thu, 30 Jan 2020 21:31:02 +0000 Message-Id: <20200130213114.325157-7-stefanha@redhat.com> In-Reply-To: <20200130213114.325157-1-stefanha@redhat.com> References: <20200130213114.325157-1-stefanha@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-MC-Unique: HC44HolfOuqDRlsqiIEBUw-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 205.139.110.61 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: Kevin Wolf , Peter Maydell , Maxim Levitsky , qemu-block@nongnu.org, Julia Suvorova , Markus Armbruster , Max Reitz , Stefan Hajnoczi , Paolo Bonzini , Fam Zheng , Aarushi Mehta , Stefano Garzarella Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Aarushi Mehta Signed-off-by: Aarushi Mehta Reviewed-by: Maxim Levitsky Acked-by: Stefano Garzarella Signed-off-by: Stefan Hajnoczi Message-id: 20200120141858.587874-4-stefanha@redhat.com Message-Id: <20200120141858.587874-4-stefanha@redhat.com> Signed-off-by: Stefan Hajnoczi --- include/block/block.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/block/block.h b/include/block/block.h index 23c76421e4..19184d5850 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -114,6 +114,7 @@ typedef struct HDGeometry { ignoring the format layer */ #define BDRV_O_NO_IO 0x10000 /* don't initialize for I/O */ #define BDRV_O_AUTO_RDONLY 0x20000 /* degrade to read-only if opening read= -write fails */ +#define BDRV_O_IO_URING 0x40000 /* use io_uring instead of the thread p= ool */ =20 #define BDRV_O_CACHE_MASK (BDRV_O_NOCACHE | BDRV_O_NO_FLUSH) =20 --=20 2.24.1 From nobody Sat Apr 12 07:40:49 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 15804203517994.373624804092628; Thu, 30 Jan 2020 13:39:11 -0800 (PST) Received: from localhost ([::1]:39438 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHWo-00025K-3i for importer@patchew.org; Thu, 30 Jan 2020 16:39:10 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:56238) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHQB-0007wZ-Nj for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:22 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ixHQ9-0006Bm-9R for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:19 -0500 Received: from us-smtp-1.mimecast.com ([207.211.31.81]:45832 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ixHQ9-0006BA-2U for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:17 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-181-gGMNc1xNOWioUxytaheeRA-1; Thu, 30 Jan 2020 16:32:10 -0500 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 58650800D41; Thu, 30 Jan 2020 21:32:09 +0000 (UTC) Received: from localhost (unknown [10.36.118.87]) by smtp.corp.redhat.com (Postfix) with ESMTP id AB4F47792C; Thu, 30 Jan 2020 21:32:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580419936; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=gQE7JZP3ejF2bDFCP66R/w6+1/ijKE0r6ej7sxLCYa8=; b=Qkn4AjXsz5BWQzIFGCrjsvihmT2PtwUZRwmVa3lHM7TfSd1IM5DyHZ7wa4zeAw5VeD6158 VL5KNZEG1/FgQL8xRgZ0Zb9s1/fgIsOsfOwojjFBM1IxVpekKVnN7vQlohdhtwGg9XQjz/ kTAtV1c3tYh/IF3rKmHXVZ2gaL9oQVc= From: Stefan Hajnoczi To: qemu-devel@nongnu.org Subject: [PULL 07/18] block/io_uring: implements interfaces for io_uring Date: Thu, 30 Jan 2020 21:31:03 +0000 Message-Id: <20200130213114.325157-8-stefanha@redhat.com> In-Reply-To: <20200130213114.325157-1-stefanha@redhat.com> References: <20200130213114.325157-1-stefanha@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-MC-Unique: gGMNc1xNOWioUxytaheeRA-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 207.211.31.81 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: Kevin Wolf , Peter Maydell , qemu-block@nongnu.org, Julia Suvorova , Markus Armbruster , Max Reitz , Stefan Hajnoczi , Paolo Bonzini , Fam Zheng , Aarushi Mehta , Stefano Garzarella Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Aarushi Mehta Aborts when sqe fails to be set as sqes cannot be returned to the ring. Adds slow path for short reads for older kernels Signed-off-by: Aarushi Mehta Acked-by: Stefano Garzarella Signed-off-by: Stefan Hajnoczi Message-id: 20200120141858.587874-5-stefanha@redhat.com Message-Id: <20200120141858.587874-5-stefanha@redhat.com> Signed-off-by: Stefan Hajnoczi --- MAINTAINERS | 8 + block/Makefile.objs | 3 + block/io_uring.c | 401 ++++++++++++++++++++++++++++++++++++++++ include/block/aio.h | 16 +- include/block/raw-aio.h | 12 ++ 5 files changed, 439 insertions(+), 1 deletion(-) create mode 100644 block/io_uring.c diff --git a/MAINTAINERS b/MAINTAINERS index c45e886d88..a19437c13d 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2634,6 +2634,14 @@ F: block/file-posix.c F: block/file-win32.c F: block/win32-aio.c =20 +Linux io_uring +M: Aarushi Mehta +M: Julia Suvorova +M: Stefan Hajnoczi +L: qemu-block@nongnu.org +S: Maintained +F: block/io_uring.c + qcow2 M: Kevin Wolf M: Max Reitz diff --git a/block/Makefile.objs b/block/Makefile.objs index 330529b0b7..3bcb35c81d 100644 --- a/block/Makefile.objs +++ b/block/Makefile.objs @@ -18,6 +18,7 @@ block-obj-y +=3D block-backend.o snapshot.o qapi.o block-obj-$(CONFIG_WIN32) +=3D file-win32.o win32-aio.o block-obj-$(CONFIG_POSIX) +=3D file-posix.o block-obj-$(CONFIG_LINUX_AIO) +=3D linux-aio.o +block-obj-$(CONFIG_LINUX_IO_URING) +=3D io_uring.o block-obj-y +=3D null.o mirror.o commit.o io.o create.o block-obj-y +=3D throttle-groups.o block-obj-$(CONFIG_LINUX) +=3D nvme.o @@ -66,5 +67,7 @@ block-obj-$(if $(CONFIG_LZFSE),m,n) +=3D dmg-lzfse.o dmg-lzfse.o-libs :=3D $(LZFSE_LIBS) qcow.o-libs :=3D -lz linux-aio.o-libs :=3D -laio +io_uring.o-cflags :=3D $(LINUX_IO_URING_CFLAGS) +io_uring.o-libs :=3D $(LINUX_IO_URING_LIBS) parallels.o-cflags :=3D $(LIBXML2_CFLAGS) parallels.o-libs :=3D $(LIBXML2_LIBS) diff --git a/block/io_uring.c b/block/io_uring.c new file mode 100644 index 0000000000..bb433a685b --- /dev/null +++ b/block/io_uring.c @@ -0,0 +1,401 @@ +/* + * Linux io_uring support. + * + * Copyright (C) 2009 IBM, Corp. + * Copyright (C) 2009 Red Hat, Inc. + * Copyright (C) 2019 Aarushi Mehta + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + */ +#include "qemu/osdep.h" +#include +#include "qemu-common.h" +#include "block/aio.h" +#include "qemu/queue.h" +#include "block/block.h" +#include "block/raw-aio.h" +#include "qemu/coroutine.h" +#include "qapi/error.h" + +/* io_uring ring size */ +#define MAX_ENTRIES 128 + +typedef struct LuringAIOCB { + Coroutine *co; + struct io_uring_sqe sqeq; + ssize_t ret; + QEMUIOVector *qiov; + bool is_read; + QSIMPLEQ_ENTRY(LuringAIOCB) next; + + /* + * Buffered reads may require resubmission, see + * luring_resubmit_short_read(). + */ + int total_read; + QEMUIOVector resubmit_qiov; +} LuringAIOCB; + +typedef struct LuringQueue { + int plugged; + unsigned int in_queue; + unsigned int in_flight; + bool blocked; + QSIMPLEQ_HEAD(, LuringAIOCB) submit_queue; +} LuringQueue; + +typedef struct LuringState { + AioContext *aio_context; + + struct io_uring ring; + + /* io queue for submit at batch. Protected by AioContext lock. */ + LuringQueue io_q; + + /* I/O completion processing. Only runs in I/O thread. */ + QEMUBH *completion_bh; +} LuringState; + +/** + * luring_resubmit: + * + * Resubmit a request by appending it to submit_queue. The caller must en= sure + * that ioq_submit() is called later so that submit_queue requests are sta= rted. + */ +static void luring_resubmit(LuringState *s, LuringAIOCB *luringcb) +{ + QSIMPLEQ_INSERT_TAIL(&s->io_q.submit_queue, luringcb, next); + s->io_q.in_queue++; +} + +/** + * luring_resubmit_short_read: + * + * Before Linux commit 9d93a3f5a0c ("io_uring: punt short reads to async + * context") a buffered I/O request with the start of the file range in the + * page cache could result in a short read. Applications need to resubmit= the + * remaining read request. + * + * This is a slow path but recent kernels never take it. + */ +static void luring_resubmit_short_read(LuringState *s, LuringAIOCB *luring= cb, + int nread) +{ + QEMUIOVector *resubmit_qiov; + size_t remaining; + + /* Update read position */ + luringcb->total_read =3D nread; + remaining =3D luringcb->qiov->size - luringcb->total_read; + + /* Shorten qiov */ + resubmit_qiov =3D &luringcb->resubmit_qiov; + if (resubmit_qiov->iov =3D=3D NULL) { + qemu_iovec_init(resubmit_qiov, luringcb->qiov->niov); + } else { + qemu_iovec_reset(resubmit_qiov); + } + qemu_iovec_concat(resubmit_qiov, luringcb->qiov, luringcb->total_read, + remaining); + + /* Update sqe */ + luringcb->sqeq.off =3D nread; + luringcb->sqeq.addr =3D (__u64)(uintptr_t)luringcb->resubmit_qiov.iov; + luringcb->sqeq.len =3D luringcb->resubmit_qiov.niov; + + luring_resubmit(s, luringcb); +} + +/** + * luring_process_completions: + * @s: AIO state + * + * Fetches completed I/O requests, consumes cqes and invokes their callbac= ks + * The function is somewhat tricky because it supports nested event loops,= for + * example when a request callback invokes aio_poll(). + * + * Function schedules BH completion so it can be called again in a nested + * event loop. When there are no events left to complete the BH is being + * canceled. + * + */ +static void luring_process_completions(LuringState *s) +{ + struct io_uring_cqe *cqes; + int total_bytes; + /* + * Request completion callbacks can run the nested event loop. + * Schedule ourselves so the nested event loop will "see" remaining + * completed requests and process them. Without this, completion + * callbacks that wait for other requests using a nested event loop + * would hang forever. + * + * This workaround is needed because io_uring uses poll_wait, which + * is woken up when new events are added to the uring, thus polling on + * the same uring fd will block unless more events are received. + * + * Other leaf block drivers (drivers that access the data themselves) + * are networking based, so they poll sockets for data and run the + * correct coroutine. + */ + qemu_bh_schedule(s->completion_bh); + + while (io_uring_peek_cqe(&s->ring, &cqes) =3D=3D 0) { + LuringAIOCB *luringcb; + int ret; + + if (!cqes) { + break; + } + + luringcb =3D io_uring_cqe_get_data(cqes); + ret =3D cqes->res; + io_uring_cqe_seen(&s->ring, cqes); + cqes =3D NULL; + + /* Change counters one-by-one because we can be nested. */ + s->io_q.in_flight--; + + /* total_read is non-zero only for resubmitted read requests */ + total_bytes =3D ret + luringcb->total_read; + + if (ret < 0) { + if (ret =3D=3D -EINTR) { + luring_resubmit(s, luringcb); + continue; + } + } else if (!luringcb->qiov) { + goto end; + } else if (total_bytes =3D=3D luringcb->qiov->size) { + ret =3D 0; + /* Only read/write */ + } else { + /* Short Read/Write */ + if (luringcb->is_read) { + if (ret > 0) { + luring_resubmit_short_read(s, luringcb, ret); + continue; + } else { + /* Pad with zeroes */ + qemu_iovec_memset(luringcb->qiov, total_bytes, 0, + luringcb->qiov->size - total_bytes); + ret =3D 0; + } + } else { + ret =3D -ENOSPC;; + } + } +end: + luringcb->ret =3D ret; + qemu_iovec_destroy(&luringcb->resubmit_qiov); + + /* + * If the coroutine is already entered it must be in ioq_submit() + * and will notice luringcb->ret has been filled in when it + * eventually runs later. Coroutines cannot be entered recursively + * so avoid doing that! + */ + if (!qemu_coroutine_entered(luringcb->co)) { + aio_co_wake(luringcb->co); + } + } + qemu_bh_cancel(s->completion_bh); +} + +static int ioq_submit(LuringState *s) +{ + int ret =3D 0; + LuringAIOCB *luringcb, *luringcb_next; + + while (s->io_q.in_queue > 0) { + /* + * Try to fetch sqes from the ring for requests waiting in + * the overflow queue + */ + QSIMPLEQ_FOREACH_SAFE(luringcb, &s->io_q.submit_queue, next, + luringcb_next) { + struct io_uring_sqe *sqes =3D io_uring_get_sqe(&s->ring); + if (!sqes) { + break; + } + /* Prep sqe for submission */ + *sqes =3D luringcb->sqeq; + QSIMPLEQ_REMOVE_HEAD(&s->io_q.submit_queue, next); + } + ret =3D io_uring_submit(&s->ring); + /* Prevent infinite loop if submission is refused */ + if (ret <=3D 0) { + if (ret =3D=3D -EAGAIN) { + continue; + } + break; + } + s->io_q.in_flight +=3D ret; + s->io_q.in_queue -=3D ret; + } + s->io_q.blocked =3D (s->io_q.in_queue > 0); + + if (s->io_q.in_flight) { + /* + * We can try to complete something just right away if there are + * still requests in-flight. + */ + luring_process_completions(s); + } + return ret; +} + +static void luring_process_completions_and_submit(LuringState *s) +{ + aio_context_acquire(s->aio_context); + luring_process_completions(s); + + if (!s->io_q.plugged && s->io_q.in_queue > 0) { + ioq_submit(s); + } + aio_context_release(s->aio_context); +} + +static void qemu_luring_completion_bh(void *opaque) +{ + LuringState *s =3D opaque; + luring_process_completions_and_submit(s); +} + +static void qemu_luring_completion_cb(void *opaque) +{ + LuringState *s =3D opaque; + luring_process_completions_and_submit(s); +} + +static void ioq_init(LuringQueue *io_q) +{ + QSIMPLEQ_INIT(&io_q->submit_queue); + io_q->plugged =3D 0; + io_q->in_queue =3D 0; + io_q->in_flight =3D 0; + io_q->blocked =3D false; +} + +void luring_io_plug(BlockDriverState *bs, LuringState *s) +{ + s->io_q.plugged++; +} + +void luring_io_unplug(BlockDriverState *bs, LuringState *s) +{ + assert(s->io_q.plugged); + if (--s->io_q.plugged =3D=3D 0 && + !s->io_q.blocked && s->io_q.in_queue > 0) { + ioq_submit(s); + } +} + +/** + * luring_do_submit: + * @fd: file descriptor for I/O + * @luringcb: AIO control block + * @s: AIO state + * @offset: offset for request + * @type: type of request + * + * Fetches sqes from ring, adds to pending queue and preps them + * + */ +static int luring_do_submit(int fd, LuringAIOCB *luringcb, LuringState *s, + uint64_t offset, int type) +{ + struct io_uring_sqe *sqes =3D &luringcb->sqeq; + + switch (type) { + case QEMU_AIO_WRITE: + io_uring_prep_writev(sqes, fd, luringcb->qiov->iov, + luringcb->qiov->niov, offset); + break; + case QEMU_AIO_READ: + io_uring_prep_readv(sqes, fd, luringcb->qiov->iov, + luringcb->qiov->niov, offset); + break; + case QEMU_AIO_FLUSH: + io_uring_prep_fsync(sqes, fd, IORING_FSYNC_DATASYNC); + break; + default: + fprintf(stderr, "%s: invalid AIO request type, aborting 0x%x.\n", + __func__, type); + abort(); + } + io_uring_sqe_set_data(sqes, luringcb); + + QSIMPLEQ_INSERT_TAIL(&s->io_q.submit_queue, luringcb, next); + s->io_q.in_queue++; + + if (!s->io_q.blocked && + (!s->io_q.plugged || + s->io_q.in_flight + s->io_q.in_queue >=3D MAX_ENTRIES)) { + return ioq_submit(s); + } + return 0; +} + +int coroutine_fn luring_co_submit(BlockDriverState *bs, LuringState *s, in= t fd, + uint64_t offset, QEMUIOVector *qiov, int= type) +{ + int ret; + LuringAIOCB luringcb =3D { + .co =3D qemu_coroutine_self(), + .ret =3D -EINPROGRESS, + .qiov =3D qiov, + .is_read =3D (type =3D=3D QEMU_AIO_READ), + }; + + ret =3D luring_do_submit(fd, &luringcb, s, offset, type); + if (ret < 0) { + return ret; + } + + if (luringcb.ret =3D=3D -EINPROGRESS) { + qemu_coroutine_yield(); + } + return luringcb.ret; +} + +void luring_detach_aio_context(LuringState *s, AioContext *old_context) +{ + aio_set_fd_handler(old_context, s->ring.ring_fd, false, NULL, NULL, NU= LL, + s); + qemu_bh_delete(s->completion_bh); + s->aio_context =3D NULL; +} + +void luring_attach_aio_context(LuringState *s, AioContext *new_context) +{ + s->aio_context =3D new_context; + s->completion_bh =3D aio_bh_new(new_context, qemu_luring_completion_bh= , s); + aio_set_fd_handler(s->aio_context, s->ring.ring_fd, false, + qemu_luring_completion_cb, NULL, NULL, s); +} + +LuringState *luring_init(Error **errp) +{ + int rc; + LuringState *s =3D g_new0(LuringState, 1); + struct io_uring *ring =3D &s->ring; + + rc =3D io_uring_queue_init(MAX_ENTRIES, ring, 0); + if (rc < 0) { + error_setg_errno(errp, errno, "failed to init linux io_uring ring"= ); + g_free(s); + return NULL; + } + + ioq_init(&s->io_q); + return s; + +} + +void luring_cleanup(LuringState *s) +{ + io_uring_queue_exit(&s->ring); + g_free(s); +} diff --git a/include/block/aio.h b/include/block/aio.h index 6b0d52f732..7ba9bd7874 100644 --- a/include/block/aio.h +++ b/include/block/aio.h @@ -49,6 +49,7 @@ typedef void IOHandler(void *opaque); struct Coroutine; struct ThreadPool; struct LinuxAioState; +struct LuringState; =20 struct AioContext { GSource source; @@ -117,11 +118,19 @@ struct AioContext { struct ThreadPool *thread_pool; =20 #ifdef CONFIG_LINUX_AIO - /* State for native Linux AIO. Uses aio_context_acquire/release for + /* + * State for native Linux AIO. Uses aio_context_acquire/release for * locking. */ struct LinuxAioState *linux_aio; #endif +#ifdef CONFIG_LINUX_IO_URING + /* + * State for Linux io_uring. Uses aio_context_acquire/release for + * locking. + */ + struct LuringState *linux_io_uring; +#endif =20 /* TimerLists for calling timers - one per clock type. Has its own * locking. @@ -386,6 +395,11 @@ struct LinuxAioState *aio_setup_linux_aio(AioContext *= ctx, Error **errp); /* Return the LinuxAioState bound to this AioContext */ struct LinuxAioState *aio_get_linux_aio(AioContext *ctx); =20 +/* Setup the LuringState bound to this AioContext */ +struct LuringState *aio_setup_linux_io_uring(AioContext *ctx, Error **errp= ); + +/* Return the LuringState bound to this AioContext */ +struct LuringState *aio_get_linux_io_uring(AioContext *ctx); /** * aio_timer_new_with_attrs: * @ctx: the aio context diff --git a/include/block/raw-aio.h b/include/block/raw-aio.h index 4629f24d08..251b10d273 100644 --- a/include/block/raw-aio.h +++ b/include/block/raw-aio.h @@ -57,6 +57,18 @@ void laio_attach_aio_context(LinuxAioState *s, AioContex= t *new_context); void laio_io_plug(BlockDriverState *bs, LinuxAioState *s); void laio_io_unplug(BlockDriverState *bs, LinuxAioState *s); #endif +/* io_uring.c - Linux io_uring implementation */ +#ifdef CONFIG_LINUX_IO_URING +typedef struct LuringState LuringState; +LuringState *luring_init(Error **errp); +void luring_cleanup(LuringState *s); +int coroutine_fn luring_co_submit(BlockDriverState *bs, LuringState *s, in= t fd, + uint64_t offset, QEMUIOVector *qiov, int t= ype); +void luring_detach_aio_context(LuringState *s, AioContext *old_context); +void luring_attach_aio_context(LuringState *s, AioContext *new_context); +void luring_io_plug(BlockDriverState *bs, LuringState *s); +void luring_io_unplug(BlockDriverState *bs, LuringState *s); +#endif =20 #ifdef _WIN32 typedef struct QEMUWin32AIOState QEMUWin32AIOState; --=20 2.24.1 From nobody Sat Apr 12 07:40:49 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580420197367823.6392338220408; Thu, 30 Jan 2020 13:36:37 -0800 (PST) Received: from localhost ([::1]:39382 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHUK-0005f0-7a for importer@patchew.org; Thu, 30 Jan 2020 16:36:36 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:56265) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHQE-00083r-Ld for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:23 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ixHQD-0006IH-Da for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:22 -0500 Received: from us-smtp-1.mimecast.com ([207.211.31.81]:20495 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ixHQD-0006Hy-8l for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:21 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-123-6WYJImbBPEa3mv9uvnDsRQ-1; Thu, 30 Jan 2020 16:32:18 -0500 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id CC42610CE784; Thu, 30 Jan 2020 21:32:16 +0000 (UTC) Received: from localhost (unknown [10.36.118.87]) by smtp.corp.redhat.com (Postfix) with ESMTP id D499F60BE0; Thu, 30 Jan 2020 21:32:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580419940; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=mVn5LzPSG/yYiTSVziR8xhw8Osu/tHcOxSJdpsoQJns=; b=KEM2l33yCiUvppeoruZ0lsrpohz04wB0T9HXm4jswiUXK0h8NFSn9I+BpwBp0TBX6XYZ86 uxvfOpXNJT2TNLw0j//+9ku5ZrO3jJGlU2x9aaq5xb9eoWtMHQInW8FxHmfsyhjnBhgOXU cpVtXOfOfch2LXB/cCOlhp6WZCmzqpU= From: Stefan Hajnoczi To: qemu-devel@nongnu.org Subject: [PULL 08/18] stubs: add stubs for io_uring interface Date: Thu, 30 Jan 2020 21:31:04 +0000 Message-Id: <20200130213114.325157-9-stefanha@redhat.com> In-Reply-To: <20200130213114.325157-1-stefanha@redhat.com> References: <20200130213114.325157-1-stefanha@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-MC-Unique: 6WYJImbBPEa3mv9uvnDsRQ-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 207.211.31.81 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: Kevin Wolf , Peter Maydell , qemu-block@nongnu.org, Julia Suvorova , Markus Armbruster , Max Reitz , Stefan Hajnoczi , Paolo Bonzini , Fam Zheng , Aarushi Mehta , Stefano Garzarella Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Aarushi Mehta Follow linux-aio.o and stub out the block/io_uring.o APIs that will be missing when a binary is linked with obj-util-y but without block-util-y (e.g. vhost-user-gpu). For example, the stubs are necessary so that a binary using util/async.o from obj-util-y for qemu_bh_new() links successfully. In this case block/io_uring.o from block-util-y isn't needed and we can avoid dragging in the block layer by linking the stubs instead. The stub functions never get called. Signed-off-by: Aarushi Mehta Acked-by: Stefano Garzarella Signed-off-by: Stefan Hajnoczi Message-id: 20200120141858.587874-6-stefanha@redhat.com Message-Id: <20200120141858.587874-6-stefanha@redhat.com> Signed-off-by: Stefan Hajnoczi --- MAINTAINERS | 1 + stubs/Makefile.objs | 1 + stubs/io_uring.c | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 stubs/io_uring.c diff --git a/MAINTAINERS b/MAINTAINERS index a19437c13d..4ceb1ad882 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2641,6 +2641,7 @@ M: Stefan Hajnoczi L: qemu-block@nongnu.org S: Maintained F: block/io_uring.c +F: stubs/io_uring.c =20 qcow2 M: Kevin Wolf diff --git a/stubs/Makefile.objs b/stubs/Makefile.objs index 8b0ff25508..7afbe5fb61 100644 --- a/stubs/Makefile.objs +++ b/stubs/Makefile.objs @@ -13,6 +13,7 @@ stub-obj-y +=3D iothread.o stub-obj-y +=3D iothread-lock.o stub-obj-y +=3D is-daemonized.o stub-obj-$(CONFIG_LINUX_AIO) +=3D linux-aio.o +stub-obj-$(CONFIG_LINUX_IO_URING) +=3D io_uring.o stub-obj-y +=3D machine-init-done.o stub-obj-y +=3D migr-blocker.o stub-obj-y +=3D change-state-handler.o diff --git a/stubs/io_uring.c b/stubs/io_uring.c new file mode 100644 index 0000000000..622d1e4648 --- /dev/null +++ b/stubs/io_uring.c @@ -0,0 +1,32 @@ +/* + * Linux io_uring support. + * + * Copyright (C) 2009 IBM, Corp. + * Copyright (C) 2009 Red Hat, Inc. + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + */ +#include "qemu/osdep.h" +#include "block/aio.h" +#include "block/raw-aio.h" + +void luring_detach_aio_context(LuringState *s, AioContext *old_context) +{ + abort(); +} + +void luring_attach_aio_context(LuringState *s, AioContext *new_context) +{ + abort(); +} + +LuringState *luring_init(Error **errp) +{ + abort(); +} + +void luring_cleanup(LuringState *s) +{ + abort(); +} --=20 2.24.1 From nobody Sat Apr 12 07:40:49 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580420467082955.3293712409139; Thu, 30 Jan 2020 13:41:07 -0800 (PST) Received: from localhost ([::1]:39484 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHYf-0005fn-VJ for importer@patchew.org; Thu, 30 Jan 2020 16:41:06 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:56330) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHQL-0008DQ-TK for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:30 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ixHQK-0006OK-So for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:29 -0500 Received: from us-smtp-1.mimecast.com ([207.211.31.81]:34353 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ixHQJ-0006Ma-AO for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:27 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-183-Xu48HumdOoG1ng5mD25LTQ-1; Thu, 30 Jan 2020 16:32:24 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 54657800D41; Thu, 30 Jan 2020 21:32:23 +0000 (UTC) Received: from localhost (unknown [10.36.118.87]) by smtp.corp.redhat.com (Postfix) with ESMTP id 09503100194E; Thu, 30 Jan 2020 21:32:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580419946; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=xHs5kWWppNV6p8BzmwaptGcin4Jlu0OeZMb6NCzD4bI=; b=cPALE5AsWw0UQW+7RcNx88lv9ZlBYvm/n4zhumi9X6gnCjSCMvuNUlvStS+GfboCAaIhTY pVvmHh5e2/zfF5INe8C8PoyPFADrxF93J93TnmvyFqL7rEYPsYfgKV5A53Xd90/4Dm3Jgv 4Y1rs6lr+bsXprozHwQvL5LRHEN+ZAc= From: Stefan Hajnoczi To: qemu-devel@nongnu.org Subject: [PULL 09/18] util/async: add aio interfaces for io_uring Date: Thu, 30 Jan 2020 21:31:05 +0000 Message-Id: <20200130213114.325157-10-stefanha@redhat.com> In-Reply-To: <20200130213114.325157-1-stefanha@redhat.com> References: <20200130213114.325157-1-stefanha@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-MC-Unique: Xu48HumdOoG1ng5mD25LTQ-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 207.211.31.81 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: Kevin Wolf , Peter Maydell , qemu-block@nongnu.org, Julia Suvorova , Markus Armbruster , Max Reitz , Stefan Hajnoczi , Paolo Bonzini , Fam Zheng , Aarushi Mehta , Stefano Garzarella Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Aarushi Mehta Signed-off-by: Aarushi Mehta Acked-by: Stefano Garzarella Signed-off-by: Stefan Hajnoczi Message-id: 20200120141858.587874-7-stefanha@redhat.com Message-Id: <20200120141858.587874-7-stefanha@redhat.com> Signed-off-by: Stefan Hajnoczi --- util/async.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/util/async.c b/util/async.c index b1fa5319e5..c192a24a61 100644 --- a/util/async.c +++ b/util/async.c @@ -276,6 +276,14 @@ aio_ctx_finalize(GSource *source) } #endif =20 +#ifdef CONFIG_LINUX_IO_URING + if (ctx->linux_io_uring) { + luring_detach_aio_context(ctx->linux_io_uring, ctx); + luring_cleanup(ctx->linux_io_uring); + ctx->linux_io_uring =3D NULL; + } +#endif + assert(QSLIST_EMPTY(&ctx->scheduled_coroutines)); qemu_bh_delete(ctx->co_schedule_bh); =20 @@ -340,6 +348,29 @@ LinuxAioState *aio_get_linux_aio(AioContext *ctx) } #endif =20 +#ifdef CONFIG_LINUX_IO_URING +LuringState *aio_setup_linux_io_uring(AioContext *ctx, Error **errp) +{ + if (ctx->linux_io_uring) { + return ctx->linux_io_uring; + } + + ctx->linux_io_uring =3D luring_init(errp); + if (!ctx->linux_io_uring) { + return NULL; + } + + luring_attach_aio_context(ctx->linux_io_uring, ctx); + return ctx->linux_io_uring; +} + +LuringState *aio_get_linux_io_uring(AioContext *ctx) +{ + assert(ctx->linux_io_uring); + return ctx->linux_io_uring; +} +#endif + void aio_notify(AioContext *ctx) { /* Write e.g. bh->scheduled before reading ctx->notify_me. Pairs @@ -434,6 +465,11 @@ AioContext *aio_context_new(Error **errp) #ifdef CONFIG_LINUX_AIO ctx->linux_aio =3D NULL; #endif + +#ifdef CONFIG_LINUX_IO_URING + ctx->linux_io_uring =3D NULL; +#endif + ctx->thread_pool =3D NULL; qemu_rec_mutex_init(&ctx->lock); timerlistgroup_init(&ctx->tlg, aio_timerlist_notify, ctx); --=20 2.24.1 From nobody Sat Apr 12 07:40:49 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580420256665558.3395253286424; Thu, 30 Jan 2020 13:37:36 -0800 (PST) Received: from localhost ([::1]:39404 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHVH-0007WM-Hy for importer@patchew.org; Thu, 30 Jan 2020 16:37:35 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:56353) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHQM-0008Dh-LY for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:32 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ixHQL-0006PE-Ii for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:30 -0500 Received: from us-smtp-1.mimecast.com ([207.211.31.81]:49041 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ixHQL-0006OO-8X for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:29 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-417-kCrCiznQMNi-RSQ07_9zrA-1; Thu, 30 Jan 2020 16:32:26 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 39D27800D48; Thu, 30 Jan 2020 21:32:25 +0000 (UTC) Received: from localhost (unknown [10.36.118.87]) by smtp.corp.redhat.com (Postfix) with ESMTP id C366C10018FF; Thu, 30 Jan 2020 21:32:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580419948; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=wNNMFMIsemXPxOGDw+fbRy3Gh45uwUm4FAGTPCMX4rE=; b=f24IyTGGfCveYu3iNbEFYCAMC9B7VxemoRvKipJjTWhmp6DBg1WgeSKMu13ucNB5Zwi0mb cRsMfbiJfe2vpHzcc9eqUlIxo1HQWh41FAcuF6UQg4AduLgjRk3bztBhEqewyGHkHSYsuc rZhZFPQVHtg+yTzQFb+2m7D/Dlq5f2c= From: Stefan Hajnoczi To: qemu-devel@nongnu.org Subject: [PULL 10/18] blockdev: adds bdrv_parse_aio to use io_uring Date: Thu, 30 Jan 2020 21:31:06 +0000 Message-Id: <20200130213114.325157-11-stefanha@redhat.com> In-Reply-To: <20200130213114.325157-1-stefanha@redhat.com> References: <20200130213114.325157-1-stefanha@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-MC-Unique: kCrCiznQMNi-RSQ07_9zrA-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 207.211.31.81 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: Kevin Wolf , Peter Maydell , qemu-block@nongnu.org, Julia Suvorova , Markus Armbruster , Max Reitz , Stefan Hajnoczi , Paolo Bonzini , Fam Zheng , Aarushi Mehta , Stefano Garzarella Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Aarushi Mehta Signed-off-by: Aarushi Mehta Acked-by: Stefano Garzarella Signed-off-by: Stefan Hajnoczi Message-id: 20200120141858.587874-8-stefanha@redhat.com Message-Id: <20200120141858.587874-8-stefanha@redhat.com> Signed-off-by: Stefan Hajnoczi --- block.c | 22 ++++++++++++++++++++++ blockdev.c | 12 ++++-------- include/block/block.h | 1 + 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/block.c b/block.c index ecd09dbbfd..6c2b2bd2e2 100644 --- a/block.c +++ b/block.c @@ -845,6 +845,28 @@ static BlockdevDetectZeroesOptions bdrv_parse_detect_z= eroes(QemuOpts *opts, return detect_zeroes; } =20 +/** + * Set open flags for aio engine + * + * Return 0 on success, -1 if the engine specified is invalid + */ +int bdrv_parse_aio(const char *mode, int *flags) +{ + if (!strcmp(mode, "threads")) { + /* do nothing, default */ + } else if (!strcmp(mode, "native")) { + *flags |=3D BDRV_O_NATIVE_AIO; +#ifdef CONFIG_LINUX_IO_URING + } else if (!strcmp(mode, "io_uring")) { + *flags |=3D BDRV_O_IO_URING; +#endif + } else { + return -1; + } + + return 0; +} + /** * Set open flags for a given discard mode * diff --git a/blockdev.c b/blockdev.c index 4cd9a58d36..c6a727cca9 100644 --- a/blockdev.c +++ b/blockdev.c @@ -385,13 +385,9 @@ static void extract_common_blockdev_options(QemuOpts *= opts, int *bdrv_flags, } =20 if ((aio =3D qemu_opt_get(opts, "aio")) !=3D NULL) { - if (!strcmp(aio, "native")) { - *bdrv_flags |=3D BDRV_O_NATIVE_AIO; - } else if (!strcmp(aio, "threads")) { - /* this is the default */ - } else { - error_setg(errp, "invalid aio option"); - return; + if (bdrv_parse_aio(aio, bdrv_flags) < 0) { + error_setg(errp, "invalid aio option"); + return; } } } @@ -4672,7 +4668,7 @@ QemuOptsList qemu_common_drive_opts =3D { },{ .name =3D "aio", .type =3D QEMU_OPT_STRING, - .help =3D "host AIO implementation (threads, native)", + .help =3D "host AIO implementation (threads, native, io_uring)= ", },{ .name =3D BDRV_OPT_CACHE_WB, .type =3D QEMU_OPT_BOOL, diff --git a/include/block/block.h b/include/block/block.h index 19184d5850..6cd566324d 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -289,6 +289,7 @@ void bdrv_append(BlockDriverState *bs_new, BlockDriverS= tate *bs_top, void bdrv_replace_node(BlockDriverState *from, BlockDriverState *to, Error **errp); =20 +int bdrv_parse_aio(const char *mode, int *flags); int bdrv_parse_cache_mode(const char *mode, int *flags, bool *writethrough= ); int bdrv_parse_discard_flags(const char *mode, int *flags); BdrvChild *bdrv_open_child(const char *filename, --=20 2.24.1 From nobody Sat Apr 12 07:40:49 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580420136565452.3245938950895; Thu, 30 Jan 2020 13:35:36 -0800 (PST) Received: from localhost ([::1]:39356 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHTL-0003y2-8w for importer@patchew.org; Thu, 30 Jan 2020 16:35:35 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:56399) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHQO-0008EO-Q8 for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:34 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ixHQM-0006R3-Uw for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:32 -0500 Received: from us-smtp-1.mimecast.com ([207.211.31.81]:25891 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ixHQM-0006QQ-QH for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:30 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-303-nV4jhI_WPSe9XlVjAbonMQ-1; Thu, 30 Jan 2020 16:32:28 -0500 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 166A213E6; Thu, 30 Jan 2020 21:32:27 +0000 (UTC) Received: from localhost (unknown [10.36.118.87]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9D1B560BE0; Thu, 30 Jan 2020 21:32:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580419950; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=KcnVVs+GyUpD4I2Efw+5RJEEQNSFTzcNphIoht67I54=; b=hlHlRXr1vc3Das2qd3SCAgbvfOmgtvdCXU2LRZ48eZe7yh+KpZzEvsgIjV7q6orR1PvxMQ f8YtKcIfFjnOvfcu7IPGnKzzCfSSu4WgT95o00368KER7a3khzAq1f6xGAJet6Ab5znCii JKlgPZwaBwYH62Bllceaisg1uJBV8tE= From: Stefan Hajnoczi To: qemu-devel@nongnu.org Subject: [PULL 11/18] block/file-posix.c: extend to use io_uring Date: Thu, 30 Jan 2020 21:31:07 +0000 Message-Id: <20200130213114.325157-12-stefanha@redhat.com> In-Reply-To: <20200130213114.325157-1-stefanha@redhat.com> References: <20200130213114.325157-1-stefanha@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-MC-Unique: nV4jhI_WPSe9XlVjAbonMQ-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 207.211.31.81 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: Kevin Wolf , Peter Maydell , Maxim Levitsky , qemu-block@nongnu.org, Julia Suvorova , Markus Armbruster , Max Reitz , Stefan Hajnoczi , Paolo Bonzini , Fam Zheng , Aarushi Mehta , Stefano Garzarella Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Aarushi Mehta Signed-off-by: Aarushi Mehta Reviewed-by: Maxim Levitsky Acked-by: Stefano Garzarella Signed-off-by: Stefan Hajnoczi Message-id: 20200120141858.587874-9-stefanha@redhat.com Message-Id: <20200120141858.587874-9-stefanha@redhat.com> Signed-off-by: Stefan Hajnoczi --- block/file-posix.c | 98 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 79 insertions(+), 19 deletions(-) diff --git a/block/file-posix.c b/block/file-posix.c index 2b08b02d27..ab82ee1a67 100644 --- a/block/file-posix.c +++ b/block/file-posix.c @@ -156,6 +156,7 @@ typedef struct BDRVRawState { bool has_write_zeroes:1; bool discard_zeroes:1; bool use_linux_aio:1; + bool use_linux_io_uring:1; bool page_cache_inconsistent:1; bool has_fallocate; bool needs_alignment; @@ -444,7 +445,7 @@ static QemuOptsList raw_runtime_opts =3D { { .name =3D "aio", .type =3D QEMU_OPT_STRING, - .help =3D "host AIO implementation (threads, native)", + .help =3D "host AIO implementation (threads, native, io_uring)= ", }, { .name =3D "locking", @@ -503,9 +504,16 @@ static int raw_open_common(BlockDriverState *bs, QDict= *options, goto fail; } =20 - aio_default =3D (bdrv_flags & BDRV_O_NATIVE_AIO) - ? BLOCKDEV_AIO_OPTIONS_NATIVE - : BLOCKDEV_AIO_OPTIONS_THREADS; + if (bdrv_flags & BDRV_O_NATIVE_AIO) { + aio_default =3D BLOCKDEV_AIO_OPTIONS_NATIVE; +#ifdef CONFIG_LINUX_IO_URING + } else if (bdrv_flags & BDRV_O_IO_URING) { + aio_default =3D BLOCKDEV_AIO_OPTIONS_IO_URING; +#endif + } else { + aio_default =3D BLOCKDEV_AIO_OPTIONS_THREADS; + } + aio =3D qapi_enum_parse(&BlockdevAioOptions_lookup, qemu_opt_get(opts, "aio"), aio_default, &local_err); @@ -514,7 +522,11 @@ static int raw_open_common(BlockDriverState *bs, QDict= *options, ret =3D -EINVAL; goto fail; } + s->use_linux_aio =3D (aio =3D=3D BLOCKDEV_AIO_OPTIONS_NATIVE); +#ifdef CONFIG_LINUX_IO_URING + s->use_linux_io_uring =3D (aio =3D=3D BLOCKDEV_AIO_OPTIONS_IO_URING); +#endif =20 locking =3D qapi_enum_parse(&OnOffAuto_lookup, qemu_opt_get(opts, "locking"), @@ -600,6 +612,22 @@ static int raw_open_common(BlockDriverState *bs, QDict= *options, } #endif /* !defined(CONFIG_LINUX_AIO) */ =20 +#ifdef CONFIG_LINUX_IO_URING + if (s->use_linux_io_uring) { + if (!aio_setup_linux_io_uring(bdrv_get_aio_context(bs), errp)) { + error_prepend(errp, "Unable to use io_uring: "); + goto fail; + } + } +#else + if (s->use_linux_io_uring) { + error_setg(errp, "aio=3Dio_uring was specified, but is not support= ed " + "in this build."); + ret =3D -EINVAL; + goto fail; + } +#endif /* !defined(CONFIG_LINUX_IO_URING) */ + s->has_discard =3D true; s->has_write_zeroes =3D true; if ((bs->open_flags & BDRV_O_NOCACHE) !=3D 0) { @@ -1877,21 +1905,25 @@ static int coroutine_fn raw_co_prw(BlockDriverState= *bs, uint64_t offset, return -EIO; =20 /* - * Check if the underlying device requires requests to be aligned, - * and if the request we are trying to submit is aligned or not. - * If this is the case tell the low-level driver that it needs - * to copy the buffer. + * When using O_DIRECT, the request must be aligned to be able to use + * either libaio or io_uring interface. If not fail back to regular th= read + * pool read/write code which emulates this for us if we + * set QEMU_AIO_MISALIGNED. */ - if (s->needs_alignment) { - if (!bdrv_qiov_is_aligned(bs, qiov)) { - type |=3D QEMU_AIO_MISALIGNED; + if (s->needs_alignment && !bdrv_qiov_is_aligned(bs, qiov)) { + type |=3D QEMU_AIO_MISALIGNED; +#ifdef CONFIG_LINUX_IO_URING + } else if (s->use_linux_io_uring) { + LuringState *aio =3D aio_get_linux_io_uring(bdrv_get_aio_context(b= s)); + assert(qiov->size =3D=3D bytes); + return luring_co_submit(bs, aio, s->fd, offset, qiov, type); +#endif #ifdef CONFIG_LINUX_AIO - } else if (s->use_linux_aio) { - LinuxAioState *aio =3D aio_get_linux_aio(bdrv_get_aio_context(= bs)); - assert(qiov->size =3D=3D bytes); - return laio_co_submit(bs, aio, s->fd, offset, qiov, type); + } else if (s->use_linux_aio) { + LinuxAioState *aio =3D aio_get_linux_aio(bdrv_get_aio_context(bs)); + assert(qiov->size =3D=3D bytes); + return laio_co_submit(bs, aio, s->fd, offset, qiov, type); #endif - } } =20 acb =3D (RawPosixAIOData) { @@ -1927,24 +1959,36 @@ static int coroutine_fn raw_co_pwritev(BlockDriverS= tate *bs, uint64_t offset, =20 static void raw_aio_plug(BlockDriverState *bs) { + BDRVRawState __attribute__((unused)) *s =3D bs->opaque; #ifdef CONFIG_LINUX_AIO - BDRVRawState *s =3D bs->opaque; if (s->use_linux_aio) { LinuxAioState *aio =3D aio_get_linux_aio(bdrv_get_aio_context(bs)); laio_io_plug(bs, aio); } #endif +#ifdef CONFIG_LINUX_IO_URING + if (s->use_linux_io_uring) { + LuringState *aio =3D aio_get_linux_io_uring(bdrv_get_aio_context(b= s)); + luring_io_plug(bs, aio); + } +#endif } =20 static void raw_aio_unplug(BlockDriverState *bs) { + BDRVRawState __attribute__((unused)) *s =3D bs->opaque; #ifdef CONFIG_LINUX_AIO - BDRVRawState *s =3D bs->opaque; if (s->use_linux_aio) { LinuxAioState *aio =3D aio_get_linux_aio(bdrv_get_aio_context(bs)); laio_io_unplug(bs, aio); } #endif +#ifdef CONFIG_LINUX_IO_URING + if (s->use_linux_io_uring) { + LuringState *aio =3D aio_get_linux_io_uring(bdrv_get_aio_context(b= s)); + luring_io_unplug(bs, aio); + } +#endif } =20 static int raw_co_flush_to_disk(BlockDriverState *bs) @@ -1964,14 +2008,20 @@ static int raw_co_flush_to_disk(BlockDriverState *b= s) .aio_type =3D QEMU_AIO_FLUSH, }; =20 +#ifdef CONFIG_LINUX_IO_URING + if (s->use_linux_io_uring) { + LuringState *aio =3D aio_get_linux_io_uring(bdrv_get_aio_context(b= s)); + return luring_co_submit(bs, aio, s->fd, 0, NULL, QEMU_AIO_FLUSH); + } +#endif return raw_thread_pool_submit(bs, handle_aiocb_flush, &acb); } =20 static void raw_aio_attach_aio_context(BlockDriverState *bs, AioContext *new_context) { + BDRVRawState __attribute__((unused)) *s =3D bs->opaque; #ifdef CONFIG_LINUX_AIO - BDRVRawState *s =3D bs->opaque; if (s->use_linux_aio) { Error *local_err =3D NULL; if (!aio_setup_linux_aio(new_context, &local_err)) { @@ -1981,6 +2031,16 @@ static void raw_aio_attach_aio_context(BlockDriverSt= ate *bs, } } #endif +#ifdef CONFIG_LINUX_IO_URING + if (s->use_linux_io_uring) { + Error *local_err; + if (!aio_setup_linux_io_uring(new_context, &local_err)) { + error_reportf_err(local_err, "Unable to use linux io_uring, " + "falling back to thread pool: "); + s->use_linux_io_uring =3D false; + } + } +#endif } =20 static void raw_close(BlockDriverState *bs) --=20 2.24.1 From nobody Sat Apr 12 07:40:49 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580420302664756.9447227068274; Thu, 30 Jan 2020 13:38:22 -0800 (PST) Received: from localhost ([::1]:39424 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHW1-0001Ar-HF for importer@patchew.org; Thu, 30 Jan 2020 16:38:21 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:56470) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHQU-0008QG-Sm for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:40 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ixHQT-0006Wp-Dd for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:38 -0500 Received: from us-smtp-2.mimecast.com ([205.139.110.61]:46904 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ixHQT-0006WK-8Y for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:37 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-194-FVHFyw5fNmOQgmaVLXV1Jg-1; Thu, 30 Jan 2020 16:32:34 -0500 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 91D0413E7; Thu, 30 Jan 2020 21:32:33 +0000 (UTC) Received: from localhost (unknown [10.36.118.87]) by smtp.corp.redhat.com (Postfix) with ESMTP id 43E6987B2C; Thu, 30 Jan 2020 21:32:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580419956; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=k9oak+DZwenPuEWJZV/Nh+OygvUsM7UqW0QjZl8vAKA=; b=CNU9l6R/fnpeyZoFmd2/hD2xKdJRz9Jx80f/kTjRXeoGh6nefbmpr1P/c9gprlmOR8bcnQ dtubWqW7c5rvIuzDe0G57lgKWdjFGB0OsZi3v7DH3TFsc+JDsfD9ShG63o+i5u4Q2wkQVI 2qOnH4A38+Bww1zKT7frDo5Oqbm7whk= From: Stefan Hajnoczi To: qemu-devel@nongnu.org Subject: [PULL 12/18] block: add trace events for io_uring Date: Thu, 30 Jan 2020 21:31:08 +0000 Message-Id: <20200130213114.325157-13-stefanha@redhat.com> In-Reply-To: <20200130213114.325157-1-stefanha@redhat.com> References: <20200130213114.325157-1-stefanha@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-MC-Unique: FVHFyw5fNmOQgmaVLXV1Jg-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 205.139.110.61 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: Kevin Wolf , Peter Maydell , qemu-block@nongnu.org, Julia Suvorova , Markus Armbruster , Max Reitz , Stefan Hajnoczi , Paolo Bonzini , Fam Zheng , Aarushi Mehta , Stefano Garzarella Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Aarushi Mehta Signed-off-by: Aarushi Mehta Acked-by: Stefano Garzarella Signed-off-by: Stefan Hajnoczi Message-id: 20200120141858.587874-10-stefanha@redhat.com Message-Id: <20200120141858.587874-10-stefanha@redhat.com> Signed-off-by: Stefan Hajnoczi --- block/io_uring.c | 23 ++++++++++++++++++++--- block/trace-events | 12 ++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/block/io_uring.c b/block/io_uring.c index bb433a685b..a5c0d16220 100644 --- a/block/io_uring.c +++ b/block/io_uring.c @@ -17,6 +17,7 @@ #include "block/raw-aio.h" #include "qemu/coroutine.h" #include "qapi/error.h" +#include "trace.h" =20 /* io_uring ring size */ #define MAX_ENTRIES 128 @@ -85,6 +86,8 @@ static void luring_resubmit_short_read(LuringState *s, Lu= ringAIOCB *luringcb, QEMUIOVector *resubmit_qiov; size_t remaining; =20 + trace_luring_resubmit_short_read(s, luringcb, nread); + /* Update read position */ luringcb->total_read =3D nread; remaining =3D luringcb->qiov->size - luringcb->total_read; @@ -156,6 +159,7 @@ static void luring_process_completions(LuringState *s) =20 /* Change counters one-by-one because we can be nested. */ s->io_q.in_flight--; + trace_luring_process_completion(s, luringcb, ret); =20 /* total_read is non-zero only for resubmitted read requests */ total_bytes =3D ret + luringcb->total_read; @@ -224,6 +228,7 @@ static int ioq_submit(LuringState *s) QSIMPLEQ_REMOVE_HEAD(&s->io_q.submit_queue, next); } ret =3D io_uring_submit(&s->ring); + trace_luring_io_uring_submit(s, ret); /* Prevent infinite loop if submission is refused */ if (ret <=3D 0) { if (ret =3D=3D -EAGAIN) { @@ -280,12 +285,15 @@ static void ioq_init(LuringQueue *io_q) =20 void luring_io_plug(BlockDriverState *bs, LuringState *s) { + trace_luring_io_plug(s); s->io_q.plugged++; } =20 void luring_io_unplug(BlockDriverState *bs, LuringState *s) { assert(s->io_q.plugged); + trace_luring_io_unplug(s, s->io_q.blocked, s->io_q.plugged, + s->io_q.in_queue, s->io_q.in_flight); if (--s->io_q.plugged =3D=3D 0 && !s->io_q.blocked && s->io_q.in_queue > 0) { ioq_submit(s); @@ -306,6 +314,7 @@ void luring_io_unplug(BlockDriverState *bs, LuringState= *s) static int luring_do_submit(int fd, LuringAIOCB *luringcb, LuringState *s, uint64_t offset, int type) { + int ret; struct io_uring_sqe *sqes =3D &luringcb->sqeq; =20 switch (type) { @@ -329,11 +338,14 @@ static int luring_do_submit(int fd, LuringAIOCB *luri= ngcb, LuringState *s, =20 QSIMPLEQ_INSERT_TAIL(&s->io_q.submit_queue, luringcb, next); s->io_q.in_queue++; - + trace_luring_do_submit(s, s->io_q.blocked, s->io_q.plugged, + s->io_q.in_queue, s->io_q.in_flight); if (!s->io_q.blocked && (!s->io_q.plugged || s->io_q.in_flight + s->io_q.in_queue >=3D MAX_ENTRIES)) { - return ioq_submit(s); + ret =3D ioq_submit(s); + trace_luring_do_submit_done(s, ret); + return ret; } return 0; } @@ -348,8 +360,10 @@ int coroutine_fn luring_co_submit(BlockDriverState *bs= , LuringState *s, int fd, .qiov =3D qiov, .is_read =3D (type =3D=3D QEMU_AIO_READ), }; - + trace_luring_co_submit(bs, s, &luringcb, fd, offset, qiov ? qiov->size= : 0, + type); ret =3D luring_do_submit(fd, &luringcb, s, offset, type); + if (ret < 0) { return ret; } @@ -382,6 +396,8 @@ LuringState *luring_init(Error **errp) LuringState *s =3D g_new0(LuringState, 1); struct io_uring *ring =3D &s->ring; =20 + trace_luring_init_state(s, sizeof(*s)); + rc =3D io_uring_queue_init(MAX_ENTRIES, ring, 0); if (rc < 0) { error_setg_errno(errp, errno, "failed to init linux io_uring ring"= ); @@ -398,4 +414,5 @@ void luring_cleanup(LuringState *s) { io_uring_queue_exit(&s->ring); g_free(s); + trace_luring_cleanup_state(s); } diff --git a/block/trace-events b/block/trace-events index 6ba86decca..1a7329b736 100644 --- a/block/trace-events +++ b/block/trace-events @@ -63,6 +63,18 @@ qmp_block_stream(void *bs) "bs %p" file_paio_submit(void *acb, void *opaque, int64_t offset, int count, int t= ype) "acb %p opaque %p offset %"PRId64" count %d type %d" file_copy_file_range(void *bs, int src, int64_t src_off, int dst, int64_t = dst_off, int64_t bytes, int flags, int64_t ret) "bs %p src_fd %d offset %"P= RIu64" dst_fd %d offset %"PRIu64" bytes %"PRIu64" flags %d ret %"PRId64 =20 +#io_uring.c +luring_init_state(void *s, size_t size) "s %p size %zu" +luring_cleanup_state(void *s) "%p freed" +luring_io_plug(void *s) "LuringState %p plug" +luring_io_unplug(void *s, int blocked, int plugged, int queued, int inflig= ht) "LuringState %p blocked %d plugged %d queued %d inflight %d" +luring_do_submit(void *s, int blocked, int plugged, int queued, int inflig= ht) "LuringState %p blocked %d plugged %d queued %d inflight %d" +luring_do_submit_done(void *s, int ret) "LuringState %p submitted to kerne= l %d" +luring_co_submit(void *bs, void *s, void *luringcb, int fd, uint64_t offse= t, size_t nbytes, int type) "bs %p s %p luringcb %p fd %d offset %" PRId64 = " nbytes %zd type %d" +luring_process_completion(void *s, void *aiocb, int ret) "LuringState %p l= uringcb %p ret %d" +luring_io_uring_submit(void *s, int ret) "LuringState %p ret %d" +luring_resubmit_short_read(void *s, void *luringcb, int nread) "LuringStat= e %p luringcb %p nread %d" + # qcow2.c qcow2_add_task(void *co, void *bs, void *pool, const char *action, int clu= ster_type, uint64_t file_cluster_offset, uint64_t offset, uint64_t bytes, v= oid *qiov, size_t qiov_offset) "co %p bs %p pool %p: %s: cluster_type %d fi= le_cluster_offset %" PRIu64 " offset %" PRIu64 " bytes %" PRIu64 " qiov %p = qiov_offset %zu" qcow2_writev_start_req(void *co, int64_t offset, int bytes) "co %p offset = 0x%" PRIx64 " bytes %d" --=20 2.24.1 From nobody Sat Apr 12 07:40:49 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580420431760713.9348745648899; Thu, 30 Jan 2020 13:40:31 -0800 (PST) Received: from localhost ([::1]:39470 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHY6-0004hX-Kc for importer@patchew.org; Thu, 30 Jan 2020 16:40:30 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:56515) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHQa-000088-T8 for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:46 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ixHQZ-0006eq-SM for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:44 -0500 Received: from us-smtp-1.mimecast.com ([207.211.31.81]:59884 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ixHQZ-0006ca-OO for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:43 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-227-AOYuaHChMS20BXrLL49Tkg-1; Thu, 30 Jan 2020 16:32:41 -0500 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 2E54F1005513; Thu, 30 Jan 2020 21:32:40 +0000 (UTC) Received: from localhost (unknown [10.36.118.87]) by smtp.corp.redhat.com (Postfix) with ESMTP id EEFEA7792C; Thu, 30 Jan 2020 21:32:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580419963; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=a44NGMn6vruT3WLbd+9LXW35cusyc+fsGPwVh38cNRU=; b=d8XAfLtdDguIIw0Kdi5Qul7uJnCdXgjwQtIY5vqN9az9lg/HrnuBncN4O4WEqVihIah4aC sbYB9KfOl3IsajJLO3uUet8aQLeue/kFsij7wPAPSYK9SS8N9b6wvnr4vFC2DrCcy58eWz d+IIWJx0s1zbu5l/flpiSZakjzwxa6w= From: Stefan Hajnoczi To: qemu-devel@nongnu.org Subject: [PULL 13/18] block/io_uring: adds userspace completion polling Date: Thu, 30 Jan 2020 21:31:09 +0000 Message-Id: <20200130213114.325157-14-stefanha@redhat.com> In-Reply-To: <20200130213114.325157-1-stefanha@redhat.com> References: <20200130213114.325157-1-stefanha@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-MC-Unique: AOYuaHChMS20BXrLL49Tkg-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 207.211.31.81 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: Kevin Wolf , Peter Maydell , qemu-block@nongnu.org, Julia Suvorova , Markus Armbruster , Max Reitz , Stefan Hajnoczi , Paolo Bonzini , Fam Zheng , Aarushi Mehta , Stefano Garzarella Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Aarushi Mehta Signed-off-by: Aarushi Mehta Acked-by: Stefano Garzarella Signed-off-by: Stefan Hajnoczi Message-id: 20200120141858.587874-11-stefanha@redhat.com Message-Id: <20200120141858.587874-11-stefanha@redhat.com> Signed-off-by: Stefan Hajnoczi --- block/io_uring.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/block/io_uring.c b/block/io_uring.c index a5c0d16220..56892fd1ab 100644 --- a/block/io_uring.c +++ b/block/io_uring.c @@ -274,6 +274,21 @@ static void qemu_luring_completion_cb(void *opaque) luring_process_completions_and_submit(s); } =20 +static bool qemu_luring_poll_cb(void *opaque) +{ + LuringState *s =3D opaque; + struct io_uring_cqe *cqes; + + if (io_uring_peek_cqe(&s->ring, &cqes) =3D=3D 0) { + if (cqes) { + luring_process_completions_and_submit(s); + return true; + } + } + + return false; +} + static void ioq_init(LuringQueue *io_q) { QSIMPLEQ_INIT(&io_q->submit_queue); @@ -387,7 +402,7 @@ void luring_attach_aio_context(LuringState *s, AioConte= xt *new_context) s->aio_context =3D new_context; s->completion_bh =3D aio_bh_new(new_context, qemu_luring_completion_bh= , s); aio_set_fd_handler(s->aio_context, s->ring.ring_fd, false, - qemu_luring_completion_cb, NULL, NULL, s); + qemu_luring_completion_cb, NULL, qemu_luring_poll_c= b, s); } =20 LuringState *luring_init(Error **errp) --=20 2.24.1 From nobody Sat Apr 12 07:40:49 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580420604836399.01952212836864; Thu, 30 Jan 2020 13:43:24 -0800 (PST) Received: from localhost ([::1]:39540 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHat-0001Sf-NQ for importer@patchew.org; Thu, 30 Jan 2020 16:43:23 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:56547) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHQd-0000AV-13 for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:48 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ixHQb-0006ii-Rb for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:46 -0500 Received: from us-smtp-1.mimecast.com ([207.211.31.81]:41020 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ixHQb-0006iA-Ng for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:45 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-247-PJBw87ykOMu3LmgXkipjLQ-1; Thu, 30 Jan 2020 16:32:43 -0500 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 0ABD413E6; Thu, 30 Jan 2020 21:32:42 +0000 (UTC) Received: from localhost (unknown [10.36.118.87]) by smtp.corp.redhat.com (Postfix) with ESMTP id 908FB87B2C; Thu, 30 Jan 2020 21:32:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580419965; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=l1TyDJ5osXtD2by3mVKtIQVckuM4uw97xoOWsLKmg2A=; b=VYSYGX/HUZzfKpaeT2HThGChVtVN/OnYpNqCvJsDmX5xpDtKdUq9X8Aogad0+Oz5Emna+k eq10EyMRGRqszyPQbCXD5Bd0iF0cW8i+txvvcM/W3iou7drzES1mTy+xSMqlBrmJpX+ndq 5VZUzCxzr7PHLf8dQC7OSP3Hljua0t8= From: Stefan Hajnoczi To: qemu-devel@nongnu.org Subject: [PULL 14/18] qemu-io: adds option to use aio engine Date: Thu, 30 Jan 2020 21:31:10 +0000 Message-Id: <20200130213114.325157-15-stefanha@redhat.com> In-Reply-To: <20200130213114.325157-1-stefanha@redhat.com> References: <20200130213114.325157-1-stefanha@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-MC-Unique: PJBw87ykOMu3LmgXkipjLQ-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 207.211.31.81 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: Kevin Wolf , Peter Maydell , qemu-block@nongnu.org, Julia Suvorova , Markus Armbruster , Max Reitz , Stefan Hajnoczi , Paolo Bonzini , Fam Zheng , Aarushi Mehta , Stefano Garzarella Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Aarushi Mehta Signed-off-by: Aarushi Mehta Acked-by: Stefano Garzarella Signed-off-by: Stefan Hajnoczi Message-id: 20200120141858.587874-12-stefanha@redhat.com Message-Id: <20200120141858.587874-12-stefanha@redhat.com> Signed-off-by: Stefan Hajnoczi --- qemu-io.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/qemu-io.c b/qemu-io.c index 91e3276592..3adc5a7d0d 100644 --- a/qemu-io.c +++ b/qemu-io.c @@ -130,7 +130,8 @@ static void open_help(void) " -C, -- use copy-on-read\n" " -n, -- disable host cache, short for -t none\n" " -U, -- force shared permissions\n" -" -k, -- use kernel AIO implementation (on Linux only)\n" +" -k, -- use kernel AIO implementation (Linux only, prefer use of -i)\n" +" -i, -- use AIO mode (threads, native or io_uring)\n" " -t, -- use the given cache mode for the image\n" " -d, -- use the given discard mode for the image\n" " -o, -- options to be given to the block driver" @@ -172,7 +173,7 @@ static int open_f(BlockBackend *blk, int argc, char **a= rgv) QDict *opts; bool force_share =3D false; =20 - while ((c =3D getopt(argc, argv, "snCro:kt:d:U")) !=3D -1) { + while ((c =3D getopt(argc, argv, "snCro:ki:t:d:U")) !=3D -1) { switch (c) { case 's': flags |=3D BDRV_O_SNAPSHOT; @@ -204,6 +205,13 @@ static int open_f(BlockBackend *blk, int argc, char **= argv) return -EINVAL; } break; + case 'i': + if (bdrv_parse_aio(optarg, &flags) < 0) { + error_report("Invalid aio option: %s", optarg); + qemu_opts_reset(&empty_opts); + return -EINVAL; + } + break; case 'o': if (imageOpts) { printf("--image-opts and 'open -o' are mutually exclusive\= n"); @@ -291,7 +299,9 @@ static void usage(const char *name) " -n, --nocache disable host cache, short for -t none\n" " -C, --copy-on-read enable copy-on-read\n" " -m, --misalign misalign allocations for O_DIRECT\n" -" -k, --native-aio use kernel AIO implementation (on Linux only)\n" +" -k, --native-aio use kernel AIO implementation\n" +" (Linux only, prefer use of -i)\n" +" -i, --aio=3DMODE use AIO mode (threads, native or io_uring)\n" " -t, --cache=3DMODE use the given cache mode for the image\n" " -d, --discard=3DMODE use the given discard mode for the image\n" " -T, --trace [[enable=3D]][,events=3D][,file=3D]\n" @@ -496,7 +506,7 @@ static QemuOptsList file_opts =3D { int main(int argc, char **argv) { int readonly =3D 0; - const char *sopt =3D "hVc:d:f:rsnCmkt:T:U"; + const char *sopt =3D "hVc:d:f:rsnCmki:t:T:U"; const struct option lopt[] =3D { { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'V' }, @@ -508,6 +518,7 @@ int main(int argc, char **argv) { "copy-on-read", no_argument, NULL, 'C' }, { "misalign", no_argument, NULL, 'm' }, { "native-aio", no_argument, NULL, 'k' }, + { "aio", required_argument, NULL, 'i' }, { "discard", required_argument, NULL, 'd' }, { "cache", required_argument, NULL, 't' }, { "trace", required_argument, NULL, 'T' }, @@ -575,6 +586,12 @@ int main(int argc, char **argv) case 'k': flags |=3D BDRV_O_NATIVE_AIO; break; + case 'i': + if (bdrv_parse_aio(optarg, &flags) < 0) { + error_report("Invalid aio option: %s", optarg); + exit(1); + } + break; case 't': if (bdrv_parse_cache_mode(optarg, &flags, &writethrough) < 0) { error_report("Invalid cache option: %s", optarg); --=20 2.24.1 From nobody Sat Apr 12 07:40:49 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580420569111685.2450097847044; Thu, 30 Jan 2020 13:42:49 -0800 (PST) Received: from localhost ([::1]:39530 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHaJ-00006M-TN for importer@patchew.org; Thu, 30 Jan 2020 16:42:47 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:56622) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHQj-0000Ii-CA for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:54 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ixHQi-0006um-6j for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:53 -0500 Received: from us-smtp-2.mimecast.com ([205.139.110.61]:45390 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ixHQi-0006tw-2U for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:52 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-38-Q_65KO1pOt-htvcWtfXBjQ-1; Thu, 30 Jan 2020 16:32:49 -0500 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 mimecast-mx01.redhat.com (Postfix) with ESMTPS id 51ADD1005510; Thu, 30 Jan 2020 21:32:48 +0000 (UTC) Received: from localhost (unknown [10.36.118.87]) by smtp.corp.redhat.com (Postfix) with ESMTP id 380BBCFE4; Thu, 30 Jan 2020 21:32:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580419971; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=fYNQ7jJgafiMaUYshjy399LxG0rug6vmLbRRS3cxgMM=; b=bD4EDZNOlO8DoefXDsD2liL09ox3lX4WoKPjfyU7NPrlFj3PcEtvwmsejiIsanIkL7RZGp VMD0VnRgimKnbthvJKti0sK+qfY6QjUKpcxCkx3cX/taHjJ0yPPGBdRdIArI0f7eUW34ck oMTW7I5pI8ejhu1DLat+3lLe9U1UEIU= From: Stefan Hajnoczi To: qemu-devel@nongnu.org Subject: [PULL 15/18] qemu-img: adds option to use aio engine for benchmarking Date: Thu, 30 Jan 2020 21:31:11 +0000 Message-Id: <20200130213114.325157-16-stefanha@redhat.com> In-Reply-To: <20200130213114.325157-1-stefanha@redhat.com> References: <20200130213114.325157-1-stefanha@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-MC-Unique: Q_65KO1pOt-htvcWtfXBjQ-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 205.139.110.61 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: Kevin Wolf , Peter Maydell , qemu-block@nongnu.org, Julia Suvorova , Markus Armbruster , Max Reitz , Stefan Hajnoczi , Paolo Bonzini , Fam Zheng , Aarushi Mehta , Stefano Garzarella Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Aarushi Mehta Signed-off-by: Aarushi Mehta Acked-by: Stefano Garzarella Signed-off-by: Stefan Hajnoczi Message-id: 20200120141858.587874-13-stefanha@redhat.com Message-Id: <20200120141858.587874-13-stefanha@redhat.com> Signed-off-by: Stefan Hajnoczi --- qemu-img-cmds.hx | 4 ++-- qemu-img.c | 11 ++++++++++- qemu-img.texi | 5 ++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx index 1c93e6d185..77b5a8dda8 100644 --- a/qemu-img-cmds.hx +++ b/qemu-img-cmds.hx @@ -20,9 +20,9 @@ STEXI ETEXI =20 DEF("bench", img_bench, - "bench [-c count] [-d depth] [-f fmt] [--flush-interval=3Dflush_interv= al] [-n] [--no-drain] [-o offset] [--pattern=3Dpattern] [-q] [-s buffer_siz= e] [-S step_size] [-t cache] [-w] [-U] filename") + "bench [-c count] [-d depth] [-f fmt] [--flush-interval=3Dflush_interv= al] [-n] [--no-drain] [-o offset] [--pattern=3Dpattern] [-q] [-s buffer_siz= e] [-S step_size] [-t cache] [-i aio] [-w] [-U] filename") STEXI -@item bench [-c @var{count}] [-d @var{depth}] [-f @var{fmt}] [--flush-inte= rval=3D@var{flush_interval}] [-n] [--no-drain] [-o @var{offset}] [--pattern= =3D@var{pattern}] [-q] [-s @var{buffer_size}] [-S @var{step_size}] [-t @var= {cache}] [-w] [-U] @var{filename} +@item bench [-c @var{count}] [-d @var{depth}] [-f @var{fmt}] [--flush-inte= rval=3D@var{flush_interval}] [-n] [--no-drain] [-o @var{offset}] [--pattern= =3D@var{pattern}] [-q] [-s @var{buffer_size}] [-S @var{step_size}] [-t @var= {cache}] [-i @var{aio}] [-w] [-U] @var{filename} ETEXI =20 DEF("check", img_check, diff --git a/qemu-img.c b/qemu-img.c index 6233b8ca56..2b4562b9d9 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -4187,7 +4187,8 @@ static int img_bench(int argc, char **argv) {"force-share", no_argument, 0, 'U'}, {0, 0, 0, 0} }; - c =3D getopt_long(argc, argv, ":hc:d:f:no:qs:S:t:wU", long_options= , NULL); + c =3D getopt_long(argc, argv, ":hc:d:f:ni:o:qs:S:t:wU", long_optio= ns, + NULL); if (c =3D=3D -1) { break; } @@ -4230,6 +4231,14 @@ static int img_bench(int argc, char **argv) case 'n': flags |=3D BDRV_O_NATIVE_AIO; break; + case 'i': + ret =3D bdrv_parse_aio(optarg, &flags); + if (ret < 0) { + error_report("Invalid aio option: %s", optarg); + ret =3D -1; + goto out; + } + break; case 'o': { offset =3D cvtnum(optarg); diff --git a/qemu-img.texi b/qemu-img.texi index b5156d6316..20136fcb94 100644 --- a/qemu-img.texi +++ b/qemu-img.texi @@ -206,7 +206,7 @@ Command description: Amends the image format specific @var{options} for the image file @var{filename}. Not all file formats support this operation. =20 -@item bench [-c @var{count}] [-d @var{depth}] [-f @var{fmt}] [--flush-inte= rval=3D@var{flush_interval}] [-n] [--no-drain] [-o @var{offset}] [--pattern= =3D@var{pattern}] [-q] [-s @var{buffer_size}] [-S @var{step_size}] [-t @var= {cache}] [-w] [-U] @var{filename} +@item bench [-c @var{count}] [-d @var{depth}] [-f @var{fmt}] [--flush-inte= rval=3D@var{flush_interval}] [-n] [-i @var{aio}] [--no-drain] [-o @var{offs= et}] [--pattern=3D@var{pattern}] [-q] [-s @var{buffer_size}] [-S @var{step_= size}] [-t @var{cache}] [-w] [-U] @var{filename} =20 Run a simple sequential I/O benchmark on the specified image. If @code{-w}= is specified, a write test is performed, otherwise a read test is performed. @@ -227,6 +227,9 @@ If @code{-n} is specified, the native AIO backend is us= ed if possible. On Linux, this option only works if @code{-t none} or @code{-t directsync} is specified as well. =20 +If @code{-i} is specified, aio option can be used to specify different AIO +backends: @var{threads}, @var{native} or @var{io_uring}. + For write tests, by default a buffer filled with zeros is written. This ca= n be overridden with a pattern byte specified by @var{pattern}. =20 --=20 2.24.1 From nobody Sat Apr 12 07:40:49 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580420368488588.1996132702625; Thu, 30 Jan 2020 13:39:28 -0800 (PST) Received: from localhost ([::1]:39454 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHX5-0002nq-6j for importer@patchew.org; Thu, 30 Jan 2020 16:39:27 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:56715) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHQr-0000WJ-7B for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:33:02 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ixHQp-00074w-4B for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:33:01 -0500 Received: from us-smtp-1.mimecast.com ([207.211.31.81]:57485 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ixHQo-00073y-W3 for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:32:59 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-411-sefOwBRhMV-vBy981I0THg-1; Thu, 30 Jan 2020 16:32:56 -0500 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 1B33C800D41; Thu, 30 Jan 2020 21:32:55 +0000 (UTC) Received: from localhost (unknown [10.36.118.87]) by smtp.corp.redhat.com (Postfix) with ESMTP id C131087B2C; Thu, 30 Jan 2020 21:32:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580419978; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=SMMIrVJy0uwR8Uuxe8xOKWdDD+Tu4OY0UK1A96PYN3Q=; b=i2NKrCczm+lt7g5OJAyd8ErJT6FNqKW8li13efLdW6UIrtABaZZpc8LYUFKddyuAjZQpJ1 fDoivzbT3Pmf1Rj0PNIxL/IzCshOqbZPfA/oBkCBrGf1WkXb0POPAeFcc3gmCvVgMBXWrT aU10QncsTrHO63tkjzInQ1x3ig46k80= From: Stefan Hajnoczi To: qemu-devel@nongnu.org Subject: [PULL 16/18] qemu-nbd: adds option for aio engines Date: Thu, 30 Jan 2020 21:31:12 +0000 Message-Id: <20200130213114.325157-17-stefanha@redhat.com> In-Reply-To: <20200130213114.325157-1-stefanha@redhat.com> References: <20200130213114.325157-1-stefanha@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-MC-Unique: sefOwBRhMV-vBy981I0THg-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 207.211.31.81 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: Kevin Wolf , Peter Maydell , qemu-block@nongnu.org, Julia Suvorova , Markus Armbruster , Max Reitz , Stefan Hajnoczi , Paolo Bonzini , Fam Zheng , Aarushi Mehta , Stefano Garzarella Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Aarushi Mehta Signed-off-by: Aarushi Mehta Acked-by: Eric Blake Acked-by: Stefano Garzarella Signed-off-by: Stefan Hajnoczi Message-id: 20200120141858.587874-14-stefanha@redhat.com Message-Id: <20200120141858.587874-14-stefanha@redhat.com> Signed-off-by: Stefan Hajnoczi --- docs/interop/qemu-nbd.rst | 4 ++-- qemu-nbd.c | 12 ++++-------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/docs/interop/qemu-nbd.rst b/docs/interop/qemu-nbd.rst index 873bb9e17d..df7b6b9d0d 100644 --- a/docs/interop/qemu-nbd.rst +++ b/docs/interop/qemu-nbd.rst @@ -108,8 +108,8 @@ driver options if ``--image-opts`` is specified. =20 .. option:: --aio=3DAIO =20 - Set the asynchronous I/O mode between ``threads`` (the default) - and ``native`` (Linux only). + Set the asynchronous I/O mode between ``threads`` (the default), + ``native`` (Linux only), and ``io_uring`` (Linux 5.1+). =20 .. option:: --discard=3DDISCARD =20 diff --git a/qemu-nbd.c b/qemu-nbd.c index 108a51f7eb..db29a0d0ed 100644 --- a/qemu-nbd.c +++ b/qemu-nbd.c @@ -135,7 +135,7 @@ static void usage(const char *name) " '[ID_OR_NAME]'\n" " -n, --nocache disable host cache\n" " --cache=3DMODE set cache mode (none, writeback, ...)\n" -" --aio=3DMODE set AIO mode (native or threads)\n" +" --aio=3DMODE set AIO mode (native, io_uring or threads)\= n" " --discard=3DMODE set discard mode (ignore, unmap)\n" " --detect-zeroes=3DMODE set detect-zeroes mode (off, on, unmap)\n" " --image-opts treat FILE as a full set of image options\n" @@ -726,13 +726,9 @@ int main(int argc, char **argv) exit(EXIT_FAILURE); } seen_aio =3D true; - if (!strcmp(optarg, "native")) { - flags |=3D BDRV_O_NATIVE_AIO; - } else if (!strcmp(optarg, "threads")) { - /* this is the default */ - } else { - error_report("invalid aio mode `%s'", optarg); - exit(EXIT_FAILURE); + if (bdrv_parse_aio(optarg, &flags) < 0) { + error_report("Invalid aio mode '%s'", optarg); + exit(EXIT_FAILURE); } break; case QEMU_NBD_OPT_DISCARD: --=20 2.24.1 From nobody Sat Apr 12 07:40:49 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580420741403856.8829623201376; Thu, 30 Jan 2020 13:45:41 -0800 (PST) Received: from localhost ([::1]:39614 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHd6-0004tF-54 for importer@patchew.org; Thu, 30 Jan 2020 16:45:40 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:56795) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHR5-0000e1-DF for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:33:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ixHQz-0007IA-Sl for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:33:11 -0500 Received: from us-smtp-delivery-1.mimecast.com ([205.139.110.120]:58223 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ixHQw-0007GF-Sq for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:33:06 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-438-vGnvEmcJP1Wnz7GY_Ps10g-1; Thu, 30 Jan 2020 16:33:03 -0500 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 498E2100550E; Thu, 30 Jan 2020 21:33:02 +0000 (UTC) Received: from localhost (unknown [10.36.118.87]) by smtp.corp.redhat.com (Postfix) with ESMTP id 85B6460BE0; Thu, 30 Jan 2020 21:32:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580419985; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=/HGmUHjCPxCFbKBVxQL3WgeKYD6TdAhjbnQqC/l5sfA=; b=elL0X1YbNcjpmcsuwiKGI33lNc0zrWBC2YqD84NxXk7gP+4Y5gAv/Hl18eTILU1JNe/p0o uyulF1TlNoBc0w3wim/jJH2/mQe43G3YS9v4kvJhhBEf1JLimbFIqGcsHU9ZVaaEhO9k7Z vyPBNBTxcNkS1GkqfJDJm7dckDrCilw= From: Stefan Hajnoczi To: qemu-devel@nongnu.org Subject: [PULL 17/18] tests/qemu-iotests: enable testing with aio options Date: Thu, 30 Jan 2020 21:31:13 +0000 Message-Id: <20200130213114.325157-18-stefanha@redhat.com> In-Reply-To: <20200130213114.325157-1-stefanha@redhat.com> References: <20200130213114.325157-1-stefanha@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-MC-Unique: vGnvEmcJP1Wnz7GY_Ps10g-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 205.139.110.120 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: Kevin Wolf , Peter Maydell , qemu-block@nongnu.org, Julia Suvorova , Markus Armbruster , Max Reitz , Stefan Hajnoczi , Paolo Bonzini , Fam Zheng , Aarushi Mehta , Stefano Garzarella Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Aarushi Mehta Signed-off-by: Aarushi Mehta Acked-by: Stefano Garzarella Signed-off-by: Stefan Hajnoczi Message-id: 20200120141858.587874-15-stefanha@redhat.com Message-Id: <20200120141858.587874-15-stefanha@redhat.com> Signed-off-by: Stefan Hajnoczi --- tests/qemu-iotests/check | 15 ++++++++++++++- tests/qemu-iotests/common.rc | 14 ++++++++++++++ tests/qemu-iotests/iotests.py | 12 ++++++++++-- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/tests/qemu-iotests/check b/tests/qemu-iotests/check index 2890785a10..39ed5bc1be 100755 --- a/tests/qemu-iotests/check +++ b/tests/qemu-iotests/check @@ -137,6 +137,7 @@ sortme=3Dfalse expunge=3Dtrue have_test_arg=3Dfalse cachemode=3Dfalse +aiomode=3Dfalse =20 tmp=3D"${TEST_DIR}"/$$ rm -f $tmp.list $tmp.tmp $tmp.sed @@ -146,6 +147,7 @@ export IMGFMT_GENERIC=3Dtrue export IMGPROTO=3Dfile export IMGOPTS=3D"" export CACHEMODE=3D"writeback" +export AIOMODE=3D"threads" export QEMU_IO_OPTIONS=3D"" export QEMU_IO_OPTIONS_NO_FMT=3D"" export CACHEMODE_IS_DEFAULT=3Dtrue @@ -230,6 +232,11 @@ s/ .*//p CACHEMODE_IS_DEFAULT=3Dfalse cachemode=3Dfalse continue + elif $aiomode + then + AIOMODE=3D"$r" + aiomode=3Dfalse + continue fi =20 xpand=3Dtrue @@ -274,6 +281,7 @@ other options -n show me, do not run tests -o options -o options to pass to qemu-img create/convert -c mode cache mode + -i mode AIO mode -makecheck pretty print output for make check =20 testlist options @@ -438,10 +446,13 @@ testlist options cachemode=3Dtrue xpand=3Dfalse ;; + -i) + aiomode=3Dtrue + xpand=3Dfalse + ;; -T) # deprecated timestamp option xpand=3Dfalse ;; - -v) verbose=3Dtrue xpand=3Dfalse @@ -520,6 +531,8 @@ done =20 # Set qemu-io cache mode with $CACHEMODE we have QEMU_IO_OPTIONS=3D"$QEMU_IO_OPTIONS --cache $CACHEMODE" +# Set qemu-io aio mode with $AIOMODE we have +QEMU_IO_OPTIONS=3D"$QEMU_IO_OPTIONS --aio $AIOMODE" =20 QEMU_IO_OPTIONS_NO_FMT=3D"$QEMU_IO_OPTIONS" if [ "$IMGOPTSSYNTAX" !=3D "true" ]; then diff --git a/tests/qemu-iotests/common.rc b/tests/qemu-iotests/common.rc index d088392ab6..9ccde32634 100644 --- a/tests/qemu-iotests/common.rc +++ b/tests/qemu-iotests/common.rc @@ -645,6 +645,20 @@ _default_cache_mode() return fi } +_supported_aio_modes() +{ + for mode; do + if [ "$mode" =3D "$AIOMODE" ]; then + return + fi + done + _notrun "not suitable for aio mode: $AIOMODE" +} +_default_aio_mode() +{ + AIOMODE=3D"$1" + QEMU_IO=3D"$QEMU_IO --aio $1" +} =20 _unsupported_imgopts() { diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py index 0b62c42851..89aa2df2f3 100644 --- a/tests/qemu-iotests/iotests.py +++ b/tests/qemu-iotests/iotests.py @@ -65,6 +65,7 @@ test_dir =3D os.environ.get('TEST_DIR') sock_dir =3D os.environ.get('SOCK_DIR') output_dir =3D os.environ.get('OUTPUT_DIR', '.') cachemode =3D os.environ.get('CACHEMODE') +aiomode =3D os.environ.get('AIOMODE') qemu_default_machine =3D os.environ.get('QEMU_DEFAULT_MACHINE') =20 socket_scm_helper =3D os.environ.get('SOCKET_SCM_HELPER', 'socket_scm_help= er') @@ -495,6 +496,7 @@ class VM(qtest.QEMUQtestMachine): options.append('file=3D%s' % path) options.append('format=3D%s' % format) options.append('cache=3D%s' % cachemode) + options.append('aio=3D%s' % aiomode) =20 if opts: options.append(opts) @@ -937,6 +939,10 @@ def verify_cache_mode(supported_cache_modes=3D[]): if supported_cache_modes and (cachemode not in supported_cache_modes): notrun('not suitable for this cache mode: %s' % cachemode) =20 +def verify_aio_mode(supported_aio_modes=3D[]): + if supported_aio_modes and (aiomode not in supported_aio_modes): + notrun('not suitable for this aio mode: %s' % aiomode) + def supports_quorum(): return 'quorum' in qemu_img_pipe('--help') =20 @@ -1023,8 +1029,9 @@ def execute_unittest(output, verbosity, debug): =20 def execute_test(test_function=3DNone, supported_fmts=3D[], supported_oses=3D['linux'], - supported_cache_modes=3D[], unsupported_fmts=3D[], - supported_protocols=3D[], unsupported_protocols=3D[]): + supported_cache_modes=3D[], supported_aio_modes=3D{}, + unsupported_fmts=3D[], supported_protocols=3D[], + unsupported_protocols=3D[]): """Run either unittest or script-style tests.""" =20 # We are using TEST_DIR and QEMU_DEFAULT_MACHINE as proxies to @@ -1041,6 +1048,7 @@ def execute_test(test_function=3DNone, verify_protocol(supported_protocols, unsupported_protocols) verify_platform(supported_oses) verify_cache_mode(supported_cache_modes) + verify_aio_mode(supported_aio_modes) =20 if debug: output =3D sys.stdout --=20 2.24.1 From nobody Sat Apr 12 07:40:49 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580420263271401.68712656079276; Thu, 30 Jan 2020 13:37:43 -0800 (PST) Received: from localhost ([::1]:39408 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHVO-0007wY-0K for importer@patchew.org; Thu, 30 Jan 2020 16:37:42 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:56897) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ixHRD-0000iC-80 for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:33:25 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ixHRB-0007TO-0V for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:33:23 -0500 Received: from us-smtp-1.mimecast.com ([207.211.31.81]:52203 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ixHRA-0007OO-TQ for qemu-devel@nongnu.org; Thu, 30 Jan 2020 16:33:20 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-29-HAW9hGltPRCEm9owgL-DpA-1; Thu, 30 Jan 2020 16:33:10 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 13F49107ACC5; Thu, 30 Jan 2020 21:33:09 +0000 (UTC) Received: from localhost (unknown [10.36.118.87]) by smtp.corp.redhat.com (Postfix) with ESMTP id ADBDF1001B23; Thu, 30 Jan 2020 21:33:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580419996; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+uHZ8irsP+n1mN8+V04sGNyPvPznAWy8yeCAASWzUVc=; b=NBEAa3ZlQDk7WkAxuANZWETqOLWBKrdTCQwuHhZVShh6jn1rHtzDzJ8XmEqse2Xr+mMv0T b6jDIluaxd83oR1O1OK7/U8brMwAnjQZ9czcLrcTYfBahiRYxtJN5176y9yww+061jhZsA Z7JvFLYC4i9aBMrTaJm2xD5dUNqFTRA= From: Stefan Hajnoczi To: qemu-devel@nongnu.org Subject: [PULL 18/18] tests/qemu-iotests: use AIOMODE with various tests Date: Thu, 30 Jan 2020 21:31:14 +0000 Message-Id: <20200130213114.325157-19-stefanha@redhat.com> In-Reply-To: <20200130213114.325157-1-stefanha@redhat.com> References: <20200130213114.325157-1-stefanha@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-MC-Unique: HAW9hGltPRCEm9owgL-DpA-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 207.211.31.81 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: Kevin Wolf , Peter Maydell , qemu-block@nongnu.org, Julia Suvorova , Markus Armbruster , Max Reitz , Stefan Hajnoczi , Paolo Bonzini , Fam Zheng , Aarushi Mehta , Stefano Garzarella Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Aarushi Mehta Signed-off-by: Aarushi Mehta Acked-by: Stefano Garzarella Signed-off-by: Stefan Hajnoczi Message-id: 20200120141858.587874-16-stefanha@redhat.com Message-Id: <20200120141858.587874-16-stefanha@redhat.com> Signed-off-by: Stefan Hajnoczi --- tests/qemu-iotests/028 | 2 +- tests/qemu-iotests/058 | 2 +- tests/qemu-iotests/089 | 4 ++-- tests/qemu-iotests/091 | 4 ++-- tests/qemu-iotests/109 | 2 +- tests/qemu-iotests/147 | 5 +++-- tests/qemu-iotests/181 | 8 ++++---- tests/qemu-iotests/183 | 4 ++-- tests/qemu-iotests/185 | 10 +++++----- tests/qemu-iotests/200 | 2 +- tests/qemu-iotests/201 | 8 ++++---- 11 files changed, 26 insertions(+), 25 deletions(-) diff --git a/tests/qemu-iotests/028 b/tests/qemu-iotests/028 index e2556d8e57..797dae5350 100755 --- a/tests/qemu-iotests/028 +++ b/tests/qemu-iotests/028 @@ -108,7 +108,7 @@ echo block-backup echo =20 qemu_comm_method=3D"monitor" -_launch_qemu -drive file=3D"${TEST_IMG}",cache=3D${CACHEMODE},id=3Ddisk +_launch_qemu -drive file=3D"${TEST_IMG}",cache=3D${CACHEMODE},aio=3D${AIOM= ODE},id=3Ddisk h=3D$QEMU_HANDLE if [ "${VALGRIND_QEMU}" =3D=3D "y" ]; then QEMU_COMM_TIMEOUT=3D7 diff --git a/tests/qemu-iotests/058 b/tests/qemu-iotests/058 index d5304bb404..d84740ed9f 100755 --- a/tests/qemu-iotests/058 +++ b/tests/qemu-iotests/058 @@ -65,7 +65,7 @@ nbd_snapshot_img=3D"nbd:unix:$nbd_unix_socket" converted_image=3D$TEST_IMG.converted =20 # Use -f raw instead of -f $IMGFMT for the NBD connection -QEMU_IO_NBD=3D"$QEMU_IO -f raw --cache=3D$CACHEMODE" +QEMU_IO_NBD=3D"$QEMU_IO -f raw --cache=3D$CACHEMODE --aio=3D$AIOMODE" =20 echo echo "=3D=3D preparing image =3D=3D" diff --git a/tests/qemu-iotests/089 b/tests/qemu-iotests/089 index ad029f1f09..059ad75e28 100755 --- a/tests/qemu-iotests/089 +++ b/tests/qemu-iotests/089 @@ -64,7 +64,7 @@ $QEMU_IO -c 'write -P 42 0 512' -c 'write -P 23 512 512' \ =20 $QEMU_IMG convert -f raw -O $IMGFMT "$TEST_IMG.base" "$TEST_IMG" =20 -$QEMU_IO_PROG --cache $CACHEMODE \ +$QEMU_IO_PROG --cache $CACHEMODE --aio $AIOMODE \ -c 'read -P 42 0 512' -c 'read -P 23 512 512' \ -c 'read -P 66 1024 512' "json:{ \"driver\": \"$IMGFMT\", @@ -111,7 +111,7 @@ $QEMU_IO -c 'write -P 42 0x38000 512' "$TEST_IMG" | _fi= lter_qemu_io =20 # The "image.filename" part tests whether "a": { "b": "c" } and "a.b": "c"= do # the same (which they should). -$QEMU_IO_PROG --cache $CACHEMODE \ +$QEMU_IO_PROG --cache $CACHEMODE --aio $AIOMODE \ -c 'read -P 42 0x38000 512' "json:{ \"driver\": \"$IMGFMT\", \"file\": { diff --git a/tests/qemu-iotests/091 b/tests/qemu-iotests/091 index 0874fa84c8..d2a2aca347 100755 --- a/tests/qemu-iotests/091 +++ b/tests/qemu-iotests/091 @@ -60,13 +60,13 @@ echo =3D=3D=3D Starting QEMU VM1 =3D=3D=3D echo =20 qemu_comm_method=3D"monitor" -_launch_qemu -drive file=3D"${TEST_IMG}",cache=3D${CACHEMODE},id=3Ddisk +_launch_qemu -drive file=3D"${TEST_IMG}",cache=3D${CACHEMODE},aio=3D${AIOM= ODE},id=3Ddisk h1=3D$QEMU_HANDLE =20 echo echo =3D=3D=3D Starting QEMU VM2 =3D=3D=3D echo -_launch_qemu -drive file=3D"${TEST_IMG}",cache=3D${CACHEMODE},id=3Ddisk \ +_launch_qemu -drive file=3D"${TEST_IMG}",cache=3D${CACHEMODE},aio=3D${AIOM= ODE},id=3Ddisk \ -incoming "exec: cat '${MIG_FIFO}'" h2=3D$QEMU_HANDLE =20 diff --git a/tests/qemu-iotests/109 b/tests/qemu-iotests/109 index ba638db11f..a51dd84b3d 100755 --- a/tests/qemu-iotests/109 +++ b/tests/qemu-iotests/109 @@ -52,7 +52,7 @@ run_qemu() local qmp_format=3D"$3" local qmp_event=3D"$4" =20 - _launch_qemu -drive file=3D"${source_img}",format=3Draw,cache=3D${CACH= EMODE},id=3Dsrc + _launch_qemu -drive file=3D"${source_img}",format=3Draw,cache=3D${CACH= EMODE},aio=3D${AIOMODE},id=3Dsrc _send_qemu_cmd $QEMU_HANDLE "{ 'execute': 'qmp_capabilities' }" "retur= n" =20 _send_qemu_cmd $QEMU_HANDLE \ diff --git a/tests/qemu-iotests/147 b/tests/qemu-iotests/147 index 03fc2fabcf..2b6f859a09 100755 --- a/tests/qemu-iotests/147 +++ b/tests/qemu-iotests/147 @@ -24,7 +24,7 @@ import socket import stat import time import iotests -from iotests import cachemode, imgfmt, qemu_img, qemu_nbd, qemu_nbd_early_= pipe +from iotests import cachemode, aiomode, imgfmt, qemu_img, qemu_nbd, qemu_n= bd_early_pipe =20 NBD_PORT_START =3D 32768 NBD_PORT_END =3D NBD_PORT_START + 1024 @@ -134,7 +134,8 @@ class BuiltinNBD(NBDBlockdevAddBase): self.server.add_drive_raw('if=3Dnone,id=3Dnbd-export,' + 'file=3D%s,' % test_img + 'format=3D%s,' % imgfmt + - 'cache=3D%s' % cachemode) + 'cache=3D%s' % cachemode + + 'aio=3D%s' % aiomode) self.server.launch() =20 def tearDown(self): diff --git a/tests/qemu-iotests/181 b/tests/qemu-iotests/181 index 378c2899d1..438c2dcd80 100755 --- a/tests/qemu-iotests/181 +++ b/tests/qemu-iotests/181 @@ -58,20 +58,20 @@ qemu_comm_method=3D"monitor" =20 if [ "$IMGOPTSSYNTAX" =3D "true" ]; then _launch_qemu \ - -drive "${TEST_IMG}",cache=3D${CACHEMODE},id=3Ddisk + -drive "${TEST_IMG}",cache=3D${CACHEMODE},aio=3D$AIOMODE,id=3Ddisk else _launch_qemu \ - -drive file=3D"${TEST_IMG}",cache=3D${CACHEMODE},driver=3D$IMGFMT,= id=3Ddisk + -drive file=3D"${TEST_IMG}",cache=3D${CACHEMODE},aio=3D$AIOMODE,dr= iver=3D$IMGFMT,id=3Ddisk fi src=3D$QEMU_HANDLE =20 if [ "$IMGOPTSSYNTAX" =3D "true" ]; then _launch_qemu \ - -drive "${TEST_IMG}",cache=3D${CACHEMODE},id=3Ddisk \ + -drive "${TEST_IMG}",cache=3D${CACHEMODE},aio=3D$AIOMODE,id=3Ddisk= \ -incoming "unix:${MIG_SOCKET}" else _launch_qemu \ - -drive file=3D"${TEST_IMG}",cache=3D${CACHEMODE},driver=3D$IMGFMT,= id=3Ddisk \ + -drive file=3D"${TEST_IMG}",cache=3D${CACHEMODE},aio=3D$AIOMODE,dr= iver=3D$IMGFMT,id=3Ddisk \ -incoming "unix:${MIG_SOCKET}" fi dest=3D$QEMU_HANDLE diff --git a/tests/qemu-iotests/183 b/tests/qemu-iotests/183 index 3f74b9f62d..64621617f5 100755 --- a/tests/qemu-iotests/183 +++ b/tests/qemu-iotests/183 @@ -56,12 +56,12 @@ echo qemu_comm_method=3D"qmp" =20 _launch_qemu \ - -drive file=3D"${TEST_IMG}",cache=3D$CACHEMODE,driver=3D$IMGFMT,id=3Dd= isk + -drive file=3D"${TEST_IMG}",cache=3D$CACHEMODE,aio=3D$AIOMODE,driver= =3D$IMGFMT,id=3Ddisk src=3D$QEMU_HANDLE _send_qemu_cmd $src "{ 'execute': 'qmp_capabilities' }" 'return' =20 _launch_qemu \ - -drive file=3D"${TEST_IMG}.dest",cache=3D$CACHEMODE,driver=3D$IMGFMT,i= d=3Ddisk \ + -drive file=3D"${TEST_IMG}.dest",cache=3D$CACHEMODE,aio=3D$AIOMODE,dri= ver=3D$IMGFMT,id=3Ddisk \ -incoming "unix:${MIG_SOCKET}" dest=3D$QEMU_HANDLE _send_qemu_cmd $dest "{ 'execute': 'qmp_capabilities' }" 'return' diff --git a/tests/qemu-iotests/185 b/tests/qemu-iotests/185 index e50f19ebf0..fd5e6ebe11 100755 --- a/tests/qemu-iotests/185 +++ b/tests/qemu-iotests/185 @@ -54,7 +54,7 @@ echo qemu_comm_method=3D"qmp" =20 _launch_qemu \ - -drive file=3D"${TEST_IMG}.base",cache=3D$CACHEMODE,driver=3D$IMGFMT,i= d=3Ddisk + -drive file=3D"${TEST_IMG}.base",cache=3D$CACHEMODE,aio=3D$AIOMODE,dri= ver=3D$IMGFMT,id=3Ddisk h=3D$QEMU_HANDLE _send_qemu_cmd $h "{ 'execute': 'qmp_capabilities' }" 'return' =20 @@ -125,7 +125,7 @@ echo =3D=3D=3D Start active commit job and exit qemu = =3D=3D=3D echo =20 _launch_qemu \ - -drive file=3D"${TEST_IMG}",cache=3D$CACHEMODE,driver=3D$IMGFMT,id=3Dd= isk + -drive file=3D"${TEST_IMG}",cache=3D$CACHEMODE,aio=3D$AIOMODE,driver= =3D$IMGFMT,id=3Ddisk h=3D$QEMU_HANDLE _send_qemu_cmd $h "{ 'execute': 'qmp_capabilities' }" 'return' =20 @@ -147,7 +147,7 @@ echo =3D=3D=3D Start mirror job and exit qemu =3D=3D=3D echo =20 _launch_qemu \ - -drive file=3D"${TEST_IMG}",cache=3D$CACHEMODE,driver=3D$IMGFMT,id=3Dd= isk + -drive file=3D"${TEST_IMG}",cache=3D$CACHEMODE,aio=3D$AIOMODE,driver= =3D$IMGFMT,id=3Ddisk h=3D$QEMU_HANDLE _send_qemu_cmd $h "{ 'execute': 'qmp_capabilities' }" 'return' =20 @@ -172,7 +172,7 @@ echo =3D=3D=3D Start backup job and exit qemu =3D=3D=3D echo =20 _launch_qemu \ - -drive file=3D"${TEST_IMG}",cache=3D$CACHEMODE,driver=3D$IMGFMT,id=3Dd= isk + -drive file=3D"${TEST_IMG}",cache=3D$CACHEMODE,aio=3D$AIOMODE,driver= =3D$IMGFMT,id=3Ddisk h=3D$QEMU_HANDLE _send_qemu_cmd $h "{ 'execute': 'qmp_capabilities' }" 'return' =20 @@ -196,7 +196,7 @@ echo =3D=3D=3D Start streaming job and exit qemu =3D=3D= =3D echo =20 _launch_qemu \ - -drive file=3D"${TEST_IMG}",cache=3D$CACHEMODE,driver=3D$IMGFMT,id=3Dd= isk + -drive file=3D"${TEST_IMG}",cache=3D$CACHEMODE,aio=3D$AIOMODE,driver= =3D$IMGFMT,id=3Ddisk h=3D$QEMU_HANDLE _send_qemu_cmd $h "{ 'execute': 'qmp_capabilities' }" 'return' =20 diff --git a/tests/qemu-iotests/200 b/tests/qemu-iotests/200 index a2cdd7f83d..59f7854b9f 100755 --- a/tests/qemu-iotests/200 +++ b/tests/qemu-iotests/200 @@ -67,7 +67,7 @@ echo =3D=3D=3D Starting QEMU VM =3D=3D=3D echo qemu_comm_method=3D"qmp" _launch_qemu -object iothread,id=3Diothread0 $virtio_scsi \ - -drive file=3D"${TEST_IMG}",media=3Ddisk,if=3Dnone,cache=3D$C= ACHEMODE,id=3Ddrive_sysdisk,format=3D$IMGFMT \ + -drive file=3D"${TEST_IMG}",media=3Ddisk,if=3Dnone,cache=3D$C= ACHEMODE,aio=3D$AIOMODE,id=3Ddrive_sysdisk,format=3D$IMGFMT \ -device scsi-hd,drive=3Ddrive_sysdisk,bus=3Dscsi0.0,id=3Dsysd= isk,bootindex=3D0 h1=3D$QEMU_HANDLE =20 diff --git a/tests/qemu-iotests/201 b/tests/qemu-iotests/201 index 133ba9f03e..483eb189c5 100755 --- a/tests/qemu-iotests/201 +++ b/tests/qemu-iotests/201 @@ -58,20 +58,20 @@ qemu_comm_method=3D"monitor" =20 if [ "$IMGOPTSSYNTAX" =3D "true" ]; then _launch_qemu \ - -drive "${TEST_IMG}",cache=3D${CACHEMODE},id=3Ddisk + -drive "${TEST_IMG}",cache=3D${CACHEMODE},aio=3D$AIOMODE,id=3Ddisk else _launch_qemu \ - -drive file=3D"${TEST_IMG}",cache=3D${CACHEMODE},driver=3D$IMGFMT,= id=3Ddisk + -drive file=3D"${TEST_IMG}",cache=3D${CACHEMODE},aio=3D$AIOMODE,dr= iver=3D$IMGFMT,id=3Ddisk fi src=3D$QEMU_HANDLE =20 if [ "$IMGOPTSSYNTAX" =3D "true" ]; then _launch_qemu \ - -drive "${TEST_IMG}",cache=3D${CACHEMODE},id=3Ddisk \ + -drive "${TEST_IMG}",cache=3D${CACHEMODE},aio=3D$AIOMODE,id=3Ddisk= \ -incoming "unix:${MIG_SOCKET}" else _launch_qemu \ - -drive file=3D"${TEST_IMG}",cache=3D${CACHEMODE},driver=3D$IMGFMT,= id=3Ddisk \ + -drive file=3D"${TEST_IMG}",cache=3D${CACHEMODE},aio=3D$AIOMODE,dr= iver=3D$IMGFMT,id=3Ddisk \ -incoming "unix:${MIG_SOCKET}" fi dest=3D$QEMU_HANDLE --=20 2.24.1