From nobody Wed Dec 10 22:53:52 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 4dRWH50VKTz6Jq9X for ; Wed, 10 Dec 2025 22:53:53 +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 4dRWH45Scgz3PdV for ; Wed, 10 Dec 2025 22:53:52 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1765407232; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=aF6Dm5x1qmsh6fyn9b42jJRkcwYoFs1pWltadl/s10w=; b=CnGVp10Fcm/hFsQW7xCmEuH3/204jarMu/0RvehN1VJEWOm/CAOr2v9K5f4i9e4kX69zvA XEiM8cYXr1G6PyezxMrFdrsliimH/us106hQJ3p3AXjsTgfCPB1pv6CvV+5P3EhSQ3mubC 7O53KLfJe9aFQjKNS7HwJ4lZSeIXd2KWx8DnH6V3LGlzY2srMXKqmaNiSI3rp4rSV0Xaxl tRZGFsI6o9IpJ4Bq4wRoH+q8ATyhGEz4++++WT3HHvJCLnlY4EYbJS5tTvlDy/tpU+OqXz /gJzV9bXrDqhK0S3dRktETH03Y7cfqZmqbnsJV6ALqIkDSmvb5QVfx+Ioekiaw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1765407232; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=aF6Dm5x1qmsh6fyn9b42jJRkcwYoFs1pWltadl/s10w=; b=TmAukqRmv44JONr0oxqgjmNEGG6rb0ubJ3eGGwSTo7sQxGceRc51aMfSz+0hFnEntVJTmn I1nD01TaFW4hQfCT+HC6uLr2cOjP+IxNWgt30rRiT7jG7h4v8fEv70nWpu+ht9dG/ScBRa k+chahlfKQpKPGnJ3DXCVfYOWeYuiiOb6IMsA82wKaoi4woCBKSu5uoD4m6l7M7sxXsyVC tNtVjtxlOiO1zbwCs/GFRtrxN37T+CP4+IDYoJhRg3E9VYtpsIUSz+numirQ/1p8iLM7w/ vpWLofFOet5Ge8ZArZsTsKWooheP/UrTIAOO2qpF4bK8e9EhSRUCTgAouDruKw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1765407232; a=rsa-sha256; cv=none; b=WDThdP2EK+jPllY1IVUfvOTNqZSiiAzbqyGMut8MmIRLEp2BSfTbUPlC8tlzIbGWGbiHXd sXMXFEvyGmNgSO9NVKRpwFgq+l5fSX6F6Jt97+e0F4Ac6ggbW7WJU83STnI2uZinhmsNCl FE+FPs/VvLVVdcCGtYdtsDyLgpbQcibSlHTr/Xqq1HKCqfCj3Szbgb/4FF+fqEOf3Eve77 gDBuUuJzF1My8PQJ07jHxz6H6i6wUlYZTynBl3nu1wWDHGFUz8v7SJ7WGlod2lDBLdvEuj 1hYNTbXX2HDdmTlPwKsRFumQDmRZONo957M5GZd2ANWF1BuazoB+MGOyncqT3g== 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 4dRWH44dYkz14Yt for ; Wed, 10 Dec 2025 22:53:52 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id b113 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 10 Dec 2025 22:53:52 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Warner Losh Subject: git: b32470bc6621 - main - nvd: Attach as a child of nvme 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: b32470bc6621b622cac266600a670e1847bfb037 Auto-Submitted: auto-generated Date: Wed, 10 Dec 2025 22:53:52 +0000 Message-Id: <6939fa00.b113.30ed6cdb@gitrepo.freebsd.org> The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=b32470bc6621b622cac266600a670e1847bfb037 commit b32470bc6621b622cac266600a670e1847bfb037 Author: Warner Losh AuthorDate: 2025-12-10 22:52:28 +0000 Commit: Warner Losh CommitDate: 2025-12-10 22:52:28 +0000 nvd: Attach as a child of nvme Rather than registering as a consumer of the nvme controller, hook into the child device and use that. This is a small regression at the moment: we don't fail the device when that happens at runtime. Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D51385 --- sys/dev/nvd/nvd.c | 110 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 73 insertions(+), 37 deletions(-) diff --git a/sys/dev/nvd/nvd.c b/sys/dev/nvd/nvd.c index 9250fb54c234..fef3d1a1bc92 100644 --- a/sys/dev/nvd/nvd.c +++ b/sys/dev/nvd/nvd.c @@ -60,12 +60,6 @@ static disk_getattr_t nvd_getattr; static void nvd_done(void *arg, const struct nvme_completion *cpl); static void nvd_gone(struct nvd_disk *ndisk); -static void *nvd_new_disk(struct nvme_namespace *ns, void *ctrlr); -static void *nvd_ns_changed(struct nvme_namespace *ns, void *ctrlr); - -static void *nvd_new_controller(struct nvme_controller *ctrlr); -static void nvd_controller_fail(void *ctrlr); - static int nvd_load(void); static void nvd_unload(void); @@ -149,16 +143,12 @@ static int nvd_load(void) { if (!nvme_use_nvd) - return 0; + return (0); mtx_init(&nvd_lock, "nvd_lock", NULL, MTX_DEF); TAILQ_INIT(&ctrlr_head); TAILQ_INIT(&disk_head); - - consumer_handle = nvme_register_consumer(nvd_ns_changed, - nvd_new_controller, NULL, nvd_controller_fail); - - return (consumer_handle != NULL ? 0 : -1); + return (0); } static void @@ -395,30 +385,12 @@ nvd_bioq_process(void *arg, int pending) } } -static void * -nvd_new_controller(struct nvme_controller *ctrlr) -{ - struct nvd_controller *nvd_ctrlr; - - nvd_ctrlr = malloc(sizeof(struct nvd_controller), M_NVD, - M_ZERO | M_WAITOK); - - nvd_ctrlr->ctrlr = ctrlr; - TAILQ_INIT(&nvd_ctrlr->disk_head); - mtx_lock(&nvd_lock); - TAILQ_INSERT_TAIL(&ctrlr_head, nvd_ctrlr, tailq); - mtx_unlock(&nvd_lock); - - return (nvd_ctrlr); -} - -static void * -nvd_new_disk(struct nvme_namespace *ns, void *ctrlr_arg) +static void +nvd_new_disk(struct nvme_namespace *ns, struct nvd_controller *ctrlr) { uint8_t descr[NVME_MODEL_NUMBER_LENGTH+1]; struct nvd_disk *ndisk, *tnd; struct disk *disk; - struct nvd_controller *ctrlr = ctrlr_arg; device_t dev = ctrlr->ctrlr->dev; int unit; @@ -509,10 +481,9 @@ nvd_new_disk(struct nvme_namespace *ns, void *ctrlr_arg) (uintmax_t)disk->d_mediasize / (1024*1024), (uintmax_t)disk->d_mediasize / disk->d_sectorsize, disk->d_sectorsize); - - return (ndisk); } +#if 0 static void nvd_resize(struct nvd_disk *ndisk) { @@ -534,15 +505,25 @@ nvd_resize(struct nvd_disk *ndisk) (uintmax_t)disk->d_mediasize / disk->d_sectorsize, disk->d_sectorsize); } +#endif + +static int +nvdc_fail(device_t dev) +{ + return ENXIO; +} +#if 0 static void * nvd_ns_changed(struct nvme_namespace *ns, void *ctrlr_arg) { struct nvd_disk *ndisk; struct nvd_controller *ctrlr = ctrlr_arg; - if ((ns->flags & NVME_NS_DELTA) == 0) - return (nvd_new_disk(ns, ctrlr_arg)); + if ((ns->flags & NVME_NS_DELTA) == 0) { + nvd_new_disk(ns, ctrlr_arg); + return (ctrlr_arg); + } mtx_lock(&nvd_lock); TAILQ_FOREACH(ndisk, &ctrlr->disk_head, ctrlr_tailq) { @@ -568,5 +549,60 @@ nvd_controller_fail(void *ctrlr_arg) while (!TAILQ_EMPTY(&ctrlr->disk_head)) msleep(&ctrlr->disk_head, &nvd_lock, 0, "nvd_fail", 0); mtx_unlock(&nvd_lock); - free(ctrlr, M_NVD); } +#endif + +static int +nvdc_probe(device_t dev) +{ + if (!nvme_use_nvd) + return (ENXIO); + + device_set_desc(dev, "nvme storage namespace"); + return (BUS_PROBE_DEFAULT); +} + +static int +nvdc_attach(device_t dev) +{ + struct nvd_controller *nvd_ctrlr = device_get_softc(dev); + struct nvme_controller *ctrlr = device_get_ivars(dev); + + nvd_ctrlr->ctrlr = ctrlr; + TAILQ_INIT(&nvd_ctrlr->disk_head); + mtx_lock(&nvd_lock); + TAILQ_INSERT_TAIL(&ctrlr_head, nvd_ctrlr, tailq); + mtx_unlock(&nvd_lock); + + for (int i = 0; i < min(ctrlr->cdata.nn, NVME_MAX_NAMESPACES); i++) { + struct nvme_namespace *ns = &ctrlr->ns[i]; + + if (ns->data.nsze == 0) + continue; + nvd_new_disk(ns, nvd_ctrlr); + } + + return (0); +} + +static int +nvdc_detach(device_t dev) +{ + return (nvdc_fail(dev)); +} + +static device_method_t nvdc_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, nvdc_probe), + DEVMETHOD(device_attach, nvdc_attach), + DEVMETHOD(device_detach, nvdc_detach), + { 0, 0 } +}; + +static driver_t nvdc_driver = { + "nvdc", + nvdc_methods, + sizeof(struct nvd_controller), +}; + +DRIVER_MODULE(nvdc, nvme, nvdc_driver, NULL, NULL);