Fix Hailo v4.21.0 driver traces due to missing lock (#4138)

Backport patch for traces appearing since v4.21.0 bump, introduced in #4095.
This change is not available in any newer tagged release of the driver and the
commit message upstream is messed up, hence the reworded patch.

(cherry picked from commit 286f5a66ca66bf5e39767e925609bf46fb1e1047)
This commit is contained in:
Jan Čermák 2025-07-02 16:01:01 +02:00 committed by Jan Čermák
parent 6735603d89
commit 3c1aa91376
No known key found for this signature in database
GPG Key ID: A78C897AA3AF012B

View File

@ -0,0 +1,64 @@
From 6c80e322d23337a8b9e5df85677be89f50561d10 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20=C4=8Cerm=C3=A1k?= <sairon@sairon.cz>
Date: Wed, 2 Jul 2025 14:09:30 +0200
Subject: [PATCH] Add missing lock around current->mm
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Backport patch on top of v4.21.0 to hold lock during mmap access.
Without this patch, kernel traces are generated when e.g. Frigate uses the driver:
WARNING: CPU: 3 PID: 5063 at include/linux/rwsem.h:80 find_vma+0x6c/0x80
Modules linked in: broadcom bcm_phy_ptp wireguard libchacha20poly1305 chacha_neon poly1305_neon ip6_udp_tunnel udp_tunnel libcurve25519_generic libchacha rfcomm nf_conntrack_netlink xt_set ip_set nft_chain_nat nft_compat nf_tables xfrm_user algif_hash algif_skcipher af_alg bnep btsdio sch_fq_codel brcmfmac_wcc vc4 snd_soc_hdmi_codec drm_display_helper brcmfmac cec hci_uart btqca btrtl btbcm btintel spidev drm_dma_helper brcmutil bluetooth snd_soc_core snd_compress snd_pcm_dmaengine v3d ecdh_generic rpi_hevc_dec snd_pcm pisp_be cfg80211 aes_ce_blk aes_ce_cipher v4l2_mem2mem ghash_ce videobuf2_dma_contig videobuf2_memops snd_timer ecc gpu_sched videobuf2_v4l2 sha2_ce sha256_arm64 sha1_ce libaes sha1_generic raspberrypi_hwmon rfkill snd videobuf2_common rp1_pio spi_bcm2835 drm_shmem_helper gpio_keys raspberrypi_gpiomem hailo_pci(O) rp1_mailbox i2c_brcmstb drm_kms_helper pwm_fan rp1_adc nvmem_rmem rp1 uio_pdrv_genirq uio fuse drm drm_panel_orientation_quirks backlight nfnetlink
CPU: 3 UID: 0 PID: 5063 Comm: frigate.detecto Tainted: G W O 6.12.25-haos-raspi #1
Tainted: [W]=WARN, [O]=OOT_MODULE
Hardware name: Raspberry Pi 5 Model B Rev 1.1 (DT)
pstate: 80400009 (Nzcv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
pc : find_vma+0x6c/0x80
lr : hailo_vdma_buffer_map+0xe4/0x620 [hailo_pci]
sp : ffffffc082f0bc20
x29: ffffffc082f0bc30 x28: ffffff8194dea100 x27: 0000000000000000
x26: 0000000000000000 x25: ffffff8109c04c80 x24: ffffffd03ff91000
x23: 0000000000040f70 x22: 0000000000000001 x21: ffffff8101d570c8
x20: 0000000000000000 x19: 0000007f8c087000 x18: 0000000000000000
x17: 0000000000000000 x16: ffffffd08c730828 x15: 0000007f81bdcb48
x14: 0000000000000000 x13: 0000000000000000 x12: 0000000000000000
x11: 0000000000000000 x10: 0000007f81bdcb48 x9 : ffffffd03ff8b744
x8 : ffffff8109c04d00 x7 : 0000000000000000 x6 : 000000000000003f
x5 : 0000000000000040 x4 : 0000000000000080 x3 : 0000000000000000
x2 : 0000000000000000 x1 : 0000007f8c087000 x0 : ffffff8177b56880
Call trace:
find_vma+0x6c/0x80
hailo_vdma_buffer_map+0xe4/0x620 [hailo_pci]
hailo_vdma_buffer_map_ioctl+0xdc/0x348 [hailo_pci]
hailo_vdma_ioctl+0xcc/0x258 [hailo_pci]
hailo_pcie_fops_unlockedioctl+0x1e4/0x798 [hailo_pci]
__arm64_sys_ioctl+0xb0/0x100
invoke_syscall+0x50/0x120
el0_svc_common.constprop.0+0xc8/0xf0
do_el0_svc+0x24/0x38
el0_svc+0x30/0xd0
el0t_64_sync_handler+0x120/0x130
el0t_64_sync+0x190/0x198
Upstream: https://github.com/hailo-ai/hailort-drivers/commit/8edb23bdb6130f89f9f73d6dc90f9db3d1f407c6
Signed-off-by: Jan Čermák <sairon@sairon.cz>
---
linux/vdma/memory.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/linux/vdma/memory.c b/linux/vdma/memory.c
index 7ad4a68..7a78cc5 100644
--- a/linux/vdma/memory.c
+++ b/linux/vdma/memory.c
@@ -167,7 +167,9 @@ struct hailo_vdma_buffer *hailo_vdma_buffer_map(struct device *dev,
}
if (HAILO_DMA_DMABUF_BUFFER != buffer_type) {
+ mmap_read_lock(current->mm);
vma = find_vma(current->mm, addr_or_fd);
+ mmap_read_unlock(current->mm);
if (IS_ENABLED(HAILO_SUPPORT_MMIO_DMA_MAPPING)) {
if (NULL == vma) {
dev_err(dev, "no vma for virt_addr/size = 0x%08lx/0x%08zx\n", addr_or_fd, size);