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