1.当 cma_allocation 失败时,它会转储失败的回溯。
例如。
[35.360001] 页面:bef55be8 计数:58 映射计数:56 映射:bc4001dc 索引:0x3
[35.366855] 标志:0x8019040c(引用|最新|arch_1|mappedtodisk|unevictable|mlocked)
[35.375173] 原始:8019040c bc4001dc 00000003 00000037 0000003a b9eb1a98 b9eb1a98 00000000
[35.383299] 原始:be008c00
[35.385916] 页面被转储,因为:VM_BUG_ON_PAGE(PageLRU(page) || PageUnevictable(page))
[35.393995]页面->mem_cgroup:be008c00
[ 35.397668] ------------[ 剪在这里 ]------------
[35.402281] mm/vmscan.c:1350 处的内核 BUG!
[35.406458] 内部错误:糟糕 - 错误:0 [#1] PREEMPT SMP ARM
[37.778079] 回溯:
[ 37.780531] [] (shrink_page_list) 来自 []
(reclaim_clean_pages_from_list+0x14c/0x1a8)
[37.790093] r10:b9c6fb88 r9:b9c6fb9c r8:b9c6fb0c r7:8141e100 r6:81216588 r5:b9c6fb9c
[37.797914] r4:bf05ffb8
[ 37.800444] [] (reclaim_clean_pages_from_list) 来自 [] (alloc_contig_range+0x17c/0x4e0)
[37.810178] r10:00000000 r9:8121e384 r8:814790c4 r7:b9c6e000 r6:0006a000 r5:00081a00
[37.817999] r4:b9c6fb9c
[ 37.820529] [] (alloc_contig_range) 来自 [] (cma_alloc+0x154/0x5dc)
[37.828527] r10:00040000 r9:00017c00 r8:fffffff4 r7:00017c00 r6:8147bf24 r5:00009e00
[37.836347] r4:00069e00
[ 37.838878] [] (cma_alloc) 来自 [] (dma_alloc_from_contiguous+0x40/0x44)
[37.847310] r10:00000000 r9:80607f30 r8:b9c6fd64 r7:00017c00 r6:17c00000 r5:81216588
[37.855131] r4:00000001
[ 37.857661] [] (dma_alloc_from_contiguous) 来自 [] (__alloc_from_contiguous+0x54/0x144)
[ 37.867396] [] (__alloc_from_contiguous) 来自 [] (cma_allocator_alloc+0x44/0x4c)
[37.876523] r10:00000000 r9:b9c6fe08 r8:81216588 r7:00c00000 r6:b94d0140 r5:80607f30
[37.884343] r4:00000001
[ 37.886870] [] (cma_allocator_alloc) 来自 [] (__dma_alloc+0x19c/0x2e4)
[37.895125] r5:bd2da400 r4:014000c0
[ 37.898695] [] (__dma_alloc) 来自 [] (arm_dma_alloc+0x4c/0x54)
[37.906258] r10:00000080 r9:17c00000 r8:80c01778 r7:bd2da400 r6:8148ff6c r5:00c00000
[37.914079] r4:00000707
[ 37.916608] [] (arm_dma_alloc) 来自 []
[37.924690] r5:81490278 r4:81216588
您可以使用此回溯调试 cma 分配失败。
在分配前和分配后不断检查/proc/pagetypeinfo,它会给你提示页面是否回到初始阶段。
要获取页面信息,请参考以下链接:-
link
这里的稳定内核bug是补丁link
根据link:-
这种 cma 机制存在以下弱点。
-
分配失败
由于以下原因,CMA 可能无法分配连续内存。
1-1。直接固定
任何内核线程都可以长时间固定任何可移动页面。如果需要为连续内存分配迁移的可移动页面已被某人固定,则无法完成迁移。因此,如果页面没有长时间取消固定,连续分配可能会失败。
1-2。间接销
如果可移动页面与对象有依赖关系,则该对象将增加可移动页面的引用计数以断言使用该页面是安全的。如果是需要为连续内存分配迁移的可移动页面,则该页面不能被连续分配使用。
因此,连续分配可能会失败。
简而言之,cma 不保证连续内存分配的成功和快速延迟。而且,核心原因是 cma 选择的二级客户端(可移动页面)不够好(难以迁移/丢弃)