WARN and return -EIO if an existing memslot with npages=0 is encountered
when updating memslots, as KVM returns NULL if there is no memslot since
commit 0577d1abe704 ("KVM: Terminate memslot walks via used_slots". Before
that, KVM pre-allocated all possible memslots and relied on npages==0 to
denote "no valid memslot". The check on npages was deliberately left
behind to aid debug, but that was over six years ago.
Signed-off-by: Sean Christopherson <seanjc@google.com>
---
virt/kvm/kvm_main.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 218456372b11..dcd28b45ef30 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -2086,9 +2086,11 @@ static int kvm_set_memory_region(struct kvm *kvm,
* and/or destroyed by kvm_set_memslot().
*/
old = id_to_memslot(slots, id);
+ if (WARN_ON_ONCE(old && !old->npages))
+ return -EIO;
if (!mem->memory_size) {
- if (!old || !old->npages)
+ if (!old)
return -EINVAL;
if (WARN_ON_ONCE(kvm->nr_memslot_pages < old->npages))@@ -2100,7 +2102,7 @@ static int kvm_set_memory_region(struct kvm *kvm,
base_gfn = (mem->guest_phys_addr >> PAGE_SHIFT);
npages = (mem->memory_size >> PAGE_SHIFT);
- if (!old || !old->npages) {
+ if (!old) {
change = KVM_MR_CREATE;
/*--
2.56.0.385.gac671c819a-goog