POWER9 外部中斷虛擬化引擎 (XIVE Gen1)¶
- 支援的裝置型別
KVM_DEV_TYPE_XIVE POWER9 XIVE 中斷控制器第一代
此裝置用作虛擬機器中斷控制器。它提供 KVM 介面,用於在底層 POWER9 XIVE 中斷控制器中配置虛擬機器的中斷源。
只能例項化一個 XIVE 例項。客戶機 XIVE 裝置需要 POWER9 主機,並且客戶機作業系統應支援 XIVE 本機利用中斷模式。否則,它應使用舊版中斷模式執行,即 XICS (POWER7/8)。
裝置對映
KVM 裝置公開了 XIVE 硬體的不同 MMIO 範圍,這些範圍是中斷管理所需的。這些範圍透過填充了自定義虛擬機器故障處理程式的 VMA 暴露給客戶機。
執行緒中斷管理區域 (TIMA)
每個執行緒都有一個關聯的執行緒中斷管理上下文,由一組暫存器組成。這些暫存器允許執行緒處理優先順序管理和中斷確認。最重要的有
中斷待處理緩衝區 (IPB)
當前處理器優先順序 (CPPR)
通知源暫存器 (NSR)
它們以四種不同的頁面形式暴露給軟體,每種頁面提供不同許可權的檢視。第一頁用於物理執行緒上下文,第二頁用於虛擬機器監控程式。只有第三頁(作業系統)和第四頁(使用者級別)暴露給客戶機。
事件狀態緩衝區 (ESB)
每個源都關聯一個事件狀態緩衝區 (ESB),帶有一對偶數/奇數頁面,提供用於管理源的命令:例如,觸發、EOI、關閉源。
裝置直通
當裝置直通給客戶機時,源中斷來自不同的硬體控制器 (PHB4),並且暴露給客戶機的 ESB 頁面應適應此更改。
當裝置的硬體中斷被對映到或從客戶機中斷號空間解除對映時,會呼叫 passthru_irq 輔助函式 kvmppc_xive_set_mapped() 和 kvmppc_xive_clr_mapped()。KVM 裝置擴充套件這些輔助函式以清除正在對映的客戶機中斷號的 ESB 頁面,然後讓虛擬機器故障處理程式重新填充。如果裝置已被移除,處理程式將插入對應於直通裝置的硬體中斷的 ESB 頁面,或者初始的 IPI ESB 頁面。
ESB 重對映對客戶機和作業系統裝置驅動程式完全透明。所有處理均在 VFIO 和 KVM-PPC 中的上述輔助函式內完成。
組
- KVM_DEV_XIVE_GRP_CTRL
提供裝置的全域性控制
- 屬性
1.1 KVM_DEV_XIVE_RESET(只寫)重置中斷控制器對源和事件佇列的配置。供 kexec 和 kdump 使用。
錯誤:無
1.2 KVM_DEV_XIVE_EQ_SYNC(只寫)同步所有源和佇列,並將 EQ 頁面標記為髒頁。這確保在遷移虛擬機器時捕獲一致的記憶體狀態。
錯誤:無
1.3 KVM_DEV_XIVE_NR_SERVERS(只寫)kvm_device_attr.addr 指向一個 __u32 值,該值表示中斷伺服器的數量(即,可能的最高 vCPU ID 加一)。
錯誤
-EINVAL
值大於 KVM_MAX_VCPU_IDS。
-EFAULT
attr->addr 的使用者指標無效。
-EBUSY
vCPU 已連線到裝置。
- KVM_DEV_XIVE_GRP_SOURCE(只寫)
在 XIVE 裝置中初始化一個新源並將其遮蔽。
- 屬性
中斷源編號(64位)
kvm_device_attr.addr 指向一個 __u64 值
bits: | 63 .... 2 | 1 | 0 values: | unused | level | type
型別:0:MSI 1:LSI
level: 在 LSI 情況下的斷言級別。
錯誤
-E2BIG
中斷源編號超出範圍
-ENOMEM
無法建立新的源塊
-EFAULT
attr->addr 的使用者指標無效。
-ENXIO
無法分配底層硬體中斷
- KVM_DEV_XIVE_GRP_SOURCE_CONFIG(只寫)
配置源目標
- 屬性
中斷源編號(64位)
kvm_device_attr.addr 指向一個 __u64 值
bits: | 63 .... 33 | 32 | 31 .. 3 | 2 .. 0 values: | eisn | mask | server | priority
priority: 0-7 中斷優先順序
server: 選擇用於處理中斷的 CPU 編號
mask: 掩碼標誌(未使用)
eisn: 有效中斷源編號
錯誤
-ENOENT
未知源編號
-EINVAL
未初始化源編號
-EINVAL
無效優先順序
-EINVAL
無效的 CPU 編號。
-EFAULT
attr->addr 的使用者指標無效。
-ENXIO
CPU 事件佇列未配置或底層硬體中斷配置失敗
-EBUSY
沒有可用於服務中斷的 CPU
- KVM_DEV_XIVE_GRP_EQ_CONFIG(讀寫)
配置 CPU 的事件佇列
- 屬性
EQ 描述符識別符號(64位)
EQ 描述符識別符號是一個元組(伺服器,優先順序)
bits: | 63 .... 32 | 31 .. 3 | 2 .. 0 values: | unused | server | prioritykvm_device_attr.addr 指向
struct kvm_ppc_xive_eq { __u32 flags; __u32 qshift; __u64 qaddr; __u32 qtoggle; __u32 qindex; __u8 pad[40]; };
- flags: 佇列標誌
- KVM_XIVE_EQ_ALWAYS_NOTIFY(必需)
強制通知,不使用 XIVE END ESB 提供的合併機制。
qshift: 佇列大小(2 的冪)
qaddr: 佇列的實際地址
qtoggle: 當前佇列切換位
qindex: 當前佇列索引
pad: 保留供將來使用
錯誤
-ENOENT
無效的 CPU 編號
-EINVAL
無效優先順序
-EINVAL
無效標誌
-EINVAL
無效佇列大小
-EINVAL
無效佇列地址
-EFAULT
attr->addr 的使用者指標無效。
-EIO
底層硬體配置失敗
- KVM_DEV_XIVE_GRP_SOURCE_SYNC(只寫)
同步源以重新整理事件通知
- 屬性
中斷源編號(64位)
錯誤
-ENOENT
未知源編號
-EINVAL
未初始化源編號
VCPU 狀態
XIVE IC 在一個名為 NVT 的內部結構中維護 VP 中斷狀態。當 VP 未排程到硬體處理器執行緒上時,如果 VP 是事件通知的目標,該結構可以由硬體更新。
對於遷移而言,從 NVT 捕獲快取的 IPB 很重要,因為它綜合了待處理中斷的優先順序。我們捕獲更多資訊以報告除錯資訊。
KVM_REG_PPC_VP_STATE (2 * 64bits)
bits: | 63 .... 32 | 31 .... 0 | values: | TIMA word0 | TIMA word1 | bits: | 127 .......... 64 | values: | unused |
遷移
使用 XIVE 本機利用模式儲存虛擬機器狀態應遵循特定序列。當虛擬機器停止時
遮蔽所有源 (PQ=01) 以停止事件流。
2. 使用 KVM 控制 KVM_DEV_XIVE_EQ_SYNC 同步 XIVE 裝置,以重新整理任何正在傳輸的事件通知並穩定 EQ。在此階段,EQ 頁面被標記為髒頁,以確保它們在遷移序列中被傳輸。
3. 捕獲源目標的狀態、EQs 配置以及執行緒中斷上下文暫存器的狀態。
恢復類似
恢復 EQ 配置。因為目標設定依賴於它。
恢復目標設定
恢復執行緒中斷上下文
恢復源狀態
讓 vCPU 執行