Message ID | 20210511171610.170160-4-bgardon@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Lazily allocate memslot rmaps | expand |
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@redhat.com> > Signed-off-by: Ben Gardon <bgardon@google.com> > --- > 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 >
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) +{ + 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; }