On Tue, May 11, 2021, Ben Gardon wrote: > 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@xxxxxxxxxx> > Signed-off-by: Ben Gardon <bgardon@xxxxxxxxxx> > --- > virt/kvm/kvm_main.c | 23 ++++++++++++++++------- > 1 file changed, 16 insertions(+), 7 deletions(-) > > diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c > index 6b4feb92dc79..9e106742b388 100644 > --- a/virt/kvm/kvm_main.c > +++ b/virt/kvm/kvm_main.c > @@ -1306,6 +1306,18 @@ static struct kvm_memslots *install_new_memslots(struct kvm *kvm, > return old_memslots; > } > > +static size_t kvm_memslots_size(int slots) Can we call this kvm_calc_memslots_size()? This doesn't actually return the true size of a given memslots instance since the allocated size may be greater than the size computed by looking at used_slots. > +{ > + return sizeof(struct kvm_memslots) + > + (sizeof(struct kvm_memory_slot) * slots); > +} > + > +static void kvm_copy_memslots(struct kvm_memslots *from, > + struct kvm_memslots *to) > +{ > + memcpy(to, from, kvm_memslots_size(from->used_slots)); > +} > + > /* > * 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 > @@ -1315,19 +1327,16 @@ static struct kvm_memslots *kvm_dup_memslots(struct kvm_memslots *old, > enum kvm_mr_change change) > { > struct kvm_memslots *slots; > - size_t old_size, new_size; > - > - old_size = sizeof(struct kvm_memslots) + > - (sizeof(struct kvm_memory_slot) * old->used_slots); > + size_t new_size; > > if (change == KVM_MR_CREATE) > - new_size = old_size + sizeof(struct kvm_memory_slot); > + new_size = kvm_memslots_size(old->used_slots + 1); > else > - new_size = old_size; > + new_size = kvm_memslots_size(old->used_slots); > > slots = kvzalloc(new_size, GFP_KERNEL_ACCOUNT); > if (likely(slots)) > - memcpy(slots, old, old_size); > + kvm_copy_memslots(old, slots); > > return slots; > } > -- > 2.31.1.607.g51e8a6a459-goog >