Skip to content

Commit

Permalink
KVM: x86/mmu: Add a field to control memslot rmap allocation
Browse files Browse the repository at this point in the history
Add a field to control whether new memslots should have rmaps allocated
for them. As of this change, it's not safe to skip allocating rmaps, so
the field is always set to allocate rmaps. Future changes will make it
safe to operate without rmaps, using the TDP MMU. Then further changes
will allow the rmaps to be allocated lazily when needed for nested
oprtation.

No functional change expected.

Reviewed-by: David Hildenbrand <[email protected]>
Signed-off-by: Ben Gardon <[email protected]>
Message-Id: <[email protected]>
Signed-off-by: Paolo Bonzini <[email protected]>
  • Loading branch information
Ben Gardon authored and bonzini committed Jun 17, 2021
1 parent b10a038 commit a255740
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 5 deletions.
6 changes: 6 additions & 0 deletions arch/x86/include/asm/kvm_host.h
Original file line number Diff line number Diff line change
Expand Up @@ -1124,6 +1124,12 @@ struct kvm_arch {
*/
spinlock_t tdp_mmu_pages_lock;
#endif /* CONFIG_X86_64 */

/*
* If set, rmaps have been allocated for all memslots and should be
* allocated for any newly created or modified memslots.
*/
bool memslots_have_rmaps;
};

struct kvm_vm_stat {
Expand Down
2 changes: 2 additions & 0 deletions arch/x86/kvm/mmu/mmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -5511,6 +5511,8 @@ void kvm_mmu_init_vm(struct kvm *kvm)

kvm_mmu_init_tdp_mmu(kvm);

kvm->arch.memslots_have_rmaps = true;

node->track_write = kvm_mmu_pte_write;
node->track_flush_slot = kvm_mmu_invalidate_zap_pages_in_memslot;
kvm_page_track_register_notifier(kvm, node);
Expand Down
13 changes: 8 additions & 5 deletions arch/x86/kvm/x86.c
Original file line number Diff line number Diff line change
Expand Up @@ -10962,7 +10962,8 @@ static int memslot_rmap_alloc(struct kvm_memory_slot *slot,
return 0;
}

static int kvm_alloc_memslot_metadata(struct kvm_memory_slot *slot,
static int kvm_alloc_memslot_metadata(struct kvm *kvm,
struct kvm_memory_slot *slot,
unsigned long npages)
{
int i, r;
Expand All @@ -10974,9 +10975,11 @@ static int kvm_alloc_memslot_metadata(struct kvm_memory_slot *slot,
*/
memset(&slot->arch, 0, sizeof(slot->arch));

r = memslot_rmap_alloc(slot, npages);
if (r)
return r;
if (kvm->arch.memslots_have_rmaps) {
r = memslot_rmap_alloc(slot, npages);
if (r)
return r;
}

for (i = 1; i < KVM_NR_PAGE_SIZES; ++i) {
struct kvm_lpage_info *linfo;
Expand Down Expand Up @@ -11047,7 +11050,7 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm,
enum kvm_mr_change change)
{
if (change == KVM_MR_CREATE || change == KVM_MR_MOVE)
return kvm_alloc_memslot_metadata(memslot,
return kvm_alloc_memslot_metadata(kvm, memslot,
mem->memory_size >> PAGE_SHIFT);
return 0;
}
Expand Down

0 comments on commit a255740

Please sign in to comment.