基本上,我想要做的是在每个中断中添加一个WorkQueue,但是在完全100001次中断之后,系统失败了,中断不再工作了"irq 63:没有人关心(尝试用"irqpoll“选项启动)。
这是我的密码:
H文件:
typedef struct work_struct GFA_DMA_QUEUE_Work_Struct_t;
typedef struct
{
uint32_t dma_length;
uint8_t * dma_page_pointer;
} GFA_DMA_QUEUE_Work_Data_t;
typedef struct
{
GFA_DMA_QUEUE_Work_Struct_t Work;
GFA_DMA_QUEUE_Work_Data_t Data;
GFA_DMA_QUEUE_Work_t;
}在.c文件中:
static struct workqueue_struct * GFA_DMA_QUEUE_workqueue;
GFA_DMA_QUEUE_Work_t * dma_queue_work;
create_task( dma_page_pointer,dma_length)
{
//.....
dma_queue_work = (GFA_DMA_QUEUE_Work_t *) kmalloc( sizeof(GFA_DMA_QUEUE_Work_t), __GFP_NOFAIL | GFP_KERNEL );
dma_queue_work->Data.dma_length = dma_length;
dma_queue_work->Data.dma_page_pointer = dma_page_pointer;
INIT_WORK ( (GFA_DMA_QUEUE_Work_Struct_t *)dma_queue_work, GFA_DMA_QUEUE_queue_handler);
retVal = queue_work (GFA_DMA_QUEUE_workqueue, (GFA_DMA_QUEUE_Work_Struct_t * )dma_queue_work);
}
static void GFA_DMA_QUEUE_queue_handler( GFA_DMA_QUEUE_Work_Struct_t * Dma_Queue_Work )
{
//.....
kfree( dma_queue_work );
}在中断内:
我只是用正确的参数调用create_tasks()函数。
在100001次中断后,我得到了"irq 63:没人在意“(尝试用"irqpoll”选项启动)。这个系统本来是正常工作的。
中断在大约6uSecs中创建任务所需的时间,因此不是一个问题。
我卸载模块并再次挂载,每次中断到达100001失败。
可能是记忆泄露?是检查内核模块中内存泄漏的一种方法吗?
你认为这可能会发生吗?
谢谢,
发布于 2016-02-18 09:56:01
谢谢你的帮助,齐瓦列夫,我想念那个(GFP_ATOMIC)..但在100000次中断之后,一些事情继续出错。我删除了中断中的所有内容,问题还在继续,唯一可能出错的是返回值,实际上,我从未返回IRQ_HANDLED。这就是问题所在。
https://stackoverflow.com/questions/35455938
复制相似问题