From nobody Wed Nov 19 21:44:35 2025 X-Original-To: dev-commits-src-branches@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 4dBZkq3fwCz6JJtS for ; Wed, 19 Nov 2025 21:44:35 +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 4dBZkq0nWJz3CDj for ; Wed, 19 Nov 2025 21:44:35 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1763588675; 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=28G6CgAWeYeqpl5NaOKQ9kGAVHNK7ftmXb5Nhk5+t8I=; b=IIGcXnLfGn9g64XHFuDS8lJhXtNWOOSPhC/C6Qwk0l6ZDr4imIk84tvKAuaepwpr9Zv4EO aX0TtJWWNim2l+8FV58vpBuqcM84M73W3Zq3d2Cfp2cFYJFqWZK2Fx6521jgzEghXE2MO0 VgNz0VY+0ct5mmdfj/24/l2qd5s1QbZ2BUBb69+BQ61sJT6dDe+H2J1ItiqUPZX75bduyf cS49DLpNKwHxTPThVXNkpz+8oXzvS85Fk+eF+5LOXDX8hymMnBQWRuqWM0UzsNHzXIv4eD RJqlO7yamijTqU0Fp1i6SbAo7Q1VH3R0ZoZaJlveAictNN1YIGjS7HobmhYS+g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1763588675; 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=28G6CgAWeYeqpl5NaOKQ9kGAVHNK7ftmXb5Nhk5+t8I=; b=Fp2wUw8VO5r4v0dgC9j2YkckpPPN+A0HLmHBmXxl7V05gyL66qBCL+a6WPLtfSXeY4OCAD VxeYvs+TayX2PJ9ZnbSy8l+usTynwCZaAgf2sgKDl2Vy5m+f1cv6/AzZ0iyqptZ8Ucb48B R/kmGG/rLWkot1Gbx1o+rfqr3NiTWKLSMjjUwOviqjd2IYpUGh9JCvRmx7opVtqcaFkpsm kEGsudnHK1iWK/fJXQ7ZY1ZkcCYkYEAj8fOoR5nnGAw/8EMYZHtbG7fCpy/UazkWE7VG4N r5NHWF8b13p15Q5SbFQE00QCDB5f3EMTCjYsZ6EzR0GnnCFkjamtn/GXRk3q7w== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1763588675; a=rsa-sha256; cv=none; b=i1v9z1Av6Wg1z2zmAWEqthWQQvLPr6BQSOZg7Tc5nbhl0zRmh7gzi5uTavELIZvzKzaY9B 3DqhnYYW7cveNC76dnyLd5QAgGPFSGlxBhIAJf6+1IUYFtYILrGruAC5rnjQhUxhjjB7v3 2EAyXeQkacG5yNmnOBcUogBWkqZD4ErilXuCqViFIrW/EF7RbnV0XrMRP2++wS9L7gKX6o uifj/8P8rROgKiTMf6SKucvMSbV2vc83RWe3zS1/pRh7EA5LGwEWmMU09h7h8n3p6zhLcN 9NO4a/0NRc//beHdHnvr/BWdPMk0z605c6qbPMYXWgBuwu+E+5NnzORTZj0hkA== 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 4dBZkq0HX9zxyb for ; Wed, 19 Nov 2025 21:44:35 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 33e5c by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 19 Nov 2025 21:44:35 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Cc: Wanpeng Qian From: Colin Percival Subject: git: 2c5edd4860b2 - releng/15.0 - nvme: Notify namespace changes better List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: cperciva X-Git-Repository: src X-Git-Refname: refs/heads/releng/15.0 X-Git-Reftype: branch X-Git-Commit: 2c5edd4860b2a1912f987557dfa09bae3c322d36 Auto-Submitted: auto-generated Date: Wed, 19 Nov 2025 21:44:35 +0000 Message-Id: <691e3a43.33e5c.30af149a@gitrepo.freebsd.org> The branch releng/15.0 has been updated by cperciva: URL: https://cgit.FreeBSD.org/src/commit/?id=2c5edd4860b2a1912f987557dfa09bae3c322d36 commit 2c5edd4860b2a1912f987557dfa09bae3c322d36 Author: Wanpeng Qian AuthorDate: 2025-11-18 15:24:23 +0000 Commit: Colin Percival CommitDate: 2025-11-19 21:37:09 +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. Approved by: re (cperciva) Co-authored-by: imp Differential Revision: https://reviews.freebsd.org/D33032 (cherry picked from commit 20e94950c54e398049396647da36b9e2c3b639c1) (cherry picked from commit fe6ee00d174e0d7f4c7a38db9af7b94c56579054) --- 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 17c5cdb4db87..8e69c0ffe339 100644 --- a/sys/dev/nvme/nvme.h +++ b/sys/dev/nvme/nvme.h @@ -1930,8 +1930,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 07c1bcdfbf08..63b8643d97d7 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 e84d2066930e..21d7965bf7a6 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: { @@ -557,8 +557,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); @@ -622,6 +624,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); }