蜗窝科技

关于workqueue问题

蜗窝讨论区存档 · Linux kernel技术问答 · 楼主 疯狂的锤头100 · 2017-03-23 · 3 帖

本文是原「蜗窝讨论区」的历史存档(2017-03-23),来自版块「Linux kernel技术问答」,共 3 帖。讨论区已停止服务,此处仅供查阅。

疯狂的锤头100 · 2017-03-23 19:22

大家好,现在遇到一个问题,是与workqueue相关的 首先我这边定义了一个workqueue 之后再调用的时候,我调用了两次 发现第一调用的地方生效了 第二次调用的地方没能生效

详细点就是在一个中断函数中 irq_handler(){ queue_delayed_work(work_q,&work, msecs_to_jiffies(5)); //这个执行了 queue_delayed_work(work_q,&work, msecs_to_jiffies(5000)); //这个没有执行 }

请大神们帮看看是什么原因

谢谢

linuxer · 2017-03-24 08:53

内核相关代码如下: 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是不成功的。

疯狂的锤头100 · 2017-03-27 23:06

@linuxer 谢谢你的说明,确实是这个原因