1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
* Copyright 2012 Joyent, Inc. All rights reserved.
*/
#ifndef _SYS_FSS_H
#define _SYS_FSS_H
#pragma ident "%Z%%M% %I% %E% SMI"
#include <sys/types.h>
#include <sys/thread.h>
#include <sys/project.h>
#include <sys/cpucaps.h>
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _KERNEL
typedef uint64_t fsspri_t;
typedef uint64_t fssusage_t;
struct cpupart;
struct zone;
/*
* Valid arg1's for fss_allocbuf()
*/
#define FSS_NPSET_BUF 1
#define FSS_NPROJ_BUF 2
#define FSS_ONE_BUF 3
/*
* Valid arg2's for fss_allocbuf()
*/
#define FSS_ALLOC_PROJ 1
#define FSS_ALLOC_ZONE 2
#define FSS_MAXSHARES 65535
typedef struct fssbuf {
int fssb_size;
void **fssb_list;
} fssbuf_t;
void *fss_allocbuf(int, int);
void fss_freebuf(fssbuf_t *, int);
void fss_changeproj(kthread_id_t, void *, void *, fssbuf_t *, fssbuf_t *);
void fss_changepset(kthread_id_t, void *, fssbuf_t *, fssbuf_t *);
/*
* Fair share scheduling class specific cpu partition structure
*/
typedef struct fsspset {
kmutex_t fssps_lock; /* lock to protect per-pset */
/* list of fssproj structures */
disp_lock_t fssps_displock; /* lock for fsps_maxfsspri */
struct cpupart *fssps_cpupart; /* ptr to our cpu partition */
/* protected by fsspsets_lock */
fsspri_t fssps_maxfsspri; /* maximum fsspri value among */
/* all projects on this pset */
uint32_t fssps_shares; /* number of active shares */
uint32_t fssps_nproj; /* number of fssproj structures */
/* on the list */
struct fssproj *fssps_list; /* list of project parts */
struct fsszone *fssps_zones; /* list of fsszone_t's in pset */
uint32_t fssps_gen; /* generation for zone's kstats */
} fsspset_t;
/*
* One of these structures is allocated to each project running within each
* active cpu partition.
*/
typedef struct fssproj {
kproject_t *fssp_proj; /* ptr to our project structure */
fsspset_t *fssp_pset; /* ptr to our fsspset structure */
uint32_t fssp_threads; /* total number of threads here */
/* protected by fssps_lock */
uint32_t fssp_runnable; /* number of runnable threads */
/* protected by fssps_lock */
uint32_t fssp_shares; /* copy of our kpj_shares */
/* protected by fssps_displock */
uint32_t fssp_ticks; /* total of all ticks */
/* protected by fssps_displock */
uint32_t fssp_zone_ticks; /* unscaled total of all ticks */
/* protected by fssps_displock */
fssusage_t fssp_usage; /* this project's decayed usage */
fssusage_t fssp_shusage; /* normalized usage */
struct fssproj *fssp_next; /* next project on this pset */
struct fssproj *fssp_prev; /* prev project on this pset */
struct fsszone *fssp_fsszone; /* fsszone_t for this fssproj */
} fssproj_t;
/*
* Fair share scheduling class specific thread structure
*/
typedef struct fssproc {
kthread_t *fss_tp; /* pointer back to our thread */
fssproj_t *fss_proj; /* pointer to our project FSS data */
uchar_t fss_flags; /* flags defined below */
int fss_timeleft; /* time remaining in procs quantum */
uint32_t fss_ticks; /* ticks accumulated by this thread */
pri_t fss_upri; /* user supplied priority (to priocntl) */
pri_t fss_uprilim; /* user priority limit */
pri_t fss_umdpri; /* user mode priority within fs class */
pri_t fss_scpri; /* remembered priority, for schedctl */
int fss_nice; /* nice value for compatibility with ts */
fsspri_t fss_fsspri; /* internal fair share priority */
int fss_runnable; /* to indicate runnable/sleeping thread */
struct fssproc *fss_next; /* pointer to next fssproc_t struct */
struct fssproc *fss_prev; /* pointer to prev fssproc_t sturct */
caps_sc_t fss_caps; /* CPU caps specific data */
} fssproc_t;
/*
* One of these structures is allocated to each zone running within
* each active cpu partition. This means that if a zone spans more
* than one cpu partition then it will have a few of these structures.
*/
typedef struct fsszone {
struct zone *fssz_zone; /* ptr to our zone structure */
struct fsszone *fssz_next; /* next fsszone_t in fsspset_t */
struct fsszone *fssz_prev; /* prev fsszone_t in fsspset_t */
uint32_t fssz_shares; /* sum of all project shares */
uint32_t fssz_nproj; /* # of projects */
uint32_t fssz_rshares; /* "real" shares given to zone */
uint32_t fssz_runnable; /* # of runnable projects */
} fsszone_t;
#define FSSPROC(tx) ((fssproc_t *)(tx->t_cldata))
#define FSSPROC2FSSPROJ(fssx) ((fssx)->fss_proj);
#define FSSPROC2FSSPSET(fssx) (FSSPROC2FSSPROJ(fssx)->fssp_pset)
#define FSSPROJ(tx) (FSSPROC(tx)->fss_proj)
#define FSSPROJ2FSSPSET(fssx) ((fssx)->fssp_pset)
#define FSSPROJ2KPROJ(fssx) ((fssx)->fssp_proj)
#define FSSPROJ2FSSZONE(fssx) ((fssx)->fssp_fsszone)
/*
* fss_flags
*/
#define FSSKPRI 0x01 /* the thread is in kernel mode */
#define FSSBACKQ 0x02 /* thread should be placed at the back of */
/* the dispatch queue if preempted */
#define FSSRESTORE 0x04 /* thread was not preempted, due to schedctl */
/* restore priority from fss_scpri */
#endif /* _KERNEL */
#ifdef __cplusplus
}
#endif
#endif /* _SYS_FSS_H */
|