首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从CMA(连续内存分配器)区域迁移失败

从CMA(连续内存分配器)区域迁移失败
EN

Stack Overflow用户
提问于 2014-02-06 05:51:34
回答 1查看 1.6K关注 0票数 1

我正面临着CMA的问题。我试图通过CMA(连续内存分配)为运行Linux3.8内核的基于ARM的目标板分配设备内存。

当通过私有cma节点请求内存分配时,结果是“无memin CMA区域”。尽管我们已经预留了所需的内存。在调试"_alloc_contig_migrate_range“函数时,我们发现一些页面的迁移失败了,在CMA区域没有出现mem。

当满足以下条件的页面被迁移时,在"migrate_page_move_mapping(migrate.c)“函数中。

代码语言:javascript
复制
   if (!mapping) {
            /* Anonymous page without mapping */
             if (page_count(page) != 1) {
                         return -EAGAIN;
             }
             return MIGRATEPAGE_SUCCESS;
   }

其他页面失败,并在migrate_page_move_mapping()中返回

代码语言:javascript
复制
    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集

任何建议都会有帮助。

EN

回答 1

Stack Overflow用户

发布于 2017-12-26 10:50:40

CMA迁移可能在3.18岁以上的内核上失败的几个原因已记录在案。

这里 (好友分配器记帐错误)和这里(不支持KSM迁移)。

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

CMA的核心概念如下…

  1. 在启动时,允许将一定数量的内存定义为连续缓冲池。
  2. 在运行时,允许从这个连续缓冲池为常规内存分配请求分配内存(作为最后手段)。
  3. 每当请求一个大型的连续缓冲区时, 立即将上面step2中分配的页面迁移到常规内存池中。 向请求者提供一个大型的连续缓冲区。

问题在于在某些情况下,

步骤3a中的页面迁移可能失败。这可能是由于:

  • 缺少空闲内存交换作为迁移已在CMA池中分配的非连续小页面的目的地。
  • 进程分配给引脚存储器/缓冲器的能力。

由于没有关于更新/替换CMA的单一方法的建议,它继续以目前的形式存在,大部分时间都在工作,但在所有可能的情况下都不能保证连续内存。随着SMMU的出现和对其他控制器的分散收集DMA支持的出现,对大型连续缓冲区的需求减少了。

尽管如此,有两种改进CMA的主要方法已经尝试过,并在一些圈子中得到了接受:

  1. GCMA
  2. CMA区

这两种方法都有自己的局限性,其基础是它们认为可以接受的妥协。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21595069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档