我将继续我的 FGPA 驱动程序的工作。
现在我正在添加 OpenCL 支持。所以我有以下测试。它只是添加 NUM_OF_EXEC 次相同缓冲区的写入和读取请求,然后等待完成。
每个写入/读取请求在驱动程序中序列化并作为 DMA 事务顺序执行。DMA相关代码可以在这里查看。
因此驱动程序接受一个事务,执行它(rsp_setup_dma 和 fpga_push_data_to_device),等待来自 FPGA 的中断(fpga_int_handler),释放资源(fpga_finish_dma_write)并开始一个新的。当 NUM_OF_EXEC 等于 1 时,似乎一切正常,但如果我增加它,就会出现问题。在某些时候 get_user_pages(在 rsp_setup_dma)返回 -EFAULT。调试内核时,我发现分配的 vma 没有设置 VM_GROWSDOWN 标志(在 mmap.c 中的 find_extend_vma 处)。但是在这一点上我卡住了,因为我不确定我理解为什么需要这个标志,我也不知道为什么没有设置它。为什么 get_user_pages 会因上述症状而失败?我该如何调试呢?