diff options
author | Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp> | 2012-07-02 04:57:17 -0400 |
---|---|---|
committer | Marcelo Tosatti <mtosatti@redhat.com> | 2012-07-18 15:55:04 -0400 |
commit | 77d11309b3a10e1ce112058ec2c9b7b979bcf311 (patch) | |
tree | 295d8d2adea1e2b68eac599263b963059fecf3a5 /arch/x86/kvm | |
parent | b3ae2096974b12c3af2ad1a4e7716b084949867f (diff) |
KVM: Separate rmap_pde from kvm_lpage_info->write_count
This makes it possible to loop over rmap_pde arrays in the same way as
we do over rmap so that we can optimize kvm_handle_hva_range() easily in
the following patch.
Signed-off-by: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'arch/x86/kvm')
-rw-r--r-- | arch/x86/kvm/mmu.c | 6 | ||||
-rw-r--r-- | arch/x86/kvm/x86.c | 11 |
2 files changed, 14 insertions, 3 deletions
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) | |||
960 | static unsigned long *__gfn_to_rmap(gfn_t gfn, int level, | 960 | static 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 | ||
6362 | out_free: | 6371 | out_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; |