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