Re: [RFC PATCH 9/9] kvm_main.c: handle atomic memslot update

From: David Hildenbrand
Date: Tue Sep 27 2022 - 05:24:46 EST


On 27.09.22 10:35, Emanuele Giuseppe Esposito wrote:


Am 27/09/2022 um 09:46 schrieb David Hildenbrand:
On 09.09.22 12:45, Emanuele Giuseppe Esposito wrote:
When kvm_vm_ioctl_set_memory_region_list() is invoked, we need
to make sure that all memslots are updated in the inactive list
and then swap (preferreably only once) the lists, so that all
changes are visible immediately.

The only issue is that DELETE and MOVE need to perform 2 swaps:
firstly replace old memslot with invalid, and then remove invalid.


I'm curious, how would a resize (grow/shrink) or a split be handled?


There are only 4 operations possible in KVM: KVM_MR_{DELETE, MOVE,
CREATE, FLAGS_ONLY}.

A resize should be implemented in QEMU as DELETE+CREATE.

Therefore a resize on memslot X will be implemented as:
First pass on the userspace operations:
invalidate memslot X;
swap_memslot_list(); // NOW it is visible to the guest

What guest sees: memslot X is invalid, so MMU keeps retrying the page fault

Second pass:
create new memslot X
delete old memslot X

Thanks a lot for the very nice explanation!

Does the invalidation already free up memslot metadata (especially the rmaps) or will we end up temporarily allocating twice the memslot metadata?

--
Thanks,

David / dhildenb