164 lines
6.5 KiB
Plaintext
164 lines
6.5 KiB
Plaintext
|
FLIC (floating interrupt controller)
|
||
|
====================================
|
||
|
|
||
|
FLIC handles floating (non per-cpu) interrupts, i.e. I/O, service and some
|
||
|
machine check interruptions. All interrupts are stored in a per-vm list of
|
||
|
pending interrupts. FLIC performs operations on this list.
|
||
|
|
||
|
Only one FLIC instance may be instantiated.
|
||
|
|
||
|
FLIC provides support to
|
||
|
- add interrupts (KVM_DEV_FLIC_ENQUEUE)
|
||
|
- inspect currently pending interrupts (KVM_FLIC_GET_ALL_IRQS)
|
||
|
- purge all pending floating interrupts (KVM_DEV_FLIC_CLEAR_IRQS)
|
||
|
- purge one pending floating I/O interrupt (KVM_DEV_FLIC_CLEAR_IO_IRQ)
|
||
|
- enable/disable for the guest transparent async page faults
|
||
|
- register and modify adapter interrupt sources (KVM_DEV_FLIC_ADAPTER_*)
|
||
|
- modify AIS (adapter-interruption-suppression) mode state (KVM_DEV_FLIC_AISM)
|
||
|
- inject adapter interrupts on a specified adapter (KVM_DEV_FLIC_AIRQ_INJECT)
|
||
|
- get/set all AIS mode states (KVM_DEV_FLIC_AISM_ALL)
|
||
|
|
||
|
Groups:
|
||
|
KVM_DEV_FLIC_ENQUEUE
|
||
|
Passes a buffer and length into the kernel which are then injected into
|
||
|
the list of pending interrupts.
|
||
|
attr->addr contains the pointer to the buffer and attr->attr contains
|
||
|
the length of the buffer.
|
||
|
The format of the data structure kvm_s390_irq as it is copied from userspace
|
||
|
is defined in usr/include/linux/kvm.h.
|
||
|
|
||
|
KVM_DEV_FLIC_GET_ALL_IRQS
|
||
|
Copies all floating interrupts into a buffer provided by userspace.
|
||
|
When the buffer is too small it returns -ENOMEM, which is the indication
|
||
|
for userspace to try again with a bigger buffer.
|
||
|
-ENOBUFS is returned when the allocation of a kernelspace buffer has
|
||
|
failed.
|
||
|
-EFAULT is returned when copying data to userspace failed.
|
||
|
All interrupts remain pending, i.e. are not deleted from the list of
|
||
|
currently pending interrupts.
|
||
|
attr->addr contains the userspace address of the buffer into which all
|
||
|
interrupt data will be copied.
|
||
|
attr->attr contains the size of the buffer in bytes.
|
||
|
|
||
|
KVM_DEV_FLIC_CLEAR_IRQS
|
||
|
Simply deletes all elements from the list of currently pending floating
|
||
|
interrupts. No interrupts are injected into the guest.
|
||
|
|
||
|
KVM_DEV_FLIC_CLEAR_IO_IRQ
|
||
|
Deletes one (if any) I/O interrupt for a subchannel identified by the
|
||
|
subsystem identification word passed via the buffer specified by
|
||
|
attr->addr (address) and attr->attr (length).
|
||
|
|
||
|
KVM_DEV_FLIC_APF_ENABLE
|
||
|
Enables async page faults for the guest. So in case of a major page fault
|
||
|
the host is allowed to handle this async and continues the guest.
|
||
|
|
||
|
KVM_DEV_FLIC_APF_DISABLE_WAIT
|
||
|
Disables async page faults for the guest and waits until already pending
|
||
|
async page faults are done. This is necessary to trigger a completion interrupt
|
||
|
for every init interrupt before migrating the interrupt list.
|
||
|
|
||
|
KVM_DEV_FLIC_ADAPTER_REGISTER
|
||
|
Register an I/O adapter interrupt source. Takes a kvm_s390_io_adapter
|
||
|
describing the adapter to register:
|
||
|
|
||
|
struct kvm_s390_io_adapter {
|
||
|
__u32 id;
|
||
|
__u8 isc;
|
||
|
__u8 maskable;
|
||
|
__u8 swap;
|
||
|
__u8 flags;
|
||
|
};
|
||
|
|
||
|
id contains the unique id for the adapter, isc the I/O interruption subclass
|
||
|
to use, maskable whether this adapter may be masked (interrupts turned off),
|
||
|
swap whether the indicators need to be byte swapped, and flags contains
|
||
|
further characteristics of the adapter.
|
||
|
Currently defined values for 'flags' are:
|
||
|
- KVM_S390_ADAPTER_SUPPRESSIBLE: adapter is subject to AIS
|
||
|
(adapter-interrupt-suppression) facility. This flag only has an effect if
|
||
|
the AIS capability is enabled.
|
||
|
Unknown flag values are ignored.
|
||
|
|
||
|
|
||
|
KVM_DEV_FLIC_ADAPTER_MODIFY
|
||
|
Modifies attributes of an existing I/O adapter interrupt source. Takes
|
||
|
a kvm_s390_io_adapter_req specifying the adapter and the operation:
|
||
|
|
||
|
struct kvm_s390_io_adapter_req {
|
||
|
__u32 id;
|
||
|
__u8 type;
|
||
|
__u8 mask;
|
||
|
__u16 pad0;
|
||
|
__u64 addr;
|
||
|
};
|
||
|
|
||
|
id specifies the adapter and type the operation. The supported operations
|
||
|
are:
|
||
|
|
||
|
KVM_S390_IO_ADAPTER_MASK
|
||
|
mask or unmask the adapter, as specified in mask
|
||
|
|
||
|
KVM_S390_IO_ADAPTER_MAP
|
||
|
perform a gmap translation for the guest address provided in addr,
|
||
|
pin a userspace page for the translated address and add it to the
|
||
|
list of mappings
|
||
|
Note: A new mapping will be created unconditionally; therefore,
|
||
|
the calling code should avoid making duplicate mappings.
|
||
|
|
||
|
KVM_S390_IO_ADAPTER_UNMAP
|
||
|
release a userspace page for the translated address specified in addr
|
||
|
from the list of mappings
|
||
|
|
||
|
KVM_DEV_FLIC_AISM
|
||
|
modify the adapter-interruption-suppression mode for a given isc if the
|
||
|
AIS capability is enabled. Takes a kvm_s390_ais_req describing:
|
||
|
|
||
|
struct kvm_s390_ais_req {
|
||
|
__u8 isc;
|
||
|
__u16 mode;
|
||
|
};
|
||
|
|
||
|
isc contains the target I/O interruption subclass, mode the target
|
||
|
adapter-interruption-suppression mode. The following modes are
|
||
|
currently supported:
|
||
|
- KVM_S390_AIS_MODE_ALL: ALL-Interruptions Mode, i.e. airq injection
|
||
|
is always allowed;
|
||
|
- KVM_S390_AIS_MODE_SINGLE: SINGLE-Interruption Mode, i.e. airq
|
||
|
injection is only allowed once and the following adapter interrupts
|
||
|
will be suppressed until the mode is set again to ALL-Interruptions
|
||
|
or SINGLE-Interruption mode.
|
||
|
|
||
|
KVM_DEV_FLIC_AIRQ_INJECT
|
||
|
Inject adapter interrupts on a specified adapter.
|
||
|
attr->attr contains the unique id for the adapter, which allows for
|
||
|
adapter-specific checks and actions.
|
||
|
For adapters subject to AIS, handle the airq injection suppression for
|
||
|
an isc according to the adapter-interruption-suppression mode on condition
|
||
|
that the AIS capability is enabled.
|
||
|
|
||
|
KVM_DEV_FLIC_AISM_ALL
|
||
|
Gets or sets the adapter-interruption-suppression mode for all ISCs. Takes
|
||
|
a kvm_s390_ais_all describing:
|
||
|
|
||
|
struct kvm_s390_ais_all {
|
||
|
__u8 simm; /* Single-Interruption-Mode mask */
|
||
|
__u8 nimm; /* No-Interruption-Mode mask *
|
||
|
};
|
||
|
|
||
|
simm contains Single-Interruption-Mode mask for all ISCs, nimm contains
|
||
|
No-Interruption-Mode mask for all ISCs. Each bit in simm and nimm corresponds
|
||
|
to an ISC (MSB0 bit 0 to ISC 0 and so on). The combination of simm bit and
|
||
|
nimm bit presents AIS mode for a ISC.
|
||
|
|
||
|
KVM_DEV_FLIC_AISM_ALL is indicated by KVM_CAP_S390_AIS_MIGRATION.
|
||
|
|
||
|
Note: The KVM_SET_DEVICE_ATTR/KVM_GET_DEVICE_ATTR device ioctls executed on
|
||
|
FLIC with an unknown group or attribute gives the error code EINVAL (instead of
|
||
|
ENXIO, as specified in the API documentation). It is not possible to conclude
|
||
|
that a FLIC operation is unavailable based on the error code resulting from a
|
||
|
usage attempt.
|
||
|
|
||
|
Note: The KVM_DEV_FLIC_CLEAR_IO_IRQ ioctl will return EINVAL in case a zero
|
||
|
schid is specified.
|