1c97ad5cdSakolb /* 2c97ad5cdSakolb * CDDL HEADER START 3c97ad5cdSakolb * 4c97ad5cdSakolb * The contents of this file are subject to the terms of the 5c97ad5cdSakolb * Common Development and Distribution License (the "License"). 6c97ad5cdSakolb * You may not use this file except in compliance with the License. 7c97ad5cdSakolb * 8c97ad5cdSakolb * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9c97ad5cdSakolb * or http://www.opensolaris.org/os/licensing. 10c97ad5cdSakolb * See the License for the specific language governing permissions 11c97ad5cdSakolb * and limitations under the License. 12c97ad5cdSakolb * 13c97ad5cdSakolb * When distributing Covered Code, include this CDDL HEADER in each 14c97ad5cdSakolb * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15c97ad5cdSakolb * If applicable, add the following below this CDDL HEADER, with the 16c97ad5cdSakolb * fields enclosed by brackets "[]" replaced with your own identifying 17c97ad5cdSakolb * information: Portions Copyright [yyyy] [name of copyright owner] 18c97ad5cdSakolb * 19c97ad5cdSakolb * CDDL HEADER END 20c97ad5cdSakolb */ 21c97ad5cdSakolb 22c97ad5cdSakolb /* 23*d3d50737SRafael Vanoni * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24c97ad5cdSakolb * Use is subject to license terms. 25c97ad5cdSakolb */ 26c97ad5cdSakolb 27c97ad5cdSakolb #ifndef _SYS_CPUCAPS_IMPL_H 28c97ad5cdSakolb #define _SYS_CPUCAPS_IMPL_H 29c97ad5cdSakolb 30c97ad5cdSakolb #ifdef __cplusplus 31c97ad5cdSakolb extern "C" { 32c97ad5cdSakolb #endif 33c97ad5cdSakolb 34c97ad5cdSakolb #ifdef _KERNEL 35c97ad5cdSakolb 36c97ad5cdSakolb #include <sys/kstat.h> 37c97ad5cdSakolb #include <sys/cpucaps.h> 38c97ad5cdSakolb #include <sys/list.h> 39c97ad5cdSakolb #include <sys/time.h> 40c97ad5cdSakolb #include <sys/waitq.h> 41c97ad5cdSakolb 42c97ad5cdSakolb /* 43c97ad5cdSakolb * When resource control framework sets the cap to NOCAP value the cap 44c97ad5cdSakolb * is disabled. 45c97ad5cdSakolb */ 46c97ad5cdSakolb #define NOCAP MAXCAP 47c97ad5cdSakolb 48c97ad5cdSakolb /* 49c97ad5cdSakolb * Maximum value for the cap usage. Should be the maximum value for hrtime_t 50c97ad5cdSakolb */ 51c97ad5cdSakolb #if defined(_LP64) 52c97ad5cdSakolb #define MAX_USAGE LONG_MAX 53c97ad5cdSakolb #else 54c97ad5cdSakolb #define MAX_USAGE 9223372036854775807LL 55c97ad5cdSakolb #endif 56c97ad5cdSakolb 57c97ad5cdSakolb 58c97ad5cdSakolb /* 59c97ad5cdSakolb * Most of the per-project or per-zone state related to CPU caps is kept in the 60c97ad5cdSakolb * cpucap_t structure. 61c97ad5cdSakolb */ 62c97ad5cdSakolb typedef struct cpucap { 63c97ad5cdSakolb list_node_t cap_link; /* next/prev capped entity */ 64c97ad5cdSakolb struct kproject *cap_project; /* project for the cap */ 65c97ad5cdSakolb struct zone *cap_zone; /* zone for the cap */ 66c97ad5cdSakolb waitq_t cap_waitq; /* waitq for capped threads */ 67c97ad5cdSakolb kstat_t *cap_kstat; /* cpucaps specific kstat */ 68*d3d50737SRafael Vanoni int64_t cap_gen; /* zone cap specific */ 69c97ad5cdSakolb hrtime_t cap_value; /* scaled CPU usage cap */ 70c97ad5cdSakolb hrtime_t cap_usage; /* current CPU usage */ 71c97ad5cdSakolb disp_lock_t cap_usagelock; /* protects cap_usage above */ 72c97ad5cdSakolb /* 73c97ad5cdSakolb * Per cap statistics. 74c97ad5cdSakolb */ 75c97ad5cdSakolb hrtime_t cap_maxusage; /* maximum cap usage */ 76c97ad5cdSakolb u_longlong_t cap_below; /* # of ticks spend below the cap */ 77c97ad5cdSakolb u_longlong_t cap_above; /* # of ticks spend above the cap */ 78c97ad5cdSakolb } cpucap_t; 79c97ad5cdSakolb 80c97ad5cdSakolb /* 81c97ad5cdSakolb * Wrapper macros for checking cap state. 82c97ad5cdSakolb */ 83c97ad5cdSakolb #define CAP_ENABLED(cap) ((cap)->cap_value != 0) 84c97ad5cdSakolb #define CAP_DISABLED(cap) (!CAP_ENABLED(cap)) 85c97ad5cdSakolb 86c97ad5cdSakolb #define PROJECT_IS_CAPPED(project) \ 87c97ad5cdSakolb (((project)->kpj_cpucap != NULL) && \ 88c97ad5cdSakolb CAP_ENABLED((project)->kpj_cpucap)) 89c97ad5cdSakolb 90c97ad5cdSakolb #define ZONE_IS_CAPPED(zone) \ 91c97ad5cdSakolb (((zone)->zone_cpucap != NULL) && \ 92c97ad5cdSakolb CAP_ENABLED((zone)->zone_cpucap)) 93c97ad5cdSakolb 94c97ad5cdSakolb #endif /* _KERNEL */ 95c97ad5cdSakolb 96c97ad5cdSakolb #ifdef __cplusplus 97c97ad5cdSakolb } 98c97ad5cdSakolb #endif 99c97ad5cdSakolb 100c97ad5cdSakolb #endif /* _SYS_CPUCAPS_IMPL_H */ 101