From nobody Wed Nov 19 05:52:26 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; 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 ARC-Seal: i=1; a=rsa-sha256; t=1614683728; cv=none; d=zohomail.com; s=zohoarc; b=PlGjVrjA/5V56opehGz+X68CR7kk06uvgG5fK5tya71Xz50lKIYyLsdieoWLXsQcZ0FKSom/bRikn7WgSsNVlJ7d2HC5C5ePEdw9GuQOKgNFObF4/zTQFTMNHWtmk87SvW6HX3xOqWPMnefFGr/nrXLp/9wlMKPnoKyFIVNCQqA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1614683728; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=PNZmbtZdEl/mFrCUEeQ2F7hb4v6l/Eu6Q3cp/qGLdZ0=; b=Ick5c/RU9RBi2ONozYrZqY3+b0khfqK0RCZ5xYZJTn5vk7v+W+UZBRuniKdCOIsb7A1glWF+hGt8kN10Nri9GFU4Xi/IrOWbhjYneiQgF0DzZeMHCbduQMENOWKYPOx1UBHAcAkwFYauCKTuc0O2+ZRiXMKA3qfHA88frIi/7Pg= ARC-Authentication-Results: i=1; mx.zohomail.com; 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1614683728830119.47081805427251; Tue, 2 Mar 2021 03:15:28 -0800 (PST) Received: from localhost ([::1]:36986 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lH2zu-0001Kx-NZ for importer@patchew.org; Tue, 02 Mar 2021 06:15:26 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:36856) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lH2vS-0006aY-WD; Tue, 02 Mar 2021 06:10:51 -0500 Received: from out3-smtp.messagingengine.com ([66.111.4.27]:56799) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lH2vR-0007Ib-67; Tue, 02 Mar 2021 06:10:50 -0500 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id 672C55C015B; Tue, 2 Mar 2021 06:10:48 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute4.internal (MEProxy); Tue, 02 Mar 2021 06:10:48 -0500 Received: from apples.local (80-167-98-190-cable.dk.customer.tdc.net [80.167.98.190]) by mail.messagingengine.com (Postfix) with ESMTPA id 3A37F1080054; Tue, 2 Mar 2021 06:10:47 -0500 (EST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=irrelevant.dk; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=fm2; bh=PNZmbtZdEl/mF rCUEeQ2F7hb4v6l/Eu6Q3cp/qGLdZ0=; b=rcjP5MCz/2oq/1K4CT8sBzhAs5f4r FseT+AzKiZ5CLcWAIrSSn5uflSx07UeS3G4j4uME0v+EbfG3MflNlY0m8GVMYvq6 VK7x2NrvLfiZMWuQkOv7D7Q+tpe5KOrckdk+LO+jS2tX60caKpUW9mv7IakfIse8 bW8GUhHpEYywrqxzOIpm7d/HiQ2mTUMBFXP/8/G/EwgnfmfJQ2pBzYZE8en/rBC9 BMFMRn1S8aYd+V9gj628NWGYT0mYiMVYtHWqxlNmKUsN8APgkbqt5E3l/PannceE gu61rw9l8C3FaZTTkceIajCzcCRuqeK0vCAf8hJ/St3A0yu4UM3SjCQZQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm2; bh=PNZmbtZdEl/mFrCUEeQ2F7hb4v6l/Eu6Q3cp/qGLdZ0=; b=LOtzC93H sMzI5ZilyWEqtFmqOivEH+XCfhSRb1bdjR07oyrL1N2xBWT5Wrxykw5pYfn6SBqe es6SD6FTMLl/uWc5Upao7vJhSXtemluCjV6/EjRRXHD9FvXm8FK9wryK+0uxlfda 2I5BLJ0k64C+K83/TjMOb3aHMVRJ1O8fNl2GflJl/6vhGGACGFSF/2l/oJNSRUgE UYJRntlQc7vv4SqbSmCBTXdf16/UXZUVQrNpL06tzYw9cXW1jf38y4BQyeyI1Lpc VszM4uD5qVBHAKcnB/STc6MJE5Uv8HzUqP+dmaAqCEGcnbYZLUQtALxtdH8h+MMj cJXx6SVnvmPfXg== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledruddttddgvdefucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpefmlhgruhhs ucflvghnshgvnhcuoehithhssehirhhrvghlvghvrghnthdrughkqeenucggtffrrghtth gvrhhnpeeuleetgeeiuefhgfekfefgveejiefgteekiedtgfdtieefhfdthfefueffvefg keenucfkphepkedtrdduieejrdelkedrudeltdenucevlhhushhtvghrufhiiigvpedune curfgrrhgrmhepmhgrihhlfhhrohhmpehithhssehirhhrvghlvghvrghnthdrughk X-ME-Proxy: From: Klaus Jensen To: qemu-devel@nongnu.org Subject: [PATCH RFC 3/4] hw/block/nvme: convert flush to aiocb Date: Tue, 2 Mar 2021 12:10:39 +0100 Message-Id: <20210302111040.289244-4-its@irrelevant.dk> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210302111040.289244-1-its@irrelevant.dk> References: <20210302111040.289244-1-its@irrelevant.dk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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; Received-SPF: pass client-ip=66.111.4.27; envelope-from=its@irrelevant.dk; helo=out3-smtp.messagingengine.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action 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 , qemu-block@nongnu.org, Klaus Jensen , Max Reitz , Klaus Jensen , Stefan Hajnoczi , Keith Busch Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Klaus Jensen Convert flush from ad-hoc multi aio tracking to use standard QEMU AIOCB processing. Signed-off-by: Klaus Jensen --- hw/block/nvme.c | 143 +++++++++++++++++++++++++----------------------- 1 file changed, 74 insertions(+), 69 deletions(-) diff --git a/hw/block/nvme.c b/hw/block/nvme.c index 48a1abe52787..773b41527c79 100644 --- a/hw/block/nvme.c +++ b/hw/block/nvme.c @@ -1459,41 +1459,6 @@ static void nvme_rw_cb(void *opaque, int ret) nvme_enqueue_req_completion(nvme_cq(req), req); } =20 -struct nvme_aio_flush_ctx { - NvmeRequest *req; - NvmeNamespace *ns; - BlockAcctCookie acct; -}; - -static void nvme_aio_flush_cb(void *opaque, int ret) -{ - struct nvme_aio_flush_ctx *ctx =3D opaque; - NvmeRequest *req =3D ctx->req; - uintptr_t *num_flushes =3D (uintptr_t *)&req->opaque; - - BlockBackend *blk =3D ctx->ns->blkconf.blk; - BlockAcctCookie *acct =3D &ctx->acct; - BlockAcctStats *stats =3D blk_get_stats(blk); - - trace_pci_nvme_aio_flush_cb(nvme_cid(req), blk_name(blk)); - - if (!ret) { - block_acct_done(stats, acct); - } else { - block_acct_failed(stats, acct); - nvme_aio_err(req, ret); - } - - (*num_flushes)--; - g_free(ctx); - - if (*num_flushes) { - return; - } - - nvme_enqueue_req_completion(nvme_cq(req), req); -} - static void nvme_misc_cb(void *opaque, int ret) { NvmeRequest *req =3D opaque; @@ -2055,13 +2020,74 @@ static uint16_t nvme_compare(NvmeCtrl *n, NvmeReque= st *req) return NVME_NO_COMPLETE; } =20 +typedef struct NvmeFlushAIOCB { + BlockAIOCB common; + BlockAIOCB *aiocb; + NvmeRequest *req; + QEMUBH *bh; + int ret; + + int nsid; +} NvmeFlushAIOCB; + +static void nvme_flush_cancel(BlockAIOCB *acb) +{ + NvmeFlushAIOCB *iocb =3D container_of(acb, NvmeFlushAIOCB, common); + NvmeCtrl *n =3D nvme_ctrl(iocb->req); + + iocb->nsid =3D n->num_namespaces + 1; + iocb->ret =3D -ECANCELED; + + if (iocb->aiocb) { + blk_aio_cancel_async(iocb->aiocb); + iocb->aiocb =3D NULL; + } +} + +static const AIOCBInfo nvme_flush_aiocb_info =3D { + .aiocb_size =3D sizeof(NvmeFlushAIOCB), + .cancel_async =3D nvme_flush_cancel, +}; + +static void nvme_flush_bh(void *opaque) +{ + NvmeFlushAIOCB *iocb =3D opaque; + + iocb->common.cb(iocb->common.opaque, iocb->ret); + qemu_bh_delete(iocb->bh); + iocb->bh =3D NULL; + qemu_aio_unref(iocb); +} + +static void nvme_flush_aio_cb(void *opaque, int ret) +{ + NvmeFlushAIOCB *iocb =3D opaque; + NvmeRequest *req =3D iocb->req; + NvmeCtrl *n =3D nvme_ctrl(req); + + if (ret < 0) { + iocb->ret =3D ret; + goto done; + } + + while (iocb->nsid <=3D n->num_namespaces) { + NvmeNamespace *ns =3D nvme_ns(n, iocb->nsid++); + if (ns) { + iocb->aiocb =3D blk_aio_flush(ns->blkconf.blk, nvme_flush_aio_= cb, + iocb); + return; + } + } + +done: + iocb->aiocb =3D NULL; + qemu_bh_schedule(iocb->bh); +} + static uint16_t nvme_flush(NvmeCtrl *n, NvmeRequest *req) { + NvmeFlushAIOCB *iocb; uint32_t nsid =3D le32_to_cpu(req->cmd.nsid); - uintptr_t *num_flushes =3D (uintptr_t *)&req->opaque; - uint16_t status; - struct nvme_aio_flush_ctx *ctx; - NvmeNamespace *ns; =20 trace_pci_nvme_flush(nvme_cid(req), nsid); =20 @@ -2071,42 +2097,21 @@ static uint16_t nvme_flush(NvmeCtrl *n, NvmeRequest= *req) return NVME_INVALID_FIELD | NVME_DNR; } =20 - block_acct_start(blk_get_stats(req->ns->blkconf.blk), &req->acct, = 0, - BLOCK_ACCT_FLUSH); - req->aiocb =3D blk_aio_flush(req->ns->blkconf.blk, nvme_rw_cb, req= ); + req->aiocb =3D blk_aio_flush(req->ns->blkconf.blk, nvme_misc_cb, r= eq); return NVME_NO_COMPLETE; } =20 - /* 1-initialize; see comment in nvme_dsm */ - *num_flushes =3D 1; + iocb =3D qemu_aio_get(&nvme_flush_aiocb_info, NULL, nvme_misc_cb, req); =20 - for (int i =3D 1; i <=3D n->num_namespaces; i++) { - ns =3D nvme_ns(n, i); - if (!ns) { - continue; - } + iocb->req =3D req; + iocb->bh =3D qemu_bh_new(nvme_flush_bh, iocb); + iocb->ret =3D 0; + iocb->nsid =3D 1; =20 - ctx =3D g_new(struct nvme_aio_flush_ctx, 1); - ctx->req =3D req; - ctx->ns =3D ns; + nvme_flush_aio_cb(iocb, 0); + req->aiocb =3D &iocb->common; =20 - (*num_flushes)++; - - block_acct_start(blk_get_stats(ns->blkconf.blk), &ctx->acct, 0, - BLOCK_ACCT_FLUSH); - blk_aio_flush(ns->blkconf.blk, nvme_aio_flush_cb, ctx); - } - - /* account for the 1-initialization */ - (*num_flushes)--; - - if (*num_flushes) { - status =3D NVME_NO_COMPLETE; - } else { - status =3D req->status; - } - - return status; + return NVME_NO_COMPLETE; } =20 static uint16_t nvme_read(NvmeCtrl *n, NvmeRequest *req) --=20 2.30.1