Messages in this thread | | | Subject | Re: [PATCH v2] KVM: s390: Enable specification exception interpretation | From | Christian Borntraeger <> | Date | Wed, 7 Jul 2021 14:59:13 +0200 |
| |
On 07.07.21 14:07, Janis Schoetterl-Glausch wrote: > When this feature is enabled the hardware is free to interpret > specification exceptions generated by the guest, instead of causing > program interruption interceptions, but it is not required to. > There is no indication if this feature is available or not, > so we can simply set this bit and if the hardware ignores it > we fall back to intercept 8 handling. > The same applies to vSIE, we forward the guest hypervisor's bit > and fall back to injection if interpretation does not occur. > > 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. > A specification exception detected on the program new PSW > will also always cause an interception. > > Signed-off-by: Janis Schoetterl-Glausch <scgl@linux.ibm.com> > Reviewed-by: David Hildenbrand <david@redhat.com> > Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com> > Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Thanks, applied.
> --- > v1 -> v2 > Rephrase commit message > Add comment about opting into interpretation > > arch/s390/include/asm/kvm_host.h | 1 + > arch/s390/kvm/kvm-s390.c | 5 +++++ > arch/s390/kvm/vsie.c | 2 ++ > 3 files changed, 8 insertions(+) > > diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h > index 9b4473f76e56..3a5b5084cdbe 100644 > --- a/arch/s390/include/asm/kvm_host.h > +++ b/arch/s390/include/asm/kvm_host.h > @@ -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 */ > diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c > index b655a7d82bf0..7675b72a3ddf 100644 > --- a/arch/s390/kvm/kvm-s390.c > +++ b/arch/s390/kvm/kvm-s390.c > @@ -3200,6 +3200,11 @@ 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; > + /* no facility bit, can opt in because we do not need > + * to observe specification exception intercepts > + */ > + 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; > diff --git a/arch/s390/kvm/vsie.c b/arch/s390/kvm/vsie.c > index 4002a24bc43a..acda4b6fc851 100644 > --- a/arch/s390/kvm/vsie.c > +++ b/arch/s390/kvm/vsie.c > @@ -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; >
| |