]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: s390: Fix KVM_S390_VCPU_FAULT ioctl
authorClaudio Imbrenda <imbrenda@linux.ibm.com>
Thu, 26 Mar 2026 13:17:19 +0000 (14:17 +0100)
committerClaudio Imbrenda <imbrenda@linux.ibm.com>
Thu, 26 Mar 2026 15:12:38 +0000 (16:12 +0100)
A previous commit changed the behaviour of the KVM_S390_VCPU_FAULT
ioctl. The current (wrong) implementation will trigger a guest
addressing exception if the requested address lies outside of a
memslot, unless the VM is UCONTROL.

Restore the previous behaviour by open coding the fault-in logic.

Fixes: 3762e905ec2e ("KVM: s390: use __kvm_faultin_pfn()")
Acked-by: Christian Borntraeger <borntraeger@linux.ibm.com>
Reviewed-by: Steffen Eiden <seiden@linux.ibm.com>
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
arch/s390/kvm/kvm-s390.c

index b2c01fa7b852c8257781a77c91d1a40248cba2f7..d7838334a33823f6ca047bce65914349ed50db23 100644 (file)
@@ -5520,9 +5520,21 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
        }
 #endif
        case KVM_S390_VCPU_FAULT: {
-               idx = srcu_read_lock(&vcpu->kvm->srcu);
-               r = vcpu_dat_fault_handler(vcpu, arg, 0);
-               srcu_read_unlock(&vcpu->kvm->srcu, idx);
+               gpa_t gaddr = arg;
+
+               scoped_guard(srcu, &vcpu->kvm->srcu) {
+                       r = vcpu_ucontrol_translate(vcpu, &gaddr);
+                       if (r)
+                               break;
+
+                       r = kvm_s390_faultin_gfn_simple(vcpu, NULL, gpa_to_gfn(gaddr), false);
+                       if (r == PGM_ADDRESSING)
+                               r = -EFAULT;
+                       if (r <= 0)
+                               break;
+                       r = -EIO;
+                       KVM_BUG_ON(r, vcpu->kvm);
+               }
                break;
        }
        case KVM_ENABLE_CAP: