From fc68da4b4dcf4471a44d839c4b996dbfb9355789 Mon Sep 17 00:00:00 2001 From: Warner Losh Date: Mon, 2 Sep 2019 17:10:46 +0000 Subject: [PATCH] Add a brief comment explaining why we can return ETIMEDOUT from the call to the polled interface. Normally this would have the potential to corrupt stack memory because the completion routines would run after we return. In this case, however, we're doing a dump so it's safe for reasons explained in the comment. --- sys/dev/nvme/nvme_ns_cmd.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sys/dev/nvme/nvme_ns_cmd.c b/sys/dev/nvme/nvme_ns_cmd.c index 5cf61b772fed..1bf92ec5e02a 100644 --- a/sys/dev/nvme/nvme_ns_cmd.c +++ b/sys/dev/nvme/nvme_ns_cmd.c @@ -191,6 +191,14 @@ nvme_ns_dump(struct nvme_namespace *ns, void *virt, off_t offset, size_t len) nvme_qpair_process_completions(req->qpair); } + /* + * Normally, when using the polling interface, we can't return a + * timeout error because we don't know when the completion routines + * will be called if the command later completes. However, in this + * case we're running a system dump, so all interrupts are turned + * off, the scheduler isn't running so there's nothing to complete + * the transaction. + */ if (status.done == FALSE) return (ETIMEDOUT);