Kodi on the Raspberry Pi 3 and CMA problems

I installed Kodi 19.4 on the Raspberry Pi 3 Model B Plus Rev 1.3, running the Raspberry Pi OS based on Debian 11.9. Unfortunately I experienced some weird crashes of the Kodi program: sometimes the Kodi process suddendly restart while I'm browsing a folder with about 200 video items.

The error messages are revealed by the dmesg output:

[  628.433140] cma: cma_alloc: linux,cma: alloc failed, req-size: 338 pages, ret: -12
[  628.433195] bcm2835-codec bcm2835-codec: dma alloc of size 1384448 failed
...
[  848.225919] [drm:vc4_bo_create [vc4]] *ERROR* Failed to allocate from GEM DMA helper:
[  848.226063] vc4-drm soc:gpu: [drm]                            V3D: 210408kb BOs (1132)
[  848.226074] vc4-drm soc:gpu: [drm]                     V3D shader:     56kb BOs (14)
[  848.226081] vc4-drm soc:gpu: [drm]                           dumb:   2040kb BOs (1)
[  848.226088] vc4-drm soc:gpu: [drm]                         binner:  16384kb BOs (1)
[  848.226095] vc4-drm soc:gpu: [drm]                total purged BO:   1028kb BOs (2)

As you can see the V3D used 210408 kb of the DRM memory, which is very near to the default size reserved of 256 Mb. You can see it into dmesg output:

[    0.000000] Reserved memory: created CMA memory pool at 0x1ec00000, size 256 MiB

In /boot/config.txt you should confirm that you are loading the vc4-kms-v3d overlay, which is the module dedicated to GPU management, the VideoCore IV GPU available on the Raspberry Pi 3:

# Enable DRM VC4 V3D driver
dtoverlay=vc4-kms-v3d
max_framebuffers=2

To reserve more memory for the CMA, add the following line into /boot/config.txt

# Default cma reserved memory is 256 Mb, use 512 instead.
dtoverlay=cma,cma-size=536870912

Because the total memory is limited to 1 Gb, it is advisable to reserve not much memory for the GPU; in /boot/config.txt put this:

gpu_mem=92

With 92 Mb of GPU memory I'm still able to play 1920×1080 videos without issues. Many features of the VideoCore IV GPU use the CMA reserved memory, not this GPU reserver one.

You can check how many GPU memory is used during Kodi normal operation, just launch the bcmstat.sh script and let it run:

./bcmstat.sh Dd5

At next reboot I verified that the new setting is in place, checking the dmesg output:

[    0.000000] Reserved memory: created CMA memory pool at 0x0ec00000, size 512 MiB
[    0.000000] Memory: 402028K/954368K available (10240K kernel code, 1452K rwdata,
               2900K rodata, 1024K init, 613K bss, 28052K reserved, 524288K cma-reserved)

Verify also that the system has enough free memory once the Kodi program is started, use the free commando to get it:

               total        used        free      shared  buff/cache   available
Mem:          927340      321760      319708        2836      285872      548032
Swap:         524284           0      524284

About 300 Mb of free memory should suffice for normal operations.