socsvn commit: r269607 - in soc2014/mihai/bhyve-icache-head/sys/amd64: include vmm
mihai at FreeBSD.org
mihai at FreeBSD.org
Mon Jun 16 06:37:37 UTC 2014
Author: mihai
Date: Mon Jun 16 06:37:35 2014
New Revision: 269607
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=269607
Log:
sys: amd64: vmm: add VMM_STAT counters for instruction caching
Modified:
soc2014/mihai/bhyve-icache-head/sys/amd64/include/vmm_instruction_cache.h
soc2014/mihai/bhyve-icache-head/sys/amd64/vmm/vmm.c
soc2014/mihai/bhyve-icache-head/sys/amd64/vmm/vmm_instruction_cache.c
soc2014/mihai/bhyve-icache-head/sys/amd64/vmm/vmm_stat.c
soc2014/mihai/bhyve-icache-head/sys/amd64/vmm/vmm_stat.h
Modified: soc2014/mihai/bhyve-icache-head/sys/amd64/include/vmm_instruction_cache.h
==============================================================================
--- soc2014/mihai/bhyve-icache-head/sys/amd64/include/vmm_instruction_cache.h Mon Jun 16 04:32:27 2014 (r269606)
+++ soc2014/mihai/bhyve-icache-head/sys/amd64/include/vmm_instruction_cache.h Mon Jun 16 06:37:35 2014 (r269607)
@@ -33,11 +33,11 @@
int vmm_inst_cache_init(void);
int vmm_inst_cache_cleanup(void);
-int vm_inst_cache_add(struct vm *vm, uint64_t rip, uint64_t cr3,
+int vm_inst_cache_add(struct vm *vm, int vcpu, uint64_t rip, uint64_t cr3,
enum vie_paging_mode paging_mode, struct vie *vie);
-int vm_inst_cache_lookup(struct vm *vm, uint64_t rip, uint64_t cr3,
+int vm_inst_cache_lookup(struct vm *vm, int vcpu, uint64_t rip, uint64_t cr3,
struct vie *vie);
-int vm_inst_cache_delete(struct vm *vm, uint64_t rip, uint64_t cr3);
+int vm_inst_cache_delete(struct vm *vm, int vcpu, uint64_t rip, uint64_t cr3);
#define vm_inst_cache_lock_init(vm) sx_init(&vm->inst_cache_lock, "VM INST CACHE LOCK")
#define vm_inst_cache_xlock(vm) sx_xlock(&vm->inst_cache_lock)
Modified: soc2014/mihai/bhyve-icache-head/sys/amd64/vmm/vmm.c
==============================================================================
--- soc2014/mihai/bhyve-icache-head/sys/amd64/vmm/vmm.c Mon Jun 16 04:32:27 2014 (r269606)
+++ soc2014/mihai/bhyve-icache-head/sys/amd64/vmm/vmm.c Mon Jun 16 06:37:35 2014 (r269607)
@@ -1136,7 +1136,7 @@
if (!inst_cache_locked) {
inst_cache_locked = true;
vm_inst_cache_xlock(vm);
- vm_inst_cache_delete(vm, vme->u.paging.gpa, vme->u.paging.cr3);
+ vm_inst_cache_delete(vm, vcpuid, vme->u.paging.gpa, vme->u.paging.cr3);
goto again;
}
}
@@ -1185,7 +1185,7 @@
/* Check to see if the instruction is cached */
vm_inst_cache_slock(vm);
- if (vm_inst_cache_lookup(vm, rip, cr3, vie)) {
+ if (vm_inst_cache_lookup(vm, vcpuid, rip, cr3, vie)) {
vm_inst_cache_unlock(vm);
vie_init(vie);
@@ -1200,7 +1200,7 @@
vm_inst_cache_xlock(vm);
/* Cache decoded instruction for further use */
- vm_inst_cache_add(vm, rip, cr3, paging_mode, vie);
+ vm_inst_cache_add(vm, vcpuid, rip, cr3, paging_mode, vie);
}
vm_inst_cache_unlock(vm);
Modified: soc2014/mihai/bhyve-icache-head/sys/amd64/vmm/vmm_instruction_cache.c
==============================================================================
--- soc2014/mihai/bhyve-icache-head/sys/amd64/vmm/vmm_instruction_cache.c Mon Jun 16 04:32:27 2014 (r269606)
+++ soc2014/mihai/bhyve-icache-head/sys/amd64/vmm/vmm_instruction_cache.c Mon Jun 16 06:37:35 2014 (r269607)
@@ -46,6 +46,8 @@
#include <machine/vmm.h>
#include <machine/vmm_instruction_cache.h>
+#include "vmm_stat.h"
+
#define PT_NLEVELS 10
#define GB (1024 * 1024 * 1024)
@@ -292,7 +294,7 @@
return (-1);
}
int
-vm_inst_cache_add(struct vm *vm, uint64_t rip, uint64_t cr3,
+vm_inst_cache_add(struct vm *vm, int vcpu, uint64_t rip, uint64_t cr3,
enum vie_paging_mode paging_mode,
struct vie *vie)
{
@@ -328,11 +330,13 @@
sx_xunlock(&vie_cached_hash[hash].vie_cached_lock);
+ vmm_stat_incr(vm, vcpu, VM_INST_CACHE_INSERTIONS, 1);
+
return (0);
}
int
-vm_inst_cache_lookup(struct vm *vm, uint64_t rip, uint64_t cr3,
+vm_inst_cache_lookup(struct vm *vm, int vcpu, uint64_t rip, uint64_t cr3,
struct vie *vie)
{
struct vie_cached *vie_cached;
@@ -353,6 +357,9 @@
{
bcopy(&vie_cached->vie, vie, sizeof(struct vie));
sx_sunlock(&vie_cached_hash[hash].vie_cached_lock);
+
+ vmm_stat_incr(vm, vcpu, VM_INST_CACHE_HITS, 1);
+
return(0);
}
}
@@ -361,7 +368,7 @@
}
int
-vm_inst_cache_delete(struct vm *vm, uint64_t fault_address, uint64_t cr3)
+vm_inst_cache_delete(struct vm *vm, int vcpu, uint64_t fault_address, uint64_t cr3)
{
struct vie_cached *vie_cached, *vie_cached_safe;
int hash, i;
@@ -392,6 +399,8 @@
/* Remove the RIP found and continue searching */
LIST_REMOVE(vie_cached, vie_link);
+ vmm_stat_array_incr(vm, vcpu, VM_INST_CACHE_EVICTIONS, i, 1);
+
page_addr = vie_cached->pages[i];
page_size = vie_cached->pages_mask[i] + 1;
Modified: soc2014/mihai/bhyve-icache-head/sys/amd64/vmm/vmm_stat.c
==============================================================================
--- soc2014/mihai/bhyve-icache-head/sys/amd64/vmm/vmm_stat.c Mon Jun 16 04:32:27 2014 (r269606)
+++ soc2014/mihai/bhyve-icache-head/sys/amd64/vmm/vmm_stat.c Mon Jun 16 06:37:35 2014 (r269607)
@@ -153,3 +153,7 @@
VMM_STAT(VMEXIT_USERSPACE, "number of vm exits handled in userspace");
VMM_STAT(VMEXIT_RENDEZVOUS, "number of times rendezvous pending at exit");
VMM_STAT(VMEXIT_EXCEPTION, "number of vm exits due to exceptions");
+VMM_STAT(VM_INST_CACHE_HITS, "number of instruction cache hits");
+VMM_STAT_ARRAY(VM_INST_CACHE_EVICTIONS, 4, "number of instruction cache evictions");
+VMM_STAT(VM_INST_CACHE_INSERTIONS, "number of instruction cache insertions");
+
Modified: soc2014/mihai/bhyve-icache-head/sys/amd64/vmm/vmm_stat.h
==============================================================================
--- soc2014/mihai/bhyve-icache-head/sys/amd64/vmm/vmm_stat.h Mon Jun 16 04:32:27 2014 (r269606)
+++ soc2014/mihai/bhyve-icache-head/sys/amd64/vmm/vmm_stat.h Mon Jun 16 06:37:35 2014 (r269607)
@@ -123,4 +123,7 @@
VMM_STAT_DECLARE(VMEXIT_USERSPACE);
VMM_STAT_DECLARE(VMEXIT_RENDEZVOUS);
VMM_STAT_DECLARE(VMEXIT_EXCEPTION);
+VMM_STAT_DECLARE(VM_INST_CACHE_HITS);
+VMM_STAT_DECLARE(VM_INST_CACHE_EVICTIONS);
+VMM_STAT_DECLARE(VM_INST_CACHE_INSERTIONS);
#endif
More information about the svn-soc-all
mailing list