我正在处理一个设备驱动程序,它在中断服务程序(ISR)和read()
调用之间共享资源。
ISR仅调用schedule_work()
函数,以便让底半部分来完成繁重的工作。该资源在read()
(即用户上下文)和实现底半部分的函数之间进行共享,这就是为什么我要使用spin_lock_bh()
进行锁定。
我不理解锁定机制。假设当前有人持有锁,当ISR调用schedule_work()
时会发生什么(即在持有锁时触发硬件中断)?任务是否仍然会被调度并在以后的时间运行,还是被丢弃了?换句话说......实际上"锁定"或防止什么(即工作队列还是执行工作)?工作队列是否会更新?
与我的问题相反,如果我使用spin_lock_irqsave()
,则在持有锁时ISR将被禁用,因此我一开始就无法执行schedule_work()
。但是考虑到资源是共享的,我认为没有必要也不想在持有锁时禁用硬件中断。