工作队列和中断失败

时间:2016-02-17 11:51:06

标签: c module kernel scheduled-tasks interrupt

基本上我要做的就是每次中断都要添加一个WorkQueue,但是在100001中断之后,systemm就会失败并且中断不再起作用“irq 63:没人关心(尝试使用”irqpoll“启动)选项)”。

这是我的代码:

Inside.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失败时。

可能是内存泄漏?是检查内核模块中内存泄漏的方法吗?

你有没有想过它可能会发生?

谢谢,

1 个答案:

答案 0 :(得分:0)

感谢你的帮助,Tsyvarev,我想念那个( GFP_ATOMIC )..但是在100000次中断之后,一些事情仍然是错误的。我删除了中断内部的所有内容并且问题仍然存在,唯一可能出错的是返回值,事实上,它确实是,我永远不会返回IRQ_HANDLED。这就是问题所在。