如何在驱动程序中实现一个阻塞型IO,等待队列就是最常用的方法。
对于一个阻塞操作来说,我们的驱动程序应该阻塞该进程,将其置入休眠状态直到请求可继续。
一、休眠的简单介绍
当一个进程被置为睡眠,它被标识为处于一个特殊的状态并且从调度器的运行队列中去除。直到发生某些情况下改变了这个状态, 进程将才会在任意 CPU 上调度,,即运行该进程。 休眠中的进程会被搁置到系统的一边, 等待将来的某个事件发生。
对Linux驱动来说,让一个进程、进入休眠状态很容易。但是,为了将进程以一种安全的方式进入休眠,我们需要牢记及两条规则:
第一条:
永远不要在原子上下文中进入休眠。那什么是原子上下文呢:在执行多个步骤时,不能被间断,不能有任何的并发访问。这就意味着,对于休眠来说,我们的驱动程序不能使在持有自旋锁,seqlock或者RCU锁时休眠。如果我们禁止了中断,也不能休眠。
在持有信号量时休眠是合法的,但是必须仔细检查持有信号量时休眠的那段代码。如果代码在拥有信号量时休眠,任何其他等待该信号量的线程也会休眠,所以任何持有信号量而休眠的代码必须很短。