Linux 드라이버에서 NVME IO를 어디에서 추적할 수 있나요?

Linux 드라이버에서 NVME IO를 어디에서 추적할 수 있나요?

작은 Linux 드라이버 확장을 작성하고 싶습니다. 더 구체적으로 말하자면: 호스트와 M.2-nvme-ssd 간의 모든 통신을 사용자 공간 파일에 쓰고 싶습니다. nvme 드라이버는 꽤 커서 어디서부터 시작해야 할지 파악하는 데 어려움을 겪고 있습니다.

내 동료가 SD 카드로 비슷한 작업을 수행했습니다. 호스트가 카드로부터 응답을 수신하고 작업이 종료되려고 할 때 IO(function is)를 추적합니다 sdhci_request_done. 추적은 opcode, 데이터, 타임스탬프와 함께 요청 및 응답을 표시합니다. 이런 것이 내 목표가 될 것입니다.

IO를 추적하는 프로그램을 찾았지만 사용자 공간에서 실행됩니다. 이는 드라이버에서 카드로 직접 메시지를 보낼 수 있기 때문에 문제가 됩니다.

그래서 제 질문은 다음과 같습니다. 작업을 지연시키거나 너무 많은 메모리를 할당하지 않고 데이터를 얻으려면 호스트 드라이버에 어디로 들어가야 할까요? 아니면 이를 수행할 수 있는 드라이버 기능이 있습니까?

답변1

내 동료가 SD 카드로 비슷한 작업을 수행했습니다. 호스트가 카드의 응답을 수신하고 작업을 종료하려고 하는 경우 IO를 추적합니다(함수는 sdhci_request_done).

SD 카드와 달리 대부분의 데이터는 실제로 DMA를 통해 nvme 장치(일반적으로)로 교환되므로 Linux는 무엇이 전송되었는지 알 수 없으며 전송된 내용만 알 수 있습니다. DMA를 비활성화하면 성능이 크게 저하될 수 있다고 확신합니다. 이 작업을 수행하는 방법을 모르겠지만 커널 부팅 플래그를 사용하여 이를 수행할 수 있습니다.

그 외에도 아무것도 확장하지 않고도 이미 교환된 모든 명령을 추적할 수 있습니다. Linux에는 추적 지점이 있으며 nvme는 그 중 하나일 뿐입니다.

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

관련 정보