補丁正在通過 x86/urgent 掛起,以解決英特爾 Alder Lake 和 Raptor Lake 處理器的問題,該問題讓內核開發人員暫時禁用這些英特爾移動/桌面處理器的進程上下文標識符 (PCID)。
一個補丁將被設置為 Linux 6.4 開發的主線,並且還向後移植到穩定的內核版本,以避免不完整的全局 INVLPG 刷新。來自一位英特爾 Linux 工程師解釋說:
“INVLPG 指令用於使指定虛擬地址的 TLB 條目無效。啟用 PCID 後,INVLPG 應該使指定地址的 TLB 條目無效當前的 PCID * 和 * 全局條目。(注意:只有內核映射設置 Global=1。)
不幸的是,一些 INVLPG 實現可能會在啟用 PCID 時保留全局轉換不刷新。
作為解決方法,永遠不要在受影響的處理器上啟用 PCID。
我預計最終會有微碼緩解措施來取代這個軟件變通辦法。但是,現在還不知道確切的版本號。一旦版本號確定下來,處理器列表就可以調整為僅在受影響的處理器上禁用 PCID受影響的微碼。
注意:如果有人想要不需要打補丁的快速修復,只需在內核命令行上輸入“nopcid”即可。”
受影響的處理器結束是 Intel Alder Lake 和 Raptor Lake 處理器。正如補丁消息中提到的那樣,據說 Intel 正在研究針對此問題的微代碼緩解,但目前至少 Linux 內核已設置為禁用對 Alder Lake/Alder Lake 的 PCID 支持L/Alder Lake N/Raptor Lake/Raptor Lake P/Raptor Lake S,直到可以處理微代碼緩解。
INVLPG 用於使指定的 TLB 條目無效。至少 Alder Lake 和 Raptor Lake不需要內核頁表隔離(KPTI)來緩解崩潰,因為這些較新的處理器不受它的影響。但是對於較舊的英特爾處理器,PCID 支持有助於抵消處理內核頁表隔離/緩解崩潰的一些開銷,如圖所示幾年前。內核 PTI 文檔繼續更廣泛地說明 PCID 支持的好處:
“進程上下文標識符 (PCID) 是一項 CPU 功能,它允許我們在頁表更改時通過在 CR3 中設置一個特殊位來在切換頁表時跳過刷新整個 TLB。這使得切換頁表(在上下文切換或內核進入/退出)更便宜。但是,在支持 PCID 的系統上,上下文切換代碼必須從 TLB 中清除用戶和內核條目。用戶 PCID TLB 刷新被推遲到退出用戶空間,從而最大限度地降低成本。有關血腥的 PCID/INVPCID 詳細信息,請參閱 intel.com/sdm。
…
在不支持 PCID 的系統上,每個 CR3 寫入都會刷新整個 TLB。這意味著每個系統調用、中斷或異常都會刷新 TLB。”
無論如何,我將在 Raptor Lake 上運行一些基準測試,看看這個——至少是暫時的——禁用 PCID 支持是否意味著對於最終用戶的任何常見性能領域。
更新(5 月 22 日):在禁用 PCID 的情況下測試 Intel Raptor Lake 以及 FreeBSD 去年的一項舉措