尊敬的书Linux Driver Development说
传递给flags
的spin_unlock_irqrestore
参数必须与传递给spin_lock_irqsave
的变量相同。 您还必须在同一函数中调用spin_lock_irqsave
和spin_unlock_irqrestore
。否则,您的代码可能会在某些架构上中断。
但是我找不到the official documentation bundled with the kernel code itself要求的任何此类限制。我找到driver code that violates this guidance。
显然,从单独的函数中调用spin_lock_irqsave
和spin_unlock_irqrestore
并不是一个好主意,因为您应该尽量减少持有锁时的工作量(禁用中断,不少!)。但是,如果对内核进行了更改,是否经过精心处理,是否真的没有违反API合同,还是仍然可以这样做?
如果在某个时候取消了限制,那么它是否适用于3.10.17版本?
最佳答案
除了这本书,我再也没有看到过这种限制。书中给定的信息可能已经过时,或者..完全错误。
在当前内核中(至少从我开始使用的2.6.32开始),实际的锁定是通过spin_lock_irqsave
的多层嵌套调用来完成的(例如参见__raw_spin_lock_irqsave,在中间被调用)。因此,针对lock
和unlock
的不同函数上下文几乎不会成为功能失常的原因。