Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 10 Dec 2025 22:53:52 +0000
From:      Warner Losh <imp@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: b32470bc6621 - main - nvd: Attach as a child of nvme
Message-ID:  <6939fa00.b113.30ed6cdb@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help

The branch main has been updated by imp:

URL: https://cgit.FreeBSD.org/src/commit/?id=b32470bc6621b622cac266600a670e1847bfb037

commit b32470bc6621b622cac266600a670e1847bfb037
Author:     Warner Losh <imp@FreeBSD.org>
AuthorDate: 2025-12-10 22:52:28 +0000
Commit:     Warner Losh <imp@FreeBSD.org>
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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6939fa00.b113.30ed6cdb>