]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: Do not restrict the size of KVM-internal memory regions
authorSean Christopherson <seanjc@google.com>
Thu, 23 Jan 2025 14:46:13 +0000 (15:46 +0100)
committerClaudio Imbrenda <imbrenda@linux.ibm.com>
Fri, 31 Jan 2025 11:03:52 +0000 (12:03 +0100)
Exempt KVM-internal memslots from the KVM_MEM_MAX_NR_PAGES restriction, as
the limit on the number of pages exists purely to play nice with dirty
bitmap operations, which use 32-bit values to index the bitmaps, and dirty
logging isn't supported for KVM-internal memslots.

Link: https://lore.kernel.org/all/20240802205003.353672-6-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
Reviewed-by: Christoph Schlameuss <schlameuss@linux.ibm.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Link: https://lore.kernel.org/r/20250123144627.312456-2-imbrenda@linux.ibm.com
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Message-ID: <20250123144627.312456-2-imbrenda@linux.ibm.com>

virt/kvm/kvm_main.c

index faf10671eed2a39365855d54c05e8b03256cea00..3f04cd5e3a8cfb37bf2ad6c1dc9ab16882e01d14 100644 (file)
@@ -1971,7 +1971,15 @@ static int kvm_set_memory_region(struct kvm *kvm,
                return -EINVAL;
        if (mem->guest_phys_addr + mem->memory_size < mem->guest_phys_addr)
                return -EINVAL;
-       if ((mem->memory_size >> PAGE_SHIFT) > KVM_MEM_MAX_NR_PAGES)
+
+       /*
+        * The size of userspace-defined memory regions is restricted in order
+        * to play nice with dirty bitmap operations, which are indexed with an
+        * "unsigned int".  KVM's internal memory regions don't support dirty
+        * logging, and so are exempt.
+        */
+       if (id < KVM_USER_MEM_SLOTS &&
+           (mem->memory_size >> PAGE_SHIFT) > KVM_MEM_MAX_NR_PAGES)
                return -EINVAL;
 
        slots = __kvm_memslots(kvm, as_id);