aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/include/asm/kvm_host.h2
-rw-r--r--arch/x86/kvm/mmu.c6
-rw-r--r--arch/x86/kvm/x86.c11
3 files changed, 15 insertions, 4 deletions
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
index d4aab865606c..4f98da9243fc 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -500,11 +500,11 @@ struct kvm_vcpu_arch {
500}; 500};
501 501
502struct kvm_lpage_info { 502struct kvm_lpage_info {
503 unsigned long rmap_pde;
504 int write_count; 503 int write_count;
505}; 504};
506 505
507struct kvm_arch_memory_slot { 506struct kvm_arch_memory_slot {
507 unsigned long *rmap_pde[KVM_NR_PAGE_SIZES - 1];
508 struct kvm_lpage_info *lpage_info[KVM_NR_PAGE_SIZES - 1]; 508 struct kvm_lpage_info *lpage_info[KVM_NR_PAGE_SIZES - 1];
509}; 509};
510 510
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index d2855f895fde..3b3f5ae5da6a 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -960,13 +960,13 @@ static void pte_list_walk(unsigned long *pte_list, pte_list_walk_fn fn)
960static unsigned long *__gfn_to_rmap(gfn_t gfn, int level, 960static unsigned long *__gfn_to_rmap(gfn_t gfn, int level,
961 struct kvm_memory_slot *slot) 961 struct kvm_memory_slot *slot)
962{ 962{
963 struct kvm_lpage_info *linfo; 963 unsigned long idx;
964 964
965 if (likely(level == PT_PAGE_TABLE_LEVEL)) 965 if (likely(level == PT_PAGE_TABLE_LEVEL))
966 return &slot->rmap[gfn - slot->base_gfn]; 966 return &slot->rmap[gfn - slot->base_gfn];
967 967
968 linfo = lpage_info_slot(gfn, slot, level); 968 idx = gfn_to_index(gfn, slot->base_gfn, level);
969 return &linfo->rmap_pde; 969 return &slot->arch.rmap_pde[level - PT_DIRECTORY_LEVEL][idx];
970} 970}
971 971
972/* 972/*
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 59b59508ff07..829b4e972558 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -6314,6 +6314,10 @@ void kvm_arch_free_memslot(struct kvm_memory_slot *free,
6314 int i; 6314 int i;
6315 6315
6316 for (i = 0; i < KVM_NR_PAGE_SIZES - 1; ++i) { 6316 for (i = 0; i < KVM_NR_PAGE_SIZES - 1; ++i) {
6317 if (!dont || free->arch.rmap_pde[i] != dont->arch.rmap_pde[i]) {
6318 kvm_kvfree(free->arch.rmap_pde[i]);
6319 free->arch.rmap_pde[i] = NULL;
6320 }
6317 if (!dont || free->arch.lpage_info[i] != dont->arch.lpage_info[i]) { 6321 if (!dont || free->arch.lpage_info[i] != dont->arch.lpage_info[i]) {
6318 kvm_kvfree(free->arch.lpage_info[i]); 6322 kvm_kvfree(free->arch.lpage_info[i]);
6319 free->arch.lpage_info[i] = NULL; 6323 free->arch.lpage_info[i] = NULL;
@@ -6333,6 +6337,11 @@ int kvm_arch_create_memslot(struct kvm_memory_slot *slot, unsigned long npages)
6333 lpages = gfn_to_index(slot->base_gfn + npages - 1, 6337 lpages = gfn_to_index(slot->base_gfn + npages - 1,
6334 slot->base_gfn, level) + 1; 6338 slot->base_gfn, level) + 1;
6335 6339
6340 slot->arch.rmap_pde[i] =
6341 kvm_kvzalloc(lpages * sizeof(*slot->arch.rmap_pde[i]));
6342 if (!slot->arch.rmap_pde[i])
6343 goto out_free;
6344
6336 slot->arch.lpage_info[i] = 6345 slot->arch.lpage_info[i] =
6337 kvm_kvzalloc(lpages * sizeof(*slot->arch.lpage_info[i])); 6346 kvm_kvzalloc(lpages * sizeof(*slot->arch.lpage_info[i]));
6338 if (!slot->arch.lpage_info[i]) 6347 if (!slot->arch.lpage_info[i])
@@ -6361,7 +6370,9 @@ int kvm_arch_create_memslot(struct kvm_memory_slot *slot, unsigned long npages)
6361 6370
6362out_free: 6371out_free:
6363 for (i = 0; i < KVM_NR_PAGE_SIZES - 1; ++i) { 6372 for (i = 0; i < KVM_NR_PAGE_SIZES - 1; ++i) {
6373 kvm_kvfree(slot->arch.rmap_pde[i]);
6364 kvm_kvfree(slot->arch.lpage_info[i]); 6374 kvm_kvfree(slot->arch.lpage_info[i]);
6375 slot->arch.rmap_pde[i] = NULL;
6365 slot->arch.lpage_info[i] = NULL; 6376 slot->arch.lpage_info[i] = NULL;
6366 } 6377 }
6367 return -ENOMEM; 6378 return -ENOMEM;