FLIC(浮动中断控制器)

FLIC 处理浮动(非每个 CPU)中断,即 I/O、服务和一些机器检查中断。所有中断都存储在每个 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

删除一个(如果有)I/O 中断,该中断针对通过 attr->addr(地址)和 attr->attr(长度)指定的缓冲区传递的子系统标识字标识的子通道。

KVM_DEV_FLIC_APF_ENABLE

为客户机启用异步页面错误。因此,如果发生主要页面错误,则允许主机异步处理此错误并继续运行客户机。

KVM_DEV_FLIC_APF_DISABLE_WAIT

禁用客户机的异步页面错误,并等待直到已挂起的异步页面错误完成。这对于在迁移中断列表之前为每个初始化中断触发完成中断是必需的。

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

现在这是一个空操作。映射完全由 irq 路由完成。

KVM_S390_IO_ADAPTER_UNMAP

现在这是一个空操作。映射完全由 irq 路由完成。

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:所有中断模式,即始终允许 airq 注入;

  • KVM_S390_AIS_MODE_SINGLE:单中断模式,即仅允许 airq 注入一次,并且在将模式再次设置为所有中断或单中断模式之前,将禁止后续适配器中断。

KVM_DEV_FLIC_AIRQ_INJECT

在指定的适配器上注入适配器中断。attr->attr 包含适配器的唯一 id,这允许适配器特定的检查和操作。对于受 AIS 约束的适配器,请根据适配器中断抑制模式处理 isc 的 airq 注入抑制,前提是启用了 AIS 功能。

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 的单中断模式掩码,nimm 包含所有 ISC 的无中断模式掩码。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。