尊敬的书Linux Driver Development

传递给flagsspin_unlock_irqrestore参数必须与传递给spin_lock_irqsave的变量相同。 您还必须在同一函数中调用spin_lock_irqsavespin_unlock_irqrestore。否则,您的代码可能会在某些架构上中断。

但是我找不到the official documentation bundled with the kernel code itself要求的任何此类限制。我找到driver code that violates this guidance

显然,从单独的函数中调用spin_lock_irqsavespin_unlock_irqrestore并不是一个好主意,因为您应该尽量减少持有锁时的工作量(禁用中断,不少!)。但是,如果对内核进行了更改,是否经过精心处理,是否真的没有违反API合同,还是仍然可以这样做?

如果在某个时候取消了限制,那么它是否适用于3.10.17版本?

最佳答案

除了这本书,我再也没有看到过这种限制。书中给定的信息可能已经过时,或者..完全错误。

在当前内核中(至少从我开始使用的2.6.32开始),实际的锁定是通过spin_lock_irqsave的多层嵌套调用来完成的(例如参见__raw_spin_lock_irqsave,在中间被调用)。因此,针对lockunlock的不同函数上下文几乎不会成为功能失常的原因。

10-04 21:55
查看更多