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。