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, Version 1.0 only
   6  * (the "License").  You may not use this file except in compliance
   7  * with the License.
   8  *
   9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10  * or http://www.opensolaris.org/os/licensing.
  11  * See the License for the specific language governing permissions
  12  * and limitations under the License.
  13  *
  14  * When distributing Covered Code, include this CDDL HEADER in each
  15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16  * If applicable, add the following below this CDDL HEADER, with the
  17  * fields enclosed by brackets "[]" replaced with your own identifying
  18  * information: Portions Copyright [yyyy] [name of copyright owner]
  19  *
  20  * CDDL HEADER END
  21  */
  22 /*
  23  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  */
  26 
  27 /*      Copyright (c) 1990, 1991 UNIX System Laboratories, Inc. */
  28 /*      Copyright (c) 1984, 1986, 1987, 1988, 1989, 1990 AT&T       */
  29 /*        All Rights Reserved   */
  30 
  31 #pragma ident   "%Z%%M% %I%     %E% SMI"
  32 
  33 #include <sys/proc.h>
  34 #include <sys/priocntl.h>
  35 #include <sys/class.h>
  36 #include <sys/disp.h>
  37 #include <sys/ts.h>
  38 #include <sys/tspriocntl.h>
  39 #include <sys/modctl.h>
  40 
  41 /*
  42  * The purpose of this file is to allow a user to make their own
  43  * ts_dptbl. The contents of this file should be included in the
  44  * ts_dptbl(4) man page with proper instructions for making
  45  * and replacing the TS_DPTBL.kmod in modules/sched. This was the
  46  * only way to provide functionality equivalent to the mkboot/cunix
  47  * method in SVr4 without having the utilities mkboot/cunix in
  48  * SunOS/Svr4.
  49  * It is recommended that the system calls be used to change the time
  50  * quantums instead of re-building the module.
  51  * There are also other tunable time sharing parameters in here also
  52  * that used to be in param.c
  53  */
  54 
  55 extern int ts_dispatch_extended;
  56 
  57 static struct modlmisc modlmisc = {
  58         &mod_miscops, "Time sharing dispatch table"
  59 };
  60 
  61 static struct modlinkage modlinkage = {
  62         MODREV_1, &modlmisc, 0
  63 };
  64 
  65 int
  66 _init()
  67 {
  68         return (mod_install(&modlinkage));
  69 }
  70 
  71 int
  72 _info(struct modinfo *modinfop)
  73 {
  74         return (mod_info(&modlinkage, modinfop));
  75 }
  76 
  77 #define TSGPUP0 0       /* Global priority for TS user priority 0 */
  78 #define TSGPKP0 60      /* Global priority for TS kernel priority 0 */
  79 
  80 /*
  81  * array of global priorities used by ts procs sleeping or
  82  * running in kernel mode after sleep
  83  */
  84 
  85 pri_t config_ts_kmdpris[] = {
  86         TSGPKP0,    TSGPKP0+1,  TSGPKP0+2,  TSGPKP0+3,
  87         TSGPKP0+4,  TSGPKP0+5,  TSGPKP0+6,  TSGPKP0+7,
  88         TSGPKP0+8,  TSGPKP0+9,  TSGPKP0+10, TSGPKP0+11,
  89         TSGPKP0+12, TSGPKP0+13, TSGPKP0+14, TSGPKP0+15,
  90         TSGPKP0+16, TSGPKP0+17, TSGPKP0+18, TSGPKP0+19,
  91         TSGPKP0+20, TSGPKP0+21, TSGPKP0+22, TSGPKP0+23,
  92         TSGPKP0+24, TSGPKP0+25, TSGPKP0+26, TSGPKP0+27,
  93         TSGPKP0+28, TSGPKP0+29, TSGPKP0+30, TSGPKP0+31,
  94         TSGPKP0+32, TSGPKP0+33, TSGPKP0+34, TSGPKP0+35,
  95         TSGPKP0+36, TSGPKP0+37, TSGPKP0+38, TSGPKP0+39
  96 };
  97 
  98 tsdpent_t       config_ts_dptbl[] = {
  99 
 100 /*      glbpri          qntm    tqexp   slprt   mxwt    lwt */
 101 
 102         TSGPUP0+0,      20,      0,     50,         0,  50,
 103         TSGPUP0+1,      20,      0,     50,         0,  50,
 104         TSGPUP0+2,      20,      0,     50,         0,  50,
 105         TSGPUP0+3,      20,      0,     50,         0,  50,
 106         TSGPUP0+4,      20,      0,     50,         0,  50,
 107         TSGPUP0+5,      20,      0,     50,         0,  50,
 108         TSGPUP0+6,      20,      0,     50,         0,  50,
 109         TSGPUP0+7,      20,      0,     50,         0,  50,
 110         TSGPUP0+8,      20,      0,     50,         0,  50,
 111         TSGPUP0+9,      20,      0,     50,         0,  50,
 112         TSGPUP0+10,     16,      0,     51,         0,  51,
 113         TSGPUP0+11,     16,      1,     51,         0,  51,
 114         TSGPUP0+12,     16,      2,     51,         0,  51,
 115         TSGPUP0+13,     16,      3,     51,         0,  51,
 116         TSGPUP0+14,     16,      4,     51,         0,  51,
 117         TSGPUP0+15,     16,      5,     51,         0,  51,
 118         TSGPUP0+16,     16,      6,     51,         0,  51,
 119         TSGPUP0+17,     16,      7,     51,         0,  51,
 120         TSGPUP0+18,     16,      8,     51,         0,  51,
 121         TSGPUP0+19,     16,      9,     51,         0,  51,
 122         TSGPUP0+20,     12,     10,     52,         0,  52,
 123         TSGPUP0+21,     12,     11,     52,         0,  52,
 124         TSGPUP0+22,     12,     12,     52,         0,  52,
 125         TSGPUP0+23,     12,     13,     52,         0,  52,
 126         TSGPUP0+24,     12,     14,     52,         0,  52,
 127         TSGPUP0+25,     12,     15,     52,         0,  52,
 128         TSGPUP0+26,     12,     16,     52,         0,  52,
 129         TSGPUP0+27,     12,     17,     52,         0,  52,
 130         TSGPUP0+28,     12,     18,     52,         0,  52,
 131         TSGPUP0+29,     12,     19,     52,         0,  52,
 132         TSGPUP0+30,      8,     20,     53,         0,  53,
 133         TSGPUP0+31,      8,     21,     53,         0,  53,
 134         TSGPUP0+32,      8,     22,     53,         0,  53,
 135         TSGPUP0+33,      8,     23,     53,         0,  53,
 136         TSGPUP0+34,      8,     24,     53,         0,  53,
 137         TSGPUP0+35,      8,     25,     54,         0,  54,
 138         TSGPUP0+36,      8,     26,     54,         0,  54,
 139         TSGPUP0+37,      8,     27,     54,         0,  54,
 140         TSGPUP0+38,      8,     28,     54,         0,  54,
 141         TSGPUP0+39,      8,     29,     54,         0,  54,
 142         TSGPUP0+40,      4,     30,     55,         0,  55,
 143         TSGPUP0+41,      4,     31,     55,         0,  55,
 144         TSGPUP0+42,      4,     32,     55,         0,  55,
 145         TSGPUP0+43,      4,     33,     55,         0,  55,
 146         TSGPUP0+44,      4,     34,     55,         0,  55,
 147         TSGPUP0+45,      4,     35,     56,         0,  56,
 148         TSGPUP0+46,      4,     36,     57,         0,  57,
 149         TSGPUP0+47,      4,     37,     58,         0,  58,
 150         TSGPUP0+48,      4,     38,     58,         0,  58,
 151         TSGPUP0+49,      4,     39,     58,         0,  59,
 152         TSGPUP0+50,      4,     40,     58,         0,  59,
 153         TSGPUP0+51,      4,     41,     58,         0,  59,
 154         TSGPUP0+52,      4,     42,     58,         0,  59,
 155         TSGPUP0+53,      4,     43,     58,         0,  59,
 156         TSGPUP0+54,      4,     44,     58,         0,  59,
 157         TSGPUP0+55,      4,     45,     58,         0,  59,
 158         TSGPUP0+56,      4,     46,     58,         0,  59,
 159         TSGPUP0+57,      4,     47,     58,         0,  59,
 160         TSGPUP0+58,      4,     48,     58,         0,  59,
 161         TSGPUP0+59,      2,     49,     59,     32000,  59
 162 };
 163 
 164 /*
 165  * config_ts_dptbl_server[] is an alternate dispatch table that may
 166  * deliver better performance on large server configurations.
 167  * This table must be the same size as the default table, config_ts_dptbl.
 168  */
 169 tsdpent_t       config_ts_dptbl_server[] = {
 170 
 171 /*      glbpri          qntm    tqexp   slprt   mxwt    lwt */
 172 
 173         TSGPUP0+0,      40,      0,      1,         2,  40,
 174         TSGPUP0+1,      38,      0,      2,         2,  40,
 175         TSGPUP0+2,      38,      1,      3,         2,  40,
 176         TSGPUP0+3,      38,      1,      4,         2,  40,
 177         TSGPUP0+4,      38,      2,      5,         2,  40,
 178         TSGPUP0+5,      38,      2,      6,         2,  40,
 179         TSGPUP0+6,      38,      3,      7,         2,  40,
 180         TSGPUP0+7,      38,      3,      8,         2,  40,
 181         TSGPUP0+8,      38,      4,      9,         2,  40,
 182         TSGPUP0+9,      38,      4,     10,         2,  40,
 183         TSGPUP0+10,     38,      5,     11,         2,  40,
 184         TSGPUP0+11,     38,      5,     12,         2,  40,
 185         TSGPUP0+12,     38,      6,     13,         2,  40,
 186         TSGPUP0+13,     38,      6,     14,         2,  40,
 187         TSGPUP0+14,     38,      7,     15,         2,  40,
 188         TSGPUP0+15,     38,      7,     16,         2,  40,
 189         TSGPUP0+16,     38,      8,     17,         2,  40,
 190         TSGPUP0+17,     38,      8,     18,         2,  40,
 191         TSGPUP0+18,     38,      9,     19,         2,  40,
 192         TSGPUP0+19,     38,      9,     20,         2,  40,
 193         TSGPUP0+20,     36,     10,     21,         2,  40,
 194         TSGPUP0+21,     36,     11,     22,         2,  40,
 195         TSGPUP0+22,     36,     12,     23,         2,  40,
 196         TSGPUP0+23,     36,     13,     24,         2,  40,
 197         TSGPUP0+24,     36,     14,     25,         2,  40,
 198         TSGPUP0+25,     36,     15,     26,         2,  40,
 199         TSGPUP0+26,     36,     16,     27,         2,  40,
 200         TSGPUP0+27,     36,     17,     28,         2,  40,
 201         TSGPUP0+28,     36,     18,     29,         2,  40,
 202         TSGPUP0+29,     36,     19,     30,         2,  40,
 203         TSGPUP0+30,     36,     20,     31,         2,  40,
 204         TSGPUP0+31,     36,     21,     32,         2,  40,
 205         TSGPUP0+32,     36,     22,     33,         2,  40,
 206         TSGPUP0+33,     36,     23,     34,         2,  40,
 207         TSGPUP0+34,     36,     24,     35,         2,  40,
 208         TSGPUP0+35,     36,     25,     36,         2,  40,
 209         TSGPUP0+36,     36,     26,     37,         2,  40,
 210         TSGPUP0+37,     36,     27,     38,         2,  40,
 211         TSGPUP0+38,     36,     28,     39,         2,  40,
 212         TSGPUP0+39,     36,     29,     40,         2,  40,
 213         TSGPUP0+40,     36,     30,     41,         2,  41,
 214         TSGPUP0+41,     34,     31,     42,         2,  42,
 215         TSGPUP0+42,     34,     32,     43,         2,  43,
 216         TSGPUP0+43,     34,     33,     44,         2,  44,
 217         TSGPUP0+44,     34,     34,     45,         2,  45,
 218         TSGPUP0+45,     34,     35,     46,         2,  46,
 219         TSGPUP0+46,     34,     36,     47,         2,  47,
 220         TSGPUP0+47,     34,     37,     48,         2,  48,
 221         TSGPUP0+48,     34,     38,     49,         2,  49,
 222         TSGPUP0+49,     34,     39,     50,         2,  50,
 223         TSGPUP0+50,     34,     40,     51,         2,  51,
 224         TSGPUP0+51,     34,     41,     52,         2,  52,
 225         TSGPUP0+52,     34,     42,     53,         2,  53,
 226         TSGPUP0+53,     34,     43,     54,         2,  54,
 227         TSGPUP0+54,     34,     44,     55,         2,  55,
 228         TSGPUP0+55,     34,     45,     56,         2,  56,
 229         TSGPUP0+56,     34,     46,     57,         2,  57,
 230         TSGPUP0+57,     34,     47,     58,         2,  58,
 231         TSGPUP0+58,     34,     48,     59,         2,  59,
 232         TSGPUP0+59,     34,     49,     59,         2,  59
 233 };
 234 
 235 
 236 
 237 pri_t config_ts_maxumdpri = sizeof (config_ts_dptbl) / sizeof (tsdpent_t) - 1;
 238 
 239 /*
 240  * Return the address of config_ts_dptbl
 241  */
 242 tsdpent_t *
 243 ts_getdptbl()
 244 {
 245         /*
 246          * If ts_dispatch_extended is -1, set it to 0x0
 247          * to choose the default TS table.
 248          */
 249         if (ts_dispatch_extended == -1)
 250                 ts_dispatch_extended = 0;
 251 
 252         /*
 253          * If ts_dispatch_extended is non-zero, use the
 254          * "large server style" TS dispatch table.
 255          */
 256         if (ts_dispatch_extended)
 257                 return (config_ts_dptbl_server);
 258         else
 259                 return (config_ts_dptbl);
 260 }
 261 
 262 /*
 263  * Return the address of config_ts_kmdpris
 264  */
 265 pri_t *
 266 ts_getkmdpris()
 267 {
 268         return (config_ts_kmdpris);
 269 }
 270 
 271 /*
 272  * Return the address of ts_maxumdpri
 273  */
 274 pri_t
 275 ts_getmaxumdpri()
 276 {
 277         /*
 278          * The config_ts_dptbl_server table must be the same size as
 279          * the config_ts_dptbl table.
 280          */
 281         /*LINTED*/
 282         ASSERT(sizeof (config_ts_dptbl) == sizeof (config_ts_dptbl_server));
 283         return (config_ts_maxumdpri);
 284 }