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 2009 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27/* Copyright (c) 1988 AT&T */ 28/* All Rights Reserved */ 29 30#ifndef _SYS_CLASS_H 31#define _SYS_CLASS_H 32 33#include <sys/t_lock.h> 34#include <sys/cred.h> 35#include <sys/thread.h> 36#include <sys/priocntl.h> 37#include <sys/mutex.h> 38#include <sys/uio.h> 39 40#ifdef __cplusplus 41extern "C" { 42#endif 43 44/* 45 * NOTE: Developers making use of the scheduler class switch mechanism 46 * to develop scheduling class modules should be aware that the 47 * architecture is not frozen and the kernel interface for scheduling 48 * class modules may change in future releases of System V. Support 49 * for the current interface is not guaranteed and class modules 50 * developed to this interface may require changes in order to work 51 * with future releases of the system. 52 */ 53 54/* 55 * three different ops vectors are bundled together, here. 56 * one is for each of the fundamental objects acted upon 57 * by these operators: procs, threads, and the class manager itself. 58 */ 59 60typedef struct class_ops { 61 int (*cl_admin)(caddr_t, cred_t *); 62 int (*cl_getclinfo)(void *); 63 int (*cl_parmsin)(void *); 64 int (*cl_parmsout)(void *, pc_vaparms_t *); 65 int (*cl_vaparmsin)(void *, pc_vaparms_t *); 66 int (*cl_vaparmsout)(void *, pc_vaparms_t *); 67 int (*cl_getclpri)(pcpri_t *); 68 int (*cl_alloc)(void **, int); 69 void (*cl_free)(void *); 70} class_ops_t; 71 72typedef struct thread_ops { 73 int (*cl_enterclass)(kthread_t *, id_t, void *, cred_t *, void *); 74 void (*cl_exitclass)(void *); 75 int (*cl_canexit)(kthread_t *, cred_t *); 76 int (*cl_fork)(kthread_t *, kthread_t *, void *); 77 void (*cl_forkret)(kthread_t *, kthread_t *); 78 void (*cl_parmsget)(kthread_t *, void *); 79 int (*cl_parmsset)(kthread_t *, void *, id_t, cred_t *); 80 void (*cl_stop)(kthread_t *, int, int); 81 void (*cl_exit)(kthread_t *); 82 void (*cl_active)(kthread_t *); 83 void (*cl_inactive)(kthread_t *); 84 pri_t (*cl_swapin)(kthread_t *, int); 85 pri_t (*cl_swapout)(kthread_t *, int); 86 void (*cl_trapret)(kthread_t *); 87 void (*cl_preempt)(kthread_t *); 88 void (*cl_setrun)(kthread_t *); 89 void (*cl_sleep)(kthread_t *); 90 void (*cl_tick)(kthread_t *); 91 void (*cl_wakeup)(kthread_t *); 92 int (*cl_donice)(kthread_t *, cred_t *, int, int *); 93 pri_t (*cl_globpri)(kthread_t *); 94 void (*cl_set_process_group)(pid_t, pid_t, pid_t); 95 void (*cl_yield)(kthread_t *); 96 int (*cl_doprio)(kthread_t *, cred_t *, int, int *); 97} thread_ops_t; 98 99typedef struct classfuncs { 100 class_ops_t sclass; 101 thread_ops_t thread; 102} classfuncs_t; 103 104typedef struct sclass { 105 char *cl_name; /* class name */ 106 /* class specific initialization function */ 107 pri_t (*cl_init)(id_t, int, classfuncs_t **); 108 classfuncs_t *cl_funcs; /* pointer to classfuncs structure */ 109 krwlock_t *cl_lock; /* class structure read/write lock */ 110 int cl_count; /* # of threads trying to load class */ 111} sclass_t; 112 113#define STATIC_SCHED (krwlock_t *)0xffffffff 114#define LOADABLE_SCHED(s) ((s)->cl_lock != STATIC_SCHED) 115#define SCHED_INSTALLED(s) ((s)->cl_funcs != NULL) 116#define ALLOCATED_SCHED(s) ((s)->cl_lock != NULL) 117 118#ifdef _KERNEL 119 120#define CLASS_KERNEL(cid) ((cid) == syscid || (cid) == sysdccid) 121 122extern int nclass; /* number of configured scheduling classes */ 123extern char *defaultclass; /* default class for newproc'd processes */ 124extern struct sclass sclass[]; /* the class table */ 125extern kmutex_t class_lock; /* lock protecting class table */ 126extern int loaded_classes; /* number of classes loaded */ 127 128extern pri_t minclsyspri; 129extern id_t syscid; /* system scheduling class ID */ 130extern id_t sysdccid; /* system duty-cycle scheduling class ID */ 131extern id_t defaultcid; /* "default" class id; see dispadmin(1M) */ 132 133extern int alloc_cid(char *, id_t *); 134extern int scheduler_load(char *, sclass_t *); 135extern int getcid(char *, id_t *); 136extern int getcidbyname(char *, id_t *); 137extern int parmsin(pcparms_t *, pc_vaparms_t *); 138extern int parmsout(pcparms_t *, pc_vaparms_t *); 139extern int parmsset(pcparms_t *, kthread_t *); 140extern void parmsget(kthread_t *, pcparms_t *); 141extern int vaparmsout(char *, pcparms_t *, pc_vaparms_t *, uio_seg_t); 142 143#endif 144 145#define CL_ADMIN(clp, uaddr, reqpcredp) \ 146 (*(clp)->cl_funcs->sclass.cl_admin)(uaddr, reqpcredp) 147 148#define CL_ENTERCLASS(t, cid, clparmsp, credp, bufp) \ 149 (sclass[cid].cl_funcs->thread.cl_enterclass) (t, cid, \ 150 (void *)clparmsp, credp, bufp) 151 152#define CL_EXITCLASS(cid, clprocp)\ 153 (sclass[cid].cl_funcs->thread.cl_exitclass) ((void *)clprocp) 154 155#define CL_CANEXIT(t, cr) (*(t)->t_clfuncs->cl_canexit)(t, cr) 156 157#define CL_FORK(tp, ct, bufp) (*(tp)->t_clfuncs->cl_fork)(tp, ct, bufp) 158 159#define CL_FORKRET(t, ct) (*(t)->t_clfuncs->cl_forkret)(t, ct) 160 161#define CL_GETCLINFO(clp, clinfop) \ 162 (*(clp)->cl_funcs->sclass.cl_getclinfo)((void *)clinfop) 163 164#define CL_GETCLPRI(clp, clprip) \ 165 (*(clp)->cl_funcs->sclass.cl_getclpri)(clprip) 166 167#define CL_PARMSGET(t, clparmsp) \ 168 (*(t)->t_clfuncs->cl_parmsget)(t, (void *)clparmsp) 169 170#define CL_PARMSIN(clp, clparmsp) \ 171 (clp)->cl_funcs->sclass.cl_parmsin((void *)clparmsp) 172 173#define CL_PARMSOUT(clp, clparmsp, vaparmsp) \ 174 (clp)->cl_funcs->sclass.cl_parmsout((void *)clparmsp, vaparmsp) 175 176#define CL_VAPARMSIN(clp, clparmsp, vaparmsp) \ 177 (clp)->cl_funcs->sclass.cl_vaparmsin((void *)clparmsp, vaparmsp) 178 179#define CL_VAPARMSOUT(clp, clparmsp, vaparmsp) \ 180 (clp)->cl_funcs->sclass.cl_vaparmsout((void *)clparmsp, vaparmsp) 181 182#define CL_PARMSSET(t, clparmsp, cid, curpcredp) \ 183 (*(t)->t_clfuncs->cl_parmsset)(t, (void *)clparmsp, cid, curpcredp) 184 185#define CL_PREEMPT(tp) (*(tp)->t_clfuncs->cl_preempt)(tp) 186 187#define CL_SETRUN(tp) (*(tp)->t_clfuncs->cl_setrun)(tp) 188 189#define CL_SLEEP(tp) (*(tp)->t_clfuncs->cl_sleep)(tp) 190 191#define CL_STOP(t, why, what) (*(t)->t_clfuncs->cl_stop)(t, why, what) 192 193#define CL_EXIT(t) (*(t)->t_clfuncs->cl_exit)(t) 194 195#define CL_ACTIVE(t) (*(t)->t_clfuncs->cl_active)(t) 196 197#define CL_INACTIVE(t) (*(t)->t_clfuncs->cl_inactive)(t) 198 199#define CL_SWAPIN(t, flags) (*(t)->t_clfuncs->cl_swapin)(t, flags) 200 201#define CL_SWAPOUT(t, flags) (*(t)->t_clfuncs->cl_swapout)(t, flags) 202 203#define CL_TICK(t) (*(t)->t_clfuncs->cl_tick)(t) 204 205#define CL_TRAPRET(t) (*(t)->t_clfuncs->cl_trapret)(t) 206 207#define CL_WAKEUP(t) (*(t)->t_clfuncs->cl_wakeup)(t) 208 209#define CL_DONICE(t, cr, inc, ret) \ 210 (*(t)->t_clfuncs->cl_donice)(t, cr, inc, ret) 211 212#define CL_DOPRIO(t, cr, inc, ret) \ 213 (*(t)->t_clfuncs->cl_doprio)(t, cr, inc, ret) 214 215#define CL_GLOBPRI(t) (*(t)->t_clfuncs->cl_globpri)(t) 216 217#define CL_SET_PROCESS_GROUP(t, s, b, f) \ 218 (*(t)->t_clfuncs->cl_set_process_group)(s, b, f) 219 220#define CL_YIELD(tp) (*(tp)->t_clfuncs->cl_yield)(tp) 221 222#define CL_ALLOC(pp, cid, flag) \ 223 (sclass[cid].cl_funcs->sclass.cl_alloc) (pp, flag) 224 225#define CL_FREE(cid, bufp) (sclass[cid].cl_funcs->sclass.cl_free) (bufp) 226 227#ifdef __cplusplus 228} 229#endif 230 231#endif /* _SYS_CLASS_H */ 232