2014-12-02 83 views
0

我们有一个ISR可以在任何可用的内核上执行,并且可能根据内核是忙还是空闲而导致成功或失败条件。在处理程序中,我们使用queue_work_on()函数对每个核心的工作队列进行排队。对于每个核心,queue_work_on()函数将被调用,并且基于queue_work_on()的返回值,我们如何通过ISR返回值IRQ_HANDLED,IRQ_NONE由于多核系统中的调度程序超时导致进程挂起

如何处理queue_work_on函数中的任何一个失败以及如何返回ISR值。

希望我提供了足够的上下文来获得一些观点。

编辑:

情景更像是: 我们有例如由多个进程消耗的1024个队列用于由主机驱动程序执行一些卸载功能。在提交卸载后,进程会被wait_for_completion()调用阻塞,理想情况下应该通过完成通知来唤醒进程。在驱动程序卸载的环中排队并基于卸载成功,isr会通知工作线程使队列作业出列并触发完成事件。 现在我们看到更多的完成事件,而不是等待进程导致挂起TASK_UNITERRUPTIBLE状态的进程导致计划程序超时。需要一些指针来在多核系统中部署可能的同步

回答

0

当您得到一个实际来自您的设备的中断请求时,您的一定不能返回IRQ_NONE。其结果是内核认为你的设备的中断线卡住了,并且禁用了设备。

如果您不知道在哪个CPU内核上排队某些工作,请使用queue_work()获取下一个空闲内核。

+0

感谢您的回复。我尝试了这个建议,但没有什么区别:( 方案更像是:我们有1024个队列,这些队列被多个进程用于执行主驱动程序的卸载功能 – 2014-12-02 15:42:44

+0

感谢您的回应,我尝试了这个建议,但没有任何区别: ( 请参阅编辑后的查询,详细了解场景和相关问题。 希望能够帮助您提供更多相关指示,以进一步探索。 – 2014-12-02 15:54:36

相关问题