![在 Linux 驱动程序中哪里可以跟踪 NVME IO?](https://linux22.com/image/230242/%E5%9C%A8%20Linux%20%E9%A9%B1%E5%8A%A8%E7%A8%8B%E5%BA%8F%E4%B8%AD%E5%93%AA%E9%87%8C%E5%8F%AF%E4%BB%A5%E8%B7%9F%E8%B8%AA%20NVME%20IO%EF%BC%9F.png)
我想编写一个小型的 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