後端工坊 2026 年 8 月 13 日

2026-08-13 — LLVM 23 分支指令重構、QEMU 11.1 儲存模擬升級、Linux block-layer 錯誤注入新機制

primary=https://github.com/llvm/llvm-project/releases/tag/llvmorg-23.1.0-rc3 primary=https://www.qemu.org/2026/08/11/qemu-11-1-0/ primary=http://www.mail-archive.com/linux-block@vger.kernel.org/msg44312.html

LLVM 23.1.0-rc3 發布,IR 層級大改:分支指令拆分、浮點常數語法重構

LLVM Project GitHub Releases · 2026-08-12

LLVM 專案於 2026 年 8 月 12 日標記 llvmorg-23.1.0-rc3,對應 commit 7196f931f212fc7c406066b2628a0ff4ea0ee344,由 release manager Tobias Hieta 簽署發布,作為 23.1.0 正式版前的第三個候選版本。這個系列的重點不在單一效能數字,而是 IR 與 C API 的結構性調整,牽動下游使用 LLVM C API 的工具鏈需要同步修改程式碼。發布頁提供 Linux x86_64/ARM64 與 macOS Apple Silicon 的 xz、zstd 壓縮套件,並支援 GPG 簽章與 GitHub attestation 兩種驗證方式。

核心改動

IR 層級最顯著的變化是分支指令的拆分:原本單一的 Br opcode 被分成 UncondBr(無條件分支)與 CondBr(條件分支)兩個獨立 opcode。對應的 C API 函式 LLVMBr 也被 LLVMUncondBrLLVMCondBr 取代,且 CondBr 的 operand 順序改為與後繼區塊(successor)順序一致——這意味著任何透過 LLVMGetOperandLLVMSetOperand 存取條件分支 operand 的程式碼都可能需要調整索引。

浮點常數的字面語法也做了重構:舊有的十六進位位元表示法(hex bitwise representation)被標記為棄用,改用統一的 f0x 前綴,並加入 C99 風格的十六進位浮點語法;舊語法將在下一個版本中移除。此外新增 noipa function attribute,用於關閉跨函式分析(interprocedural analysis),並引入 callgraph metadata 將函式與型別識別碼關聯,供呼叫圖(call graph)產生使用。ConstantFP 也開始支援向量型別。

ABI 相容性方面有一項容易被忽略的改動:coroutine 的 resume/destroy 函式呼叫慣例(calling convention)從 CallingConv::Fast 改為 CallingConv::C,在 i686、MIPS O32、PowerPC64 ELFv1 與 Lanai 等目標上會造成 ABI 不相容。WebAssembly 的 reference type 也從位址空間指標(address-space pointer)改為 target extension type 表示。

影響範圍

  • NVPTX:預設 SM 版本由 sm_30 提升到 sm_75,影響未明確指定架構的 CUDA 編譯目標。
  • SystemZ:初步支援 z/OS XPLINK 64-bit ABI,含 GOFF 物件檔與 HLASM 語法輸出。
  • RISC-V:P extension 的 SIMD 程式碼生成改為自動啟用;新增 Zvzip、Zvvmm、Zvvfmm 向量擴充的實驗性支援。
  • 工具鏈:llvm-readobj 新增 --call-graph-sectionllvm-objcopy 修正符號表損毀問題。

對於維護前端或直接呼叫 LLVM C API 的專案,LLVMBr 的移除是本輪 rc 中最需要立即應對的變更,依賴舊 opcode 或 operand 順序的程式碼在升級到 23.1.0 前必須完成遷移

原始來源:LLVM 23.1.0-rc3 Release (GitHub)LLVM 23 Release Notes


QEMU 11.1 發布:UFS 4.1 模擬新增 Write Booster、ARM hvf 支援巢狀虛擬化

QEMU.org Release Announcement · 2026-08-11

QEMU 專案於 2026 年 8 月 11 日發布 QEMU 11.1.0,官方公告與 wiki ChangeLog 指出此版本收錄超過 3200 個 commit,來自 285 位貢獻者。本次更新集中在儲存裝置模擬的精細化與非 x86 架構的功能追趕,橫跨 ARM、RISC-V、PowerPC、s390x 與 HPPA 等多個目標。LWN.net 在 發布當日的報導中將其形容為「一長串的改進清單」。

核心改動

Universal Flash Storage(UFS)模擬新增 Write Booster 快取與 Host-Initiated Defragmentation(主機發起碎片整理),兩者皆依據 UFS 4.1 規格實作,讓在 QEMU 上測試手機/嵌入式儲存堆疊的行為更貼近真實硬體。另一項儲存相關改動是透過 vhost-host-user 支援卸載即時時鐘(RTC)處理,經由 virtio-rtc 介面完成。

ARM 架構方面新增多項架構性 CPU 特徵支援,並加入以 i.MX 8MM 評估板為基礎的 imx8mp-evk 機型;virt 開發板現在可指定 cache 拓樸(cache topology)。值得注意的是 hvf 加速器(macOS 上的 Hypervisor.framework 後端)新增了巢狀虛擬化與 vGIC 支援,意味著在 Apple Silicon Mac 上使用 hvf 加速跑 ARM guest 時,guest 內部也能再跑一層虛擬化。

RISC-V 這輪追加了 big-endian、Zbr/xbr0p93、Zvfbfa 等 ISA 擴充支援,以及向量 SHA 指令的 fractional LMUL;KVM 加速器則補上 Zicbop 與 BFloat16 擴充支援,並新增 K230 開發板與 Tenstorrent 的 mvendorid 識別支援。

影響範圍

架構新增能力
PowerPCPowerNV 的 MPIPL 支援(意外重啟後保留記憶體)、新增 Nest MMU 模擬
HPPASeaBIOS-hppa v25 韌體、修正 HP-UX 9 相關的 TLB 問題
s390xKVM 支援 ASTFLE facility 2,用於巢狀虛擬化
GUI虛擬主控台支援字元編碼選項,GTK/VNC 前端功能增強

對於在 CI 或桌面環境跑多架構模擬的使用者,UFS 4.1 與 hvf 巢狀虛擬化是本次最直接可用的功能;PowerPC、s390x 與 HPPA 的更新則主要服務於企業級與大型機模擬情境。

原始來源:QEMU 11.1.0 官方發布公告QEMU ChangeLog/11.1LWN.net 報導


Linux 核心提案:debugfs 介面實現可設定的 block-layer 錯誤注入

linux-block mailing list(Christoph Hellwig)· 2026-06-01,LWN.net 技術報導 2026-08-12

Christoph Hellwig 在 linux-block 郵件論壇發起討論串「configurable block error injection」,提出一套以 debugfs 為介面的 block-layer 錯誤注入機制,並附上 9-patch 系列,核心實作為第 8 篇 [PATCH 8/9] block: add configurable error injection。LWN.net 於 8 月 12 日以此討論串為題撰寫技術分析文章。這套機制要解決的問題是:現有工具都無法同時做到指定操作類型、指定回傳的錯誤碼、以及不需額外堆疊裝置就能直接對目標磁碟注入錯誤

背景

目前核心測試儲存錯誤處理路徑主要靠幾種既有機制:fail_make_requestshould_fail_bio 只能製造籠統的 I/O 錯誤,無法區分指令類型或位址範圍;dm-error 一律回傳 BLK_STS_IOERR,且需另建一顆 device-mapper 裝置;dm-flakeydm-dust 缺乏細緻錯誤選擇,且在 zoned device 上有對齊限制。Hellwig 指出這些方案都要求「像 xfstests 那樣搭建一顆堆疊裝置,非常麻煩」。

核心改動

新機制在每顆磁碟的 debugfs 目錄下建立一個名為 error_injection、權限 0600 的檔案,寫入指令來新增或清除注入規則:

echo "op=WRITE start=1024 nr_sectors=512 status=BLK_STS_MEDIUM chance=4" \
  > /sys/kernel/debug/block/<dev>/error_injection
echo removeall > /sys/kernel/debug/block/<dev>/error_injection

每條規則對應一個 blk_error_inject 結構,記錄扇區範圍(startnr_sectors)、操作類型(op,如 READ/WRITE)、要注入的狀態碼(status,如 BLK_STS_IOERRBLK_STS_MEDIUM)與觸發機率(chance,代表「N 次中觸發 1 次」,預設為 1 即每次必中)。這些規則存放在每顆磁碟各自的連結串列中,寫入時以 mutex 保護,讀取路徑則透過 RCU 達成無鎖存取,避免在正常 I/O 路徑上引入鎖競爭。

攔截點在 blk-core.csubmit_bio_noacct_nocheck(),新增呼叫 blk_error_inject():以 RCU 遍歷規則清單比對範圍與操作類型,命中後以 get_random_u32() 決定是否觸發,並讓該 bio 直接以指定狀態碼結束。此功能需開啟 CONFIG_FAIL_MAKE_REQUEST,同時移除舊有的 should_fail_bio

影響範圍

  • xfstests、blktests 等儲存測試框架可直接對受測磁碟下注入規則,不再需要搭建 dm 堆疊裝置。
  • 可依扇區範圍與操作類型精準模擬「特定區塊讀取失敗」或「寫入回傳介質錯誤」等情境,覆蓋 dm-flakey/dm-dust 難以處理的 zoned device 案例。
  • 討論串中有人提出改用 eBPF/bpftrace 描述注入條件,讓 blktests 之類的工具可以直接吸收、簡化設定邏輯,此方向截至報導時尚在討論階段。

原始來源:configurable block error injection(討論串起頭)[PATCH 8/9] block: add configurable error injectionLWN.net:Block-layer error injection


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