Message ID | 20250117190938.93793-2-imbrenda@linux.ibm.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | KVM: s390: Stop using page->index and other things | expand |
On 17.01.25 20:09, Claudio Imbrenda wrote: > From: Sean Christopherson <seanjc@google.com> > > 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> > --- > virt/kvm/kvm_main.c | 10 +++++++++- > 1 file changed, 9 insertions(+), 1 deletion(-) > > diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c > index a8a84bf450f9..ee3f040a4891 100644 > --- a/virt/kvm/kvm_main.c > +++ b/virt/kvm/kvm_main.c > @@ -1966,7 +1966,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); Reviewed-by: David Hildenbrand <david@redhat.com>
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index a8a84bf450f9..ee3f040a4891 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -1966,7 +1966,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);