diff options
author | Avi Kivity <avi@qumranet.com> | 2007-11-18 09:37:07 -0500 |
---|---|---|
committer | Avi Kivity <avi@qumranet.com> | 2008-01-30 10:53:04 -0500 |
commit | 4cee576493b6abc95cc7447a65f1b9d2b40b8f20 (patch) | |
tree | 64235c288aaee838e7cebea4d129157935a26e75 /drivers/kvm | |
parent | ba1389b7a04de07e6231693b7ebb34f5b5d1a3e6 (diff) |
KVM: MMU: Add some mmu statistics
Signed-off-by: Avi Kivity <avi@qumranet.com>
Diffstat (limited to 'drivers/kvm')
-rw-r--r-- | drivers/kvm/kvm.h | 6 | ||||
-rw-r--r-- | drivers/kvm/mmu.c | 9 | ||||
-rw-r--r-- | drivers/kvm/x86.c | 6 |
3 files changed, 20 insertions, 1 deletions
diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h index d3171f9c9c01..bdcc44e6b6d7 100644 --- a/drivers/kvm/kvm.h +++ b/drivers/kvm/kvm.h | |||
@@ -362,6 +362,12 @@ struct kvm_memory_slot { | |||
362 | }; | 362 | }; |
363 | 363 | ||
364 | struct kvm_vm_stat { | 364 | struct kvm_vm_stat { |
365 | u32 mmu_shadow_zapped; | ||
366 | u32 mmu_pte_write; | ||
367 | u32 mmu_pte_updated; | ||
368 | u32 mmu_pde_zapped; | ||
369 | u32 mmu_flooded; | ||
370 | u32 mmu_recycled; | ||
365 | }; | 371 | }; |
366 | 372 | ||
367 | struct kvm { | 373 | struct kvm { |
diff --git a/drivers/kvm/mmu.c b/drivers/kvm/mmu.c index 9be54a5e858e..87d8e70fe502 100644 --- a/drivers/kvm/mmu.c +++ b/drivers/kvm/mmu.c | |||
@@ -755,6 +755,7 @@ static void kvm_mmu_zap_page(struct kvm *kvm, | |||
755 | { | 755 | { |
756 | u64 *parent_pte; | 756 | u64 *parent_pte; |
757 | 757 | ||
758 | ++kvm->stat.mmu_shadow_zapped; | ||
758 | while (page->multimapped || page->parent_pte) { | 759 | while (page->multimapped || page->parent_pte) { |
759 | if (!page->multimapped) | 760 | if (!page->multimapped) |
760 | parent_pte = page->parent_pte; | 761 | parent_pte = page->parent_pte; |
@@ -1226,9 +1227,12 @@ static void mmu_pte_write_new_pte(struct kvm_vcpu *vcpu, | |||
1226 | const void *new, int bytes, | 1227 | const void *new, int bytes, |
1227 | int offset_in_pte) | 1228 | int offset_in_pte) |
1228 | { | 1229 | { |
1229 | if (page->role.level != PT_PAGE_TABLE_LEVEL) | 1230 | if (page->role.level != PT_PAGE_TABLE_LEVEL) { |
1231 | ++vcpu->kvm->stat.mmu_pde_zapped; | ||
1230 | return; | 1232 | return; |
1233 | } | ||
1231 | 1234 | ||
1235 | ++vcpu->kvm->stat.mmu_pte_updated; | ||
1232 | if (page->role.glevels == PT32_ROOT_LEVEL) | 1236 | if (page->role.glevels == PT32_ROOT_LEVEL) |
1233 | paging32_update_pte(vcpu, page, spte, new, bytes, | 1237 | paging32_update_pte(vcpu, page, spte, new, bytes, |
1234 | offset_in_pte); | 1238 | offset_in_pte); |
@@ -1263,6 +1267,7 @@ void kvm_mmu_pte_write(struct kvm_vcpu *vcpu, gpa_t gpa, | |||
1263 | int npte; | 1267 | int npte; |
1264 | 1268 | ||
1265 | pgprintk("%s: gpa %llx bytes %d\n", __FUNCTION__, gpa, bytes); | 1269 | pgprintk("%s: gpa %llx bytes %d\n", __FUNCTION__, gpa, bytes); |
1270 | ++vcpu->kvm->stat.mmu_pte_write; | ||
1266 | kvm_mmu_audit(vcpu, "pre pte write"); | 1271 | kvm_mmu_audit(vcpu, "pre pte write"); |
1267 | if (gfn == vcpu->last_pt_write_gfn | 1272 | if (gfn == vcpu->last_pt_write_gfn |
1268 | && !last_updated_pte_accessed(vcpu)) { | 1273 | && !last_updated_pte_accessed(vcpu)) { |
@@ -1296,6 +1301,7 @@ void kvm_mmu_pte_write(struct kvm_vcpu *vcpu, gpa_t gpa, | |||
1296 | pgprintk("misaligned: gpa %llx bytes %d role %x\n", | 1301 | pgprintk("misaligned: gpa %llx bytes %d role %x\n", |
1297 | gpa, bytes, page->role.word); | 1302 | gpa, bytes, page->role.word); |
1298 | kvm_mmu_zap_page(vcpu->kvm, page); | 1303 | kvm_mmu_zap_page(vcpu->kvm, page); |
1304 | ++vcpu->kvm->stat.mmu_flooded; | ||
1299 | continue; | 1305 | continue; |
1300 | } | 1306 | } |
1301 | page_offset = offset; | 1307 | page_offset = offset; |
@@ -1344,6 +1350,7 @@ void __kvm_mmu_free_some_pages(struct kvm_vcpu *vcpu) | |||
1344 | page = container_of(vcpu->kvm->active_mmu_pages.prev, | 1350 | page = container_of(vcpu->kvm->active_mmu_pages.prev, |
1345 | struct kvm_mmu_page, link); | 1351 | struct kvm_mmu_page, link); |
1346 | kvm_mmu_zap_page(vcpu->kvm, page); | 1352 | kvm_mmu_zap_page(vcpu->kvm, page); |
1353 | ++vcpu->kvm->stat.mmu_recycled; | ||
1347 | } | 1354 | } |
1348 | } | 1355 | } |
1349 | 1356 | ||
diff --git a/drivers/kvm/x86.c b/drivers/kvm/x86.c index 016abc3357e9..fdc7632d7620 100644 --- a/drivers/kvm/x86.c +++ b/drivers/kvm/x86.c | |||
@@ -66,6 +66,12 @@ struct kvm_stats_debugfs_item debugfs_entries[] = { | |||
66 | { "fpu_reload", VCPU_STAT(fpu_reload) }, | 66 | { "fpu_reload", VCPU_STAT(fpu_reload) }, |
67 | { "insn_emulation", VCPU_STAT(insn_emulation) }, | 67 | { "insn_emulation", VCPU_STAT(insn_emulation) }, |
68 | { "insn_emulation_fail", VCPU_STAT(insn_emulation_fail) }, | 68 | { "insn_emulation_fail", VCPU_STAT(insn_emulation_fail) }, |
69 | { "mmu_shadow_zapped", VM_STAT(mmu_shadow_zapped) }, | ||
70 | { "mmu_pte_write", VM_STAT(mmu_pte_write) }, | ||
71 | { "mmu_pte_updated", VM_STAT(mmu_pte_updated) }, | ||
72 | { "mmu_pde_zapped", VM_STAT(mmu_pde_zapped) }, | ||
73 | { "mmu_flooded", VM_STAT(mmu_flooded) }, | ||
74 | { "mmu_recycled", VM_STAT(mmu_recycled) }, | ||
69 | { NULL } | 75 | { NULL } |
70 | }; | 76 | }; |
71 | 77 | ||