後端工坊 2026 年 5 月 6 日

2026-05-06 — s390 Arm VM 硬體加速、TCMalloc rseq Hyrum 定律、C++ 記憶體順序效能

primary=https://lwn.net/Articles/1069954/ primary=https://lwn.net/Articles/1070072/ primary=https://isocpp.org/blog/2026/05/cppcon-2025-beyond-sequential-consistency-unlocking-hidden-performance-gain

Linux 核心新補丁:在 s390 主機上以硬體加速執行 Arm64 虛擬機

LWN.net · 2026-05-05

IBM 與 Arm 工程師聯合向 Linux 核心郵件清單提交一組 27 個補丁,在 s390 架構上引入 KVM 加速的 Arm64 虛擬機支援。這組補丁於 2026 年 4 月解除禁運後公開,使 IBM Z 大型主機能夠在接近原生速度下執行 Arm 客體作業系統。

架構原理

實作的核心是 s390 的新指令 Start-Arm-Execution(SAE),讓 s390 的 KVM 主機扮演 Arm64 架構中的 EL2(hypervisor 層),同時讓 Arm64 客體在 EL1/EL0(OS/應用程式層)執行。這意味著 s390 硬體必須能直譯 Arm64 的特權指令,而非模擬整個 ISA。

虛擬化層的對映如下:

  • s390 KVM host → Arm EL2(Hypervisor)
  • Arm64 guest OS → Arm EL1(Kernel)
  • Arm64 guest userspace → Arm EL0(Application)

核心改動

補丁引入了 virt/kvm/arm64/ 目錄作為跨架構共用程式碼的新家,包含客體暫存器處理、退出(exit)處理、通用暫存器重置邏輯,以及 IPA(Intermediate Physical Address)大小計算。

另一個關鍵變更是將 arm64 KVM 的 UAPI 標頭從 arch/arm64/ 遷移至 include/uapi/arch/arm64/,讓非 arm64 主機(如 s390)也能引用 Arm64 KVM 的用戶空間 API,而不需要在 include path 上做特殊處理。

影響範圍

對於同時擁有 s390 大型主機與 Arm 工作負載的企業,這項功能從根本上消除了跨架構轉換的虛擬化損耗。IBM Z 伺服器擁有大量硬體虛擬化資源(PR/SM、z/VM),若能在同一硬體上原生執行 Arm64 客體,將大幅簡化混合架構的部署拓撲。Arm 維護者對補丁反應正面,目前仍待架構合作細節確認後才會合入主線。

原始來源:LWN.net — Hardware-assisted Arm VMs for s390Phoronix — IBM Lays Out Patches For ARM Virtualization Acceleration On IBM Z Servers


TCMalloc 違反 Restartable Sequences API 文件,核心面對 Hyrum 定律難題

LWN.net · 2026-04-30

Linux 核心社群正面對一個典型的相容性困境:Google 的 TCMalloc 記憶體配置器依賴於 restartable sequences(rseq)API 的一個未記錄行為,而核心 6.19 的變更雖然符合官方文件規格,卻意外破壞了 TCMalloc 在生產環境中的運作。

Restartable Sequences 機制

Rseq 是 Linux 核心提供的一個低延遲原語,允許使用者空間程式定義一段「可重新啟動的臨界區」(restartable critical section)。若核心在這段程式碼執行期間產生中斷(如排程切換或信號),它會自動將程式計數器重設到指定的「中止處理程序」,讓應用程式感知到中斷並重試,而不是讓臨界區在部分完成的狀態下恢復。這讓無鎖(lock-free)的每 CPU 資料結構得以實作,TCMalloc 正是利用此機制加速記憶體配置的 fast path。

違規行為

TCMalloc 對 rseq 的某個未記錄的行為模式產生了隱性依賴。核心 6.19 在技術上維持了 API 的文件規格,但改變了一個文件中未明確定義的邊界條件,足以讓 TCMalloc 的部分假設失效。

這是 Hyrum 定律(Hyrum's Law)的教科書案例:「只要 API 有足夠多的使用者,所有可觀察到的行為,無論是否在設計意圖之內,都將被某人依賴。」

核心的困境

Linux 核心有一條嚴格的不破壞回歸原則(no regressions policy),即便被破壞的行為從未被文件化,只要它在生產環境中被廣泛依賴,核心社群通常仍會視其為需要修正的回歸。目前討論的方向包括:在核心中保留舊行為的相容模式、或更新 rseq 文件明確規範這個邊界條件,並推動 TCMalloc 修改其依賴。兩種方向各有取捨,討論仍在進行中。

原始來源:LWN.net — Restartable sequences, TCMalloc, and Hyrum's Law


C++ 原子操作的記憶體順序:從 sequential consistency 到 acquire/release 的效能增益

isocpp.org · 2026-05-05

Christopher Fretz 在 CppCon 2025 以環形緩衝區(ring buffer)作為實例,系統性地展示了弱記憶體順序(weaker memory orderings)在 C++ 原子操作中的效能潛力,並說明 C++ 記憶體模型如何映射到 x86 與 Arm 兩種不同的硬體一致性模型。

記憶體順序的層次

C++ 的 std::atomic 提供六個記憶體順序選項,由強至弱:

  • memory_order_seq_cst:完全序列一致性,是預設值,代價最高
  • memory_order_acq_rel / memory_order_acquire / memory_order_release:acquire-release 語意,建立局部同步關係
  • memory_order_consume:資料依賴順序(實作困難,多數編譯器升為 acquire)
  • memory_order_relaxed:僅保證操作的原子性,不提供順序保證

x86 對比 Arm 的硬體差異

x86 是強序模型(TSO,Total Store Order)架構。在 x86 上,普通的 load/store 指令天然具備 acquire/release 語意,因此 seq_cstacq_rel 的實際指令差距僅在 store fence(MFENCE)是否插入。這意味著在 x86 上從 seq_cst 降到 acq_rel 的收益相對有限。

Arm 是弱序模型,硬體允許大量記憶體操作重排。即使是 acquire load,Arm 也需要對應的 LDAR(Load-Acquire Register)指令;release store 需要 STLR(Store-Release Register)。seq_cst 則需要額外的 full barrier,成本更高。因此在 Arm 上,正確選用弱序往往帶來更顯著的效能增益。

環形緩衝區實例

在一個 SPSC(Single-Producer Single-Consumer)環形緩衝區中,生產者只需要對 head 執行 release store,消費者只需要對 head 執行 acquire load,兩者之間不需要 seq_cst。實際量測顯示,在 Arm 架構的高頻路徑上,這項調整可帶來可量化的延遲降低。

原始來源:isocpp.org — CppCon 2025: Beyond Sequential Consistency


End of article
0
Would love your thoughts, please comment.x
()
x