如果在中断ISR中间有作memory alloc的动作,有可能会遇到如下的BUG log信息,分析如下:
1 ISR中不能存在任何可调度的动作,如sleep等
2 在ISR中申请memory时,最好尽量使用 kmalloc(xxx, GFP_ATOMIC), 而不要使用kmalloc(xxx, GFP_KERNEL), 因为GFP_KERNEL是可以被打断的,如果因memory not enough 或其他原因alloc fail掉,则kmalloc动作将会被调度走,并等待下一次alloc, 这样就会导致kernel BUG.
[80572.488640] BUG: scheduling while atomic: BGM/821/0x40000103
[80572.494232] Modules linked in: snd_mtk mali_kbase(O) ump(O) kds(O) mtk_mmap(PO) usbhid usb_storage mtk_hcd ntfs btmtk_usb mt7662u_sta(O) driver_cli(PO) mtk_mod(PO) fusion(O)[80572.509686] CPU: 1 PID: 821 Comm: BGM Tainted: P W O 3.10.79 #1
[80572.516296] [<c0012d24>] (unwind_backtrace+0x0/0xdc) from [<c0010db0>] (show_stack+0x10/0x14)
[80572.524793] [<c0010db0>] (show_stack+0x10/0x14) from [<c037d720>] (__schedule_bug+0x48/0x64)
[80572.53321