From owner-svn-soc-all@FreeBSD.ORG Mon Jun 16 06:37:37 2014 Return-Path: Delivered-To: svn-soc-all@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 6F8078D0 for ; Mon, 16 Jun 2014 06:37:37 +0000 (UTC) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 5AD3C2C39 for ; Mon, 16 Jun 2014 06:37:37 +0000 (UTC) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.14.8/8.14.8) with ESMTP id s5G6bbm1072919 for ; Mon, 16 Jun 2014 06:37:37 GMT (envelope-from mihai@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.14.8/8.14.8/Submit) id s5G6bZsm072570 for svn-soc-all@FreeBSD.org; Mon, 16 Jun 2014 06:37:35 GMT (envelope-from mihai@FreeBSD.org) Date: Mon, 16 Jun 2014 06:37:35 GMT Message-Id: <201406160637.s5G6bZsm072570@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to mihai@FreeBSD.org using -f From: mihai@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r269607 - in soc2014/mihai/bhyve-icache-head/sys/amd64: include vmm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 16 Jun 2014 06:37:37 -0000 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 #include +#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