]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: s390: Enable KVM_GENERIC_MMU_NOTIFIER
authorClaudio Imbrenda <imbrenda@linux.ibm.com>
Wed, 4 Feb 2026 15:02:39 +0000 (16:02 +0100)
committerClaudio Imbrenda <imbrenda@linux.ibm.com>
Wed, 4 Feb 2026 16:00:08 +0000 (17:00 +0100)
Enable KVM_GENERIC_MMU_NOTIFIER, for now with empty placeholder callbacks.

Also enable KVM_MMU_LOCKLESS_AGING and define KVM_HAVE_MMU_RWLOCK.

Acked-by: Christian Borntraeger <borntraeger@linux.ibm.com>
Reviewed-by: Steffen Eiden <seiden@linux.ibm.com>
Reviewed-by: Christoph Schlameuss <schlameuss@linux.ibm.com>
Acked-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
arch/s390/include/asm/kvm_host.h
arch/s390/kvm/Kconfig
arch/s390/kvm/kvm-s390.c

index 3dbddb7c60a99c794839fbf447623d0a8effed83..6ba99870fc32ed00df8f566ab36b39aab75f1d02 100644 (file)
@@ -27,6 +27,7 @@
 #include <asm/isc.h>
 #include <asm/guarded_storage.h>
 
+#define KVM_HAVE_MMU_RWLOCK
 #define KVM_MAX_VCPUS 255
 
 #define KVM_INTERNAL_MEM_SLOTS 1
index f4ec8c1ce2149a62b34fb087dd9d2cf06ed6acb3..917ac740513e225cb55ca782430ebe87cde5b3be 100644 (file)
@@ -30,6 +30,8 @@ config KVM
        select KVM_VFIO
        select MMU_NOTIFIER
        select VIRT_XFER_TO_GUEST_WORK
+       select KVM_GENERIC_MMU_NOTIFIER
+       select KVM_MMU_LOCKLESS_AGING
        help
          Support hosting paravirtualized guest machines using the SIE
          virtualization capability on the mainframe. This should work
index cd39b2f099ca7714d3bf1c21a761ec399b124623..ec92e6361eab5e6619ef8e03ccfea2d3fc6bc724 100644 (file)
@@ -4805,7 +4805,7 @@ try_again:
        rc = fixup_user_fault(vcpu->arch.gmap->mm, vmaddr, fault_flags, &unlocked);
        if (!rc)
                rc = __gmap_link(vcpu->arch.gmap, gaddr, vmaddr);
-       scoped_guard(spinlock, &vcpu->kvm->mmu_lock) {
+       scoped_guard(read_lock, &vcpu->kvm->mmu_lock) {
                kvm_release_faultin_page(vcpu->kvm, page, false, writable);
        }
        mmap_read_unlock(vcpu->arch.gmap->mm);
@@ -6021,6 +6021,49 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
        return;
 }
 
+/**
+ * kvm_test_age_gfn() - test young
+ * @kvm: the kvm instance
+ * @range: the range of guest addresses whose young status needs to be cleared
+ *
+ * Context: called by KVM common code without holding the kvm mmu lock
+ * Return: true if any page in the given range is young, otherwise 0.
+ */
+bool kvm_test_age_gfn(struct kvm *kvm, struct kvm_gfn_range *range)
+{
+       return false;
+}
+
+/**
+ * kvm_age_gfn() - clear young
+ * @kvm: the kvm instance
+ * @range: the range of guest addresses whose young status needs to be cleared
+ *
+ * Context: called by KVM common code without holding the kvm mmu lock
+ * Return: true if any page in the given range was young, otherwise 0.
+ */
+bool kvm_age_gfn(struct kvm *kvm, struct kvm_gfn_range *range)
+{
+       return false;
+}
+
+/**
+ * kvm_unmap_gfn_range() - Unmap a range of guest addresses
+ * @kvm: the kvm instance
+ * @range: the range of guest page frames to invalidate
+ *
+ * This function always returns false because every DAT table modification
+ * has to use the appropriate DAT table manipulation instructions, which will
+ * keep the TLB coherent, hence no additional TLB flush is ever required.
+ *
+ * Context: called by KVM common code with the kvm mmu write lock held
+ * Return: false
+ */
+bool kvm_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range)
+{
+       return false;
+}
+
 static inline unsigned long nonhyp_mask(int i)
 {
        unsigned int nonhyp_fai = (sclp.hmfai << i * 2) >> 30;