关于workqueue问题
本文是原「蜗窝讨论区」的历史存档(2017-03-23),来自版块「Linux kernel技术问答」,共 3 帖。讨论区已停止服务,此处仅供查阅。
大家好,现在遇到一个问题,是与workqueue相关的 首先我这边定义了一个workqueue 之后再调用的时候,我调用了两次 发现第一调用的地方生效了 第二次调用的地方没能生效
详细点就是在一个中断函数中 irq_handler(){ queue_delayed_work(work_q,&work, msecs_to_jiffies(5)); //这个执行了 queue_delayed_work(work_q,&work, msecs_to_jiffies(5000)); //这个没有执行 }
请大神们帮看看是什么原因
谢谢
内核相关代码如下: bool queue_delayed_work_on(int cpu, struct workqueue_struct wq, struct delayed_work dwork, unsigned long delay) { struct work_struct *work = &dwork->work; bool ret = false; unsigned long flags;
/* read the comment in __queue_work( */
local_irq_save(flags);
if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) {
__queue_delayed_work(cpu, wq, dwork, delay);
ret = true;
}
local_irq_restore(flags);
return ret;
}
work数据结构中的data 成员,其WORK_STRUCT_PENDING_BIT比特标识了该work是否处于pending状态,pending状态的work只会挂入一次,因此,第二次queue work是不成功的。
@linuxer 谢谢你的说明,确实是这个原因
