記憶體熱插拔¶
將 CXL 記憶體呈現給核心頁面分配器的最後階段是讓 DAX 驅動程式透過記憶體熱插拔元件呈現 驅動程式管理 記憶體區域。
需要考慮四個主要配置
預設線上行為(開/關和區域)
熱插拔記憶體塊大小
記憶體對映資源位置
驅動程式管理的記憶體指定
預設線上行為¶
熱插拔記憶體的預設線上行為由以下因素決定,按優先順序排序
CONFIG_MHP_DEFAULT_ONLINE_TYPE構建配置memhp_default_state啟動引數/sys/devices/system/memory/auto_online_blocks值
這些決定了熱插拔記憶體塊到達以下三種狀態之一
離線
線上,位於
ZONE_NORMAL線上,位於
ZONE_MOVABLE
ZONE_NORMAL 表示此容量可用於幾乎任何分配,而 ZONE_MOVABLE 表示此容量僅應用於可遷移的分配。
ZONE_MOVABLE 嘗試保留記憶體塊的熱插拔能力,以便稍後可以熱拔出整個區域。 任何上線到 ZONE_NORMAL 的容量都應被視為永久附加到頁面分配器。
熱插拔記憶體塊大小¶
預設情況下,在大多數架構上,熱插拔記憶體塊大小為 128MB 或 256MB。 在 x86 上,隨著總記憶體容量超過 64GB,塊大小會增加到 2GB。 從 v6.15 開始,Linux 在確定熱插拔記憶體塊大小時,不會考慮 ACPI CEDT CFMWS 區域的大小和對齊方式(請參閱早期啟動文件)。
記憶體對映¶
用於表示熱插拔記憶體容量的 struct folio 分配的位置由以下系統設定決定
/sys_module/memory_hotplug/parameters/memmap_on_memory/sys/bus/dax/devices/daxN.Y/memmap_on_memory
如果這兩個引數都設定為 true,則此容量的 struct folio 將從正在上線的記憶體塊中劃分出來。 如果記憶體的延遲特別高且其 struct folio 變得競爭激烈,則這會產生效能影響。
如果任一引數設定為 false,則此容量的 struct folio 將從執行熱插拔過程的處理器的本地節點分配。 此容量將從該節點上的 ZONE_NORMAL 分配,因為它是一個 GFP_KERNEL 分配。
具有極大量 ZONE_MOVABLE 記憶體(例如 CXL 記憶體池)的系統必須確保有足夠的本地 ZONE_NORMAL 容量來託管熱插拔容量的記憶體對映。
驅動程式管理的記憶體¶
DAX 驅動程式將此記憶體作為“驅動程式管理”呈現給記憶體熱插拔。 這不是一個可配置的設定,但需要注意的是,驅動程式管理的記憶體被明確排除在 kexec 期間使用。 這是必需的,以確保 CXL 裝置在功能系統重啟期間可能受到的任何重置或帶外操作(例如 probe 時重置)不會導致 kexec 核心的部分被覆蓋。