我正面临着CMA的问题。我试图通过CMA(连续内存分配)为运行Linux3.8内核的基于ARM的目标板分配设备内存。
当通过私有cma节点请求内存分配时,结果是“无memin CMA区域”。尽管我们已经预留了所需的内存。在调试"_alloc_contig_migrate_range“函数时,我们发现一些页面的迁移失败了,在CMA区域没有出现mem。
当满足以下条件的页面被迁移时,在"migrate_page_move_mapping(migrate.c)“函数中。
if (!mapping) {
/* Anonymous page without mapping */
if (page_count(page) != 1) {
return -EAGAIN;
}
return MIGRATEPAGE_SUCCESS;
}其他页面失败,并在migrate_page_move_mapping()中返回
if (page_count(page) != expected_count ||
radix_tree_deref_slot_protected(pslot, &mapping->tree_lock) != page) {
spin_unlock_irq(&mapping->tree_lock);
return -EAGAIN;
}而page_count(页)->3和预期的_count->2不匹配,因此重复返回-EAGAIN。
在查看页面标志时,我发现在标志中有不同之处。
迁移成功-> 0xc3a40059
迁移失败> 0xc3a0000d
旗子中的差异是
观察标志-> PG_dirty PG_active PG_swapbacked PG_referenced
迁移成功->设置NOTSET
迁移失败-> NOTSET集
任何建议都会有帮助。
发布于 2017-12-26 10:50:40
CMA迁移可能在3.18岁以上的内核上失败的几个原因已记录在案。
与人们普遍的看法相反,Linux内核中的连续内存分配器框架 不能保证系统整个生命周期内连续内存的可用性。
CMA的核心概念如下…
问题在于在某些情况下,
步骤3a中的页面迁移可能失败。这可能是由于:
由于没有关于更新/替换CMA的单一方法的建议,它继续以目前的形式存在,大部分时间都在工作,但在所有可能的情况下都不能保证连续内存。随着SMMU的出现和对其他控制器的分散收集DMA支持的出现,对大型连续缓冲区的需求减少了。
尽管如此,有两种改进CMA的主要方法已经尝试过,并在一些圈子中得到了接受:
这两种方法都有自己的局限性,其基础是它们认为可以接受的妥协。
https://stackoverflow.com/questions/21595069
复制相似问题