是否有任何可用于CMA失败调试的开源调试方法/修补程序?如何了解CMA分配失败的原因
发布于 2019-06-20 06:03:31
1.当cma_allocation失败时,它会转储失败的回溯。
例如:
35.360001页:bef55be8计数:58张地图:56张地图:bc4001dc索引:0x3
35.366855标志: 0x8019040c(referenced|uptodate|arch_1|mappedtodisk|unevictable|mlocked)
原价: 8019040c bc4001dc 00000003 00000037 0000003a b9eb1a98 b9eb1a98 00000000
35.383299 raw: be008c00
35.385916页转储是因为:VM_BUG_ON_PAGE(PageLRU(页面)\x{e76f}PageUnevictable(页))
35.393995页->mem_cgroup:be008c00
35.397668
35.402281内核错误在mm/vmsn.c:1350!
35.406458内部错误: Oops - BUG: 0 #1抢占SMP手臂
37.778079回溯:
37.780531 (shrink_page_list)来自<803617c8>
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)来自<80352b2c>
37.810178 r10:00000000 r9:8121e384 R8:814790c4R7:b9c6e000 r6:0006a000 r5:00081a00 37.817999 r4:b9c6fb9c
37.820529 (alloc_contig_range)来自<803bd8c8> 37.828527 r10:00040000 R9:00017c00R8:fffff4R7:00017c00R6:8147bf24R5:00009e00 37.836347 r4:00069e00
37.838878 (cma_alloc)来自<80694188>
37.847310 r10:00000000 r9:80607f30 r8:b9c6fd64 R7:00017c00R6:17c00000 r5:81216588 37.855131 r4:00000001
37.857661 (dma_alloc_from_contiguous)来自<80218720>
37.867396 (__alloc_from_contiguous)来自<80218854>
37.876523 r10:00000000 r9:b9c6fe08 r8:81216588 r7:00c00000 r6:b94d0140 r5:80607f30 37.884343 r4:00000001
37.886870 (cma_allocator_alloc)来自<80217e28>
37.895125 R5:bd2da400r4:014000c0 37.898695 (__dma_alloc)来自<80218000>
37.906258 r10:00000080 r9:17c00000 r8:80c01778 r7:bd2da400 r6:8148ff6c r5:00c00000 37.914079 r4:00000707
37.916608 (arm_dma_alloc)来自<80607f30> r5:81490278 r4:81216588
可以使用此回溯来调试cma分配失败。
据链接称:-
这一机制存在以下弱点。
总之,cma不能保证连续内存分配的成功和快速延迟。其核心原因是cma选择二级客户端(可移动页面)不够好(很难迁移/丢弃)。
https://stackoverflow.com/questions/55017182
复制相似问题