From nobody Mon Feb 9 16:18:40 2026 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=1615209086; cv=none; d=zohomail.com; s=zohoarc; b=VpUHSuXoHnaQQBY5x5k50R2o1D8nNEFrvCZGjTTKhrGuPEO5QHxWqyclHx7mWamyp0O221ZovCNkJp/sYVu9Xt2VdMXPNEeAa3/AODepHsiFAcINH20tfPYSO689i4NGCLTy/FszNMDyil8kC8ITe2scoHgNJu+Ga2997MV+zH4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1615209086; 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=i/n9370AOIpR/+xkc4ISrFLYa4PWa4WVUCvoki9JL1E=; b=Mscr+dwQGCzyTwt4d2gkODoRWosebfmWWv4zkaUoqp5SO9bmrFAI6sZ+RULcavUlrhExWcZS/kQvOMVijerpmCsM4tRnrL8fPawcvm8NYuk2iLwo4nNmtLmZK6Z7w4EQojBS2xGiTrLXWTelf+BVOOT1k7z4ANcOAfdE/SUd//Q= 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 1615209086407305.39911316813857; Mon, 8 Mar 2021 05:11:26 -0800 (PST) Received: from localhost ([::1]:47922 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lJFfR-0006KN-Ab for importer@patchew.org; Mon, 08 Mar 2021 08:11:25 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:36572) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJEwL-000406-0C; Mon, 08 Mar 2021 07:24:49 -0500 Received: from wnew4-smtp.messagingengine.com ([64.147.123.18]:36423) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lJEwI-0007Fn-DS; Mon, 08 Mar 2021 07:24:48 -0500 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailnew.west.internal (Postfix) with ESMTP id AEE9136D0; Mon, 8 Mar 2021 07:24:14 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute4.internal (MEProxy); Mon, 08 Mar 2021 07:24:15 -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 CE2A41080064; Mon, 8 Mar 2021 07:24:12 -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=i/n9370AOIpR/ +xkc4ISrFLYa4PWa4WVUCvoki9JL1E=; b=GudtiS+Fk5ALL1YXcjcu6k2QG0HI6 F7U2eVjhfhcaxJIivaaXtnN2mOoa83x7jOlOzi8DRLoGYdZ+M/Z07oNoSoGHloP7 1L0sS5Sgg0mh0fD59/p/LJ5r9Ixsjzq82Ike4+X6WHFmvMmfDkZCJah7eC3xjtRl 5OlcZvst+njPfLDA2lnrU4Gchp7PK1Tx/hrbQPcICkgC5KlKLon0tVJhrJxttxDr RWKGgHzwX/Daa21FKUeUqdxoOIe6AKLlfU45DE5rLZS9szuCRupbkYmHsq7wihVX AQGDG/pjTgDDFk4ORoZbgeCffONONStyP0YK6pdwLKyMONbfSDeXCC8Yw== 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=i/n9370AOIpR/+xkc4ISrFLYa4PWa4WVUCvoki9JL1E=; b=V2kxi0tS NbrUU1h8a677pErsFVo/JvRO84OSMh1l9oV5JQ0aegsDG4b0iYZ6Qo9ybotsK7sh cBj4jM0hGg3tqJBCsURCE5qqRxZcFdtw7UXt2mK10wq9DmyXoIuOQpJ1Gcr8m469 FM0bUkcbh92ctl2ba83u4vURxkMJCGJUMjWeo8WREz6WdrF7Rr3kgg/zexWnwm2D wPeWZsiQVLIcyd9apTbxHCyq7yIWMnjBzdm6646QVxgmqON2DNESMkhKypBXv9C9 Fa8OxOAcAlG7s2hK1XrRZa5V90kYDLqaHZsol3SS1txbQNj1kUD/GuLc04p4kAtM UNynRt++iMmsnQ== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledrudduvddgfedtucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpefmlhgruhhs ucflvghnshgvnhcuoehithhssehirhhrvghlvghvrghnthdrughkqeenucggtffrrghtth gvrhhnpeeuleetgeeiuefhgfekfefgveejiefgteekiedtgfdtieefhfdthfefueffvefg keenucfkphepkedtrdduieejrdelkedrudeltdenucevlhhushhtvghrufhiiigvpeefud enucfrrghrrghmpehmrghilhhfrhhomhepihhtshesihhrrhgvlhgvvhgrnhhtrdgukh X-ME-Proxy: From: Klaus Jensen To: Peter Maydell , qemu-devel@nongnu.org Subject: [PULL 37/38] hw/block/nvme: support changed namespace asynchronous event Date: Mon, 8 Mar 2021 13:23:12 +0100 Message-Id: <20210308122313.286938-38-its@irrelevant.dk> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210308122313.286938-1-its@irrelevant.dk> References: <20210308122313.286938-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=64.147.123.18; envelope-from=its@irrelevant.dk; helo=wnew4-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, 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: Fam Zheng , Kevin Wolf , qemu-block@nongnu.org, Klaus Jensen , Max Reitz , Keith Busch , Minwoo Im , Stefan Hajnoczi , Klaus Jensen Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Minwoo Im If namespace inventory is changed due to some reasons (e.g., namespace attachment/detachment), controller can send out event notifier to the host to manage namespaces. This patch sends out the AEN to the host after either attach or detach namespaces from controllers. To support clear of the event from the controller, this patch also implemented Get Log Page command for Changed Namespace List log type. To return namespace id list through the command, when namespace inventory is updated, id is added to the per-controller list (changed_ns_list). To indicate the support of this async event, this patch set OAES(Optional Asynchronous Events Supported) in Identify Controller data structure. Signed-off-by: Minwoo Im Reviewed-by: Keith Busch Reviewed-by: Klaus Jensen Tested-by: Klaus Jensen Signed-off-by: Klaus Jensen --- hw/block/nvme-ns.h | 1 + hw/block/nvme.h | 4 ++++ include/block/nvme.h | 7 ++++++ hw/block/nvme.c | 56 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 68 insertions(+) diff --git a/hw/block/nvme-ns.h b/hw/block/nvme-ns.h index b0c00e115d81..318d3aebe1a8 100644 --- a/hw/block/nvme-ns.h +++ b/hw/block/nvme-ns.h @@ -53,6 +53,7 @@ typedef struct NvmeNamespace { uint8_t csi; =20 NvmeSubsystem *subsys; + QTAILQ_ENTRY(NvmeNamespace) entry; =20 NvmeIdNsZoned *id_ns_zoned; NvmeZone *zone_array; diff --git a/hw/block/nvme.h b/hw/block/nvme.h index 1287bc2cd17a..4955d649c7d4 100644 --- a/hw/block/nvme.h +++ b/hw/block/nvme.h @@ -192,6 +192,10 @@ typedef struct NvmeCtrl { =20 uint32_t dmrsl; =20 + /* Namespace ID is started with 1 so bitmap should be 1-based */ +#define NVME_CHANGED_NSID_SIZE (NVME_MAX_NAMESPACES + 1) + DECLARE_BITMAP(changed_nsids, NVME_CHANGED_NSID_SIZE); + NvmeSubsystem *subsys; =20 NvmeNamespace namespace; diff --git a/include/block/nvme.h b/include/block/nvme.h index 03471a4d5abd..7ee887022aef 100644 --- a/include/block/nvme.h +++ b/include/block/nvme.h @@ -760,6 +760,7 @@ typedef struct QEMU_PACKED NvmeCopySourceRange { enum NvmeAsyncEventRequest { NVME_AER_TYPE_ERROR =3D 0, NVME_AER_TYPE_SMART =3D 1, + NVME_AER_TYPE_NOTICE =3D 2, NVME_AER_TYPE_IO_SPECIFIC =3D 6, NVME_AER_TYPE_VENDOR_SPECIFIC =3D 7, NVME_AER_INFO_ERR_INVALID_DB_REGISTER =3D 0, @@ -771,6 +772,7 @@ enum NvmeAsyncEventRequest { NVME_AER_INFO_SMART_RELIABILITY =3D 0, NVME_AER_INFO_SMART_TEMP_THRESH =3D 1, NVME_AER_INFO_SMART_SPARE_THRESH =3D 2, + NVME_AER_INFO_NOTICE_NS_ATTR_CHANGED =3D 0, }; =20 typedef struct QEMU_PACKED NvmeAerResult { @@ -940,6 +942,7 @@ enum NvmeLogIdentifier { NVME_LOG_ERROR_INFO =3D 0x01, NVME_LOG_SMART_INFO =3D 0x02, NVME_LOG_FW_SLOT_INFO =3D 0x03, + NVME_LOG_CHANGED_NSLIST =3D 0x04, NVME_LOG_CMD_EFFECTS =3D 0x05, }; =20 @@ -1056,6 +1059,10 @@ typedef struct NvmeIdCtrlNvm { uint8_t rsvd16[4080]; } NvmeIdCtrlNvm; =20 +enum NvmeIdCtrlOaes { + NVME_OAES_NS_ATTR =3D 1 << 8, +}; + enum NvmeIdCtrlOacs { NVME_OACS_SECURITY =3D 1 << 0, NVME_OACS_FORMAT =3D 1 << 1, diff --git a/hw/block/nvme.c b/hw/block/nvme.c index fc38c3e4629d..159cd0ca867b 100644 --- a/hw/block/nvme.c +++ b/hw/block/nvme.c @@ -3006,6 +3006,48 @@ static uint16_t nvme_error_info(NvmeCtrl *n, uint8_t= rae, uint32_t buf_len, return nvme_c2h(n, (uint8_t *)&errlog, trans_len, req); } =20 +static uint16_t nvme_changed_nslist(NvmeCtrl *n, uint8_t rae, uint32_t buf= _len, + uint64_t off, NvmeRequest *req) +{ + uint32_t nslist[1024]; + uint32_t trans_len; + int i =3D 0; + uint32_t nsid; + + memset(nslist, 0x0, sizeof(nslist)); + trans_len =3D MIN(sizeof(nslist) - off, buf_len); + + while ((nsid =3D find_first_bit(n->changed_nsids, NVME_CHANGED_NSID_SI= ZE)) !=3D + NVME_CHANGED_NSID_SIZE) { + /* + * If more than 1024 namespaces, the first entry in the log page s= hould + * be set to 0xffffffff and the others to 0 as spec. + */ + if (i =3D=3D ARRAY_SIZE(nslist)) { + memset(nslist, 0x0, sizeof(nslist)); + nslist[0] =3D 0xffffffff; + break; + } + + nslist[i++] =3D nsid; + clear_bit(nsid, n->changed_nsids); + } + + /* + * Remove all the remaining list entries in case returns directly due = to + * more than 1024 namespaces. + */ + if (nslist[0] =3D=3D 0xffffffff) { + bitmap_zero(n->changed_nsids, NVME_CHANGED_NSID_SIZE); + } + + if (!rae) { + nvme_clear_events(n, NVME_AER_TYPE_NOTICE); + } + + return nvme_c2h(n, ((uint8_t *)nslist) + off, trans_len, req); +} + static uint16_t nvme_cmd_effects(NvmeCtrl *n, uint8_t csi, uint32_t buf_le= n, uint64_t off, NvmeRequest *req) { @@ -3089,6 +3131,8 @@ static uint16_t nvme_get_log(NvmeCtrl *n, NvmeRequest= *req) return nvme_smart_info(n, rae, len, off, req); case NVME_LOG_FW_SLOT_INFO: return nvme_fw_log_info(n, len, off, req); + case NVME_LOG_CHANGED_NSLIST: + return nvme_changed_nslist(n, rae, len, off, req); case NVME_LOG_CMD_EFFECTS: return nvme_cmd_effects(n, csi, len, off, req); default: @@ -3947,6 +3991,16 @@ static uint16_t nvme_ns_attachment(NvmeCtrl *n, Nvme= Request *req) =20 nvme_ns_detach(ctrl, ns); } + + /* + * Add namespace id to the changed namespace id list for event cle= aring + * via Get Log Page command. + */ + if (!test_and_set_bit(nsid, ctrl->changed_nsids)) { + nvme_enqueue_event(ctrl, NVME_AER_TYPE_NOTICE, + NVME_AER_INFO_NOTICE_NS_ATTR_CHANGED, + NVME_LOG_CHANGED_NSLIST); + } } =20 return NVME_SUCCESS; @@ -4945,6 +4999,8 @@ static void nvme_init_ctrl(NvmeCtrl *n, PCIDevice *pc= i_dev) =20 id->cntlid =3D cpu_to_le16(n->cntlid); =20 + id->oaes =3D cpu_to_le32(NVME_OAES_NS_ATTR); + id->rab =3D 6; =20 if (n->params.use_intel_id) { --=20 2.30.1