簡體   English   中英

頁面遷移從CMA(連續內存分配器)區域失敗

[英]Page migration fails from CMA(contiguous memory allocator) area

我面臨CMA的問題。 我正在嘗試通過CMA(連續內存分配)為運行Linux 3.8內核的基於ARM的目標板分配設備內存。

通過私有cma節點請求內存分配時,結果為“沒有memin CMA區域”。 即使我們保留了所需的內存。 在調試“ _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;
   }

其他頁面失敗並從以下位置返回migration_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

遷移成功----> SET SET SET NOTSET

遷移失敗------> NOTSET NOTSET NOTSET SET

任何建議都會有所幫助。

記錄了CMA遷移可能在3.18之前的內核上失敗的幾個原因
這里 (預算分配器會計錯誤)這里 (不支持KSM遷移)

與流行的看法相反,Linux內核中的連續內存分配器框架
不能保證在系統的整個生命周期中連續內存的可用性。

CMA的核心概念如下...

  1. 在啟動時,允許將一定數量的內存定義為連續的緩沖池。
  2. 在運行時,允許從此連續緩沖池分配內存以進行常規內存分配請求(作為最后的手段)。
  3. 每當請求大的連續緩沖區時,

    一種。 立即將上面在步驟2中分配的頁面遷移到常規內存池中。

    為請求者提供大的連續緩沖區。

問題在於,在某些情況下,
在步驟3a中遷移頁面可能會失敗。 這可能是由於:

  • 缺少可用內存交換作為遷移已在CMA池中分配的非連續小頁面的目標的位置。
  • 進程固定分配給它們的內存/緩沖區的能力。

由於沒有關於更新/替換CMA的單一方法的共識,因此它在大多數時間都以其當前形式繼續存在,但並不能保證在所有可能的情況下都具有連續的內存。 隨着SMMU的出現以及對其他控制器的分散聚集DMA支持,對大型連續緩沖區的需求越來越少。


也就是說,有兩種主要的CMA改進方法已經過嘗試,並在某些領域得到認可:

  1. GCMA

  2. 區域CMA

兩種方法都有其自身的局限性,這是基於他們認為可以接受的折衷方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM