提问人:Mehmet Fide 提问时间:11/16/2023 最后编辑:0andriyMehmet Fide 更新时间:11/17/2023 访问量:48
增加 Linux 内核模块 kfifo_alloc() 的大小,该模块失败 128MB
Increasing size for Linux kernel module kfifo_alloc() which fails for 128MB
问:
我们有一个具有四核 Cortex-A53 内核的嵌入式产品,并运行 Linux 内核 v5.4 aarch64。整个 Linux 目前仅消耗 200MB 即可工作,因此我有足够的 RAM 可供使用。4 GB RAM
我制作了一个内核模块,它通过 PCIe 总线从外部设备读取 20MB/秒的数据,块为 1MB。我想将中断上下文中的这 1MB 数据推送到内核模块中的 FIFO 工作,以便稍后传输到用户空间。
我在 Linux 内核中寻找可用的 fifo 模式,并看到了它已经提供的一堆 API。这完全符合我的目的。据我了解,它支持单生产者和单一消费者方法,无需任何锁定。kfifo_alloc()
put and get data
我的应用程序所需的 FIFO 大小应该在 128MB 左右。我已经有 4GB RAM,因此我最初认为分配这样的内存应该没有问题。
但是以下代码意外返回错误ENOMEM
ret = kfifo_alloc(&io_dev.streaming_dma_fifo, 128 * 1024 * 1024, GFP_KERNEL);
if (ret) {
dev_err(&pci_dev->dev, "%s:error kfifo_alloc, ret=%d\n", __func__, ret);
return ret;
}
然后我搜索了 stackoverflow,看到人们使用抱怨同样的事情。我认为函数内部也使用.kmalloc()
kfifo_alloc()
kmalloc()
然后我按照这个论坛的建议再次执行了以下代码:
dev_info(&pci_dev->dev, "KMALLOC_SHILFT_LOW:%d, KMALLOC_SHILFT_HIGH:%d, KMALLOC_MIN_SIZE:%d, KMALLOC_MAX_SIZE:%lu\n", KMALLOC_SHIFT_LOW, KMALLOC_SHIFT_HIGH, KMALLOC_MIN_SIZE, KMALLOC_MAX_SIZE);
并为我的系统提供了这些输出:
KMALLOC_SHILFT_LOW: 7
KMALLOC_SHILFT_HIGH: 13
KMALLOC_MIN_SIZE: 128
KMALLOC_MAX_SIZE: 33554432
我从这个输出中了解到的是,我可以分配的最大大小限制为 .kfifo_alloc()
32MB
如果我尝试将请求的大小从减小到 ,它不会返回错误。kfifo_alloc()
128MB
32MB
问题:
我的FIFO RAM没有任何特殊要求,例如它应该是连续的,原子的或DMAable的或其他东西。我不明白为什么 kfifo_alloc() 以 128MB 失败,而我可以轻松地在用户空间中分配相同的数量。有没有办法要求使用或内核等价物,而不是特殊?
malloc()
kfifo_alloc
malloc
kmalloc
有没有办法将我的系统定义为 32MB 的KMALLOC_MAX_SIZE增加?
例如,将KMALLOC_MAX_SIZE设置为 256MB 会有什么后果?
如果我的驱动程序需要大于 32MB 的 FIFO,建议采用什么方法?
答: 暂无答案
下一个:替换 ECMP 路由的哈希函数
评论
kmalloc()
vmalloc()
kmalloc()
kmalloc()