vmm_stat.h revision 270071
148905Srnordier/*- 248905Srnordier * Copyright (c) 2011 NetApp, Inc. 348905Srnordier * All rights reserved. 448905Srnordier * 548905Srnordier * Redistribution and use in source and binary forms, with or without 648905Srnordier * modification, are permitted provided that the following conditions 748905Srnordier * are met: 848905Srnordier * 1. Redistributions of source code must retain the above copyright 948905Srnordier * notice, this list of conditions and the following disclaimer. 1048905Srnordier * 2. Redistributions in binary form must reproduce the above copyright 1148905Srnordier * notice, this list of conditions and the following disclaimer in the 1248905Srnordier * documentation and/or other materials provided with the distribution. 1348905Srnordier * 4. Neither the name of the University nor the names of its contributors 1448905Srnordier * may be used to endorse or promote products derived from this software 1548905Srnordier * without specific prior written permission. 1648905Srnordier * 1748905Srnordier * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 1848905Srnordier * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1948905Srnordier * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2048905Srnordier * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2148905Srnordier * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2248905Srnordier * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2348905Srnordier * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2448905Srnordier * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2548905Srnordier * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2650479Speter * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2748905Srnordier * SUCH DAMAGE. 2848905Srnordier * 29130927Sobrien * $FreeBSD: stable/10/sys/amd64/vmm/vmm_stat.h 270071 2014-08-17 01:00:42Z grehan $ 30130927Sobrien */ 31130927Sobrien 3248905Srnordier#ifndef _VMM_STAT_H_ 3348905Srnordier#define _VMM_STAT_H_ 3448905Srnordier 3548905Srnordierstruct vm; 3648905Srnordier 3748905Srnordier#define MAX_VMM_STAT_ELEMS 64 /* arbitrary */ 3848905Srnordier 3948905Srnordierenum vmm_stat_scope { 4048905Srnordier VMM_STAT_SCOPE_ANY, 4148905Srnordier VMM_STAT_SCOPE_INTEL, /* Intel VMX specific statistic */ 42130927Sobrien VMM_STAT_SCOPE_AMD, /* AMD SVM specific statistic */ 4348905Srnordier}; 4468313Srnordier 4548905Srnordierstruct vmm_stat_type { 4648905Srnordier int index; /* position in the stats buffer */ 4748905Srnordier int nelems; /* standalone or array */ 4848905Srnordier const char *desc; /* description of statistic */ 4968313Srnordier enum vmm_stat_scope scope; 5048905Srnordier}; 5148905Srnordier 5248905Srnordiervoid vmm_stat_register(void *arg); 53130927Sobrien 5448905Srnordier#define VMM_STAT_DEFINE(type, nelems, desc, scope) \ 5548905Srnordier struct vmm_stat_type type[1] = { \ 5648905Srnordier { -1, nelems, desc, scope } \ 5748905Srnordier }; \ 5848905Srnordier SYSINIT(type##_stat, SI_SUB_KLD, SI_ORDER_ANY, vmm_stat_register, type) 5948905Srnordier 6048905Srnordier#define VMM_STAT_DECLARE(type) \ 6148905Srnordier extern struct vmm_stat_type type[1] 62112089Sru 6348905Srnordier#define VMM_STAT(type, desc) \ 6448905Srnordier VMM_STAT_DEFINE(type, 1, desc, VMM_STAT_SCOPE_ANY) 6548905Srnordier#define VMM_STAT_INTEL(type, desc) \ 6648905Srnordier VMM_STAT_DEFINE(type, 1, desc, VMM_STAT_SCOPE_INTEL) 6748905Srnordier#define VMM_STAT_AMD(type, desc) \ 6848905Srnordier VMM_STAT_DEFINE(type, 1, desc, VMM_STAT_SCOPE_AMD) 6948905Srnordier 7048905Srnordier#define VMM_STAT_ARRAY(type, nelems, desc) \ 7148905Srnordier VMM_STAT_DEFINE(type, nelems, desc, VMM_STAT_SCOPE_ANY) 7248905Srnordier 7368313Srnordiervoid *vmm_stat_alloc(void); 7468313Srnordiervoid vmm_stat_init(void *vp); 7568313Srnordiervoid vmm_stat_free(void *vp); 7668313Srnordier 7748905Srnordier/* 7848905Srnordier * 'buf' should be at least fit 'MAX_VMM_STAT_TYPES' entries 7968313Srnordier */ 8068313Srnordierint vmm_stat_copy(struct vm *vm, int vcpu, int *num_stats, uint64_t *buf); 8168313Srnordierint vmm_stat_desc_copy(int index, char *buf, int buflen); 8268313Srnordier 8368313Srnordierstatic void __inline 8468313Srnordiervmm_stat_array_incr(struct vm *vm, int vcpu, struct vmm_stat_type *vst, 8568313Srnordier int statidx, uint64_t x) 8668313Srnordier{ 8768313Srnordier#ifdef VMM_KEEP_STATS 8868313Srnordier uint64_t *stats; 8968313Srnordier 9068313Srnordier stats = vcpu_stats(vm, vcpu); 9168313Srnordier 9268313Srnordier if (vst->index >= 0 && statidx < vst->nelems) 93130927Sobrien stats[vst->index + statidx] += x; 94112089Sru#endif 95130927Sobrien} 9668313Srnordier 9768313Srnordier 9868313Srnordierstatic void __inline 99112089Sruvmm_stat_incr(struct vm *vm, int vcpu, struct vmm_stat_type *vst, uint64_t x) 100130927Sobrien{ 101130927Sobrien 102130927Sobrien#ifdef VMM_KEEP_STATS 103130927Sobrien vmm_stat_array_incr(vm, vcpu, vst, 0, x); 104130927Sobrien#endif 105112089Sru} 10648905Srnordier 10748905SrnordierVMM_STAT_DECLARE(VCPU_MIGRATIONS); 10848905SrnordierVMM_STAT_DECLARE(VMEXIT_COUNT); 10948905SrnordierVMM_STAT_DECLARE(VMEXIT_EXTINT); 11048905SrnordierVMM_STAT_DECLARE(VMEXIT_HLT); 11148905SrnordierVMM_STAT_DECLARE(VMEXIT_CR_ACCESS); 11248905SrnordierVMM_STAT_DECLARE(VMEXIT_RDMSR); 11348905SrnordierVMM_STAT_DECLARE(VMEXIT_WRMSR); 11448905SrnordierVMM_STAT_DECLARE(VMEXIT_MTRAP); 11568313SrnordierVMM_STAT_DECLARE(VMEXIT_PAUSE); 11648905SrnordierVMM_STAT_DECLARE(VMEXIT_INTR_WINDOW); 11748905SrnordierVMM_STAT_DECLARE(VMEXIT_NMI_WINDOW); 118130927SobrienVMM_STAT_DECLARE(VMEXIT_INOUT); 11948905SrnordierVMM_STAT_DECLARE(VMEXIT_CPUID); 12048905SrnordierVMM_STAT_DECLARE(VMEXIT_NESTED_FAULT); 12148905SrnordierVMM_STAT_DECLARE(VMEXIT_INST_EMUL); 12248905SrnordierVMM_STAT_DECLARE(VMEXIT_UNKNOWN); 12348905SrnordierVMM_STAT_DECLARE(VMEXIT_ASTPENDING); 12448905SrnordierVMM_STAT_DECLARE(VMEXIT_USERSPACE); 12548905SrnordierVMM_STAT_DECLARE(VMEXIT_RENDEZVOUS); 12648905SrnordierVMM_STAT_DECLARE(VMEXIT_EXCEPTION); 12748905Srnordier#endif 12848905Srnordier