C 工作队列和中断失败

C 工作队列和中断失败,c,module,kernel,scheduled-tasks,interrupt,C,Module,Kernel,Scheduled Tasks,Interrupt,基本上,我想做的是在每次中断时添加一个工作队列,但在100001次中断之后,systemm失败,中断不再工作“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; } GF

基本上,我想做的是在每次中断时添加一个工作队列,但在100001次中断之后,systemm失败,中断不再工作“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时都失败

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

你有没有想过它会发生


谢谢,

谢谢你的帮助,齐瓦雷夫,我很想念(GFP\u原子)。。但在100000次中断之后,一些事情继续出错。我删除了中断中的所有内容,问题仍然存在,唯一可能出错的是返回值,事实上,我从未返回IRQ_。这就是问题所在。

谢谢你的帮助,齐瓦雷夫,我很怀念(GFP\u原子)。。但在100000次中断之后,一些事情继续出错。我删除了中断中的所有内容,问题仍然存在,唯一可能出错的是返回值,事实上,我从未返回IRQ_。这就是问题所在。

GFP\u内核
在中断处理程序中?真正地几乎每一本关于Linux内核编程的手册都告诉我们这是被禁止的。您需要使用
GFP_原子
并准备好分配失败。
GFP_内核
在中断处理程序中?真正地几乎每一本关于Linux内核编程的手册都告诉我们这是被禁止的。您需要使用
GFP_原子
,并做好分配失败的准备。