[英]Problems allocating memory with Contiguous Memory Allocator (CMA) Linux device driver development
[英]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的核心概念如下...
每當請求大的連續緩沖區時,
一種。 立即將上面在步驟2中分配的頁面遷移到常規內存池中。
灣 為請求者提供大的連續緩沖區。
問題在於,在某些情況下,
在步驟3a中遷移頁面可能會失敗。 這可能是由於:
由於沒有關於更新/替換CMA的單一方法的共識,因此它在大多數時間都以其當前形式繼續存在,但並不能保證在所有可能的情況下都具有連續的內存。 隨着SMMU的出現以及對其他控制器的分散聚集DMA支持,對大型連續緩沖區的需求越來越少。
也就是說,有兩種主要的CMA改進方法已經過嘗試,並在某些領域得到認可:
兩種方法都有其自身的局限性,這是基於他們認為可以接受的折衷方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.