O_DIRECT 액세스 mmap-ed dmam_alloc_coherent() 문제

O_DIRECT 액세스 mmap-ed dmam_alloc_coherent() 문제

저는 이 장애물을 극복할 수 있는 아이디어를 찾고 있습니다. Xilinx Zynq MPSOC 장치의 PL 측에서 고속 데이터를 가져오는 Linux 커널 모듈이 있습니다. 커널 모듈은 dma-proxy 예제(https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/1027702787/Linux+DMA+From+User+Space+2.0) 하지만 버퍼를 하나만 사용하도록 약간 수정했습니다. 우리의 DMA 구현은 단일 채널, Rx 전용, 비분산 수집 IP 구현을 사용합니다. 드라이버의 dmam_alloc_coherent 메모리 공간으로 데이터를 이동하고 있습니다. 그러나 샘플 드라이버와 동일한 공간에 매핑하면 O_DIRECT 옵션으로 열린 사용자 공간 파일에 이 데이터를 쓸 수 없습니다. 이 작업을 시도하면 write() 호출에서 오류가 발생하고 "잘못된 주소"라는 메시지가 표시됩니다. 그러나 O_DIRECT 옵션을 사용하지 않고도 파일에 직접 쓸 수 있습니다. 그러나 이 데이터 속도는 PL에서 들어오는 데이터에 비해 너무 낮습니다. 다음으로 시도한 것은 dmam_alloc_coherent() 메모리 영역에서 사용자 공간 posix_memalign(512) 할당 영역으로 두 번째 복사본을 만든 다음 해당 데이터를 O_DIRECT 열린 파일에 차례로 쓰는 것이었습니다. 이로 인해 약 5배 정도 성능이 크게 향상되었습니다. 하지만 여전히 예상만큼 빠르지는 않습니다.

내 코드의 시나리오 성능 요약... (kernel)dmam_alloc_coherent() -> (userspace)file(O_DIRECT) = "잘못된 주소" (kernel)dmam_alloc_coherent() -> (userspace)file() = 272MB/sec ( 커널 ) )dmam_alloc_coherent() -> (사용자 공간) posix_memalign(512) -> (사용자 공간) 파일 (O_DIRECT) = 1323MB/초 (사용자 공간) posix_memalign(512) -> (사용자 공간) 파일 (O_DIRECT) = 2200 MB/초(실제 PL 데이터 없음, 단지 memcontents를 디스크에 덤프함)

나는 posix_memalign 영역의 두 번째 복사본을 수행하지 않고도 작동하도록 하는 방법을 찾을 수 있다면 2000MB/초에 가까워질 것이라고 믿습니다. 내 실제 목표 속도는 1600MB/초입니다. 두 번째 사본 없이 이 작업을 수행할 수 있는 방법을 아는 사람이 있습니까? 중간 복사본 없이 O_DIRECT 파일을 읽고 쓸 수 있도록 dma 메모리를 어떻게 설정합니까? 하하, 이걸 제로카피라고 하는 것 같은데....

도와주신 모든 분들께 미리 감사드립니다. 한동안 벽에 머리를 박고 있었습니다...

건배!

추신. 기타 정보....

MPSOC 설정: ext4 LVM 스트라이핑 설정으로 구성된 2개의 NVME 드라이브가 있는 MPSOC 보드의 Petalinux.

디스크에 대한 기타 dd 테스트:

1.dd if=/dev/zero of=tt/test.bin bs=20M count=50 50+0개 레코드 중 50+0개 복사됨 1048576000바이트(1.0GB, 1000MiB), 4.37955초, 239MB/s

2.dd if=/dev/zero of=tt/test.bin bs=20M count=50 oflag=direct 50+0개 레코드 중 50+0개 복사됨 1048576000바이트(1.0GB, 1000MiB), 0.489777초, 2.1GB/ 비서

3.dd if=/dev/zero of=tt/test.bin bs=30M count=1000 oflag=direct 1000+0개 레코드 중 1000+0개 레코드 복사됨 31457280000바이트(31GB, 29GiB), 13.7039초, 2.3 GB/초

관련 정보