|
@@ -1891,22 +1891,22 @@ Mandatory 배리어들은 SMP 시스템에서도 UP 시스템에서도 SMP 효
|
|
|
/* 소유권을 수정 */
|
|
/* 소유권을 수정 */
|
|
|
desc->status = DEVICE_OWN;
|
|
desc->status = DEVICE_OWN;
|
|
|
|
|
|
|
|
- /* MMIO 를 통해 디바이스에 공지를 하기 전에 메모리를 동기화 */
|
|
|
|
|
- wmb();
|
|
|
|
|
-
|
|
|
|
|
/* 업데이트된 디스크립터의 디바이스에 공지 */
|
|
/* 업데이트된 디스크립터의 디바이스에 공지 */
|
|
|
writel(DESC_NOTIFY, doorbell);
|
|
writel(DESC_NOTIFY, doorbell);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
dma_rmb() 는 디스크립터로부터 데이터를 읽어오기 전에 디바이스가 소유권을
|
|
dma_rmb() 는 디스크립터로부터 데이터를 읽어오기 전에 디바이스가 소유권을
|
|
|
- 내놓았음을 보장하게 하고, dma_wmb() 는 디바이스가 자신이 소유권을 다시
|
|
|
|
|
- 가졌음을 보기 전에 디스크립터에 데이터가 쓰였음을 보장합니다. wmb() 는
|
|
|
|
|
- 캐시 일관성이 없는 (cache incoherent) MMIO 영역에 쓰기를 시도하기 전에
|
|
|
|
|
- 캐시 일관성이 있는 메모리 (cache coherent memory) 쓰기가 완료되었음을
|
|
|
|
|
- 보장해주기 위해 필요합니다.
|
|
|
|
|
-
|
|
|
|
|
- consistent memory 에 대한 자세한 내용을 위해선 Documentation/DMA-API.txt
|
|
|
|
|
- 문서를 참고하세요.
|
|
|
|
|
|
|
+ 내려놓았을 것을 보장하고, dma_wmb() 는 디바이스가 자신이 소유권을 다시
|
|
|
|
|
+ 가졌음을 보기 전에 디스크립터에 데이터가 쓰였을 것을 보장합니다. 참고로,
|
|
|
|
|
+ writel() 을 사용하면 캐시 일관성이 있는 메모리 (cache coherent memory)
|
|
|
|
|
+ 쓰기가 MMIO 영역에의 쓰기 전에 완료되었을 것을 보장하므로 writel() 앞에
|
|
|
|
|
+ wmb() 를 실행할 필요가 없음을 알아두시기 바랍니다. writel() 보다 비용이
|
|
|
|
|
+ 저렴한 writel_relaxed() 는 이런 보장을 제공하지 않으므로 여기선 사용되지
|
|
|
|
|
+ 않아야 합니다.
|
|
|
|
|
+
|
|
|
|
|
+ writel_relaxed() 와 같은 완화된 I/O 접근자들에 대한 자세한 내용을 위해서는
|
|
|
|
|
+ "커널 I/O 배리어의 효과" 섹션을, consistent memory 에 대한 자세한 내용을
|
|
|
|
|
+ 위해선 Documentation/DMA-API.txt 문서를 참고하세요.
|
|
|
|
|
|
|
|
|
|
|
|
|
MMIO 쓰기 배리어
|
|
MMIO 쓰기 배리어
|