首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >工作队列和中断失败

工作队列和中断失败
EN

Stack Overflow用户
提问于 2016-02-17 11:51:05
回答 1查看 65关注 0票数 1

基本上,我想要做的是在每个中断中添加一个WorkQueue,但是在完全100001次中断之后,系统失败了,中断不再工作了"irq 63:没有人关心(尝试用"irqpoll“选项启动)。

这是我的密码:

H文件:

代码语言:javascript
复制
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文件中:

代码语言:javascript
复制
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失败。

可能是记忆泄露?是检查内核模块中内存泄漏的一种方法吗?

你认为这可能会发生吗?

谢谢,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-18 09:56:01

谢谢你的帮助,齐瓦列夫,我想念那个(GFP_ATOMIC)..但在100000次中断之后,一些事情继续出错。我删除了中断中的所有内容,问题还在继续,唯一可能出错的是返回值,实际上,我从未返回IRQ_HANDLED。这就是问题所在。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35455938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档