FLIC (浮動中斷控制器)

FLIC 處理浮動(非每 CPU)中斷,即 I/O、服務和某些機器檢查中斷。所有中斷都儲存在每個虛擬機器(per-vm)的待處理中斷列表中。FLIC 對此列表執行操作。

只能例項化一個 FLIC 例項。

FLIC 提供以下支援:- 新增中斷 (KVM_DEV_FLIC_ENQUEUE) - 檢查當前待處理中斷 (KVM_FLIC_GET_ALL_IRQS) - 清除所有待處理的浮動中斷 (KVM_DEV_FLIC_CLEAR_IRQS) - 清除一個待處理的浮動 I/O 中斷 (KVM_DEV_FLIC_CLEAR_IO_IRQ) - 啟用/停用對客戶機透明的非同步頁面錯誤 - 註冊和修改介面卡中斷源 (KVM_DEV_FLIC_ADAPTER_*) - 修改 AIS (介面卡中斷抑制) 模式狀態 (KVM_DEV_FLIC_AISM) - 在指定介面卡上注入介面卡中斷 (KVM_DEV_FLIC_AIRQ_INJECT) - 獲取/設定所有 AIS 模式狀態 (KVM_DEV_FLIC_AISM_ALL)

KVM_DEV_FLIC_ENQUEUE

將緩衝區和長度傳遞到核心中,然後將其注入到待處理中斷列表中。attr->addr 包含指向緩衝區的指標,attr->attr 包含緩衝區的長度。從使用者空間複製的 kvm_s390_irq 資料結構的格式定義在 usr/include/linux/kvm.h 中。

KVM_DEV_FLIC_GET_ALL_IRQS

將所有浮動中斷複製到使用者空間提供的緩衝區中。如果緩衝區太小,則返回 -ENOMEM,這表示使用者空間應嘗試使用更大的緩衝區再次操作。

當核心空間緩衝區分配失敗時,返回 -ENOBUFS。

當資料複製到使用者空間失敗時,返回 -EFAULT。所有中斷仍保持待處理狀態,即不會從當前待處理中斷列表中刪除。attr->addr 包含將所有中斷資料複製到的緩衝區的使用者空間地址。attr->attr 包含緩衝區的大小(以位元組為單位)。

KVM_DEV_FLIC_CLEAR_IRQS

簡單地刪除當前待處理浮動中斷列表中的所有元素。不會向客戶機注入任何中斷。

KVM_DEV_FLIC_CLEAR_IO_IRQ

刪除透過 attr->addr (地址) 和 attr->attr (長度) 指定的緩衝區傳遞的子系統識別字標識的子通道的一個(如果有)I/O 中斷。

KVM_DEV_FLIC_APF_ENABLE

為客戶機啟用非同步頁面錯誤。因此,在發生主要頁面錯誤時,主機被允許非同步處理此錯誤並繼續客戶機的執行。

在 ucontrol 虛擬機器上呼叫 FLIC 時返回 -EINVAL。

KVM_DEV_FLIC_APF_DISABLE_WAIT

停用客戶機的非同步頁面錯誤,並等待已掛起的非同步頁面錯誤完成。這對於在遷移中斷列表之前,為每個初始化中斷觸發一個完成中斷是必要的。

在 ucontrol 虛擬機器上呼叫 FLIC 時返回 -EINVAL。

KVM_DEV_FLIC_ADAPTER_REGISTER

註冊 I/O 介面卡中斷源。接受一個 kvm_s390_io_adapter 結構,描述要註冊的介面卡。

struct kvm_s390_io_adapter {
        __u32 id;
        __u8 isc;
        __u8 maskable;
        __u8 swap;
        __u8 flags;
};

id 包含介面卡的唯一 ID,isc 是要使用的 I/O 中斷子類,maskable 指示此介面卡是否可以被遮蔽(中斷關閉),swap 指示指標是否需要位元組交換,flags 包含介面卡的進一步特性。

當前為 'flags' 定義的值是

  • KVM_S390_ADAPTER_SUPPRESSIBLE: 介面卡受 AIS (介面卡中斷抑制) 功能影響。此標誌僅在 AIS 功能啟用時有效。

未知標誌值將被忽略。

KVM_DEV_FLIC_ADAPTER_MODIFY

修改現有 I/O 介面卡中斷源的屬性。接受一個 kvm_s390_io_adapter_req 結構,指定介面卡和操作。

struct kvm_s390_io_adapter_req {
        __u32 id;
        __u8 type;
        __u8 mask;
        __u16 pad0;
        __u64 addr;
};

id 指定介面卡,type 指定操作。支援的操作有:

KVM_S390_IO_ADAPTER_MASK

遮蔽或取消遮蔽介面卡,如 mask 中指定

KVM_S390_IO_ADAPTER_MAP

這現在是一個無操作。對映完全由中斷路由完成。

KVM_S390_IO_ADAPTER_UNMAP

這現在是一個無操作。對映完全由中斷路由完成。

KVM_DEV_FLIC_AISM

如果 AIS 功能已啟用,則修改給定 isc 的介面卡中斷抑制模式。接受一個 kvm_s390_ais_req 結構,描述:

struct kvm_s390_ais_req {
        __u8 isc;
        __u16 mode;
};

isc 包含目標 I/O 中斷子類,mode 包含目標介面卡中斷抑制模式。當前支援以下模式:

  • KVM_S390_AIS_MODE_ALL: ALL-Interruptions 模式,即始終允許 airq 注入;

  • KVM_S390_AIS_MODE_SINGLE: SINGLE-Interruption 模式,即只允許一次 airq 注入,後續的介面卡中斷將被抑制,直到模式再次設定為 ALL-Interruptions 或 SINGLE-Interruption 模式。

KVM_DEV_FLIC_AIRQ_INJECT

在指定的介面卡上注入介面卡中斷。attr->attr 包含介面卡的唯一 ID,這允許進行介面卡特定的檢查和操作。對於受 AIS 影響的介面卡,在 AIS 功能啟用的條件下,根據介面卡中斷抑制模式處理 isc 的 airq 注入抑制。

KVM_DEV_FLIC_AISM_ALL

獲取或設定所有 ISC 的介面卡中斷抑制模式。接受一個 kvm_s390_ais_all 結構,描述:

struct kvm_s390_ais_all {
       __u8 simm; /* Single-Interruption-Mode mask */
       __u8 nimm; /* No-Interruption-Mode mask *
};

simm 包含所有 ISC 的 Single-Interruption-Mode 掩碼,nimm 包含所有 ISC 的 No-Interruption-Mode 掩碼。simm 和 nimm 中的每個位對應一個 ISC(MSB0 位 0 對應 ISC 0,依此類推)。simm 位和 nimm 位的組合表示 ISC 的 AIS 模式。

KVM_DEV_FLIC_AISM_ALL 由 KVM_CAP_S390_AIS_MIGRATION 指示。

注意:在 FLIC 上執行 KVM_SET_DEVICE_ATTR/KVM_GET_DEVICE_ATTR 裝置 ioctl,如果組或屬性未知,將返回錯誤程式碼 EINVAL(而不是 API 文件中指定的 ENXIO)。無法根據使用嘗試產生的錯誤程式碼來斷定某個 FLIC 操作不可用。

注意

如果指定了零 schid,KVM_DEV_FLIC_CLEAR_IO_IRQ ioctl 將返回 EINVAL。