KVM: mmu: Refactor memslot copy
Factor out copying kvm_memslots from allocating the memory for new ones in preparation for adding a new lock to protect the arch-specific fields of the memslots. No functional change intended. Reviewed-by: David Hildenbrand <david@redhat.com> Signed-off-by: Ben Gardon <bgardon@google.com> Message-Id: <20210518173414.450044-4-bgardon@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Родитель
56dd1019c8
Коммит
ddc12f2a12
|
@ -1307,6 +1307,18 @@ static struct kvm_memslots *install_new_memslots(struct kvm *kvm,
|
||||||
return old_memslots;
|
return old_memslots;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static size_t kvm_memslots_size(int slots)
|
||||||
|
{
|
||||||
|
return sizeof(struct kvm_memslots) +
|
||||||
|
(sizeof(struct kvm_memory_slot) * slots);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void kvm_copy_memslots(struct kvm_memslots *to,
|
||||||
|
struct kvm_memslots *from)
|
||||||
|
{
|
||||||
|
memcpy(to, from, kvm_memslots_size(from->used_slots));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Note, at a minimum, the current number of used slots must be allocated, even
|
* Note, at a minimum, the current number of used slots must be allocated, even
|
||||||
* when deleting a memslot, as we need a complete duplicate of the memslots for
|
* when deleting a memslot, as we need a complete duplicate of the memslots for
|
||||||
|
@ -1316,19 +1328,16 @@ static struct kvm_memslots *kvm_dup_memslots(struct kvm_memslots *old,
|
||||||
enum kvm_mr_change change)
|
enum kvm_mr_change change)
|
||||||
{
|
{
|
||||||
struct kvm_memslots *slots;
|
struct kvm_memslots *slots;
|
||||||
size_t old_size, new_size;
|
size_t new_size;
|
||||||
|
|
||||||
old_size = sizeof(struct kvm_memslots) +
|
|
||||||
(sizeof(struct kvm_memory_slot) * old->used_slots);
|
|
||||||
|
|
||||||
if (change == KVM_MR_CREATE)
|
if (change == KVM_MR_CREATE)
|
||||||
new_size = old_size + sizeof(struct kvm_memory_slot);
|
new_size = kvm_memslots_size(old->used_slots + 1);
|
||||||
else
|
else
|
||||||
new_size = old_size;
|
new_size = kvm_memslots_size(old->used_slots);
|
||||||
|
|
||||||
slots = kvzalloc(new_size, GFP_KERNEL_ACCOUNT);
|
slots = kvzalloc(new_size, GFP_KERNEL_ACCOUNT);
|
||||||
if (likely(slots))
|
if (likely(slots))
|
||||||
memcpy(slots, old, old_size);
|
kvm_copy_memslots(slots, old);
|
||||||
|
|
||||||
return slots;
|
return slots;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче