Skip to content

Commit a11bdb1

Browse files
frankjaaborntraeger
authored andcommitted
KVM: s390: Fix pfmf and conditional skey emulation
We should not return with a lock. We also have to increase the address when we do page clearing. Fixes: bd096f6 ("KVM: s390: Add skey emulation fault handling") Signed-off-by: Janosch Frank <frankja@linux.ibm.com> Message-Id: <20180830081355.59234-1-frankja@linux.ibm.com> Reviewed-by: David Hildenbrand <david@redhat.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
1 parent 5736184 commit a11bdb1

File tree

1 file changed

+18
-12
lines changed

1 file changed

+18
-12
lines changed

arch/s390/kvm/priv.c

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -280,9 +280,11 @@ static int handle_iske(struct kvm_vcpu *vcpu)
280280
goto retry;
281281
}
282282
}
283-
if (rc)
284-
return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
285283
up_read(&current->mm->mmap_sem);
284+
if (rc == -EFAULT)
285+
return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
286+
if (rc < 0)
287+
return rc;
286288
vcpu->run->s.regs.gprs[reg1] &= ~0xff;
287289
vcpu->run->s.regs.gprs[reg1] |= key;
288290
return 0;
@@ -324,9 +326,11 @@ static int handle_rrbe(struct kvm_vcpu *vcpu)
324326
goto retry;
325327
}
326328
}
327-
if (rc < 0)
328-
return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
329329
up_read(&current->mm->mmap_sem);
330+
if (rc == -EFAULT)
331+
return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
332+
if (rc < 0)
333+
return rc;
330334
kvm_s390_set_psw_cc(vcpu, rc);
331335
return 0;
332336
}
@@ -390,12 +394,12 @@ static int handle_sske(struct kvm_vcpu *vcpu)
390394
FAULT_FLAG_WRITE, &unlocked);
391395
rc = !rc ? -EAGAIN : rc;
392396
}
397+
up_read(&current->mm->mmap_sem);
393398
if (rc == -EFAULT)
394399
return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
395-
396-
up_read(&current->mm->mmap_sem);
397-
if (rc >= 0)
398-
start += PAGE_SIZE;
400+
if (rc < 0)
401+
return rc;
402+
start += PAGE_SIZE;
399403
}
400404

401405
if (m3 & (SSKE_MC | SSKE_MR)) {
@@ -1002,13 +1006,15 @@ static int handle_pfmf(struct kvm_vcpu *vcpu)
10021006
FAULT_FLAG_WRITE, &unlocked);
10031007
rc = !rc ? -EAGAIN : rc;
10041008
}
1009+
up_read(&current->mm->mmap_sem);
10051010
if (rc == -EFAULT)
10061011
return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
1007-
1008-
up_read(&current->mm->mmap_sem);
1009-
if (rc >= 0)
1010-
start += PAGE_SIZE;
1012+
if (rc == -EAGAIN)
1013+
continue;
1014+
if (rc < 0)
1015+
return rc;
10111016
}
1017+
start += PAGE_SIZE;
10121018
}
10131019
if (vcpu->run->s.regs.gprs[reg1] & PFMF_FSC) {
10141020
if (psw_bits(vcpu->arch.sie_block->gpsw).eaba == PSW_BITS_AMODE_64BIT) {

0 commit comments

Comments
 (0)