Raspberry Pi では DMA Buffer をmmap する際に CPU Cache が無効になる







# はじめに


Linux では DMA Bufferを mmap した時に、ある条件が揃うと CPU Cache が無効になり、パフォーマンスが極端に落ちる場合があります。そこで、何故そのようなことが起こるのか説明します。少し長くなるので、次のように記事を幾つかに分けて投稿します。



1. [はじめに] 
2. [Cache Coherence 問題]
3. [Cache Aliasing 問題]
4. [Linux Kernel の Cache 問題の扱い]
5. [Linux では Cache Coherence Hardware を持っていないとDMA Buffer をmmap する際に CPU Cache が無効になる]
6.  __Raspberry Pi の例(この記事)__  
7. [RISC-V CPU の注意点]
8. [所感]



1〜3は、コンピューターアーキテクチャの基本的な事項を、簡単に説明したものです。すでにご存じの方は読み飛ばしてください。

4 はこれらの問題を Linux Kernel 内でどのように扱っているかを説明します。

5 がこれらの記事群の結論です。結論だけ知りたい方はここだけ読んでください。



前回の記事 [『Linux では Cache Coherence Hardware を持っていないとDMA Buffer をmmap する際に CPU Cache が無効になる』] では、Cache Coherence Hardware を持っていないコンピューターシステムの場合は、例え Cache Aliasing 問題が起きない場合でも、 DMA Buffer を mmap する際にキャッシュが無効になることを説明しました。この記事では、その(残念な)コンピューターシステムの例である Raspberry Pi を紹介します。


# Raspberry Pi の場合



## BCM2711 (Raspberry Pi 4 の SoC) の内部ブロック


Raspberry Pi 4 に搭載されている SoC は Broadcom 社製の BCM2711 です。このBCM2711 は次の図のような内部ブロックになっています。


![Fig.1 BCM2711 Block Diagram](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0%2F24981%2Fe7713ba6-b8ec-7b33-72fc-1abcf1fd4896.jpeg "Fig.1 BCM2711 Block Diagram")

Fig.1 BCM2711 Block Diagram

<br />




## Cortex-A72 の L1 Cache は PIPT


BCM2711 には Linux 等を動作させるためのアプリケーションプロセッサとして　arm 社製の Cortex-A72 が搭載されています。この Cortex-A72 のL1-Cache は PIPT 方式であることが次の公式資料で明記されています。つまり BCM2711 は Cache Aliasing 問題は起こりません。



* 「About the L1 memory system」   
ARM Cortex-A72 MPCore Processor Technical Reference Manual r0p3   
https://developer.arm.com/documentation/100095/0003/Level-1-Memory-System/About-the-L1-memory-system




![Fig.2 The L1 Cache of Cortex-A72 is PIPT](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0%2F24981%2F03fa7d9d-a032-19ad-0c70-79d5b192eb6a.jpeg "Fig.2 The L1 Cache of Cortex-A72 is PIPT")

Fig.2 The L1 Cache of Cortex-A72 is PIPT

<br />




## BCM2711 の InterConnect は Cache Coherence 未対応


一方、BCM2711 の AMBA/AXI-Bus InterConnect は Cache Coherence に対応していません。BCM2711 のデータシートには明記されていませんが、Raspberry Pi 公式のフォーラムには Cache Coheence 問題はソフトウェアで解決するよう明記されています。



* 「BCM2711 ARM Peripherals」   
https://datasheets.raspberrypi.com/bcm2711/bcm2711-peripherals.pdf
* 「RPI4 PCI Express Bus Master DMA and cache」    
Raspberry Pi  Forum   
https://forums.raspberrypi.com/viewtopic.php?t=335399


![Fig.3 InterConnect is not Cache Coherence capable](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0%2F24981%2F0c980396-a538-0b2b-2b9c-3c12a733466a.jpeg "Fig.3 InterConnect is not Cache Coherence capable")

Fig.3 InterConnect is not Cache Coherence capable

<br />




# まとめ


この記事では[『Linux では Cache Coherence Hardware を持っていないとDMA Buffer をmmap する際に CPU Cache が無効になる』] コンピューターシステムの例として Raspberry Pi を紹介しました。

Rapberry Pi 4 の アプリケーションプロセッサ(Cortex-A72) のL1-Cache は PIPT なので Cache Aliasing 問題は発生しませんが、BCM2711 の InterConnect が Cache Coherence に対応していないので、Linux では DMA Buffer を mmap した時にキャッシュが有効になりません。

[参考]に Raspberry Pi で mmap したら性能が落ちた事例を紹介しています。参考にしてください。


# 参考



## Raspberry Pi で mmap が遅くなっていると思われる事例


* 「Libcamera memcpy from mmap'd region very slow (CM4)」   
Raspberry Pi  Forum   
https://forums.raspberrypi.com/viewtopic.php?t=352554
* 「Why processing V4L2 Unicam buffers in userspace might be slow」   
Raspberry Pi  Forum   
https://forums.raspberrypi.com/viewtopic.php?t=315272
* 「Slow frame read from webcam」   
OpenCV Forum   
https://forum.opencv.org/t/slow-frame-read-from-webcam/6880/1
* 「[HOW-TO] processing high resolution video at high framerate」   
https://github.com/raspberrypi/picamera2/issues/740
* 「Could this be used with V4L2/libcamera buffers on the Raspberry Pi 4 (Arm A72)」   
https://github.com/ikwzm/udmabuf/issues/107
* 「V4L2 ストリーミングI/O(V4L2_MEMORY_MMAP) で性能が出ない問題 (2024年改訂版)」   
Qiita   
https://qiita.com/ikwzm/items/474ababbc99cb4812bc7


## Raspberry Pi のハードウェアの資料


* 「BCM2711 ARM Peripherals」   
https://datasheets.raspberrypi.com/bcm2711/bcm2711-peripherals.pdf
* 「RPI4 PCI Express Bus Master DMA and cache」    
Raspberry Pi  Forum   
https://forums.raspberrypi.com/viewtopic.php?t=335399
* 「About the L1 memory system」   
ARM Cortex-A72 MPCore Processor Technical Reference Manual r0p3   
https://developer.arm.com/documentation/100095/0003/Level-1-Memory-System/About-the-L1-memory-system


[はじめに]: https://qiita.com/ikwzm/items/aa7e2373705872ccf764 "『Linux で DMA Bufferを mmap した時に CPU Cacheが無効になる場合がある (はじめに)』@Qiita"
[『Linux で DMA Bufferを mmap した時に CPU Cacheが無効になる場合がある (はじめに)』]: https://qiita.com/ikwzm/items/aa7e2373705872ccf764 "『Linux で DMA Bufferを mmap した時に CPU Cacheが無効になる場合がある (はじめに)』@Qiita"
[Cache Coherence 問題]: https://qiita.com/ikwzm/items/f60281491cc83f29c019 "『Linux で DMA Bufferを mmap した時に CPU Cacheが無効になる場合がある (Cache Coherence 問題とは何か)』@Qiita"
[Cache Coherence 問題とは何か]: https://qiita.com/ikwzm/items/f60281491cc83f29c019 "『Linux で DMA Bufferを mmap した時に CPU Cacheが無効になる場合がある (Cache Coherence 問題とは何か)』@Qiita"
[『Linux で DMA Bufferを mmap した時に CPU Cacheが無効になる場合がある (Cache Coherence 問題とは何か)』]: https://qiita.com/ikwzm/items/f60281491cc83f29c019 "『Linux で DMA Bufferを mmap した時に CPU Cacheが無効になる場合がある (Cache Coherence 問題とは何か)』@Qiita"
[Cache Coherence 問題の解決方法]: https://qiita.com/ikwzm/items/6d3225e4cbdbbabcabd5 "『Linux で DMA Bufferを mmap した時に CPU Cacheが無効になる場合がある (Cache Coherence 問題の解決方法)』@Qiita"
[『Linux で DMA Bufferを mmap した時に CPU Cacheが無効になる場合がある (Cache Coherence 問題の解決方法)』]: https://qiita.com/ikwzm/items/6d3225e4cbdbbabcabd5 "『Linux で DMA Bufferを mmap した時に CPU Cacheが無効になる場合がある (Cache Coherence 問題の解決方法)』@Qiita"
[Cache Aliasing 問題]: https://qiita.com/ikwzm/items/1b8dc72e04d0fa031a0f "『Linux で DMA Bufferを mmap した時に CPU Cacheが無効になる場合がある (Cache Aliasing 問題とは何か)』@Qiita"
[Cache Aliasing 問題とは何か]: https://qiita.com/ikwzm/items/1b8dc72e04d0fa031a0f "『Linux で DMA Bufferを mmap した時に CPU Cacheが無効になる場合がある (Cache Aliasing 問題とは何か)』@Qiita"
[『Linux で DMA Bufferを mmap した時に CPU Cacheが無効になる場合がある (Cache Aliasing 問題とは何か)』]: https://qiita.com/ikwzm/items/1b8dc72e04d0fa031a0f "『Linux で DMA Bufferを mmap した時に CPU Cacheが無効になる場合がある (Cache Aliasing 問題とは何か)』@Qiita"
[Cache Aliasing 問題の解決方法]: https://qiita.com/ikwzm/items/b3c24f04121a0d2deefd "『Linux で DMA Bufferを mmap した時に CPU Cacheが無効になる場合がある (Cache Aliasing 問題の解決方法)』@Qiita"
[『Linux で DMA Bufferを mmap した時に CPU Cacheが無効になる場合がある (Cache Aliasing 問題の解決方法)』]: https://qiita.com/ikwzm/items/b3c24f04121a0d2deefd "『Linux で DMA Bufferを mmap した時に CPU Cacheが無効になる場合がある (Cache Aliasing 問題の解決方法)』@Qiita"
[Linux Kernel の Cache 問題の扱い]: https://qiita.com/ikwzm/items/f32985890b2013ef5528 "『Linux で DMA Bufferを mmap した時に CPU Cacheが無効になる場合がある (Linux Kernel の Cache 問題の扱い)』@Qiita"
[『Linux で DMA Bufferを mmap した時に CPU Cacheが無効になる場合がある (Linux Kernel の Cache 問題の扱い)』]: https://qiita.com/ikwzm/items/f32985890b2013ef5528 "『Linux で DMA Bufferを mmap した時に CPU Cacheが無効になる場合がある (Linux Kernel の Cache 問題の扱い)』@Qiita"
[Linux では Cache Coherence Hardware を持っていないとDMA Buffer をmmap する際に CPU Cache が無効になる]: https://qiita.com/ikwzm/items/0f77072158ce842018fc "『Linux では Cache Coherence Hardware を持っていないとDMA Buffer をmmap する際に CPU Cache が無効になる』@Qiita"
[『Linux では Cache Coherence Hardware を持っていないとDMA Buffer をmmap する際に CPU Cache が無効になる』]: https://qiita.com/ikwzm/items/0f77072158ce842018fc "『Linux では Cache Coherence Hardware を持っていないとDMA Buffer をmmap する際に CPU Cache が無効になる』@Qiita"
[Raspberry Pi の例]: https://qiita.com/ikwzm/items/f8bcb82cfdb818bdb07d "『Raspberry Pi では DMA Buffer をmmap する際に CPU Cache が無効になる』@Qiita"
[『Raspberry Pi では DMA Buffer をmmap する際に CPU Cache が無効になる』]: https://qiita.com/ikwzm/items/f8bcb82cfdb818bdb07d "『Raspberry Pi では DMA Buffer をmmap する際に CPU Cache が無効になる』@Qiita"
[RISC-V CPU の注意点]: https://qiita.com/ikwzm/items/3c6b15029780be57f3a9 "『Linux で DMA Bufferを mmap した時に CPU Cacheが無効になる場合がある (RISC-V CPU の注意点)』@Qiita"
[『Linux で DMA Bufferを mmap した時に CPU Cacheが無効になる場合がある (RISC-V CPU の注意点)』]: https://qiita.com/ikwzm/items/3c6b15029780be57f3a9 "『Linux で DMA Bufferを mmap した時に CPU Cacheが無効になる場合がある (RISC-V CPU の注意点)』@Qiita"
[所感]: https://qiita.com/ikwzm/items/46f00c39b7d92c06654e "『Linux で DMA Bufferを mmap した時に CPU Cacheが無効になる場合がある (所感)』@Qiita"
[『Linux で DMA Bufferを mmap した時に CPU Cacheが無効になる場合がある (所感)』]: https://qiita.com/ikwzm/items/46f00c39b7d92c06654e "『Linux で DMA Bufferを mmap した時に CPU Cacheが無効になる場合がある (所感)』@Qiita"
[『Kernel/VM探検隊@北陸 Part 6』]: https://kernelvm.connpass.com/event/297033/ "『Kernel/VM探検隊@北陸 Part 6』"