如何debug/find cma配置失败原因?
How to debug/find cma allocation failure reason?
是否有任何可用于 CMA 故障调试的开源调试 methods/patch?
如何知道CMA分配失败的原因
1.When cma_allocation 失败转储失败回溯。
例如
[35.360001]page:bef55be8count:58mapcount:56mapping:bc4001dcindex:0x3
[35.366855] 标志:0x8019040c(参考|最新|arch_1|映射到磁盘|不可清除|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] 内核 BUG 在 mm/vmscan.c:1350!
[35.406458] 内部错误:糟糕 - BUG:0 [#1] PREEMPT SMP ARM
[37.778079]回溯:
[ 37.780531] [<80360610>] (shrink_page_list) 来自 [<803617c8>]
(reclaim_clean_pages_from_list+0x14c/0x1a8)
[37.790093]r10:b9c6fb88r9:b9c6fb9cr8:b9c6fb0cr7:8141e100r6:81216588r5:b9c6fb9c
[ 37.797914] r4:bf05ffb8
[ 37.800444] [<8036167c>] (reclaim_clean_pages_from_list) 来自 [<80352b2c>] (alloc_contig_range+0x17c/0x4e0)
[37.810178]r10:00000000r9:8121e384r8:814790c4r7:b9c6e000r6:0006a000r5:00081a00
[37.817999]r4:b9c6fb9c
[ 37.820529] [<803529b0>] (alloc_contig_range) 来自 [<803bd8c8>] (cma_alloc+0x154/0x5dc)
[ 37.828527] r10:00040000 r9:00017c00 r8:fffffff4 r7:00017c00 r6:8147bf24 r5:00009e00
[ 37.836347] r4:00069e00
[ 37.838878] [<803bd774>] (cma_alloc) 来自 [<80694188>] (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] [<80694148>] (dma_alloc_from_contiguous) 来自 [<80218720>] (__alloc_from_contiguous+0x54/0x144)
[ 37.867396] [<802186cc>] (__alloc_from_contiguous) 来自 [<80218854>] (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] [<80218810>] (cma_allocator_alloc) 来自 [<80217e28>] (__dma_alloc+0x19c/0x2e4)
[37.895125]r5:bd2da400r4:014000c0
[ 37.898695] [<80217c8c>] (__dma_alloc) 来自 [<80218000>] (arm_dma_alloc+0x4c/0x54)
[37.906258]r10:00000080r9:17c00000r8:80c01778r7:bd2da400r6:8148ff6cr5:00c00000
[37.914079]r4:00000707
[ 37.916608] [<80217fb4>] (arm_dma_alloc) 来自 [<80607f30>]
[37.924690]r5:81490278r4:81216588
您可以使用此回溯调试 cma 分配失败。
在分配前和分配后不断检查/proc/pagetypeinfo,如果页面返回或未返回初始阶段,它会提示您。
要获取页面信息,请参考以下内容link:-
stable kernel bug 这里是补丁link
根据link :-
此 cma 机制存在以下弱点。
分配失败
由于以下原因,CMA 可能无法分配连续内存。
1-1。直接固定
任何内核线程都可以长时间固定任何可移动页面。如果需要为连续内存分配迁移的可移动页面已被某人固定,则无法完成迁移。因此,如果页面长时间未取消固定,连续分配可能会失败。
1-2。间接引脚
如果一个可移动页面依赖于一个对象,该对象将增加可移动页面的引用计数以断言可以安全使用该页面。如果在这种情况下需要为连续内存分配迁移可移动页面,则该页面不能被连续分配免费使用。
因此,连续分配可能会失败。
简而言之,cma 不保证连续内存分配的成功和快速延迟。而且,核心原因是 cma 选择 2nd-class 客户端(可移动页面)不够好(难以迁移/丢弃)
是否有任何可用于 CMA 故障调试的开源调试 methods/patch? 如何知道CMA分配失败的原因
1.When cma_allocation 失败转储失败回溯。
例如
[35.360001]page:bef55be8count:58mapcount:56mapping:bc4001dcindex:0x3
[35.366855] 标志:0x8019040c(参考|最新|arch_1|映射到磁盘|不可清除|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] 内核 BUG 在 mm/vmscan.c:1350!
[35.406458] 内部错误:糟糕 - BUG:0 [#1] PREEMPT SMP ARM
[37.778079]回溯:
[ 37.780531] [<80360610>] (shrink_page_list) 来自 [<803617c8>] (reclaim_clean_pages_from_list+0x14c/0x1a8)
[37.790093]r10:b9c6fb88r9:b9c6fb9cr8:b9c6fb0cr7:8141e100r6:81216588r5:b9c6fb9c [ 37.797914] r4:bf05ffb8
[ 37.800444] [<8036167c>] (reclaim_clean_pages_from_list) 来自 [<80352b2c>] (alloc_contig_range+0x17c/0x4e0)
[37.810178]r10:00000000r9:8121e384r8:814790c4r7:b9c6e000r6:0006a000r5:00081a00 [37.817999]r4:b9c6fb9c
[ 37.820529] [<803529b0>] (alloc_contig_range) 来自 [<803bd8c8>] (cma_alloc+0x154/0x5dc) [ 37.828527] r10:00040000 r9:00017c00 r8:fffffff4 r7:00017c00 r6:8147bf24 r5:00009e00 [ 37.836347] r4:00069e00
[ 37.838878] [<803bd774>] (cma_alloc) 来自 [<80694188>] (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] [<80694148>] (dma_alloc_from_contiguous) 来自 [<80218720>] (__alloc_from_contiguous+0x54/0x144)
[ 37.867396] [<802186cc>] (__alloc_from_contiguous) 来自 [<80218854>] (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] [<80218810>] (cma_allocator_alloc) 来自 [<80217e28>] (__dma_alloc+0x19c/0x2e4)
[37.895125]r5:bd2da400r4:014000c0 [ 37.898695] [<80217c8c>] (__dma_alloc) 来自 [<80218000>] (arm_dma_alloc+0x4c/0x54)
[37.906258]r10:00000080r9:17c00000r8:80c01778r7:bd2da400r6:8148ff6cr5:00c00000 [37.914079]r4:00000707
[ 37.916608] [<80217fb4>] (arm_dma_alloc) 来自 [<80607f30>] [37.924690]r5:81490278r4:81216588
您可以使用此回溯调试 cma 分配失败。
在分配前和分配后不断检查/proc/pagetypeinfo,如果页面返回或未返回初始阶段,它会提示您。
要获取页面信息,请参考以下内容link:-
stable kernel bug 这里是补丁link
根据link :-
此 cma 机制存在以下弱点。
分配失败 由于以下原因,CMA 可能无法分配连续内存。
1-1。直接固定 任何内核线程都可以长时间固定任何可移动页面。如果需要为连续内存分配迁移的可移动页面已被某人固定,则无法完成迁移。因此,如果页面长时间未取消固定,连续分配可能会失败。
1-2。间接引脚 如果一个可移动页面依赖于一个对象,该对象将增加可移动页面的引用计数以断言可以安全使用该页面。如果在这种情况下需要为连续内存分配迁移可移动页面,则该页面不能被连续分配免费使用。 因此,连续分配可能会失败。
简而言之,cma 不保证连续内存分配的成功和快速延迟。而且,核心原因是 cma 选择 2nd-class 客户端(可移动页面)不够好(难以迁移/丢弃)