From 54f16039543517f2c8e484166aedf7ad92bc0a6c Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Thu, 11 Aug 2022 00:04:56 +0000 Subject: [PATCH] bdev/nvme: add tracepoint support This will allow us to map spdk_bdev_io events to nvme_request events coming in a future patch. Since we pass the nvme_bdev_io to the nvme driver (not the spdk_bdev_io), we need to add tracepoints for the nvme_bdev_io so that spdk_trace can do the spdk_bdev_io->nvme_bdev_io->nvme_request mapping. An alternative would have been to pass the spdk_bdev_io as the cb_arg to the nvme driver, but that change seemed to invasive, and I think we will find other uses for the nvme_bdev_io events anyways. Signed-off-by: Jim Harris Change-Id: Id7519e689b01875093359f41a1ca2af912061a8b Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13994 Tested-by: SPDK CI Jenkins Reviewed-by: Aleksey Marchuk Reviewed-by: Jacek Kalwas Reviewed-by: Tomasz Zawadzki --- include/spdk_internal/trace_defs.h | 6 ++++++ lib/bdev/bdev.c | 2 ++ mk/spdk.lib_deps.mk | 2 +- module/bdev/nvme/bdev_nvme.c | 25 +++++++++++++++++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/include/spdk_internal/trace_defs.h b/include/spdk_internal/trace_defs.h index 5321593d4..b1e547cae 100644 --- a/include/spdk_internal/trace_defs.h +++ b/include/spdk_internal/trace_defs.h @@ -21,6 +21,7 @@ #define OBJECT_BDEV_IO 0x2 #define OBJECT_NVME_PCIE_REQ 0x3 #define OBJECT_NVME_TCP_REQ 0x4 +#define OBJECT_BDEV_NVME_IO 0x5 #define OBJECT_SCSI_TASK 0x10 #define OBJECT_NVMF_RDMA_IO 0x40 #define OBJECT_NVMF_TCP_IO 0x80 @@ -40,6 +41,7 @@ #define TRACE_GROUP_NVME_PCIE 0xB #define TRACE_GROUP_ACCEL_IAA 0xC #define TRACE_GROUP_NVME_TCP 0xD +#define TRACE_GROUP_BDEV_NVME 0xE /* Bdev tracepoint definitions */ #define TRACE_BDEV_IO_START SPDK_TPOINT_ID(TRACE_GROUP_BDEV, 0x0) @@ -151,4 +153,8 @@ #define TRACE_NVME_TCP_SUBMIT SPDK_TPOINT_ID(TRACE_GROUP_NVME_TCP, 0x0) #define TRACE_NVME_TCP_COMPLETE SPDK_TPOINT_ID(TRACE_GROUP_NVME_TCP, 0x1) +/* Bdev nvme tracepoint definitions */ +#define TRACE_BDEV_NVME_IO_START SPDK_TPOINT_ID(TRACE_GROUP_BDEV_NVME, 0x0) +#define TRACE_BDEV_NVME_IO_DONE SPDK_TPOINT_ID(TRACE_GROUP_BDEV_NVME, 0x1) + #endif /* SPDK_INTERNAL_TRACE_DEFS */ diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index 1848bd161..4955e9354 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -7768,4 +7768,6 @@ SPDK_TRACE_REGISTER_FN(bdev_trace, "bdev", TRACE_GROUP_BDEV) spdk_trace_register_owner(OWNER_BDEV, 'b'); spdk_trace_register_object(OBJECT_BDEV_IO, 'i'); spdk_trace_register_description_ext(opts, SPDK_COUNTOF(opts)); + spdk_trace_tpoint_register_relation(TRACE_BDEV_NVME_IO_START, OBJECT_BDEV_IO, 0); + spdk_trace_tpoint_register_relation(TRACE_BDEV_NVME_IO_DONE, OBJECT_BDEV_IO, 0); } diff --git a/mk/spdk.lib_deps.mk b/mk/spdk.lib_deps.mk index a3397399c..aa2960b0a 100644 --- a/mk/spdk.lib_deps.mk +++ b/mk/spdk.lib_deps.mk @@ -126,7 +126,7 @@ DEPDIRS-bdev_delay := $(BDEV_DEPS_THREAD) DEPDIRS-bdev_iscsi := $(BDEV_DEPS_THREAD) DEPDIRS-bdev_malloc := $(BDEV_DEPS_THREAD) accel DEPDIRS-bdev_null := $(BDEV_DEPS_THREAD) -DEPDIRS-bdev_nvme = $(BDEV_DEPS_THREAD) accel nvme +DEPDIRS-bdev_nvme = $(BDEV_DEPS_THREAD) accel nvme trace DEPDIRS-bdev_ocf := $(BDEV_DEPS_THREAD) DEPDIRS-bdev_passthru := $(BDEV_DEPS_THREAD) DEPDIRS-bdev_pmem := $(BDEV_DEPS_THREAD) diff --git a/module/bdev/nvme/bdev_nvme.c b/module/bdev/nvme/bdev_nvme.c index 7e9083d63..27d83bc18 100644 --- a/module/bdev/nvme/bdev_nvme.c +++ b/module/bdev/nvme/bdev_nvme.c @@ -19,6 +19,7 @@ #include "spdk/nvme_zns.h" #include "spdk/opal.h" #include "spdk/thread.h" +#include "spdk/trace.h" #include "spdk/string.h" #include "spdk/util.h" @@ -26,6 +27,7 @@ #include "spdk/log.h" #include "spdk_internal/usdt.h" +#include "spdk_internal/trace_defs.h" #define SPDK_BDEV_NVME_DEFAULT_DELAY_CMD_SUBMIT true #define SPDK_BDEV_NVME_DEFAULT_KEEP_ALIVE_TIMEOUT_IN_MS (10000) @@ -664,6 +666,8 @@ static inline void __bdev_nvme_io_complete(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_status status, const struct spdk_nvme_cpl *cpl) { + spdk_trace_record(TRACE_BDEV_NVME_IO_DONE, 0, 0, (uintptr_t)bdev_io->driver_ctx, + (uintptr_t)bdev_io); if (cpl) { spdk_bdev_io_complete_nvme_status(bdev_io, cpl->cdw0, cpl->status.sct, cpl->status.sc); } else { @@ -2092,6 +2096,7 @@ bdev_nvme_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_i struct nvme_bdev_io *nbdev_io_to_abort; int rc = 0; + spdk_trace_record(TRACE_BDEV_NVME_IO_START, 0, 0, (uintptr_t)nbdev_io, (uintptr_t)bdev_io); nbdev_io->io_path = bdev_nvme_find_io_path(nbdev_ch); if (spdk_unlikely(!nbdev_io->io_path)) { if (!bdev_nvme_io_type_is_admin(bdev_io->type)) { @@ -6757,3 +6762,23 @@ bdev_nvme_get_discovery_info(struct spdk_json_write_ctx *w) } SPDK_LOG_REGISTER_COMPONENT(bdev_nvme) + +SPDK_TRACE_REGISTER_FN(bdev_nvme_trace, "bdev_nvme", TRACE_GROUP_BDEV_NVME) +{ + struct spdk_trace_tpoint_opts opts[] = { + { + "BDEV_NVME_IO_START", TRACE_BDEV_NVME_IO_START, + OWNER_NONE, OBJECT_BDEV_NVME_IO, 1, + {{ "ctx", SPDK_TRACE_ARG_TYPE_PTR, 8 }} + }, + { + "BDEV_NVME_IO_DONE", TRACE_BDEV_NVME_IO_DONE, + OWNER_NONE, OBJECT_BDEV_NVME_IO, 0, + {{ "ctx", SPDK_TRACE_ARG_TYPE_PTR, 8 }} + } + }; + + + spdk_trace_register_object(OBJECT_BDEV_NVME_IO, 'N'); + spdk_trace_register_description_ext(opts, SPDK_COUNTOF(opts)); +}