Please re-add the "Fixes" tag. While not relevant for stable, it might be relevant for backport. On 08/30/2018 10:21 AM, Janosch Frank wrote: > On 30.08.2018 10:13, Janosch Frank wrote: >> We should not return with a lock. >> We also have to increase the address when we do page clearing. >> >> Signed-off-by: Janosch Frank <frankja@xxxxxxxxxxxxx> > > It's time for a vacation, patch will be renamed to: > KVM: s390: Fix skey emulation fault error handling > >> --- >> >> I knew there were more instances... >> >> --- >> arch/s390/kvm/priv.c | 30 ++++++++++++++++++------------ >> 1 file changed, 18 insertions(+), 12 deletions(-) >> >> diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c >> index d68f10441a16..8679bd74d337 100644 >> --- a/arch/s390/kvm/priv.c >> +++ b/arch/s390/kvm/priv.c >> @@ -280,9 +280,11 @@ static int handle_iske(struct kvm_vcpu *vcpu) >> goto retry; >> } >> } >> - if (rc) >> - return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING); >> up_read(¤t->mm->mmap_sem); >> + if (rc == -EFAULT) >> + return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING); >> + if (rc < 0) >> + return rc; >> vcpu->run->s.regs.gprs[reg1] &= ~0xff; >> vcpu->run->s.regs.gprs[reg1] |= key; >> return 0; >> @@ -324,9 +326,11 @@ static int handle_rrbe(struct kvm_vcpu *vcpu) >> goto retry; >> } >> } >> - if (rc < 0) >> - return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING); >> up_read(¤t->mm->mmap_sem); >> + if (rc == -EFAULT) >> + return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING); >> + if (rc < 0) >> + return rc; >> kvm_s390_set_psw_cc(vcpu, rc); >> return 0; >> } >> @@ -390,12 +394,12 @@ static int handle_sske(struct kvm_vcpu *vcpu) >> FAULT_FLAG_WRITE, &unlocked); >> rc = !rc ? -EAGAIN : rc; >> } >> + up_read(¤t->mm->mmap_sem); >> if (rc == -EFAULT) >> return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING); >> - >> - up_read(¤t->mm->mmap_sem); >> - if (rc >= 0) >> - start += PAGE_SIZE; >> + if (rc < 0) >> + return rc; >> + start += PAGE_SIZE; >> } >> >> if (m3 & (SSKE_MC | SSKE_MR)) { >> @@ -1002,13 +1006,15 @@ static int handle_pfmf(struct kvm_vcpu *vcpu) >> FAULT_FLAG_WRITE, &unlocked); >> rc = !rc ? -EAGAIN : rc; >> } >> + up_read(¤t->mm->mmap_sem); >> if (rc == -EFAULT) >> return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING); >> - >> - up_read(¤t->mm->mmap_sem); >> - if (rc >= 0) >> - start += PAGE_SIZE; >> + if (rc == -EAGAIN) >> + continue; >> + if (rc < 0) >> + return rc; >> } >> + start += PAGE_SIZE; >> } >> if (vcpu->run->s.regs.gprs[reg1] & PFMF_FSC) { >> if (psw_bits(vcpu->arch.sie_block->gpsw).eaba == PSW_BITS_AMODE_64BIT) { >> > >