Re: [PATCH v5] nvme: Skip trace complete_rq on host path error

Keith Busch
2026-03-26T14:28:54Z

On Thu, Mar 26, 2026 at 03:51:52PM +0900, 전민식 wrote:
> {
> struct nvme_ctrl *ctrl = nvme_req(req)->ctrl;
>
> - trace_nvme_complete_rq(req);
> + /*
> + * The idea for these trace events was to match up commands
> + * dispatched to hardware with the hardware's posted response.
> + * So skip tracing for undispatched commands.
> + */
> + if (nvme_req(req)->status != NVME_SC_HOST_PATH_ERROR)
> + trace_nvme_complete_rq(req);
> +

Well, how do we know a controller doesnn't actually return that status
code? I was just suggesting to skip the trace for the condition we never
dispatched the command. An added bonus is we don't need a mostly
unnecessary 'if' check on every IO.

---
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index f5ebcaa2f859c..0dcccdca2965e 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -454,11 +454,10 @@ void nvme_end_req(struct request *req)
blk_mq_end_request(req, status);
}

-void nvme_complete_rq(struct request *req)
+static void __nvme_complete_rq(struct request *req)
{
struct nvme_ctrl *ctrl = nvme_req(req)->ctrl;

- trace_nvme_complete_rq(req);
nvme_cleanup_cmd(req);

/*
@@ -493,6 +492,12 @@ void nvme_complete_rq(struct request *req)
return;
}
}
+
+void nvme_complete_rq(struct request *req)
+{
+ trace_nvme_complete_rq(req);
+ __nvme_complete_rq(req);
+}
EXPORT_SYMBOL_GPL(nvme_complete_rq);

void nvme_complete_batch_req(struct request *req)
@@ -513,7 +518,7 @@ blk_status_t nvme_host_path_error(struct request *req)
{
nvme_req(req)->status = NVME_SC_HOST_PATH_ERROR;
blk_mq_set_request_complete(req);
- nvme_complete_rq(req);
+ __nvme_complete_rq(req);
return BLK_STS_OK;
}
EXPORT_SYMBOL_GPL(nvme_host_path_error);
--