OSDN Git Service

KVM: s390: Enable specification exception interpretation
authorJanis Schoetterl-Glausch <scgl@linux.ibm.com>
Tue, 29 Jun 2021 08:55:30 +0000 (10:55 +0200)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Fri, 27 Aug 2021 16:35:20 +0000 (18:35 +0200)
When this feature is enabled the hardware is free to interpret
specification exceptions generated by the guest, instead of causing
program interruption interceptions.

This benefits (test) programs that generate a lot of specification
exceptions (roughly 4x increase in exceptions/sec).

Interceptions will occur as before if ICTL_PINT is set,
i.e. if guest debug is enabled.

There is no indication if this feature is available or not and the
hardware is free to interpret or not. So we can simply set this bit and
if the hardware ignores it we fall back to intercept 8 handling.

Signed-off-by: Janis Schoetterl-Glausch <scgl@linux.ibm.com>
Link: https://lore.kernel.org/linux-s390/20210706114714.3936825-1-scgl@linux.ibm.com/
Reviewed-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
arch/s390/include/asm/kvm_host.h
arch/s390/kvm/kvm-s390.c
arch/s390/kvm/vsie.c

index 8925f39..118d545 100644 (file)
@@ -244,6 +244,7 @@ struct kvm_s390_sie_block {
        __u8    fpf;                    /* 0x0060 */
 #define ECB_GS         0x40
 #define ECB_TE         0x10
+#define ECB_SPECI      0x08
 #define ECB_SRSI       0x04
 #define ECB_HOSTPROTINT        0x02
        __u8    ecb;                    /* 0x0061 */
index f72f361..5b45c83 100644 (file)
@@ -3180,6 +3180,8 @@ static int kvm_s390_vcpu_setup(struct kvm_vcpu *vcpu)
                vcpu->arch.sie_block->ecb |= ECB_SRSI;
        if (test_kvm_facility(vcpu->kvm, 73))
                vcpu->arch.sie_block->ecb |= ECB_TE;
+       if (!kvm_is_ucontrol(vcpu->kvm))
+               vcpu->arch.sie_block->ecb |= ECB_SPECI;
 
        if (test_kvm_facility(vcpu->kvm, 8) && vcpu->kvm->arch.use_pfmfi)
                vcpu->arch.sie_block->ecb2 |= ECB2_PFMFI;
index 4002a24..acda4b6 100644 (file)
@@ -510,6 +510,8 @@ static int shadow_scb(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
                        prefix_unmapped(vsie_page);
                scb_s->ecb |= ECB_TE;
        }
+       /* specification exception interpretation */
+       scb_s->ecb |= scb_o->ecb & ECB_SPECI;
        /* branch prediction */
        if (test_kvm_facility(vcpu->kvm, 82))
                scb_s->fpf |= scb_o->fpf & FPF_BPBC;