KVM: s390: interface for suppressible I/O adapters
authorFei Li <sherrylf@linux.vnet.ibm.com>
Thu, 19 Jan 2017 16:02:26 +0000 (17:02 +0100)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Thu, 6 Apr 2017 11:15:36 +0000 (13:15 +0200)
In order to properly implement adapter-interruption suppression, we
need a way for userspace to specify which adapters are subject to
suppression. Let's convert the existing (and unused) 'pad' field into
a 'flags' field and define a flag value for suppressible adapters.

Besides, add documentation for the interface.

Signed-off-by: Fei Li <sherrylf@linux.vnet.ibm.com>
Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Documentation/virtual/kvm/devices/s390_flic.txt
arch/s390/include/asm/kvm_host.h
arch/s390/include/uapi/asm/kvm.h
arch/s390/kvm/interrupt.c

index 6b0e115301c87560ee0705d547d443bf54461838..e8ee3b6edb05a8ac2aa90e07ecccad84b73c7b46 100644 (file)
@@ -64,12 +64,18 @@ struct kvm_s390_io_adapter {
        __u8 isc;
        __u8 maskable;
        __u8 swap;
-       __u8 pad;
+       __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)
-   and swap whether the indicators need to be byte swapped.
+   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
index 1af090d93bf58100d16e25dae2805c68d6f90d60..499c72c2280d392f0467502b6eb26e7cf51cdc69 100644 (file)
@@ -621,6 +621,7 @@ struct s390_io_adapter {
        bool maskable;
        bool masked;
        bool swap;
+       bool suppressible;
        struct rw_semaphore maps_lock;
        struct list_head maps;
        atomic_t nr_maps;
index 5bd23cfd9ae5d4e97068d6cd2cc0aae90dd7772b..5fa144d1df0a74790ab07276033d2b4a0f6f94c1 100644 (file)
@@ -41,9 +41,11 @@ struct kvm_s390_io_adapter {
        __u8 isc;
        __u8 maskable;
        __u8 swap;
-       __u8 pad;
+       __u8 flags;
 };
 
+#define KVM_S390_ADAPTER_SUPPRESSIBLE 0x01
+
 #define KVM_S390_IO_ADAPTER_MASK 1
 #define KVM_S390_IO_ADAPTER_MAP 2
 #define KVM_S390_IO_ADAPTER_UNMAP 3
index 311eef0df85565c6cf18bacfae109cd1c21cd172..dba51ad625708acd34c3aa3c7c3040eb299308f4 100644 (file)
@@ -1997,6 +1997,8 @@ static int register_io_adapter(struct kvm_device *dev,
        adapter->maskable = adapter_info.maskable;
        adapter->masked = false;
        adapter->swap = adapter_info.swap;
+       adapter->suppressible = (adapter_info.flags) &
+                               KVM_S390_ADAPTER_SUPPRESSIBLE;
        dev->kvm->arch.adapters[adapter->id] = adapter;
 
        return 0;