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

Memory management 如何调试/查找cma分配失败原因?,memory-management,linux-kernel,linux-device-driver,embedded-linux,Memory Management,Linux Kernel,Linux Device Driver,Embedded Linux,是否有任何开源调试方法/补丁可用于CMA故障调试? 如何知道CMA分配失败的原因1.当CMA\u分配失败时,它会转储失败回溯 如。 [35.360001]页面:bef55be8计数:58映射计数:56映射:bc4001dc索引:0x3 [35.366855]标志:0x8019040C参考|最新|拱门| 1 |映射到磁盘|不可战胜|锁定 [35.375173]原始:8019040c bc4001dc 00000003 00000037 0000003a b9eb1a98 b9eb1a98 0000

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

1.当CMA\u分配失败时,它会转储失败回溯

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

[35.366855]标志:0x8019040C参考|最新|拱门| 1 |映射到磁盘|不可战胜|锁定

[35.375173]原始:8019040c bc4001dc 00000003 00000037 0000003a b9eb1a98 b9eb1a98 00000000

[35.383299]原材料:be008c00

[35.385916]页面转储原因:VM_BUG_ON_PagePagelUppage|PageUnvictablePage

[35.393995]页面->成员组:be008c00

[35.397668]------[此处剪切]------

[35.402281]mm/vmscan.c上的内核错误:1350

[35.406458]内部错误:Oops-错误:0[1]抢占SMP ARM

[37.778079]回溯:

[37.780531][]从[]缩小页面列表 从\u列表+0x14c/0x1a8中回收\u干净的\u页面\u

[37.790093]r10:b9c6fb88 r9:b9c6fb9c r8:b9c6fb0c r7:8141e100 r6:81216588 r5:b9c6fb9c [37.797914]r4:bf05ffb8

[37.800444][]从[]alloc_contig_范围+0x17c/0x4e0中的_列表中回收_clean_页面

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

[37.820529][]分配范围从[]cma\u分配+0x154/0x5dc [37.828527]r10:00040000 r9:00017c00 r8:FFFFFFF 4 r7:00017c00 r6:8147bf24 r5:00009e00 [37.836347]r4:00069e00

[37.838878][]cma_alloc from[]dma_alloc_from_continuous+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_continuoused from[]自_alloc_from_continuoused+0x54/0x144

[37.867396][]自[]连续自[]cma\U分配器\U alloc+0x44/0x4c

[37.876523]r10:00000000 r9:b9c6fe08 r8:81216588 r7:00c00000 r6:b94d0140 r5:80607f30 [37.884343]r4:00000001

[37.886870][]来自[]的cma分配程序分配+0x19c/0x2e4

[37.895125]r5:bd2da400 r4:014000c0 [37.898695][]来自[]arm\U dma\U alloc+0x4c/0x54的[]dma\U alloc

[37.906258]r10:00000080 r9:17c00000 r8:80c01778 r7:bd2da400 r6:8148ff6c r5:00c00000 [37.914079]r4:00000707

[37.916608] [37.924690]r5:81490278 r4:81216588

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

在分配前和分配后不断检查/proc/pagetypeinfo,它会提示页面是否返回初始阶段

要获取页面信息,请参阅以下链接:-

稳定内核bug这里是补丁

根据:-

这种cma机制存在以下缺点

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

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

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


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

您是尝试调试设置cma区域,还是调试从cma区域分配页面?我尝试调试从cma区域分配的页面可移动页面,当尝试分配cma缓冲区失败时,如何知道迁移失败/页面被其他进程锁定,如何知道/确认失败原因。您可以配置CONFIG_CMA_DEBUG,以便在从CMA分配和释放页面时,将各种消息打印到内核调试日志,但是很难找到分配页面的原因。CONFIG\u CMA\u DEBUG已经启用了不太多的信息。还有一个debugfs接口,可以启用它来显示由CONFIG\u CMA\u debugfs配置的已分配页面的映射。