gpt4 book ai didi

linux - 从 CMA(连续内存分配器)区域迁移页面失败

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:34:37 25 4
gpt4 key购买 nike

我在 CMA 方面遇到了问题。我正在尝试通过 CMA(连续内存分配)为运行 Linux 3.8 内核的基于 ARM 的目标板分配设备内存。

通过私有(private) cma 节点请求内存分配时,结果为“NO memin CMA area”。尽管我们保留了所需的内存。在调试“_alloc_contig_migrate_range”函数时,我们发现某些页面的迁移失败,导致CMA区域没有内存。

在迁移“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() from

    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_脏 PG_active PG_swapbacked PG_引用

迁移成功----> 放 放 放 未设置

迁移失败------> 没有设置 没有设置 没有设置 设置

任何建议都会有所帮助。

最佳答案

记录了 CMA 迁移在早于 3.18 的内核上失败的几个原因
<强> here (伙伴分配器会计错误) here (不支持 KSM 迁移)

Contrary to popular belief, the Contiguous Memory Allocator framework in the Linux kernel
does NOT gurantee the availability of the contiguous memory throughout the lifetime of the system.

CMA的核心概念如下...

  1. 在启动时,允许将一定数量的内存定义为连续缓冲池。
  2. 在运行时,允许从这个连续的缓冲池中为常规内存分配请求分配内存(作为最后的手段)。
  3. 每当请求大的连续缓冲区时,

    一个。立即将上面step2分配的页面迁移到常规内存池中。

    为请求者提供一个大的连续缓冲区。

问题在于,在某些情况下,
迁移步骤 3a 中的页面可能会失败。这可能是由于:

  • 缺少空闲内存交换 作为迁移已在 CMA 池中分配的非连续小页面的目的地。
  • 流程能力 pin memory/buffers分配给他们。

由于没有就更新/替换 CMA 的单一方法达成共识,因此它在大部分时间都以当前形式继续存在,但不能保证在所有可能的情况下内存都是连续的。随着 SMMU 的出现和对其他 Controller 的分散-聚集 DMA 支持,对大型连续缓冲区的需求减少了。


也就是说,有两种改进 CMA 的主要方法已经过尝试并在某些圈子中得到认可:

  1. GCMA

  2. ZONE CMA

这两种方法都有其自身的局限性,基于他们认为可以接受的妥协。

关于linux - 从 CMA(连续内存分配器)区域迁移页面失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21595069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com