PRIOCNTL(2) System Calls PRIOCNTL(2)

NAME


priocntl - process scheduler control

SYNOPSIS


#include <sys/types.h>
#include <sys/priocntl.h>
#include <sys/rtpriocntl.h>
#include <sys/tspriocntl.h>
#include <sys/iapriocntl.h>
#include <sys/fsspriocntl.h>
#include <sys/fxpriocntl.h>

long priocntl(idtype_t idtype, id_t id, int cmd, /* arg */ ...);


DESCRIPTION


The priocntl() function provides for control over the scheduling of
an active light weight process (LWP).


LWPs fall into distinct classes with a separate scheduling policy
applied to each class. The classes currently supported are the
realtime class, the time-sharing class, the fair-share class, and the
fixed-priority class. The characteristics of these classes are
described under the corresponding headings below.


The class attribute of an LWP is inherited across the fork(2)
function and the exec(2) family of functions. The priocntl() function
can be used to dynamically change the class and other scheduling
parameters associated with a running LWP or set of LWPs given the
appropriate permissions as explained below.


In the default configuration, a runnable realtime LWP runs before any
other LWP. Therefore, inappropriate use of realtime LWP can have a
dramatic negative impact on system performance.


The priocntl() function provides an interface for specifying a
process, set of processes, or an LWP to which the function applies.
The priocntlset(2) function provides the same functions as
priocntl(), but allows a more general interface for specifying the
set of LWPs to which the function is to apply.


For priocntl(), the idtype and id arguments are used together to
specify the set of LWPs. The interpretation of id depends on the
value of idtype. The possible values for idtype and corresponding
interpretations of id are as follows:

P_ALL
The priocntl() function applies to all existing LWPs. The
value of id is ignored. The permission restrictions
described below still apply.


P_CID
The id argument is a class ID (returned by the priocntl()
PC_GETCID command as explained below). The priocntl()
function applies to all LWPs in the specified class.


P_GID
The id argument is a group ID. The priocntl() function
applies to all LWPs with this effective group ID.


P_LWPID
The id argument is an LWP ID. The priocntl function
applies to the LWP with the specified ID within the
calling process.


P_PGID
The id argument is a process group ID. The priocntl()
function applies to all LWPs currently associated with
processes in the specified process group.


P_PID
The id argument is a process ID specifying a single
process. The priocntl() function applies to all LWPs
currently associated with the specified process.


P_PPID
The id argument is a parent process ID. The priocntl()
function applies to all LWPs currently associated with
processes with the specified parent process ID.


P_PROJID
The id argument is a project ID. The priocntl() function
applies to all LWPs with this project ID.


P_SID
The id argument is a session ID. The priocntl() function
applies to all LWPs currently associated with processes
in the specified session.


P_TASKID
The id argument is a task ID. The priocntl() function
applies to all LWPs currently associated with processes
in the specified task.


P_UID
The id argument is a user ID. The priocntl() function
applies to all LWPs with this effective user ID.


P_ZONEID
The id argument is a zone ID. The priocntl() function
applies to all LWPs with this zone ID.


P_CTID
The id argument is a process contract ID. The priocntl()
function applies to all LWPs with this process contract
ID.


An id value of P_MYID can be used in conjunction with the idtype
value to specify the LWP ID, parent process ID, process group ID,
session ID, task ID, class ID, user ID, group ID, project ID, zone
ID, or process contract ID of the calling LWP.


To change the scheduling parameters of an LWP (using the PC_SETPARMS
or PC_SETXPARMS command as explained below), the real or effective
user ID of the LWP calling priocntl() must match the real or the
calling LWP must have sufficient privileges. These are the minimum
permission requirements enforced for all classes. An individual class
might impose additional permissions requirements when setting LWPs to
that class and/or when setting class-specific scheduling parameters.


A special SYS scheduling class exists for the purpose of scheduling
the execution of certain special system processes (such as the
swapper process). It is not possible to change the class of any LWP
to SYS. In addition, any processes in the SYS class that are included
in a specified set of processes are disregarded by priocntl(). For
example, an idtype of P_UID and an id value of 0 would specify all
processes with a user ID of 0 except processes in the SYS class and
(if changing the parameters using PC_SETPARMS or PC_SETXPARMS) the
init(8) process.


The init process is a special case. For a priocntl() call to change
the class or other scheduling parameters of the init process (process
ID 1), it must be the only process specified by idtype and id. The
init process can be assigned to any class configured on the system,
but the time-sharing class is almost always the appropriate choice.
(Other choices might be highly undesirable. See the System
Administration Guide: Basic Administration for more information.)


The data type and value of arg are specific to the type of command
specified by cmd.


A pcinfo_t structure with the following members, defined in
<sys/priocntl.h>, is used by the PC_GETCID and PC_GETCLINFO commands.

id_t pc_cid; /* Class id */
char pc_clname[PC_CLNMSZ]; /* Class name */
int pc_clinfo[PC_CLINFOSZ]; /* Class information */


The pc_cid member is a class ID returned by the priocntl() PC_GETCID
command.


The pc_clname member is a buffer of size PC_CLNMSZ, defined in
<sys/priocntl.h>, used to hold the class name: RT for realtime, TS
for time-sharing, IA for interactive, FSS for fair-share, or FX for
fixed-priority. Each string is null-terminated.


The pc_clinfo member is a buffer of size PC_CLINFOSZ, defined in
<sys/priocntl.h>, used to return data describing the attributes of a
specific class. The format of this data is class-specific and is
described under the appropriate heading (REALTIME CLASS, TIME-SHARING
CLASS, INTERACTIVE CLASS, FAIR-SHARE CLASS, or FIXED-PRIORITY CLASS)
below.


A pcparms_t structure with the following members, defined in
<sys/priocntl.h>, is used by the PC_SETPARMS and PC_GETPARMS
commands.

id_t pc_cid; /* LWP class */
int pc_clparms[PC_CLPARMSZ]; /* Class-specific params */


The pc_cid member is a class ID returned by the priocntl() PC_GETCID
command. The special class ID PC_CLNULL can also be assigned to
pc_cid when using the PC_GETPARMS command as explained below.


The pc_clparms buffer holds class-specific scheduling parameters. The
format of this parameter data for a particular class is described
under the appropriate heading below. PC_CLPARMSZ is the length of the
pc_clparms buffer and is defined in <sys/priocntl.h>.


The PC_SETXPARMS and PC_GETXPARMS commands exploit the varargs
declaration of priocntl(). The argument following the command code is
a class name: RT for realtime, TS for time-sharing, IA for
interactive, FSS for fair-share, or FX for fixed-priority. The
parameters after the class name build a chain of (key, value) pairs,
where the key determines the meaning of the value within the pair.
When using PC_GETXPARMS, the value associated with the key is always
a pointer to a scheduling parameter. In contrast, when using
PC_SETXPARMS the scheduling parameter is given as a direct value. A
key value of 0 terminates the sequence and all further keys or values
are ignored.


The PC_SETXPARMS and PC_GETXPARMS commands are more flexible than
PC_SETPARMS and PC_GETPARMS and should replace PC_SETPARMS and
PC_GETPARMS on a long-term basis.

COMMANDS


Available priocntl() commands are:

PC_ADMIN
This command provides functionality needed for the
implementation of the dispadmin(8) utility. It is not
intended for general use by other applications.


PC_DONICE
Set or get nice value of the specified LWP(s)
associated with the specified process(es). When this
command is used with the idtype of P_LWPID, it sets
the nice value of the LWP. The arg argument points to
a structure of type pcnice_t. The pc_val member
specifies the nice value and the pc_op specifies the
type of the operation.

When pc_op is set to PC_GETNICE, priocntl() sets the
pc_val to the highest priority (lowest numerical
value) pertaining to any of the specified LWPs.

When pc_op is set to PC_SETNICE, priocntl() sets the
nice value of all LWPs in the specified set to the
value specified in pc_val member of pcnice_t
structure.

The priocntl() function returns -1 with errno set to
EPERM if the calling LWP doesn't have appropriate
permissions to set or get nice values for one or more
of the target LWPs. If priocntl() encounters an error
other than permissions, it does not continue through
the set of target LWPs but returns the error
immediately.


PC_GETCID
Get class ID and class attributes for a specific
class given the class name. The idtype and id
arguments are ignored. If arg is non-null, it points
to a structure of type pcinfo_t. The pc_clname buffer
contains the name of the class whose attributes you
are getting.

On success, the class ID is returned in pc_cid, the
class attributes are returned in the pc_clinfo
buffer, and the priocntl() call returns the total
number of classes configured in the system (including
the sys class). If the class specified by pc_clname
is invalid or is not currently configured, the
priocntl() call returns -1 with errno set to EINVAL.
The format of the attribute data returned for a given
class is defined in the <sys/rtpriocntl.h>,
<sys/tspriocntl.h>, <sys/iapriocntl.h>,
<sys/fsspriocntl.h>, or <sys/fxpriocntl.h> header and
described under the appropriate heading below.

If arg is a null pointer, no attribute data is
returned but the priocntl() call still returns the
number of configured classes.


PC_GETCLINFO
Get class name and class attributes for a specific
class given class ID. The idtype and id arguments are
ignored. If arg is non-null, it points to a structure
of type pcinfo_t. The pc_cid member is the class ID
of the class whose attributes you are getting.

On success, the class name is returned in the
pc_clname buffer, the class attributes are returned
in the pc_clinfo buffer, and the priocntl() call
returns the total number of classes configured in the
system (including the sys class). The format of the
attribute data returned for a given class is defined
in the <sys/rtpriocntl.h>, <sys/tspriocntl.h>,
<sys/iapriocntl.h>, <sys/fsspriocntl.h>, or
<sys/fxpriocntl.h> header and described under the
appropriate heading below.

If arg is a null pointer, no attribute data is
returned but the priocntl() call still returns the
number of configured classes.


PC_GETPARMS
Get the class and/or class-specific scheduling
parameters of an LWP. The arg member points to a
structure of type pcparms_t.

If pc_cid specifies a configured class and a single
LWP belonging to that class is specified by the
idtype and id values or the procset structure, then
the scheduling parameters of that LWP are returned in
the pc_clparms buffer. If the LWP specified does not
exist or does not belong to the specified class, the
priocntl() call returns -1 with errno set to ESRCH.

If pc_cid specifies a configured class and a set of
LWPs is specified, the scheduling parameters of one
of the specified LWP belonging to the specified class
are returned in the pc_clparms buffer and the
priocntl() call returns the process ID of the
selected LWP. The criteria for selecting an LWP to
return in this case is class-dependent. If none of
the specified LWPs exist or none of them belong to
the specified class, the priocntl() call returns -1
with errno set to ESRCH.

If pc_cid is PC_CLNULL and a single LWP is specified,
the class of the specified LWP is returned in pc_cid
and its scheduling parameters are returned in the
pc_clparms buffer.


PC_GETXPARMS
Get the class or class-specific scheduling parameters
of an LWP. The class name (first argument after
PC_GETXPARMS) specifies the class and the (key,
value) pair sequence contains a pointer to the class-
specific parameters. The keys and the types of the
class-specific parameter data are described below and
can also be found in the class-specific headers
<sys/rtpriocntl.h>, <sys/tspriocntl.h>,
<sys/iapriocntl.h>, <sys/fsspriocntl.h>, and
<sys/fxpriocntl.h>. If the specified class is a
configured class and a single LWP belonging to that
class is specified by the idtype and id values or the
procset structure, then the scheduling parameters of
that LWP are returned in the given (key, value) pair
buffers. If the LWP specified does not exist or does
not belong to the specified class, priocntl() returns
-1 and errno is set to ESRCH.

If the class name specifies a configured class and a
set of LWPs is given, the scheduling parameters of
one of the specified LWPs belonging to the specified
class are returned and the priocntl() call returns
the process ID of the selected LWP. The criteria for
selecting an LWP to return in this case is class-
dependent. If none of the specified LWPs exist or
none of them belong to the specified class,
priocntl() returns -1 and errno is set to ESRCH.

If the class name is a null pointer, a single process
or LWP is specified, and a (key, value) pair for a
class name request is given, priocntl() fills the
buffer pointed to by value with the class name of the
specified process or LWP. The key for the class name
request is PC_KY_CLNAME and the class name buffer
should be declared as:

char pc_clname[PC_CLNMSZ]; /* Class name */


PC_SETPARMS
Set the class and class-specific scheduling
parameters of the specified LWP(s) associated with
the specified process(es). When this command is used
with the idtype of P_LWPID, it will set the class and
class-specific scheduling parameters of the LWP. The
arg argument points to a structure of type pcparms_t.
The pc_cid member specifies the class you are setting
and the pc_clparms buffer contains the class-specific
parameters you are setting. The format of the class-
specific parameter data is defined in the
<sys/rtpriocntl.h>, <sys/tspriocntl.h>,
<sys/iapriocntl.h>, <sys/fsspriocntl.h>, or
<sys/fxpriocntl.h> header and described under the
appropriate class heading below.

When setting parameters for a set of LWPs, priocntl()
acts on the LWPs in the set in an implementation-
specific order. If priocntl() encounters an error for
one or more of the target processes, it might or
might not continue through the set of LWPs, depending
on the nature of the error. If the error is related
to permissions (EPERM), priocntl() continues through
the LWP set, resetting the parameters for all target
LWPs for which the calling LWP has appropriate
permissions. The priocntl() function then returns -1
with errno set to EPERM to indicate that the
operation failed for one or more of the target LWPs.
If priocntl() encounters an error other than
permissions, it does not continue through the set of
target LWPs but returns the error immediately.


PC_SETXPARMS
Set the class and class-specific scheduling
parameters of the specified LWP(s) associated with
the specified process(es). When this command is used
with P_LWPID as idtype, it will set the class and
class-specific scheduling parameters of the LWP. The
class name (first argument after PC_SETXPARMS)
specifies the class to be changed and the following
(key, value) pair sequence contains the class-
specific parameters to be changed. Only those
(key,value) pairs whose scheduling behavior is to
change must be specified. The keys and the types of
the class-specific parameter data are described below
and can also be found in the class-specific header
files <sys/rtpriocntl.h>, <sys/tspriocntl.h>,
<sys/iapriocntl.h>, <sys/fsspriocntl.h>, and
<sys/fxpriocntl.h>.

When setting parameters for a set of LWPs, priocntl()
acts on the LWPs in the set in an implementation-
specific order. If priocntl() encounters an error for
one or more of the target processes, it might or
might not continue through the set of LWPs, depending
on the nature of the error. If the error is related
to permissions (EPERM), priocntl() continues to reset
the parameters for all target LWPs where the calling
LWP has appropriate permissions. The priocntl()
function returns -1 and errno is set to EPERM when
the operation failed for one or more of the target
LWPs. All errors other than EPERM result in an
immediate termination of priocntl().


REALTIME CLASS


The realtime class provides a fixed priority preemptive scheduling
policy for those LWPS requiring fast and deterministic response and
absolute user/application control of scheduling priorities. If the
realtime class is configured in the system, it should have exclusive
control of the highest range of scheduling priorities on the system.
This ensures that a runnable realtime LWP is given CPU service before
any LWP belonging to any other class.


The realtime class has a range of realtime priority (rt_pri) values
that can be assigned to an LWP within the class. Realtime priorities
range from 0 to x, where the value of x is configurable and can be
determined for a specific installation by using the priocntl()
PC_GETCID or PC_GETCLINFO command.


The realtime scheduling policy is a fixed priority policy. The
scheduling priority of a realtime LWP is never changed except as the
result of an explicit request by the user/application to change the
rt_pri value of the LWP.


For an LWP in the realtime class, the rt_pri value is, for all
practical purposes, equivalent to the scheduling priority of the LWP.
The rt_pri value completely determines the scheduling priority of a
realtime LWP relative to other LWPs within its class. Numerically
higher rt_pri values represent higher priorities. Since the realtime
class controls the highest range of scheduling priorities in the
system, it is guaranteed that the runnable realtime LWP with the
highest rt_pri value is always selected to run before any other LWPs
in the system.


In addition to providing control over priority, priocntl() provides
for control over the length of the time quantum allotted to the LWP
in the realtime class. The time quantum value specifies the maximum
amount of time an LWP can run assuming that it does not complete or
enter a resource or event wait state (sleep). If another LWP becomes
runnable at a higher priority, the currently running LWP might be
preempted before receiving its full time quantum.


The realtime quantum signal can be used for the notification of
runaway realtime processes about the consumption of their time
quantum. Those processes, which are monitored by the realtime time
quantum signal, receive the configured signal in the event of time
quantum expiration. The default value (0) of the time quantum signal
will denote no signal delivery and a positive value will denote the
delivery of the signal specified by the value. The realtime quantum
signal can be set with the priocntl() PC_SETXPARMS command and
displayed with the priocntl() PC_GETXPARMS command as explained
below.


The system's process scheduler keeps the runnable realtime LWPs on a
set of scheduling queues. There is a separate queue for each
configured realtime priority and all realtime LWPs with a given
rt_pri value are kept together on the appropriate queue. The LWPs on
a given queue are ordered in FIFO order (that is, the LWP at the
front of the queue has been waiting longest for service and receives
the CPU first). Realtime LWPs that wake up after sleeping, LWPs that
change to the realtime class from some other class, LWPs that have
used their full time quantum, and runnable LWPs whose priority is
reset by priocntl() are all placed at the back of the appropriate
queue for their priority. An LWP that is preempted by a higher
priority LWP remains at the front of the queue (with whatever time is
remaining in its time quantum) and runs before any other LWP at this
priority. Following a fork(2) function call by a realtime LWP, the
parent LWP continues to run while the child LWP (which inherits its
parent's rt_pri value) is placed at the back of the queue.


A rtinfo_t structure with the following members, defined in
<sys/rtpriocntl.h>, defines the format used for the attribute data
for the realtime class.

short rt_maxpri; /* Maximum realtime priority */


The priocntl() PC_GETCID and PC_GETCLINFO commands return realtime
class attributes in the pc_clinfo buffer in this format.


The rt_maxpri member specifies the configured maximum rt_pri value
for the realtime class. If rt_maxpri is x, the valid realtime
priorities range from 0 to x.


A rtparms_t structure with the following members, defined in
<sys/rtpriocntl.h>, defines the format used to specify the realtime
class-specific scheduling parameters of an LWP.

short rt_pri; /* Real-Time priority */
uint_t rt_tqsecs; /* Seconds in time quantum */
int rt_tqnsecs; /* Additional nanoseconds in quantum */


When using the priocntl() PC_SETPARMS or PC_GETPARMS commands, if
pc_cid specifies the realtime class, the data in the pc_clparms
buffer are in this format.


These commands can be used to set the realtime priority to the
specified value or get the current rt_pri value. Setting the rt_pri
value of an LWP that is currently running or runnable (not sleeping)
causes the LWP to be placed at the back of the scheduling queue for
the specified priority. The LWP is placed at the back of the
appropriate queue regardless of whether the priority being set is
different from the previous rt_pri value of the LWP. A running LWP
can voluntarily release the CPU and go to the back of the scheduling
queue at the same priority by resetting its rt_pri value to its
current realtime priority value. To change the time quantum of an LWP
without setting the priority or affecting the LWP's position on the
queue, the rt_pri member should be set to the special value
RT_NOCHANGE, defined in <sys/rtpriocntl.h>. Specifying RT_NOCHANGE
when changing the class of an LWP to realtime from some other class
results in the realtime priority being set to 0.


For the priocntl() PC_GETPARMS command, if pc_cid specifies the
realtime class and more than one realtime LWP is specified, the
scheduling parameters of the realtime LWP with the highest rt_pri
value among the specified LWPs are returned and the LWP ID of this
LWP is returned by the priocntl() call. If there is more than one LWP
sharing the highest priority, the one returned is implementation-
dependent.


The rt_tqsecs and rt_tqnsecs members are used for getting or setting
the time quantum associated with an LWP or group of LWPs. rt_tqsecs
is the number of seconds in the time quantum and rt_tqnsecs is the
number of additional nanoseconds in the quantum. For example, setting
rt_tqsecs to 2 and rt_tqnsecs to 500,000,000 (decimal) would result
in a time quantum of two and one-half seconds. Specifying a value of
1,000,000,000 or greater in the rt_tqnsecs member results in an error
return with errno set to EINVAL. Although the resolution of the
tq_nsecs member is very fine, the specified time quantum length is
rounded up by the system to the next integral multiple of the system
clock's resolution. The maximum time quantum that can be specified is
implementation-specific and equal to INT_MAX ticks. The INT_MAX value
is defined in <limits.h>. Requesting a quantum greater than this
maximum results in an error return with errno set to ERANGE, although
infinite quantums can be requested using a special value as explained
below. Requesting a time quantum of 0 by setting both rt_tqsecs and
rt_tqnsecs to 0 results in an error return with errno set to EINVAL.


The rt_tqnsecs member can also be set to one of the following special
values defined in <sys/rtpriocntl.h>, in which case the value of
rt_tqsecs is ignored:

RT_TQINF
Set an infinite time quantum.


RT_TQDEF
Set the time quantum to the default for this priority
(see rt_dptbl(5)).


RT_NOCHANGE
Do not set the time quantum. This value is useful when
you wish to change the realtime priority of an LWP
without affecting the time quantum. Specifying this
value when changing the class of an LWP to realtime
from some other class is equivalent to specifying
RT_TQDEF.


When using the priocntl() PC_SETXPARMS or PC_GETXPARMS commands, the
first argument after the command code must be the class name of the
realtime class (RT). The next arguments are formed as (key, value)
pairs, terminated by a 0 key. The definition for the keys of the
realtime class can be found in <sys/rtpriocntl.h>. A repeated
specification of the same key results in an error return and errno
set to EINVAL.


+--------------+------------+------------------------------+
| Key | Value Type | Description |
+--------------+------------+------------------------------+
|RT_KY_PRI | pri_t | realtime priority |
|RT_KY_TQSECS | uint_t | seconds in time quantum |
+--------------+------------+------------------------------+
|RT_KY_TQNSECS | int | nanoseconds in time quantum |
+--------------+------------+------------------------------+
|RT_KY_TQSIG | int | realtime time quantum signal |
+--------------+------------+------------------------------+


When using the priocntl() PC_GETXPARMS command, the value associated
with the key is always a pointer to a scheduling parameter of the
value type shown in the table above. In contrast, when using the
priocntl() PC_SETXPARMS command, the scheduling parameter is given as
a direct value.


A priocntl() PC_SETXPARMS command with the class name (RT) and
without a following (key, value) pair will set or reset all realtime
scheduling parameters of the target process(es) to their default
values. Changing the class of an LWP to realtime from some other
class causes the parameters to be set to their default values. The
default realtime priority (RT_KY_PRI) is 0. A default time quantum
(RT_TQDEF) is assigned to each priority class (see rt_dptbl(5)). The
default realtime time quantum signal (RT_KY_TQSIG) is 0.


The value associated with RT_KY_TQSECS is the number of seconds in
the time quantum. The value associated with RT_KY_TQNSECS is the
number of nanoseconds in the quantum. Specifying a value of
1,000,000,000 or greater for the number of nanoseconds results in an
error return and errno is set to EINVAL. The specified time quantum
is rounded up by the system to the next integral multiple of the
system clock's resolution. The maximum time quantum that can be
specified is implementation-specific and equal to INT_MAX ticks,
defined in <limits.h>. Requesting a quantum greater than this maximum
results in an error return and errno is set to ERANGE. If seconds
(RT_KY_TQSECS) but no nanoseconds (RT_KY_TQNSECS) are supplied, the
number of nanoseconds is set to 0. If nanoseconds (RT_KY_TQNSECS) but
no seconds (RT_KY_TQSECS) are supplied, the number of seconds is set
to 0. A time quantum of 0 (seconds and nanoseconds are 0) results in
an error return with errno set to EINVAL. Special values for
RT_KY_TQSECS are RT_TQINF and RT_TQDEF (as described above). The
priocntl() command PC_SETXPARMS knows no special value RT_NOCHANGE.


To change the class of an LWP to realtime from any other class, the
LWP invoking priocntl() must have sufficient privileges. To change
the priority or time quantum setting of a realtime LWP, the LWP
invoking priocntl() must have sufficient privileges or must itself be
a realtime LWP whose real or effective user ID matches the real of
effective user ID of the target LWP.


The realtime priority and time quantum are inherited across fork(2)
and the exec family of functions. When using the time quantum signal
with a user-defined signal handler across the exec functions, the new
image must install an appropriate user-defined signal handler before
the time quantum expires. Otherwise, unpredictable behavior might
result.

TIME-SHARING CLASS
The time-sharing scheduling policy provides for a fair and effective
allocation of the CPU resource among LWPs with varying CPU
consumption characteristics. The objectives of the time-sharing
policy are to provide good response time to interactive LWPs and good
throughput to CPU-bound jobs, while providing a degree of
user/application control over scheduling.


The time-sharing class has a range of time-sharing user priority (see
ts_upri below) values that can be assigned to LWPs within the class.
A ts_upri value of 0 is defined as the default base priority for the
time-sharing class. User priorities range from -x to +x where the
value of x is configurable and can be determined for a specific
installation by using the priocntl() PC_GETCID or PC_GETCLINFO
command.


The purpose of the user priority is to provide some degree of
user/application control over the scheduling of LWPs in the time-
sharing class. Raising or lowering the ts_upri value of an LWP in the
time-sharing class raises or lowers the scheduling priority of the
LWP. It is not guaranteed, however, that an LWP with a higher ts_upri
value will run before one with a lower ts_upri value, since the
ts_upri value is just one factor used to determine the scheduling
priority of a time-sharing LWP. The system can dynamically adjust the
internal scheduling priority of a time-sharing LWP based on other
factors such as recent CPU usage.


In addition to the system-wide limits on user priority (returned by
the PC_GETCID and PC_GETCLINFO commands) there is a per LWP user
priority limit (see ts_uprilim below) specifying the maximum ts_upri
value that can be set for a given LWP. By default, ts_uprilim is 0.


A tsinfo_t structure with the following members, defined in
<sys/tspriocntl.h>, defines the format used for the attribute data
for the time-sharing class.

short ts_maxupri; /* Limits of user priority range */


The priocntl() PC_GETCID and PC_GETCLINFO commands return time-
sharing class attributes in the pc_clinfo buffer in this format.


The ts_maxupri member specifies the configured maximum user priority
value for the time-sharing class. If ts_maxupri is x, the valid range
for both user priorities and user priority limits is from -x to +x.


A tsparms_t structure with the following members, defined in
<sys/tspriocntl.h>, defines the format used to specify the time-
sharing class-specific scheduling parameters of an LWP.

short ts_uprilim; /* Time-Sharing user priority limit */
short ts_upri; /* Time-Sharing user priority */


When using the priocntl() PC_SETPARMS or PC_GETPARMS commands, if
pc_cid specifies the time-sharing class, the data in the pc_clparms
buffer is in this format.


For the priocntl() PC_GETPARMS command, if pc_cid specifies the time-
sharing class and more than one time-sharing LWP is specified, the
scheduling parameters of the time-sharing LWP with the highest
ts_upri value among the specified LWPs is returned and the LWP ID of
this LWP is returned by the priocntl() call. If there is more than
one LWP sharing the highest user priority, the one returned is
implementation-dependent.


Any time-sharing LWP can lower its own ts_uprilim (or that of another
LWP with the same user ID). Only a time-sharing LWP with sufficient
privileges can raise a ts_uprilim. When changing the class of an LWP
to time-sharing from some other class, sufficient privileges are
required to set the initial ts_uprilim to a value greater than 0.
Attempts by an unprivileged LWP to raise a ts_uprilim or set an
initial ts_uprilim greater than 0 fail with a return value of -1 and
errno set to EPERM.


Any time-sharing LWP can set its own ts_upri (or that of another LWP
with the same user ID) to any value less than or equal to the LWP's
ts_uprilim. Attempts to set the ts_upri above the ts_uprilim (and/or
set the ts_uprilim below the ts_upri) result in the ts_upri being set
equal to the ts_uprilim.


Either of the ts_uprilim or ts_upri members can be set to the special
value TS_NOCHANGE, defined in <sys/tspriocntl.h>, to set one of the
values without affecting the other. Specifying TS_NOCHANGE for the
ts_upri when the ts_uprilim is being set to a value below the current
ts_upri causes the ts_upri to be set equal to the ts_uprilim being
set. Specifying TS_NOCHANGE for a parameter when changing the class
of an LWP to time-sharing (from some other class) causes the
parameter to be set to a default value. The default value for the
ts_uprilim is 0 and the default for the ts_upri is to set it equal to
the ts_uprilim that is being set.


When using the priocntl() PC_SETXPARMS or PC_GETXPARMS commands, the
first argument after the command code is the class name of the time-
sharing class (TS). The next arguments are formed as (key, value)
pairs, terminated by a 0 key. The definition for the keys of the
time-sharing class can be found in <sys/tspriocntl.h>. A repeated
specification of the same key results in an error return and errno
set to EINVAL.


+--------------+------------+---------------------+
| Key | Value Type | Description |
+--------------+------------+---------------------+
|TS_KY_UPRILIM | pri_t | user priority limit |
|TS_KY_UPRI | pri_t | user priority |
+--------------+------------+---------------------+


When using the priocntl() PC_GETXPARMS command, the value associated
with the key is always a pointer to a scheduling parameter of the
value type in the table above. In contrast, when using the priocntl()
PC_SETXPARMS command, the scheduling parameter is given as a direct
value.


A priocntl() PC_SETXPARMS command with the class name (TS) and
without a following (key, value) pair will set or reset all time-
sharing scheduling parameters of the target process(es) to their
default values. Changing the class of an LWP to time-sharing from
some other class causes the parameters to be set to their default
values. The default value for the user priority limit (TS_KY_UPRILIM)
is 0. The default value for the user priority (TS_KY_UPRI) is equal
to the user priority limit (TS_KY_UPRILIM) that is being set.


The priocntl() command PC_SETXPARMS knows no special value
TS_NOCHANGE.


The time-sharing user priority and user priority limit are inherited
across fork() and the exec family of functions.

INTERACTIVE CLASS


The interactive scheduling policy is a variation on the time-sharing
scheduling policy. All that can be said about the time-sharing
scheduling policy is also true for the interactive scheduling policy,
with one addition: An LWP in the interactive class with its ia_mode
value set to IA_SET_INTERACTIVE has its time-sharing priority boosted
by IA_BOOST (10).


An iainfo_t structure with the following members, defined in
<sys/iapriocntl.h>, defines the format used for the attribute data
for the interactive class.

short ia_maxupri; /* Limits of user priority range */


The priocntl() PC_GETCID and PC_GETCLINFO commands return interactive
class attributes in the pc_clinfo buffer in this format.


The ia_maxupri member specifies the configured maximum user priority
value for the interactive class. If ia_maxupri is x, the valid range
for both user priorities and user priority limits is from -x to +x.


A iaparms_t structure with the following members, defined in
<sys/iapriocntl.h>, defines the format used to specify the
interactive class-specific scheduling parameters of an LWP.

short ia_uprilim; /* Interactive user priority limit */
short ia_upri; /* Interactive user priority */
int ia_mode; /* interactive on/off */


When using the priocntl() PC_SETPARMS or PC_GETPARMS commands, if
pc_cid specifies the interactive class, the data in the pc_clparms
buffer is in this format.


For the priocntl() PC_GETPARMS command, if pc_cid specifies the
interactive class and more than one interactive LWP is specified, the
scheduling parameters of the interactive LWP with the highest ia_upri
value among the specified LWPs is returned and the LWP ID of this LWP
is returned by the priocntl() call. If there is more than one LWP
sharing the highest user priority, the one returned is
implementation-dependent.


All that is said above in the TIME-SHARING CLASS section concerning
manipulation of ts_uprilim and ts_upri applies equally to
manipulations of ia_uprilim and ia_upri in the interactive class.


When using the PC_SETPARMS command, the ia_mode member must be set to
one of the values IA_SET_INTERACTIVE, IA_INTERACTIVE_OFF, or
IA_NOCHANGE, defined in <sys/iapriocntl.h>, to set the interactive
mode on or off or to make no change to the interactive mode.


When using the priocntl() PC_SETXPARMS or PC_GETXPARMS commands, the
first argument after the command code is the class name of the
interactive class (IA). The next arguments are formed as (key, value)
pairs, terminated by a 0 key. The definition for the keys of the
interactive class can be found in <sys/iapriocntl.h>. A repeated
specification of the same key results in an error return and errno
set to EINVAL.


Key Value Type Description
IA_KY_UPRILIM pri_t user priority limit
IA_KY_UPRI pri_t user priority
IA_KY_MODE int interactive mode


When using the priocntl() PC_GETXPARMS command, the value associated
with the key is always a pointer to a scheduling parameter of the
value type in the table above. In contrast, when using the priocntl()
PC_SETXPARMS command, the scheduling parameter is given as a direct
value.


A priocntl() PC_SETXPARMS command with the class name (IA) and
without a following (key, value) pair will set or reset all
interactive scheduling parameters of the target process(es) to their
default values. Changing the class of an LWP to interactive from
some other class causes the parameters to be set to their default
values. The default value for the user priority limit (IA_KY_UPRILIM)
is 0. The default value for the user priority (IA_KY_UPRI) is equal
to the user priority limit (IA_KY_UPRILIM) that is being set. The
default value for the interactive mode (IA_KY_MODE) is
IA_SET_INTERACTIVE.


The priocntl() command PC_SETXPARMS knows no special value
IA_NOCHANGE.


The interactive user priority and user priority limit are inherited
across fork and the exec family of functions.

FAIR-SHARE CLASS
The fair-share scheduling policy provides a fair allocation of CPU
resources among projects, independent of the number of processes they
contain. Projects are given "shares" to control their quota of CPU
resources. See FSS(4) for more information about how to configure
shares.


The fair share class supports the notion of per-LWP user priority
(see fss_upri below) values for compatibility with the time-sharing
scheduling class. An fss_upri value of 0 is defined as the default
base priority for the fair-share class. User priorities range from -x
to +x where the value of x is configurable and can be determined for
a specific installation by using the priocntl() PC_GETCID or
PC_GETCLINFO command.


The purpose of the user priority is to provide some degree of
user/application control over the scheduling of LWPs in the fair-
share class. Raising the fss_upri value of an LWP in the fair-share
class tells the scheduler to give this LWP more CPU time slices,
while lowering the fss_upri value tells the scheduler to give it less
CPU slices. It is not guaranteed, however, that an LWP with a higher
fss_upri value will run before one with a lower fss_upri value. This
is because the fss_upri value is just one factor used to determine
the scheduling priority of a fair-share LWP. The system can
dynamically adjust the internal scheduling priority of a fair-share
LWP based on other factors such as recent CPU usage. The fair-share
scheduler attempts to provide an evenly graded effect across the
whole range of user priority values.


User priority values do not interfere with project shares. That is,
changing a user priority value of a process does not have any effect
on its project CPU entitlement, which is based on the number of
shares it is allocated in comparison with other projects.


In addition to the system-wide limits on user priority (returned by
the PC_GETCID and PC_GETCLINFO commands), there is a per-LWP user
priority limit (see fss_uprilim below) that specifies the maximum
fss_upri value that can be set for a given LWP. By default,
fss_uprilim is 0.


A fssinfo_t structure with the following members, defined in
<sys/fsspriocntl.h>, defines the format used for the attribute data
for the fair-share class.

short fss_maxupri; /* Limits of user priority range */


The priocntl() PC_GETCID and PC_GETCLINFO commands return fair-share
class attributes in the pc_clinfo buffer in this format.


fss_maxupri specifies the configured maximum user priority value for
the fair-share class. If fss_maxupri is x, the valid range for both
user priorities and user priority limits is from -x to +x.


A fssparms_t structure with the following members, defined in
<sys/fsspriocntl.h>, defines the format used to specify the fair-
share class-specific scheduling parameters of an LWP.

short fss_uprilim; /* Fair-share user priority limit */
short fss_upri; /* Fair-share user priority */


When using the priocntl() PC_SETPARMS or PC_GETPARMS commands, if
pc_cid specifies the fair-share class, the data in the pc_clparms
buffer is in this format.


For the priocntl() PC_GETPARMS command, if pc_cid specifies the fair-
share class and more than one fair-share LWP is specified, the
scheduling parameters of the fair-share LWP with the highest fss_upri
value among the specified LWPs is returned and the LWP ID of this LWP
is returned by the priocntl() call. If there is more than one LWP
sharing the highest user priority, the one returned is
implementation-dependent.


Any fair-share LWP can lower its own fss_uprilim (or that of another
LWP with the same user ID). Only a fair-share LWP with sufficient
privileges can raise an fss_uprilim. When changing the class of an
LWP to fair-share from some other class, sufficient privileges are
required to enter the FSS class or to set the initial fss_uprilim to
a value greater than 0. Attempts by an unprivileged LWP to raise an
fss_uprilim or set an initial fss_uprilim greater than 0 fail with a
return value of -1 and errno set to EPERM.


Any fair-share LWP can set its own fss_upri (or that of another LWP
with the same user ID) to any value less than or equal to the LWP's
fss_uprilim. Attempts to set the fss_upri above the fss_uprilim
(and/or set the fss_uprilim below the fss_upri) result in the
fss_upri being set equal to the fss_uprilim.


Either of the fss_uprilim or fss_upri members can be set to the
special value FSS_NOCHANGE (defined in <sys/fsspriocntl.h>) to set
one of the values without affecting the other. Specifying
FSS_NOCHANGE for the fss_upri when the fss_uprilim is being set to a
value below the current fss_upri causes the fss_upri to be set equal
to the fss_uprilim being set. Specifying FSS_NOCHANGE for a parameter
when changing the class of an LWP to fair-share (from some other
class) causes the parameter to be set to a default value. The default
value for the fss_uprilim is 0 and the default for the fss_upri is to
set it equal to the fss_uprilim which is being set.


The fair-share user priority and user priority limit are inherited
across fork() and the exec family of functions.

FIXED-PRIORITY CLASS
The fixed-priority class provides a fixed-priority preemptive
scheduling policy for those LWPs requiring that the scheduling
priorities do not get dynamically adjusted by the system and that the
user/application have control of the scheduling priorities.


The fixed-priority class has a range of fixed-priority user priority
(see fx_upri below) values that can be assigned to LWPs within the
class. A fx_upri value of 0 is defined as the default base priority
for the fixed-priority class. User priorities range from 0 to x where
the value of x is configurable and can be determined for a specific
installation by using the priocntl() PC_GETCID or PC_GETCLINFO
command.


The purpose of the user priority is to provide user/application
control over the scheduling of processes in the fixed-priority class.
For processes in the fixed-priority class, the fx_upri value is, for
all practical purposes, equivalent to the scheduling priority of the
process. The fx_upri value completely determines the scheduling
priority of a fixed-priority process relative to other processes
within its class. Numerically higher fx_upri values represent higher
priorities.


In addition to the system-wide limits on user priority (returned by
the PC_GETCID and PC_GETCLINFO commands), there is a per-LWP user
priority limit (see fx_uprilim below) that specifies the maximum
fx_upri value that can be set for a given LWP. By default, fx_uprilim
is 0.


A structure with the following member (defined in <sys/fxpriocntl.h>)
defines the format used for the attribute data for the fixed-priority
class.

pri_t fx_maxupri; /* Maximum user priority */


The priocntl() PC_GETCID and PC_GETCLINFO commands return fixed-
priority class attributes in the pc_clinfo buffer in this format.


The fx_maxupri member specifies the configured maximum user priority
value for the fixed-priority class. If fx_maxupri is x, the valid
range for both user priorities and user priority limits is from 0 to
x.


A structure with the following members (defined in
<sys/fxpriocntl.h>) defines the format used to specify the fixed-
priority class-specific scheduling parameters of an LWP.

pri_t fx_upri; /* Fixed-priority user priority */
pri_t fx_uprilim; /* Fixed-priority user priority limit */
uint_t fx_tqsecs; /* seconds in time quantum */
int fx_tqnsecs; /* additional nanosecs in time quant */


When using the priocntl() PC_SETPARMS or PC_GETPARMS commands, if
pc_cid specifies the fixed-priority class, the data in the pc_clparms
buffer is in this format.


For the priocntl() PC_GETPARMS command, if pc_cid specifies the
fixed-priority class and more than one fixed-priority LWP is
specified, the scheduling parameters of the fixed-priority LWP with
the highest fx_upri value among the specified LWPs is returned and
the LWP ID of this LWP is returned by the priocntl() call. If there
is more than one LWP sharing the highest user priority, the one
returned is implementation-dependent.


Any fixed-priority LWP can lower its own fx_uprilim (or that of
another LWP with the same user ID). Only a fixed-priority LWP with
sufficient privileges can raise a fx_uprilim. When changing the class
of an LWP to fixed-priority from some other class, sufficient
privileges are required to set the initial fx_uprilim to a value
greater than 0. Attempts by an unprivileged LWP to raise a fx_uprilim
or set an initial fx_uprilim greater than 0 fail with a return value
of -1 and errno set to EPERM.


Any fixed-priority LWP can set its own fx_upri (or that of another
LWP with the same user ID) to any value less than or equal to the
LWP's fx_uprilim. Attempts to set the fx_upri above the fx_uprilim
(and/or set the fx_uprilim below the fx_upri) result in the fx_upri
being set equal to the fx_uprilim.


Either of the fx_uprilim or fx_upri members can be set to the special
value FX_NOCHANGE (defined in <sys/fxpriocntl.h>) to set one of the
values without affecting the other. Specifying FX_NOCHANGE for the
fx_upri when the fx_uprilim is being set to a value below the current
fx_upri causes the fx_upri to be set equal to the fx_uprilim being
set. Specifying FX_NOCHANGE for a parameter when changing the class
of an LWP to fixed-priority (from some other class) causes the
parameter to be set to a default value. The default value for the
fx_uprilim is 0 and the default for the fx_upri is to set it equal to
the fx_uprilim that is being set. The default for time quantum is
dependent on the fx_upri and on the system configuration; see
fx_dptbl(5).


The fx_tqsecs and fx_tqnsecs members are used for getting or setting
the time quantum associated with an LWP or group of LWPs. fx_tqsecs
is the number of seconds in the time quantum and fx_tqnsecs is the
number of additional nanoseconds in the quantum. For example, setting
fx_tqsecs to 2 and fx_tqnsecs to 500,000,000 (decimal) would result
in a time quantum of two and one-half seconds. Specifying a value of
1,000,000,000 or greater in the fx_tqnsecs member results in an error
return with errno set to EINVAL. Although the resolution of the
tq_nsecs member is very fine, the specified time quantum length is
rounded up by the system to the next integral multiple of the system
clock's resolution. The maximum time quantum that can be specified is
implementation-specific and equal to INT_MAX ticks (defined in
<limits.h>). Requesting a quantum greater than this maximum results
in an error return with errno set to ERANGE, although infinite
quantums can be requested using a special value as explained below.
Requesting a time quantum of 0 (setting both fx_tqsecs and fx_tqnsecs
to 0) results in an error return with errno set to EINVAL.


The fx_tqnsecs member can also be set to one of the following special
values (defined in <sys/fxpriocntl.h>), in which case the value of
fx_tqsecs is ignored:

FX_TQINF
Set an infinite time quantum.


FX_TQDEF
Set the time quantum to the default for this priority
(see fx_dptbl(5)).


FX_NOCHANGE
Do not set the time quantum. This value is useful in
changing the user priority of an LWP without affecting
the time quantum. Specifying this value when changing
the class of an LWP to fixed-priority from some other
class is equivalent to specifying FX_TQDEF.


When using the priocntl() PC_SETXPARMS or PC_GETXPARMS commands, the
first argument after the command code must be the class name of the
fixed-priority class (FX). The next arguments are formed as (key,
value) pairs, terminated by a 0 key. The definition for the keys of
the fixed-priority class can be found in <sys/fxpriocntl.h>. A
repeated specification of the same key results in an error return and
errno set to EINVAL.


+--------------+------------+-----------------------------+
| Key | Value Type | Description |
+--------------+------------+-----------------------------+
|FX_KY_UPRILIM | pri_t | user priority limit |
|FX_KY_UPRI | pri_t | user priority |
+--------------+------------+-----------------------------+
|FX_KY_TQSECS | uint_t | seconds in time quantum |
+--------------+------------+-----------------------------+
|FX_KY_TQNSECS | int | nanoseconds in time quantum |
+--------------+------------+-----------------------------+


When using the priocntl() PC_GETXPARMS command, the value associated
with the key is always a pointer to a scheduling parameter of the
value type shown in the table above. In contrast, when using the
priocntl() PC_SETXPARMS command, the scheduling parameter is given as
a direct value.


A priocntl() PC_SETXPARMS command with the class name (FX) and
without a following (key, value) pair will set or reset all realtime
scheduling parameters of the target process(es) to their default
values. Changing the class of an LWP to fixed-priority from some
other class causes the parameters to be set to their default values.
The default value for the user priority limit (FX_KY_UPRILIM) is 0.
The default value for the user priority (FX_KY_UPRI) is equal to the
user priority limit (FX_KY_UPRILIM) that is being set. A default time
quantum (FX_TQDEF) is assigned to each priority class (see
fx_dptbl(5)).


The value associated with FX_KY_TQSECS is the number of seconds in
the time quantum. The value associated with FX_KY_TQNSECS is the
number of nanoseconds in the quantum. Specifying a value of
1,000,000,000 or greater for the number of nanoseconds results in an
error return and errno is set to EINVAL. The specified time quantum
is rounded up by the system to the next integral multiple of the
system clock's resolution. The maximum time quantum that can be
specified is implementation-specific and equal to INT_MAX ticks,
defined in <limits.h>. Requesting a quantum greater than this maximum
results in an error return and errno is set to ERANGE. If seconds
(FX_KY_TQSECS) but no nanoseconds (FX_KY_TQNSECS) are supplied, the
number of nanoseconds is set to 0. If nanoseconds (FX_KY_TQNSECS) but
no seconds (FX_KY_TQSECS) are supplied, the number of seconds is set
to 0. A time quantum of 0 (seconds and nanoseconds are 0) results in
an error return with errno set to EINVAL. Special values for
FX_KY_TQSECS are FX_TQINF and FX_TQDEF (as described above). The
priocntl() command PC_SETXPARMS knows no special value FX_NOCHANGE.


The fixed-priority user priority and user priority limit are
inherited across fork(2) and the exec family of functions.

RETURN VALUES


Unless otherwise noted above, priocntl() returns 0 on success. On
failure, priocntl() returns -1 and sets errno to indicate the error.

ERRORS


The priocntl() function will fail if:

EAGAIN
An attempt to change the class of an LWP failed because of
insufficient resources other than memory (for example,
class-specific kernel data structures).


EFAULT
One of the arguments points to an illegal address.


EINVAL
The argument cmd was invalid, an invalid or unconfigured
class was specified, or one of the parameters specified was
invalid.


ENOMEM
An attempt to change the class of an LWP failed because of
insufficient memory.


EPERM
The {PRIV_PROC_PRIOCNTL} privilege is not asserted in the
effective set of the calling LWP.

The calling LWP does not have sufficient privileges to
affect the target LWP.


ERANGE
The requested time quantum is out of range.


ESRCH
None of the specified LWPs exist.


SEE ALSO


priocntl(1), exec(2), fork(2), nice(2), priocntlset(2), fx_dptbl(5),
process(5), rt_dptbl(5), privileges(7), dispadmin(8), init(8)


System Administration Guide: Basic Administration


Programming Interfaces Guide

February 17, 2023 PRIOCNTL(2)

tribblix@gmail.com :: GitHub :: Privacy