C Linux中的微线程和中断问题
让我们假设Linux中有一个中断处理程序和一个tasklet。tasklet是从该中断处理程序调度的 中断处理程序充当某种生产者,而tasklet充当消费者。 当tasklet运行较长时间时会出现问题,当此tasklet仍在运行时会发生中断。这种干扰会导致日志中出现多个调用跟踪 如何解决这种干扰 我唯一的想法是将中断处理程序移动到某个工作队列或另一个tasklet,并从中断处理程序调度它 可以吗?C Linux中的微线程和中断问题,c,linux,linux-kernel,driver,tasklet,C,Linux,Linux Kernel,Driver,Tasklet,让我们假设Linux中有一个中断处理程序和一个tasklet。tasklet是从该中断处理程序调度的 中断处理程序充当某种生产者,而tasklet充当消费者。 当tasklet运行较长时间时会出现问题,当此tasklet仍在运行时会发生中断。这种干扰会导致日志中出现多个调用跟踪 如何解决这种干扰 我唯一的想法是将中断处理程序移动到某个工作队列或另一个tasklet,并从中断处理程序调度它 可以吗? 还有其他想法吗 系统编程的经验法则:在ISR中尽量少做。简短回答:修复代码中未显示的错误。如果代码
还有其他想法吗 系统编程的经验法则:在ISR中尽量少做。简短回答:修复代码中未显示的错误。如果代码导致调用跟踪,则修复代码。如果是ISR和tasklet之间的干预,并且您确定tasklet没有问题,则使用workqueue而不是tasklet。工作队列在进程上下文中运行,在出现新的中断时可以休眠。首先,这个问题中最有趣的是调用跟踪只出现在内核源中,而不出现在驱动程序中。第二,我在tasklet开始时禁用IRQ,在tasklet结束时启用IRQ,从而防止了干扰的发生。删除列表napi->poll\u list时,process\u backlog过程中出现问题调用跟踪,因为此过程尝试删除已删除的poll\u列表。请在tasklet代码周围使用自旋锁,自旋锁irqsave可禁用中断。如上所述,经验法则是在微线程中做一些小事情。