kmalloc fail导致系统异常

如果在中断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] [] (unwind_backtrace+0x0/0xdc) from [] (show_stack+0x10/0x14)
[80572.524793] [] (show_stack+0x10/0x14) from [] (__schedule_bug+0x48/0x64)
[80572.533211] [] (__schedule_bug+0x48/0x64) from [] (__schedule+0x80/0x730)
[80572.541716] [] (__schedule+0x80/0x730) from [] (__cond_resched+0x24/0x34)
[80572.550221] [] (__cond_resched+0x24/0x34) from [] (_cond_resched+0x3c/0x44)
[80572.558903] [] (_cond_resched+0x3c/0x44) from [] (__alloc_pages_nodemask+0x3ac/0x640)
[80572.568449] [] (__alloc_pages_nodemask+0x3ac/0x640) from [] (__get_free_pages+0x10/0x24)
[80572.578260] [] (__get_free_pages+0x10/0x24) from [] (XXX_init+0x114/0x21c [mtk_hcd])

[80572.587720] [] (XXX_init+0x114/0x21c [mtk_hcd]) from [] (usb_events_timer1_func+0x1f0/0x4b0 [])


void *kmalloc(size_tsize, intflags);
用于申请较小的、连续的物理内存
1. 以字节为单位进行分配,在
2. void *kmalloc(size_tsize, intflags) 分配的内存物理地址上连续,虚拟地址上自然连续
3. gfp_mask标志:如下:
———————————————————————————————
情形                                                相应标志
———————————————————————————————
进程上下文,可以睡眠                  GFP_KERNEL
进程上下文,不可以睡眠              GFP_ATOMIC
中断处理程序                                GFP_ATOMIC
软中断                                          GFP_ATOMIC
Tasklet                                        GFP_ATOMIC
用于DMA的内存,可以睡眠         GFP_DMA | GFP_KERNEL
用于DMA的内存,不可以睡眠     GFP_DMA | GFP_ATOMIC

malloc(), vmalloc()和kmalloc()区别
[*]kmalloc和vmalloc是分配的是 内核的内存,malloc分配的是 用户态的内存
[*]kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续,(malloc不保证任何东西??)
[*]kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大
[*]内存只有在要被DMA访问的时候才需要物理上连续, 需要使用kmalloc()
[*]vmalloc比kmalloc要慢 

你可能感兴趣的:(Linux)