MT-STREAMS(9F)          Kernel Functions for Drivers          MT-STREAMS(9F)
NAME
       mt-streams - STREAMS multithreading
SYNOPSIS
       #include <sys/conf.h>
INTERFACE LEVEL
       illumos DDI specific (illumos DDI).
DESCRIPTION
       STREAMS drivers configure the degree of concurrency using the 
cb_flag       field in the 
cb_ops structure (see 
cb_ops(9S)). The corresponding
       field for 
STREAMS modules is the 
f_flag in the 
fmodsw structure.
       For the purpose of restricting and controlling the concurrency in
       drivers/modules, we define the concepts of 
inner and 
outer       perimeters. A driver/module can be configured either to have no
       perimeters, to have only an inner or an outer perimeter, or to have
       both an inner and an outer perimeter. Each perimeter acts as a
       readers-writers lock, that is, there can be multiple concurrent
       readers or a single writer. Thus, each perimeter can be entered in
       two modes: shared (reader) or exclusive (writer). The mode depends on
       the perimeter configuration and can be different for the different       
STREAMS entry points ( 
open(9E), 
close(9E), 
put(9E), or 
srv(9E)).
       The concurrency for the different entry points is (unless specified
       otherwise) to enter with exclusive access at the inner perimeter (if
       present) and shared access at the outer perimeter (if present).
       The perimeter configuration consists of flags that define the
       presence and scope of the inner perimeter, the presence of the outer
       perimeter (which can only have one scope), and flags that modify the
       default concurrency for the different entry points.
       All MT safe modules/drivers specify the 
D_MP flag.
   Inner Perimeter Flags
       The inner perimeter presence and scope are controlled by the mutually
       exclusive flags:       
D_MTPERQ                            The module/driver has an inner perimeter around
                            each queue.       
D_MTQPAIR                            The module/driver has an inner perimeter around
                            each read/write pair of queues.       
D_MTPERMOD                            The module/driver has an inner perimeter that
                            encloses all the module's/driver's queues.       
None of the above                            The module/driver has no inner perimeter.
   Outer Perimeter Flags
       The outer perimeter presence is configured using:       
D_MTOUTPERIM                       In addition to any inner perimeter, the module/driver
                       has an outer perimeter that encloses all the
                       module's/driver's queues. This can be combined with
                       all the inner perimeter options except 
D_MTPERMOD.       Note that acquiring exclusive access at the outer perimeter (that is,
       using 
qwriter(9F) with the 
PERIM_OUTER flag) can incur significant
       performance penalties, which grow linearly with the number of open
       instances of the module or driver in the system.
       The default concurrency can be modified using:       
D_MTPUTSHARED                        This flag modifies the default behavior when 
put(9E)                        procedure are invoked so that the inner perimeter is
                        entered shared instead of exclusively.       
D_MTOCEXCL                        This flag modifies the default behavior when                        
open(9E) and 
close(9E) procedures are invoked so the
                        outer perimeter is entered exclusively instead of
                        shared.
                        Note that drivers and modules using this flag can
                        cause significant system performance degradation
                        during stream open or close when many instances of
                        the driver or module are in use simultaneously. For
                        this reason, use of this flag is discouraged.
                        Instead, since 
open(9E) and 
close(9E) both execute
                        with user context, developers are encouraged to use
                        traditional synchronization routines such as                        
cv_wait_sig(9F) to coordinate with other open
                        instances of the module or driver.
       The module/driver can use 
qwait(9F) or 
qwait_sig() in the 
open(9E)       and 
close(9E) procedures if it needs to wait "outside" the
       perimeters.
       The module/driver can use 
qwriter(9F) to upgrade the access at the
       inner or outer perimeter from shared to exclusive.
       The use and semantics of 
qprocson() and 
qprocsoff(9F) is independent
       of the inner and outer perimeters.
SEE ALSO
       close(9E), 
open(9E), 
put(9E), 
srv(9E), 
qprocsoff(9F), 
qprocson(9F),       
qwait(9F), 
qwriter(9F), 
cb_ops(9S)       STREAMS Programming Guide       Writing Device Drivers                                 May 5, 2009                  MT-STREAMS(9F)