我们有一个可以在任何可用内核上执行的ISR,并且可能会根据内核是忙还是空闲而导致成功或失败。在处理程序中,我们使用queue_work_on()将每个内核的工作队列排队function.For每个核心,将调用queue_work_on()函数并基于queue_work_on()的返回值,我们如何传递ISR返回值IRQ_HANDLED,IRQ_NONE
如何处理任何一个queue_work_on函数失败以及如何返回ISR值。
希望我提供足够的背景来获得一些观点。
编辑:
场景更像是: 我们有例如由主机驱动程序执行某些卸载功能的多个进程占用的1024个队列。提交卸载后,进程被wait_for_completion()调用阻塞,理想情况下应该通过完成通知唤醒。在驱动程序中,卸载的环被排队并基于卸载成功,isr通知工作线程将队列作业出列并触发完成事件。 现在我们看到更多的完成事件没有等待进程导致进程挂起TASK_UNITERRUPTIBLE状态导致调度程序超时。需要一些指针来在多核系统中部署可能的同步
答案 0 :(得分:0)
当您收到实际来自您设备的中断请求时,您不得返回IRQ_NONE
。其结果是内核认为你的设备的中断线被卡住了,并禁用了设备。
如果您不知道在某个工作中排队的CPU核心,请使用queue_work()
获取下一个免费核心。