记录一些Linux上的琐碎的设计点,期待有一天点连成线,构成面。:)
1.printk会调用try_to_wake_up,
调用路径为: printk->printk_emit->console_unlock()->up_console_sem->up->__up->wake_up_process-->try_to_wake_up.
而 try_to_wake_up会获取rq spinlock.
这意味着什么呢?意味着printk不能再调度器里面调用,这样会死锁,因为调度器里面已经获取了rq spinlock,spinlock不能重复获取,会死锁。
如果调度器里面想加打印怎么办,内核单独提供了printk_deferred函数,这个函数会绕靠up的调用。