1*11173SJonathan.Adams@Sun.COM /* 2*11173SJonathan.Adams@Sun.COM * CDDL HEADER START 3*11173SJonathan.Adams@Sun.COM * 4*11173SJonathan.Adams@Sun.COM * The contents of this file are subject to the terms of the 5*11173SJonathan.Adams@Sun.COM * Common Development and Distribution License (the "License"). 6*11173SJonathan.Adams@Sun.COM * You may not use this file except in compliance with the License. 7*11173SJonathan.Adams@Sun.COM * 8*11173SJonathan.Adams@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*11173SJonathan.Adams@Sun.COM * or http://www.opensolaris.org/os/licensing. 10*11173SJonathan.Adams@Sun.COM * See the License for the specific language governing permissions 11*11173SJonathan.Adams@Sun.COM * and limitations under the License. 12*11173SJonathan.Adams@Sun.COM * 13*11173SJonathan.Adams@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 14*11173SJonathan.Adams@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*11173SJonathan.Adams@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 16*11173SJonathan.Adams@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 17*11173SJonathan.Adams@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 18*11173SJonathan.Adams@Sun.COM * 19*11173SJonathan.Adams@Sun.COM * CDDL HEADER END 20*11173SJonathan.Adams@Sun.COM */ 21*11173SJonathan.Adams@Sun.COM /* 22*11173SJonathan.Adams@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23*11173SJonathan.Adams@Sun.COM * Use is subject to license terms. 24*11173SJonathan.Adams@Sun.COM */ 25*11173SJonathan.Adams@Sun.COM 26*11173SJonathan.Adams@Sun.COM #ifndef _SYS_SYSDC_IMPL_H 27*11173SJonathan.Adams@Sun.COM #define _SYS_SYSDC_IMPL_H 28*11173SJonathan.Adams@Sun.COM 29*11173SJonathan.Adams@Sun.COM #include <sys/types.h> 30*11173SJonathan.Adams@Sun.COM #include <sys/time.h> 31*11173SJonathan.Adams@Sun.COM #include <sys/list.h> 32*11173SJonathan.Adams@Sun.COM 33*11173SJonathan.Adams@Sun.COM #include <sys/sysdc.h> 34*11173SJonathan.Adams@Sun.COM 35*11173SJonathan.Adams@Sun.COM #ifdef __cplusplus 36*11173SJonathan.Adams@Sun.COM extern "C" { 37*11173SJonathan.Adams@Sun.COM #endif 38*11173SJonathan.Adams@Sun.COM 39*11173SJonathan.Adams@Sun.COM struct _kthread; 40*11173SJonathan.Adams@Sun.COM struct cpupart; 41*11173SJonathan.Adams@Sun.COM 42*11173SJonathan.Adams@Sun.COM /* 43*11173SJonathan.Adams@Sun.COM * Tracks per-processor-set information for SDC. Its main use is to 44*11173SJonathan.Adams@Sun.COM * implement per-processor-set breaks. 45*11173SJonathan.Adams@Sun.COM */ 46*11173SJonathan.Adams@Sun.COM typedef struct sysdc_pset { 47*11173SJonathan.Adams@Sun.COM list_node_t sdp_node; /* node on sysdc_psets list */ 48*11173SJonathan.Adams@Sun.COM struct cpupart *sdp_cpupart; /* associated cpu partition */ 49*11173SJonathan.Adams@Sun.COM size_t sdp_nthreads; /* reference count */ 50*11173SJonathan.Adams@Sun.COM 51*11173SJonathan.Adams@Sun.COM /* The remainder is only touched by sysdc_update() */ 52*11173SJonathan.Adams@Sun.COM hrtime_t sdp_onproc_time; /* time onproc at last update */ 53*11173SJonathan.Adams@Sun.COM boolean_t sdp_need_break; /* threads forced to minpri */ 54*11173SJonathan.Adams@Sun.COM uint_t sdp_should_break; /* # updates need_break is set */ 55*11173SJonathan.Adams@Sun.COM uint_t sdp_dont_break; /* after break, # updates until next */ 56*11173SJonathan.Adams@Sun.COM 57*11173SJonathan.Adams@Sun.COM /* debugging fields */ 58*11173SJonathan.Adams@Sun.COM uint_t sdp_onproc_threads; 59*11173SJonathan.Adams@Sun.COM hrtime_t sdp_vtime_last_interval; 60*11173SJonathan.Adams@Sun.COM uint_t sdp_DC_last_interval; 61*11173SJonathan.Adams@Sun.COM } sysdc_pset_t; 62*11173SJonathan.Adams@Sun.COM 63*11173SJonathan.Adams@Sun.COM /* 64*11173SJonathan.Adams@Sun.COM * Per-thread information, pointed to by t_cldata. 65*11173SJonathan.Adams@Sun.COM */ 66*11173SJonathan.Adams@Sun.COM typedef struct sysdc { 67*11173SJonathan.Adams@Sun.COM uint_t sdc_target_DC; /* target duty cycle */ 68*11173SJonathan.Adams@Sun.COM uint_t sdc_minpri; /* our minimum priority */ 69*11173SJonathan.Adams@Sun.COM uint_t sdc_maxpri; /* our maximum priority */ 70*11173SJonathan.Adams@Sun.COM 71*11173SJonathan.Adams@Sun.COM sysdc_pset_t *sdc_pset; /* the processor set bound to */ 72*11173SJonathan.Adams@Sun.COM 73*11173SJonathan.Adams@Sun.COM /* protected by sdl_lock */ 74*11173SJonathan.Adams@Sun.COM struct _kthread *sdc_thread; /* back-pointer, or NULL if freeable */ 75*11173SJonathan.Adams@Sun.COM 76*11173SJonathan.Adams@Sun.COM /* protected by arrangement between thread and sysdc_update() */ 77*11173SJonathan.Adams@Sun.COM struct sysdc *sdc_next; /* next in hash table, NULL if not in */ 78*11173SJonathan.Adams@Sun.COM 79*11173SJonathan.Adams@Sun.COM /* protected by thread_lock() */ 80*11173SJonathan.Adams@Sun.COM uint_t sdc_nupdates; /* number of sysdc_update_times() */ 81*11173SJonathan.Adams@Sun.COM 82*11173SJonathan.Adams@Sun.COM hrtime_t sdc_base_O; /* on-cpu time at last reset */ 83*11173SJonathan.Adams@Sun.COM hrtime_t sdc_base_R; /* runnable time at last reset */ 84*11173SJonathan.Adams@Sun.COM 85*11173SJonathan.Adams@Sun.COM uint_t sdc_sleep_updates; /* 0, or nupdates when we slept */ 86*11173SJonathan.Adams@Sun.COM clock_t sdc_ticks; /* sdc_tick() calls */ 87*11173SJonathan.Adams@Sun.COM clock_t sdc_update_ticks; /* value of ticks for forced update */ 88*11173SJonathan.Adams@Sun.COM clock_t sdc_pri_check; /* lbolt when we checked our priority */ 89*11173SJonathan.Adams@Sun.COM hrtime_t sdc_last_base_O; /* onproc time at sysdc_update() */ 90*11173SJonathan.Adams@Sun.COM 91*11173SJonathan.Adams@Sun.COM uint_t sdc_pri; /* our last computed priority */ 92*11173SJonathan.Adams@Sun.COM uint_t sdc_epri; /* our actual thread priority */ 93*11173SJonathan.Adams@Sun.COM 94*11173SJonathan.Adams@Sun.COM /* for debugging only */ 95*11173SJonathan.Adams@Sun.COM clock_t sdc_reset; /* lbolt when we reset our bases */ 96*11173SJonathan.Adams@Sun.COM hrtime_t sdc_cur_O; /* on-cpu time at last prio check */ 97*11173SJonathan.Adams@Sun.COM hrtime_t sdc_cur_R; /* runnable time at last prio check */ 98*11173SJonathan.Adams@Sun.COM hrtime_t sdc_last_O; /* onproc time at thread update */ 99*11173SJonathan.Adams@Sun.COM uint_t sdc_cur_DC; /* our actual duty cycle at last chk */ 100*11173SJonathan.Adams@Sun.COM } sysdc_t; 101*11173SJonathan.Adams@Sun.COM 102*11173SJonathan.Adams@Sun.COM /* 103*11173SJonathan.Adams@Sun.COM * Hash bucket of active SDC threads. 104*11173SJonathan.Adams@Sun.COM */ 105*11173SJonathan.Adams@Sun.COM typedef struct sysdc_list { 106*11173SJonathan.Adams@Sun.COM kmutex_t sdl_lock; /* lock keeping threads from exiting */ 107*11173SJonathan.Adams@Sun.COM sysdc_t *volatile sdl_list; /* list of active threads in bucket */ 108*11173SJonathan.Adams@Sun.COM char sdl_pad[64 - sizeof (kmutex_t) - sizeof (sysdc_t *)]; 109*11173SJonathan.Adams@Sun.COM } sysdc_list_t; 110*11173SJonathan.Adams@Sun.COM 111*11173SJonathan.Adams@Sun.COM /* 112*11173SJonathan.Adams@Sun.COM * Args to CL_ENTERCLASS(). 113*11173SJonathan.Adams@Sun.COM */ 114*11173SJonathan.Adams@Sun.COM typedef struct sysdc_params { 115*11173SJonathan.Adams@Sun.COM uint_t sdp_minpri; 116*11173SJonathan.Adams@Sun.COM uint_t sdp_maxpri; 117*11173SJonathan.Adams@Sun.COM uint_t sdp_DC; 118*11173SJonathan.Adams@Sun.COM } sysdc_params_t; 119*11173SJonathan.Adams@Sun.COM 120*11173SJonathan.Adams@Sun.COM /* 121*11173SJonathan.Adams@Sun.COM * Duty cycles are percentages in the range [1,100]. 122*11173SJonathan.Adams@Sun.COM */ 123*11173SJonathan.Adams@Sun.COM #define SYSDC_DC_MAX 100u /* 1 <= DC <= DC_MAX */ 124*11173SJonathan.Adams@Sun.COM 125*11173SJonathan.Adams@Sun.COM #ifdef __cplusplus 126*11173SJonathan.Adams@Sun.COM } 127*11173SJonathan.Adams@Sun.COM #endif 128*11173SJonathan.Adams@Sun.COM 129*11173SJonathan.Adams@Sun.COM #endif /* _SYS_SYSDC_IMPL_H */ 130