【问题标题】:How to debug/find cma allocation failure reason?如何调试/查找 cma 分配失败原因?
【发布时间】:2019-07-27 18:27:16
【问题描述】:

是否有任何开源调试方法/补丁可用于 CMA 故障调试? 如何知道 CMA 分配失败的原因

【问题讨论】:

  • 您是在尝试调试声明(设置)CMA 区域,还是调试从 CMA 区域分配页面?
  • 我正在尝试从 cma 区域(可移动页面)调试分配的页面,当尝试分配 cma 缓冲区失败时,如何知道迁移失败/页面被其他进程固定,如何知道/确认失败的原因。
  • 您可以配置CONFIG_CMA_DEBUG在CMA分配和释放页面时将各种消息打印到内核调试日志,但很难找出负责分配页面的原因。
  • CONFIG_CMA_DEBUG 已经启用的信息不多。
  • 还有一个debugfs接口可以开启显示分配页面的映射,由CONFIG_CMA_DEBUGFS配置。

标签: memory-management linux-kernel linux-device-driver embedded-linux


【解决方案1】:

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

  1. 在分配前和分配后不断检查/proc/pagetypeinfo,它会给你提示页面是否回到初始阶段。

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

  3. 这里的稳定内核bug是补丁link

根据link:-

这种 cma 机制存在以下弱点。

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

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

    1-2。间接销 如果可移动页面与对象有依赖关系,则该对象将增加可移动页面的引用计数以断言使用该页面是安全的。如果是需要为连续内存分配迁移的可移动页面,则该页面不能被连续分配使用。 因此,连续分配可能会失败。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 2017-08-23
    • 1970-01-01
    • 2016-08-21
    • 2021-12-09
    相关资源
    最近更新 更多