如何调试/查找cma分配失败原因?

时间:2019-03-06 06:48:25

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

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

1 个答案:

答案 0 :(得分:1)

1。当cma_allocation失败时,它将转储失败的回溯。

例如

[35.360001]页面:bef55be8计数:58 mapcount:56映射:bc4001dc索引:0x3

[35.366855]标志:0x8019040c(已引用|最新| arch_1 |映射到磁盘|无法迁移|已锁定)

[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]内部错误:糟糕-错误:0 [#1] PREEMPT SMP ARM


[37.778079]回溯:

[37.780531]来自[<803617c8>]的[<80360610>](收缩页面列表) (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] [<8036167c>](来自[<80352b2c>](alloc_contig_range + 0x17c / 0x4e0)的(reclaim_clean_pages_from_list)

[37.810178] r10:00000000 r9:8121e384 r8:814790c4 r7:b9c6e000 r6:0006a000 r5:00081a00 [37.817999] r4:b9c6fb9c

[37.820529]来自[<803bd8c8>]的[<803529b0>](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] [<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:bd2da400 r4:014000c0 [37.898695] [<802178000>]中的[<80217c8c>](__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]来自[<80607f30>]的[<80217fb4>](arm_dma_alloc) [37.924690] r5:81490278 r4:81216588


您可以使用此回溯调试cma分配失败。

  1. 在分配之前和分配之后连续检查/ proc / pagetypeinfo,它会提示您页面是否回到初始阶段。

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

  3. 稳定的内核错误,这里是补丁link

根据link:-

这种cma机制具有以下弱点。

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

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

    1-2。间接针 如果可移动页面与对象具有依赖性,则该对象将增加可移动页面的引用计数,以断言使用该页面是安全的。如果在这种情况下需要为连续的内存分配而迁移的可移动页面,则该页面不能自由地供连续分配使用。 因此,连续分配可能会失败。

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