mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-26 02:05:29 +07:00
94aa033efc
This fixes a bug introduced with commitc05c4186bb
("KVM: s390: add floating irq controller"). get_all_floating_irqs() does copy_to_user() while holding a spin lock. Let's fix this by filling a temporary buffer first and copy it to userspace after giving up the lock. Cc: <stable@vger.kernel.org> # 3.18+:69a8d45626
KVM: s390: no need to hold... Reviewed-by: David Hildenbrand <dahi@linux.vnet.ibm.com> Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com>
95 lines
3.4 KiB
Plaintext
95 lines
3.4 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)
|
|
- enable/disable for the guest transparent async page faults
|
|
- register and modify adapter interrupt sources (KVM_DEV_FLIC_ADAPTER_*)
|
|
|
|
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_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 pad;
|
|
};
|
|
|
|
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)
|
|
and swap whether the indicators need to be byte swapped.
|
|
|
|
|
|
KVM_DEV_FLIC_ADAPTER_MODIFY
|
|
Modifies attributes of an existing I/O adapter interrupt source. Takes
|
|
a kvm_s390_io_adapter_req specifiying 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
|
|
|
|
KVM_S390_IO_ADAPTER_UNMAP
|
|
release a userspace page for the translated address specified in addr
|
|
from the list of mappings
|