在 Linux 驱动程序中哪里可以跟踪 NVME IO?

在 Linux 驱动程序中哪里可以跟踪 NVME IO?

我想编写一个小型的 Linux 驱动程序扩展。更具体地说:我想将主机和 M.2-nvme-ssd 之间的所有通信写入用户空间文件中。不过 nvme 驱动程序相当大,我很难确定从哪里开始。

我的一位同事对 SD 卡做了类似的事情。他在主机收到卡的响应并即将结束操作后跟踪IO(函数是sdhci_request_done)。跟踪显示带有操作码、数据和时间戳的请求和响应。像这样的事情将是我的目标。

我发现了跟踪 IO 的程序,但它们在用户空间中运行。这是一个问题,因为我可能会直接从驱动程序向卡发送消息。

所以我的问题是:我在哪里进入主机驱动程序来获取数据,而不延迟操作或分配太多内存。或者是否有一个驱动程序功能可以做到这一点?

答案1

我的一位同事对 SD 卡做了类似的事情。他在主机收到卡的响应并即将结束操作后跟踪IO(函数是sdhci_request_done)。

与 SD 卡不同,大多数数据实际上会通过 DMA 交换到 nvme 设备(通常),因此您的 Linux 无法知道传输的内容,只知道它发生了。我确信您可以禁用 DMA,从而大幅降低性能。我不知道如何做到这一点,但您可以使用内核引导标志来实现它。

除此之外,您已经可以跟踪所有交换的命令,而无需扩展任何内容。 Linux 有跟踪点,nvme 只是其中之一;所以

sudo perf trace -e nvme:nvme_\* > logfile

相关内容