【问题标题】:Page migration fails from CMA(contiguous memory allocator) areaCMA(连续内存分配器)区域的页面迁移失败
【发布时间】: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


    【解决方案1】:

    记录了 CMA 迁移在早于 3.18 的内核上可能失败的几个原因
    here (伙伴分配器记帐错误) 和 @987654322 @(不支持 KSM 迁移)。

    与流行的看法相反,Linux 内核中的 连续内存分配器 框架
    不保证在系统的整个生命周期内连续内存的可用性。

    CMA的核心概念如下...

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

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

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

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

    • 缺少 可用内存 或 swap 作为迁移已在 CMA 池中分配的非连续小页面的目标。
    • 进程将pin memory/buffers 分配给它们的能力。

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


    也就是说,有 2 种改进 CMA 的主要方法已被尝试并在某些圈子中被接受:

    1. GCMA

    2. ZONE CMA

    根据他们认为可接受的折衷方案,这两种方法都有其自身的局限性。

    【讨论】:

      猜你喜欢
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      • 2019-10-23
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 2016-12-19
      相关资源
      最近更新 更多