On Thu 2016-08-18 18:51:44, Sergey Senozhatsky wrote: > On (08/18/16 11:33), Petr Mladek wrote: > [..] > > > > 2. Force synchronous printk inside WARN()/BUG() macros. > > > > > > will it help? semaphore up() calls wake_up_process() regardless the > > > context. > > > not to mention that we still may have spin_dump() enabled. > > > > Good point. That changes my preferences :-) > > > > > > > > > 3. Force printk_deferred() inside WARN()/BUG() macros via the per-CPU > > > > printk_func. > > > > > > > > It might be elegant. But we do not want this outside the scheduler > > > > code. Therefore we would need special variants of WARN_*_SCHED() > > > > BUG_*_SCHED() macros. > > > > Also we need to make sure that everything will be done on a single CPU > > as the printk_func is per-CPU variable. > > lib/dump_stack.c dump_stack() disables local IRQs, so we will stay > on the same CPU.
It is less important to stay of the same CPU if you use printk_deferred() directly. But it us must to have if you use it via the printk_func per-CPU variable. The advantage of the printk_func trick is that it is transparent. You do not need to modify any existing functions used by WARN()/BUG() macros. Best Regards, Petr