如何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 分配失败。

  1. 在分配前和分配后不断检查/proc/pagetypeinfo,如果页面返回或未返回初始阶段,它会提示您。

  2. 要获取页面信息,请参考以下内容link:-

  3. stable kernel bug 这里是补丁link

根据link :-

此 cma 机制存在以下弱点。

  1. 分配失败 由于以下原因,CMA 可能无法分配连续内存。

    1-1。直接固定 任何内核线程都可以长时间固定任何可移动页面。如果需要为连续内存分配迁移的可移动页面已被某人固定,则无法完成迁移。因此,如果页面长时间未取消固定,连续分配可能会失败。

    1-2。间接引脚 如果一个可移动页面依赖于一个对象,该对象将增加可移动页面的引用计数以断言可以安全使用该页面。如果在这种情况下需要为连续内存分配迁移可移动页面,则该页面不能被连续分配免费使用。 因此,连续分配可能会失败。

简而言之,cma 不保证连续内存分配的成功和快速延迟。而且,核心原因是 cma 选择 2nd-class 客户端(可移动页面)不够好(难以迁移/丢弃)