]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
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 8925f3969478f7ad2a7977e585438c3a95bb5217..118d5450c523d508a683b11cb0fd579f71799cd5 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 f72f361d39ddba8a84b0ed94b5efef4df8d544c2..5b45c83ced217c697d0a18d3d9340f548fc11275 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 4002a24bc43a6821e205f69560c48f48aa41eca7..acda4b6fc851824d22c3b7b68715c0905a8edfd1 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;