xref: /onnv-gate/usr/src/uts/common/sys/sysdc_impl.h (revision 11173:87f3734e64df)
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