On 05.12.2017 09:33, Christian Borntraeger wrote: > From: Janosch Frank <frankja@xxxxxxxxxxxxxxxxxx> > > All skey functions call skey_check_enable at their start, which checks > if we are in the PSTATE and injects a privileged operation exception > if we are. Correct thing to do, are we sure we even get an intercept? (no documentation at hand :( ) > > Unfortunately they continue processing afterwards and perform the > operation anyhow as skey_check_enable does not deliver an error if the > exception injection was successful. > > Let's move the PSTATE check into the skey functions and exit them on > such an occasion, also we now do not enable skey handling anymore in > such a case. > > Signed-off-by: Janosch Frank <frankja@xxxxxxxxxxxxxxxxxx> > Reviewed-by: Christian Borntraeger <borntraeger@xxxxxxxxxx> > Fixes: a7e19ab ("KVM: s390: handle missing storage-key facility") > Cc: <stable@xxxxxxxxxxxxxxx> # v4.8+ > Signed-off-by: Christian Borntraeger <borntraeger@xxxxxxxxxx> > --- > arch/s390/kvm/priv.c | 11 +++++++++-- > 1 file changed, 9 insertions(+), 2 deletions(-) > > diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c > index 28b69ab..572496c 100644 > --- a/arch/s390/kvm/priv.c > +++ b/arch/s390/kvm/priv.c > @@ -232,8 +232,6 @@ static int try_handle_skey(struct kvm_vcpu *vcpu) > VCPU_EVENT(vcpu, 4, "%s", "retrying storage key operation"); > return -EAGAIN; > } > - if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE) > - return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP); > return 0; > } > > @@ -244,6 +242,9 @@ static int handle_iske(struct kvm_vcpu *vcpu) > int reg1, reg2; > int rc; > > + if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE) > + return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP); > + > rc = try_handle_skey(vcpu); > if (rc) > return rc != -EAGAIN ? rc : 0; > @@ -273,6 +274,9 @@ static int handle_rrbe(struct kvm_vcpu *vcpu) > int reg1, reg2; > int rc; > > + if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE) > + return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP); > + > rc = try_handle_skey(vcpu); > if (rc) > return rc != -EAGAIN ? rc : 0; > @@ -308,6 +312,9 @@ static int handle_sske(struct kvm_vcpu *vcpu) > int reg1, reg2; > int rc; > > + if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE) > + return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP); > + > rc = try_handle_skey(vcpu); > if (rc) > return rc != -EAGAIN ? rc : 0; > -- Thanks, David / dhildenb