工作队列和中断失败
Work queues and Interrupts failed
基本上我想做的是在每次中断时添加一个 WorkQueue,但是在恰好 100001 次中断之后,systemm 失败并且中断不再工作 "irq 63: nobody cared (try booting with the "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: nobody cared (try booting with the "irqpoll"选项)"。系统正常工作。
中断需要在大约 6uSecs 内创建任务的时间,所以不是问题。
我卸载模块并再次安装,每次中断到达 100001 失败。
可能是内存泄漏?有没有检查内核模块内存泄漏的方法?
您是否知道它可能会发生?
谢谢,
谢谢你的帮助,Tsyvarev,我想念那个 (GFP_ATOMIC)..但是在 100000 次中断之后继续出错。我删除了中断中的所有内容,问题仍然存在,唯一可能出错的是 return 值,事实上,我从来没有 return IRQ_HANDLED。这就是问题所在。
基本上我想做的是在每次中断时添加一个 WorkQueue,但是在恰好 100001 次中断之后,systemm 失败并且中断不再工作 "irq 63: nobody cared (try booting with the "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: nobody cared (try booting with the "irqpoll"选项)"。系统正常工作。
中断需要在大约 6uSecs 内创建任务的时间,所以不是问题。
我卸载模块并再次安装,每次中断到达 100001 失败。
可能是内存泄漏?有没有检查内核模块内存泄漏的方法?
您是否知道它可能会发生?
谢谢,
谢谢你的帮助,Tsyvarev,我想念那个 (GFP_ATOMIC)..但是在 100000 次中断之后继续出错。我删除了中断中的所有内容,问题仍然存在,唯一可能出错的是 return 值,事实上,我从来没有 return IRQ_HANDLED。这就是问题所在。