xref: /illumos-gate/usr/src/uts/common/disp/sysclass.c (revision 581cede61ac9c14d8d4ea452562a567189eead78)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
28 /*	  All Rights Reserved  	*/
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"	/* from SVr4.0 1.12 */
31 
32 #include <sys/types.h>
33 #include <sys/param.h>
34 #include <sys/sysmacros.h>
35 #include <sys/signal.h>
36 #include <sys/pcb.h>
37 #include <sys/user.h>
38 #include <sys/systm.h>
39 #include <sys/sysinfo.h>
40 #include <sys/var.h>
41 #include <sys/errno.h>
42 #include <sys/cmn_err.h>
43 #include <sys/proc.h>
44 #include <sys/debug.h>
45 #include <sys/inline.h>
46 #include <sys/disp.h>
47 #include <sys/class.h>
48 #include <sys/kmem.h>
49 #include <sys/cpuvar.h>
50 #include <sys/priocntl.h>
51 
52 /*
53  * Class specific code for the sys class. There are no
54  * class specific data structures associated with
55  * the sys class and the scheduling policy is trivially
56  * simple. There is no time slicing.
57  */
58 
59 pri_t		sys_init(id_t, int, classfuncs_t **);
60 static int	sys_getclpri(pcpri_t *);
61 static int	sys_fork(kthread_t *, kthread_t *, void *);
62 static int	sys_enterclass(kthread_t *, id_t, void *, cred_t *, void *);
63 static int	sys_canexit(kthread_t *, cred_t *);
64 static int	sys_nosys();
65 static int	sys_donice(kthread_t *, cred_t *, int, int *);
66 static int	sys_doprio(kthread_t *, cred_t *, int, int *);
67 static void	sys_forkret(kthread_t *, kthread_t *);
68 static void	sys_nullsys();
69 static pri_t	sys_swappri(kthread_t *, int);
70 static int	sys_alloc(void **, int);
71 
72 struct classfuncs sys_classfuncs = {
73 	/* messages to class manager */
74 	{
75 		sys_nosys,	/* admin */
76 		sys_nosys,	/* getclinfo */
77 		sys_nosys,	/* parmsin */
78 		sys_nosys,	/* parmsout */
79 		sys_nosys,	/* vaparmsin */
80 		sys_nosys,	/* vaparmsout */
81 		sys_getclpri,	/* getclpri */
82 		sys_alloc,
83 		sys_nullsys,	/* free */
84 	},
85 	/* operations on threads */
86 	{
87 		sys_enterclass,	/* enterclass */
88 		sys_nullsys,	/* exitclass */
89 		sys_canexit,
90 		sys_fork,
91 		sys_forkret,	/* forkret */
92 		sys_nullsys,	/* parmsget */
93 		sys_nosys,	/* parmsset */
94 		sys_nullsys,	/* stop */
95 		sys_nullsys,	/* exit */
96 		sys_nullsys,	/* active */
97 		sys_nullsys,	/* inactive */
98 		sys_swappri,	/* swapin */
99 		sys_swappri,	/* swapout */
100 		sys_nullsys,	/* trapret */
101 		setfrontdq,	/* preempt */
102 		setbackdq,	/* setrun */
103 		sys_nullsys,	/* sleep */
104 		sys_nullsys,	/* tick */
105 		setbackdq,	/* wakeup */
106 		sys_donice,
107 		(pri_t (*)())sys_nosys,	/* globpri */
108 		sys_nullsys,	/* set_process_group */
109 		sys_nullsys,	/* yield */
110 		sys_doprio,
111 	}
112 
113 };
114 
115 
116 /* ARGSUSED */
117 pri_t
118 sys_init(cid, clparmsz, clfuncspp)
119 	id_t		cid;
120 	int		clparmsz;
121 	classfuncs_t	**clfuncspp;
122 {
123 	*clfuncspp = &sys_classfuncs;
124 	return ((pri_t)v.v_maxsyspri);
125 }
126 
127 /*
128  * Get maximum and minimum priorities enjoyed by sysclass threads
129  */
130 static int
131 sys_getclpri(pcpri_t *pcprip)
132 {
133 	pcprip->pc_clpmax = maxclsyspri;
134 	pcprip->pc_clpmin = minclsyspri;
135 	return (0);
136 }
137 
138 /* ARGSUSED */
139 static int
140 sys_enterclass(t, cid, parmsp, reqpcredp, bufp)
141 	kthread_t	*t;
142 	id_t		cid;
143 	void		*parmsp;
144 	cred_t		*reqpcredp;
145 	void		*bufp;
146 {
147 	return (0);
148 }
149 
150 /* ARGSUSED */
151 static int
152 sys_canexit(kthread_t *t, cred_t *reqpcredp)
153 {
154 	return (0);
155 }
156 
157 /* ARGSUSED */
158 static int
159 sys_fork(t, ct, bufp)
160 	kthread_t *t;
161 	kthread_t *ct;
162 	void	*bufp;
163 {
164 	/*
165 	 * No class specific data structure
166 	 */
167 	return (0);
168 }
169 
170 
171 /* ARGSUSED */
172 static void
173 sys_forkret(t, ct)
174 	kthread_t *t;
175 	kthread_t *ct;
176 {
177 	register proc_t *pp = ttoproc(t);
178 	register proc_t *cp = ttoproc(ct);
179 
180 	ASSERT(t == curthread);
181 	ASSERT(MUTEX_HELD(&pidlock));
182 
183 	/*
184 	 * Grab the child's p_lock before dropping pidlock to ensure
185 	 * the process does not disappear before we set it running.
186 	 */
187 	mutex_enter(&cp->p_lock);
188 	mutex_exit(&pidlock);
189 	continuelwps(cp);
190 	mutex_exit(&cp->p_lock);
191 
192 	mutex_enter(&pp->p_lock);
193 	continuelwps(pp);
194 	mutex_exit(&pp->p_lock);
195 }
196 
197 /* ARGSUSED */
198 static pri_t
199 sys_swappri(t, flags)
200 	kthread_t	*t;
201 	int		flags;
202 {
203 	return (-1);
204 }
205 
206 static int
207 sys_nosys()
208 {
209 	return (ENOSYS);
210 }
211 
212 
213 static void
214 sys_nullsys()
215 {
216 }
217 
218 /* ARGSUSED */
219 static int
220 sys_donice(kthread_t *t, cred_t *cr, int incr, int *retvalp)
221 {
222 	return (EINVAL);
223 }
224 
225 /* ARGSUSED */
226 static int
227 sys_doprio(kthread_t *t, cred_t *cr, int incr, int *retvalp)
228 {
229 	return (EINVAL);
230 }
231 
232 /* ARGSUSED */
233 static int
234 sys_alloc(void **p, int flag)
235 {
236 	*p = NULL;
237 	return (0);
238 }
239