POWER9 外部中斷虛擬化引擎 (XIVE Gen1)

支援的裝置型別
  • KVM_DEV_TYPE_XIVE POWER9 XIVE 中斷控制器第一代

此裝置用作虛擬機器中斷控制器。它提供 KVM 介面,用於在底層 POWER9 XIVE 中斷控制器中配置虛擬機器的中斷源。

只能例項化一個 XIVE 例項。客戶機 XIVE 裝置需要 POWER9 主機,並且客戶機作業系統應支援 XIVE 本機利用中斷模式。否則,它應使用舊版中斷模式執行,即 XICS (POWER7/8)。

  • 裝置對映

    KVM 裝置公開了 XIVE 硬體的不同 MMIO 範圍,這些範圍是中斷管理所需的。這些範圍透過填充了自定義虛擬機器故障處理程式的 VMA 暴露給客戶機。

    1. 執行緒中斷管理區域 (TIMA)

    每個執行緒都有一個關聯的執行緒中斷管理上下文,由一組暫存器組成。這些暫存器允許執行緒處理優先順序管理和中斷確認。最重要的有

    • 中斷待處理緩衝區 (IPB)

    • 當前處理器優先順序 (CPPR)

    • 通知源暫存器 (NSR)

    它們以四種不同的頁面形式暴露給軟體,每種頁面提供不同許可權的檢視。第一頁用於物理執行緒上下文,第二頁用於虛擬機器監控程式。只有第三頁(作業系統)和第四頁(使用者級別)暴露給客戶機。

    1. 事件狀態緩衝區 (ESB)

    每個源都關聯一個事件狀態緩衝區 (ESB),帶有一對偶數/奇數頁面,提供用於管理源的命令:例如,觸發、EOI、關閉源。

    1. 裝置直通

    當裝置直通給客戶機時,源中斷來自不同的硬體控制器 (PHB4),並且暴露給客戶機的 ESB 頁面應適應此更改。

    當裝置的硬體中斷被對映到或從客戶機中斷號空間解除對映時,會呼叫 passthru_irq 輔助函式 kvmppc_xive_set_mapped() 和 kvmppc_xive_clr_mapped()。KVM 裝置擴充套件這些輔助函式以清除正在對映的客戶機中斷號的 ESB 頁面,然後讓虛擬機器故障處理程式重新填充。如果裝置已被移除,處理程式將插入對應於直通裝置的硬體中斷的 ESB 頁面,或者初始的 IPI ESB 頁面。

    ESB 重對映對客戶機和作業系統裝置驅動程式完全透明。所有處理均在 VFIO 和 KVM-PPC 中的上述輔助函式內完成。

  1. 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 已連線到裝置。

  1. 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

無法分配底層硬體中斷

  1. 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

  1. KVM_DEV_XIVE_GRP_EQ_CONFIG(讀寫)

    配置 CPU 的事件佇列

屬性

EQ 描述符識別符號(64位)

EQ 描述符識別符號是一個元組(伺服器,優先順序)

bits:     | 63   ....  32 | 31 .. 3 |  2 .. 0
values:   |    unused     |  server | priority

kvm_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

底層硬體配置失敗

  1. 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 本機利用模式儲存虛擬機器狀態應遵循特定序列。當虛擬機器停止時

    1. 遮蔽所有源 (PQ=01) 以停止事件流。

    2. 使用 KVM 控制 KVM_DEV_XIVE_EQ_SYNC 同步 XIVE 裝置,以重新整理任何正在傳輸的事件通知並穩定 EQ。在此階段,EQ 頁面被標記為髒頁,以確保它們在遷移序列中被傳輸。

    3. 捕獲源目標的狀態、EQs 配置以及執行緒中斷上下文暫存器的狀態。

    恢復類似

    1. 恢復 EQ 配置。因為目標設定依賴於它。

    2. 恢復目標設定

    3. 恢復執行緒中斷上下文

    4. 恢復源狀態

    5. 讓 vCPU 執行