Broadcomm Linux PLX SDK 8.23 可以在 CentOS7、Alma Linux 8.8、openSUSE 15.5 或 Ubuntu 20.04 计算机上编译和加载,基本上没有问题(除了将 mm->mmap_sem 更改为 mm->mmap_lock,因为内核中的某些结构可能已重命名,或者在需要时将 down_read/up_read 替换为 mmap_read_lock/mmap_read_unloc 和 SuppFunc.c 中的一组参数 inget_user_pages)。该编译和加载(insmod)在 Alma Linux 9.1 和 9.2 中失败,并最终在 init_module() 中的 Plx_dma_buffer_alloc() 函数中的某处导致内核崩溃(自动重新启动计算机)。
对于 8311 和 9656 内核对象模块,即我们为 PCI 扩展/PCI Express 主板开发的两种不同类型的卡,存在同样的问题。
我还没有检查过AlmaLinux 9.0是否也存在这个问题。
这看起来不像是一个通用的内核问题,因为我甚至一直在 openSUSE Tumbleweed 下使用 6.x Linux 内核安装它,而且当前的 openSUSE 和 Ubuntu 内核都是 5.14 版本。我甚至检查过我可以在 gcc-11 下编译 PLX SDK 8.23 并在 openSUSE leap 15.5(gcc 7.5)下加载它,没有任何问题。
这是 RedHat 9.x 或 Alma Linux 9.x 设备驱动程序的已知问题吗?
答案1
这显然可以在 Alma Linux 9.2 上进行修补,方法是将文件 SuppFunc.c 中 Plx_dma_buffer_alloc 函数中 dma_alloc_coherent 的调用中的 GFP_KERNEL | __GFP_NOWARN 标志替换为标志 GFP_ATOMIC。围绕该功能的某种信号量/自旋锁包装器可能也会起作用。我没有检查该源代码修改是否也适用于 Alma Linux 9.0 或 9.1。