From nobody Tue Nov 18 21:04:50 2025 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4d9xvQ6xhXz6GY29 for ; Tue, 18 Nov 2025 21:04:50 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R12" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4d9xvQ5ZM8z3lc1 for ; Tue, 18 Nov 2025 21:04:50 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1763499890; 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; bh=FP5xQUPvDb+xHDJ7LvTgAsoYS5R0twFWuFA2Bgi988w=; b=Uo0bnF0yjVmPcfYiBquWl35awUSc2Upn78bYyENlwEgyKJD+/BAoT/3JGeRSpX/KWY1LvT ejJ94cHzEWaVE+OMYGK6/furbir43VAbMkY6k/AxUKJyGsmWhvHUAT1OWTB4I/I7GMREMY oDjX5iUE93zjJvFR6FwQD2IB8OdA/r61D+x7K0RS14Di64/DjlN3IyWc/oxPs6Bf6xpG4V WUQRe+b17mIR00osDpI2KMPRIema40DjIe+YIq6mWy14g+7wwC7vp8S04UiL50+mZkkZ+p W41efkfESHuWVW8L5x8BpRqnZQJ3vR9o0NUhAn4pRu6YCvjLr7VgWYWE0hAw6Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1763499890; 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; bh=FP5xQUPvDb+xHDJ7LvTgAsoYS5R0twFWuFA2Bgi988w=; b=Iulua25lMgGbNPs58kHpD+XIln7YNSc8ugbhgf+eRQl+/UIMQhClaa+T/zrCYdFivMEXmk mRUIYiS+sO+BaStHjMsWWl7r+XXOTyd3ynJIZCfJjj2ktOIZlP3jHxow7dbs/IvdWMfYEN 6yQveE+pARaOIs9oVYdBY/0/NhCQtwT4cMjXsLhRdgMwqMAOLliycnqoK6pH2+FsvdnbTG qvQyTk3bHgK0eZnSaKXfZcvrUEQdZxg2Fih2z0H4u0slgusXZoukVlwAJUEeh1DZqYO+z4 Ejz8P1t8+P5WuxJjNsSnwmz3RI4n/jJ47FrfAD3Tym7BxEeQ2izzi6bg2Qa5bQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1763499890; a=rsa-sha256; cv=none; b=QJyUeM4KiD2y+IPjmtlp1eInTB+aPMAnjRKzOifF4/y17AksE/0JY7vL4wxbQoOKCf/xa8 g58McBImgEE35FnJCAopeAGH5beGwjHrO1ABpR9toR8jIHWdOy7SxbplgRcwj9fjqm8cg0 c+fLZg7mRtG7PVUR/QcUEQtaE6WiTd196Q/feQyHTxsJYWCytWDrFhPbcQm+cPTiFRjEuK mQKFJet7oxtL35H+zi+LliG10AIBl4xHqkiMCZXXba4XTx9Kv51ITzp7HC82TaFuUbQsnQ xZAKWJkk72MQFUfWYYdTVz0F7Va9uOnr5xIxrhGjvNoj969rzTJFhFOw2XsNOw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4d9xvQ5B4Pz19W3 for ; Tue, 18 Nov 2025 21:04:50 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 35308 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Tue, 18 Nov 2025 21:04:50 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Cc: Wanpeng Qian From: Warner Losh Subject: git: 20e94950c54e - main - nvme: Notify namespace changes better List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: imp X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 20e94950c54e398049396647da36b9e2c3b639c1 Auto-Submitted: auto-generated Date: Tue, 18 Nov 2025 21:04:50 +0000 Message-Id: <691cdf72.35308.1c1c6fc1@gitrepo.freebsd.org> The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=20e94950c54e398049396647da36b9e2c3b639c1 commit 20e94950c54e398049396647da36b9e2c3b639c1 Author: Wanpeng Qian AuthorDate: 2025-11-18 15:24:23 +0000 Commit: Warner Losh CommitDate: 2025-11-18 20:32:22 +0000 nvme: Notify namespace changes better When we get a namespace notification, we have to reconstrut the namespace to get the new identification data from the namespace. For each namespace in the AEN, we will reconstrict it before we call the notification. We also flag it as changed for the duration of the change callback (prior versions of the patch needed to keep track, but we no longer do, so this bit may be removed). Note when we've seen the namespace so we can notify when it goes away. Co-authored-by: imp Differential Revision: https://reviews.freebsd.org/D33032 --- sys/dev/nvme/nvme.h | 7 +++++-- sys/dev/nvme/nvme_ctrlr.c | 12 +++++++++++- sys/dev/nvme/nvme_ns.c | 9 ++++++--- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/sys/dev/nvme/nvme.h b/sys/dev/nvme/nvme.h index 22421f5600ec..8f7a7fbda14c 100644 --- a/sys/dev/nvme/nvme.h +++ b/sys/dev/nvme/nvme.h @@ -1929,8 +1929,11 @@ typedef void (*nvme_cons_async_fn_t)(void *, const struct nvme_completion *, typedef void (*nvme_cons_fail_fn_t)(void *); enum nvme_namespace_flags { - NVME_NS_DEALLOCATE_SUPPORTED = 0x1, - NVME_NS_FLUSH_SUPPORTED = 0x2, + NVME_NS_DEALLOCATE_SUPPORTED = 0x01, + NVME_NS_FLUSH_SUPPORTED = 0x02, + NVME_NS_ADDED = 0x04, + NVME_NS_CHANGED = 0x08, + NVME_NS_GONE = 0x10, }; int nvme_ctrlr_passthrough_cmd(struct nvme_controller *ctrlr, diff --git a/sys/dev/nvme/nvme_ctrlr.c b/sys/dev/nvme/nvme_ctrlr.c index 34d4abd826b7..41542d24c107 100644 --- a/sys/dev/nvme/nvme_ctrlr.c +++ b/sys/dev/nvme/nvme_ctrlr.c @@ -1216,10 +1216,20 @@ nvme_ctrlr_aer_task(void *arg, int pending) } else if (aer->log_page_id == NVME_LOG_CHANGED_NAMESPACE) { struct nvme_ns_list *nsl = (struct nvme_ns_list *)aer->log_page_buffer; + struct nvme_controller *ctrlr = aer->ctrlr; + for (int i = 0; i < nitems(nsl->ns) && nsl->ns[i] != 0; i++) { + struct nvme_namespace *ns; + uint32_t id = nsl->ns[i]; + if (nsl->ns[i] > NVME_MAX_NAMESPACES) break; - nvme_notify_ns(aer->ctrlr, nsl->ns[i]); + + ns = &ctrlr->ns[id - 1]; + ns->flags |= NVME_NS_CHANGED; + nvme_ns_construct(ns, id, ctrlr); + nvme_notify_ns(ctrlr, id); + ns->flags &= ~NVME_NS_CHANGED; } } diff --git a/sys/dev/nvme/nvme_ns.c b/sys/dev/nvme/nvme_ns.c index f238fa552350..4ebcc03c4f04 100644 --- a/sys/dev/nvme/nvme_ns.c +++ b/sys/dev/nvme/nvme_ns.c @@ -78,7 +78,7 @@ nvme_ns_ioctl(struct cdev *cdev, u_long cmd, caddr_t arg, int flag, break; case NVME_PASSTHROUGH_CMD: pt = (struct nvme_pt_command *)arg; - return (nvme_ctrlr_passthrough_cmd(ctrlr, pt, ns->id, + return (nvme_ctrlr_passthrough_cmd(ctrlr, pt, ns->id, 1 /* is_user_buffer */, 0 /* is_admin_cmd */)); case NVME_GET_NSID: { @@ -558,8 +558,10 @@ nvme_ns_construct(struct nvme_namespace *ns, uint32_t id, * standard says the entire id will be zeros, so this is a * cheap way to test for that. */ - if (ns->data.nsze == 0) - return (ENXIO); + if (ns->data.nsze == 0) { + ns->flags |= NVME_NS_GONE; + return ((ns->flags & NVME_NS_ADDED) ? 0 : ENXIO); + } flbas_fmt = NVMEV(NVME_NS_DATA_FLBAS_FORMAT, ns->data.flbas); @@ -623,6 +625,7 @@ nvme_ns_construct(struct nvme_namespace *ns, uint32_t id, ns->cdev->si_drv2 = make_dev_alias(ns->cdev, "%sns%d", device_get_nameunit(ctrlr->dev), ns->id); ns->cdev->si_flags |= SI_UNMAPPED; + ns->flags |= NVME_NS_ADDED; return (0); }