7w5tC3TowsxqRQaApbVj2uoaIABpVX uQJ6d89LW1B6kLJgLXesEf2zDDbQV+Y2l1JT0rpjrfgmkHm4TP69js4TgdHhY52NFo6bJy N1XoKvmoaSkOynjzANAY8TCyUaUUiRkzHGXpMMEnTNVNvQpkVhc8VeMeogxBGpOISv/TDm o069hd9O6++7ahgXb6YccZNdsGEcfP7TUOuC2UleJuVkD/Nd+7SXyRun876y0A== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1765407236; a=rsa-sha256; cv=none; b=Ff1uLjpccReaW0trf7zbfWBFpGUk7Q19Fsdm1ZOM+ryG+PUqM8APUKZUeCrE/04t2o4QTE JXZgtTbfy3cHCOxMN2ba6ueiBEzseiA33RbPymlHJJ8r4AZdhHlk2QnyW4AuoWTH5/d+66 gT+wR7c1GF4E5XZoZFBXIe2KsGfMd/o37q6kEVdas5pxcomAsIuvhE8EqDZZvWOxbbujkr ZxN3JDrrxq8FqoLMkNqTpZ64Douq1gPOXJV/RPkaon9uWy9N+KidHQqL8qdGLWNxTjAp6z tzxEKqBOCKbCEDWksvJynQz62LTr/tLHQV50jfawhPP4hDJXfw6M8tZrXnm7IA== 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 4dRWH76vbPz14s3 for ; Wed, 10 Dec 2025 22:53:55 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id a57e by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 10 Dec 2025 22:53:55 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Warner Losh Subject: git: 9b170dc457a4 - main - nvme: Use new method to do async notifications 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: 9b170dc457a46d3ec3b329116fcd6851fe9b63a0 Auto-Submitted: auto-generated Date: Wed, 10 Dec 2025 22:53:55 +0000 Message-Id: <6939fa03.a57e.2d3336d8@gitrepo.freebsd.org> The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=9b170dc457a46d3ec3b329116fcd6851fe9b63a0 commit 9b170dc457a46d3ec3b329116fcd6851fe9b63a0 Author: Warner Losh AuthorDate: 2025-12-10 22:52:45 +0000 Commit: Warner Losh CommitDate: 2025-12-10 22:52:45 +0000 nvme: Use new method to do async notifications Nothing uses these at the moment, but it would be useful to use in the future so convert this functionality to an newbus function dispatch. Sponsored by: Netflix Reviewed by: dab Differential Revision: https://reviews.freebsd.org/D51390 --- sys/dev/nvme/nvme.c | 29 ++++++++++++++--------------- sys/dev/nvme/nvme_ctrlr.c | 11 +++++------ sys/dev/nvme/nvme_private.h | 8 ++++---- 3 files changed, 23 insertions(+), 25 deletions(-) diff --git a/sys/dev/nvme/nvme.c b/sys/dev/nvme/nvme.c index 3ff64c781884..dcd0851dd56a 100644 --- a/sys/dev/nvme/nvme.c +++ b/sys/dev/nvme/nvme.c @@ -34,6 +34,7 @@ #include #include "nvme_private.h" +#include "nvme_if.h" struct nvme_consumer { uint32_t id; @@ -189,23 +190,21 @@ nvme_notify_new_consumer(struct nvme_consumer *cons) } void -nvme_notify_async_consumers(struct nvme_controller *ctrlr, - const struct nvme_completion *async_cpl, - uint32_t log_page_id, void *log_page_buffer, - uint32_t log_page_size) +nvme_notify_async(struct nvme_controller *ctrlr, + const struct nvme_completion *async_cpl, + uint32_t log_page_id, void *log_page_buffer, uint32_t log_page_size) { - struct nvme_consumer *cons; - void *ctrlr_cookie; - uint32_t i; + device_t *children; + int n_children; - for (i = 0; i < NVME_MAX_CONSUMERS; i++) { - cons = &nvme_consumer[i]; - if (cons->id != INVALID_CONSUMER_ID && cons->async_fn != NULL && - (ctrlr_cookie = ctrlr->cons_cookie[i]) != NULL) { - (*cons->async_fn)(ctrlr_cookie, async_cpl, - log_page_id, log_page_buffer, log_page_size); - } - } + if (device_get_children(ctrlr->dev, &children, &n_children) != 0) + return; + + for (int i = 0; i < n_children; i++) + NVME_HANDLE_AEN(children[i], async_cpl, log_page_id, + log_page_buffer, log_page_size); + + free(children, M_TEMP); } void diff --git a/sys/dev/nvme/nvme_ctrlr.c b/sys/dev/nvme/nvme_ctrlr.c index 7a449fdc4727..2f28d8f5cb7f 100644 --- a/sys/dev/nvme/nvme_ctrlr.c +++ b/sys/dev/nvme/nvme_ctrlr.c @@ -1154,8 +1154,7 @@ nvme_ctrlr_aer_task(void *arg, int pending) * Repost another asynchronous event request to replace the one * that just completed. */ - nvme_notify_async_consumers(ctrlr, &aer->cpl, aer->log_page_id, - NULL, 0); + nvme_notify_async(ctrlr, &aer->cpl, aer->log_page_id, NULL, 0); nvme_ctrlr_construct_and_submit_aer(ctrlr, aer); goto out; } @@ -1180,8 +1179,8 @@ nvme_ctrlr_aer_task(void *arg, int pending) * error, don't pass log page data to the consumers. In * practice, this case should never happen. */ - nvme_notify_async_consumers(aer->ctrlr, &aer->cpl, - aer->log_page_id, NULL, 0); + nvme_notify_async(aer->ctrlr, &aer->cpl, aer->log_page_id, + NULL, 0); goto out; } @@ -1261,8 +1260,8 @@ nvme_ctrlr_aer_task(void *arg, int pending) * Pass the cpl data from the original async event completion, not the * log page fetch. */ - nvme_notify_async_consumers(aer->ctrlr, &aer->cpl, - aer->log_page_id, aer->log_page_buffer, aer->log_page_size); + nvme_notify_async(aer->ctrlr, &aer->cpl, aer->log_page_id, + aer->log_page_buffer, aer->log_page_size); /* * Repost another asynchronous event request to replace the one diff --git a/sys/dev/nvme/nvme_private.h b/sys/dev/nvme/nvme_private.h index cd0ef444150f..27d70d120307 100644 --- a/sys/dev/nvme/nvme_private.h +++ b/sys/dev/nvme/nvme_private.h @@ -556,10 +556,10 @@ nvme_allocate_request_ccb(union ccb *ccb, const int how, nvme_cb_fn_t cb_fn, #define nvme_free_request(req) free(req, M_NVME) -void nvme_notify_async_consumers(struct nvme_controller *ctrlr, - const struct nvme_completion *async_cpl, - uint32_t log_page_id, void *log_page_buffer, - uint32_t log_page_size); +void nvme_notify_async(struct nvme_controller *ctrlr, + const struct nvme_completion *async_cpl, + uint32_t log_page_id, void *log_page_buffer, + uint32_t log_page_size); void nvme_notify_fail_consumers(struct nvme_controller *ctrlr); void nvme_ctrlr_shared_handler(void *arg);