xref: /illumos-gate/usr/src/uts/common/disp/sysclass.c (revision dd4eeefdb8e4583c47e28a7f315db6087931ef06)
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 2007 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 
31 #pragma ident	"%Z%%M%	%I%	%E% SMI"	/* from SVr4.0 1.12 */
32 
33 #include <sys/types.h>
34 #include <sys/param.h>
35 #include <sys/sysmacros.h>
36 #include <sys/signal.h>
37 #include <sys/pcb.h>
38 #include <sys/user.h>
39 #include <sys/systm.h>
40 #include <sys/sysinfo.h>
41 #include <sys/var.h>
42 #include <sys/errno.h>
43 #include <sys/cmn_err.h>
44 #include <sys/proc.h>
45 #include <sys/debug.h>
46 #include <sys/inline.h>
47 #include <sys/disp.h>
48 #include <sys/class.h>
49 #include <sys/kmem.h>
50 #include <sys/cpuvar.h>
51 #include <sys/priocntl.h>
52 
53 /*
54  * Class specific code for the sys class. There are no
55  * class specific data structures associated with
56  * the sys class and the scheduling policy is trivially
57  * simple. There is no time slicing.
58  */
59 
60 pri_t		sys_init(id_t, int, classfuncs_t **);
61 static int	sys_getclpri(pcpri_t *);
62 static int	sys_fork(kthread_id_t, kthread_id_t, void *);
63 static int	sys_enterclass(kthread_id_t, id_t, void *, cred_t *, void *);
64 static int	sys_canexit(kthread_id_t, cred_t *);
65 static int	sys_nosys();
66 static int	sys_donice(kthread_id_t, cred_t *, int, int *);
67 static void	sys_forkret(kthread_id_t, kthread_id_t);
68 static void	sys_nullsys();
69 static pri_t	sys_swappri(kthread_id_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 	}
111 
112 };
113 
114 
115 /* ARGSUSED */
116 pri_t
117 sys_init(cid, clparmsz, clfuncspp)
118 	id_t		cid;
119 	int		clparmsz;
120 	classfuncs_t	**clfuncspp;
121 {
122 	*clfuncspp = &sys_classfuncs;
123 	return ((pri_t)v.v_maxsyspri);
124 }
125 
126 /*
127  * Get maximum and minimum priorities enjoyed by sysclass threads
128  */
129 static int
130 sys_getclpri(pcpri_t *pcprip)
131 {
132 	pcprip->pc_clpmax = maxclsyspri;
133 	pcprip->pc_clpmin = 0;
134 	return (0);
135 }
136 
137 /* ARGSUSED */
138 static int
139 sys_enterclass(t, cid, parmsp, reqpcredp, bufp)
140 	kthread_id_t	t;
141 	id_t		cid;
142 	void		*parmsp;
143 	cred_t		*reqpcredp;
144 	void		*bufp;
145 {
146 	return (0);
147 }
148 
149 /* ARGSUSED */
150 static int
151 sys_canexit(kthread_id_t t, cred_t *reqpcredp)
152 {
153 	return (0);
154 }
155 
156 /* ARGSUSED */
157 static int
158 sys_fork(t, ct, bufp)
159 	kthread_id_t t;
160 	kthread_id_t ct;
161 	void	*bufp;
162 {
163 	/*
164 	 * No class specific data structure
165 	 */
166 	return (0);
167 }
168 
169 
170 /* ARGSUSED */
171 static void
172 sys_forkret(t, ct)
173 	kthread_id_t t;
174 	kthread_id_t ct;
175 {
176 	register proc_t *pp = ttoproc(t);
177 	register proc_t *cp = ttoproc(ct);
178 
179 	ASSERT(t == curthread);
180 	ASSERT(MUTEX_HELD(&pidlock));
181 
182 	/*
183 	 * Grab the child's p_lock before dropping pidlock to ensure
184 	 * the process does not disappear before we set it running.
185 	 */
186 	mutex_enter(&cp->p_lock);
187 	mutex_exit(&pidlock);
188 	continuelwps(cp);
189 	mutex_exit(&cp->p_lock);
190 
191 	mutex_enter(&pp->p_lock);
192 	continuelwps(pp);
193 	mutex_exit(&pp->p_lock);
194 }
195 
196 /* ARGSUSED */
197 static pri_t
198 sys_swappri(t, flags)
199 	kthread_id_t	t;
200 	int		flags;
201 {
202 	return (-1);
203 }
204 
205 static int
206 sys_nosys()
207 {
208 	return (ENOSYS);
209 }
210 
211 
212 static void
213 sys_nullsys()
214 {
215 }
216 
217 /* ARGSUSED */
218 static int
219 sys_donice(t, cr, incr, retvalp)
220 	kthread_id_t	t;
221 	cred_t		*cr;
222 	int		incr;
223 	int		*retvalp;
224 {
225 	return (EINVAL);
226 }
227 
228 /* ARGSUSED */
229 static int
230 sys_alloc(void **p, int flag)
231 {
232 	*p = NULL;
233 	return (0);
234 }
235