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