【发布时间】:2014-02-06 05:51:34
【问题描述】:
我在使用 CMA 时遇到问题。我正在尝试通过 CMA(连续内存分配)为运行 linux 3.8 内核的基于 ARM 的目标板分配设备内存。
通过私有 cma 节点请求内存分配时,结果是“NO memin CMA area”。尽管我们保留了所需的内存。在调试“_alloc_contig_migrate_range”函数时,我们发现部分页面迁移失败,导致CMA区域出现NO 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(page) -->3 和 expected_count-->2 不匹配,因此重复返回 -EAGAIN。
在查看页面标志时,我发现标志不同。
迁移成功-> 0xc3a40059
迁移失败-> 0xc3a0000d
标志的区别是
观察标志--> PG_dirty PG_active PG_swapbacked PG_referenced
迁移成功----> 放 放 放 未设置
迁移失败------> 没有设置 没有设置 没有设置 设置
任何建议都会有所帮助。
【问题讨论】:
标签: linux memory-management linux-kernel linux-device-driver