未设置VM_GROWSDOWN标志导致的get_user_pages -EFAULT错误

时间:2012-11-07 12:51:32

标签: linux-kernel opencl linux-device-driver dma

我在FGPA驱动程序上继续work

现在我正在添加OpenCL支持。所以我有一个test。 它只需添加NUM_OF_EXEC次相同缓冲区的写入和读取请求,然后等待完成。

每个写入/读取请求在驱动程序中序列化,并作为DMA事务顺序执行。可以查看与DMA相关的代码here

因此驱动程序接受事务,执行它(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会因上述症状而失败?我该怎么调试呢?

1 个答案:

答案 0 :(得分:0)

在某些架构上,堆栈会增长,而在其他架构上,堆栈会逐渐减少。请参阅hppa和hppa64了解需要这种标志的怪人。

因此,无论何时必须处理为内核线程或进程设置堆栈,您都必须提供堆栈增长的方向。