MEMCNTL(2)                      System Calls                      MEMCNTL(2)
NAME
     memcntl - memory management control
SYNOPSIS
     #include <sys/types.h>     #include <sys/mman.h>     int     memcntl(
void *addr, 
size_t len, 
int cmd, 
void *arg, 
int attr,         
int mask);
DESCRIPTION
     The 
memcntl() function allows the calling process to apply a variety of
     control operations over the address space identified by the mappings
     established for the address range [ 
addr, 
addr + 
len ).
     The 
addr argument must be a multiple of the pagesize as returned by     
sysconf(3C).  The scope of the control operations can be further
     defined with additional selection criteria (in the form of attributes)
     according to the bit pattern contained in 
attr.
     The following attributes specify page mapping selection criteria:
           MEMCNTL_SHARED
                   Page is mapped shared.
           MEMCNTL_PRIVATE
                   Page is mapped private.
     The following attributes specify page protection selection criteria.
     The selection criteria are constructed by a bitwise OR operation on the
     attribute bits and must match exactly.
           PROT_READ
                   Page can be read.
           PROT_WRITE
                   Page can be written.
           PROT_EXEC
                   Page can be executed.
     The following criteria may also be specified:
           PROC_TEXT
                   Process text.
           PROC_DATA
                   Process data.
     The PROC_TEXT attribute specifies all privately mapped segments with
     read and execute permission, and the PROC_DATA attribute specifies all
     privately mapped segments with write permission.
     Selection criteria can be used to describe various abstract memory
     objects within the address space on which to operate.  If an operation
     shall not be constrained by the selection criteria, 
attr must have the
     value 
0.
     The operation to be performed is identified by the argument 
cmd.  The
     symbolic names for the operations are defined in <
sys/mman.h> as
     follows:
           MC_LOCK
                   Lock in memory all pages in the range with attributes                   
attr.  A given page may be locked multiple times through
                   different mappings; however, within a given mapping, page
                   locks do not nest.  Multiple lock operations on the same
                   address in the same process will all be removed with a
                   single unlock operation.  A page locked in one process
                   and mapped in another (or visible through a different
                   mapping in the locking process) is locked in memory as
                   long as the locking process does neither an implicit nor
                   explicit unlock operation.  If a locked mapping is
                   removed, or a page is deleted through file removal or
                   truncation, an unlock operation is implicitly performed.
                   If a writable MAP_PRIVATE page in the address range is
                   changed, the lock will be transferred to the private
                   page.
                   The 
arg argument is not used, but must be NULL to ensure
                   compatibility with potential future enhancements.
           MC_LOCKAS
                   Lock in memory all pages mapped by the address space with
                   attributes 
attr.  The 
addr and 
len arguments are not
                   used, but must be NULL and 
0 respectively, to ensure
                   compatibility with potential future enhancements.  The                   
arg argument is a bit pattern built from the flags:
                   MCL_CURRENT
                           Lock current mappings.
                   MCL_FUTURE
                           Lock future mappings.
                   The value of 
arg determines whether the pages to be
                   locked are those currently mapped by the address space,
                   those that will be mapped in the future, or both.  If
                   MCL_FUTURE is specified, then all mappings subsequently
                   added to the address space will be locked, provided
                   sufficient memory is available.
           MC_SYNC
                   Write to their backing storage locations all modified
                   pages in the range with attributes 
attr.  Optionally,
                   invalidate cache copies.  The backing storage for a
                   modified MAP_SHARED mapping is the file the page is
                   mapped to; the backing storage for a modified MAP_PRIVATE
                   mapping is its swap area.  The 
arg argument is a bit
                   pattern built from the flags used to control the behavior
                   of the operation:
                   MS_ASYNC
                           Perform asynchronous writes.  The function
                           returns immediately once all write operations are
                           scheduled (unless MS_SYNC is also specified).
                   MS_SYNC
                           Perform synchronous writes.  The function will
                           not return until all write operations are
                           completed.
                   MS_INVALIDATE
                           Invalidate all cached copies of data in memory,
                           so that further references to the pages will be
                           obtained by the system from their backing storage
                           locations.  This operation should be used by
                           applications that require a memory object to be
                           in a known state.
           MC_UNLOCK
                   Unlock all pages in the range with attributes 
attr.  The                   
arg argument is not used, but must be NULL to ensure
                   compatibility with potential future enhancements.
           MC_UNLOCKAS
                   Remove address space memory locks and locks on all pages
                   in the address space with attributes 
attr.  The 
addr,                   
len, and 
arg arguments are not used, but must be NULL, 0,
                   and NULL, respectively, to ensure compatibility with
                   potential future enhancements.
           MC_HAT_ADVISE
                   Advise system how a region of user-mapped memory will be
                   accessed.  The 
arg argument is interpreted as a "
struct                   memcntl_mha *".  The following members are defined in a                   
struct memcntl_mha:
                         uint_t mha_cmd;
                         uint_t mha_flags;
                         size_t mha_pagesize;
                   The accepted values for 
mha_cmd are:
                         MHA_MAPSIZE_VA
                         MHA_MAPSIZE_STACK
                         MHA_MAPSIZE_BSSBRK
                   The 
mha_flags member is reserved for future use and must
                   always be set to 0.  The 
mha_pagesize member must be a
                   valid size as obtained from 
getpagesizes(3C) or the
                   constant value 0 to allow the system to choose an
                   appropriate hardware address translation mapping size.
                   MHA_MAPSIZE_VA sets the preferred hardware address
                   translation mapping size of the region of memory from                   
addr to 
addr + 
len.  Both 
addr and 
len must be aligned to
                   an 
mha_pagesize boundary.  The entire virtual address
                   region from 
addr to 
addr + 
len must not have any holes.
                   Permissions within each 
mha_pagesize-aligned portion of
                   the region must be consistent.  When a size of 0 is
                   specified, the system selects an appropriate size based
                   on the size and alignment of the memory region, type of
                   processor, and other considerations.
                   MHA_MAPSIZE_STACK sets the preferred hardware address
                   translation mapping size of the process main thread stack
                   segment.  The 
addr and 
len arguments must be NULL and 0,
                   respectively.
                   MHA_MAPSIZE_BSSBRK sets the preferred hardware address
                   translation mapping size of the process heap.  The 
addr                   and 
len arguments must be NULL and 0, respectively.  See
                   the NOTES section of the 
ppgsz(1) manual page for
                   additional information on process heap alignment.
                   The 
attr argument must be 0 for all MC_HAT_ADVISE
                   operations.
     The 
mask argument must be 0; it is reserved for future use.
     Locks established with the lock operations are not inherited by a child
     process after 
fork(2).  The 
memcntl() function fails if it attempts to
     lock more memory than a system-specific limit.
     Due to the potential impact on system resources, the operations
     MC_LOCKAS, MC_LOCK, MC_UNLOCKAS, and MC_UNLOCK are restricted to
     privileged processes.
USAGE
     The 
memcntl() function subsumes the operations of 
plock(3C).
     MC_HAT_ADVISE is intended to improve performance of applications that
     use large amounts of memory on processors that support multiple
     hardware address translation mapping sizes; however, it should be used
     with care.  Not all processors support all sizes with equal efficiency.
     Use of larger sizes may also introduce extra overhead that could reduce
     performance or available memory.  Using large sizes for one application
     may reduce available resources for other applications and result in
     slower system wide performance.
RETURN VALUES
     Upon successful completion, 
memcntl() returns 
0.  Otherwise, it returns     
-1 and sets 
errno to indicate an error.
ERRORS
     The 
memcntl() function will fail if:
     EAGAIN             When the selection criteria match, some or all of
                        the memory identified by the operation could not be
                        locked when MC_LOCK or MC_LOCKAS was specified, some
                        or all mappings in the address range [
addr, 
addr +                        
len) are locked for I/O when MC_HAT_ADVISE was
                        specified, or the system has insufficient resources
                        when MC_HAT_ADVISE was specified.
                        The 
cmd is MC_LOCK or MC_LOCKAS and locking the
                        memory identified by this operation would exceed a
                        limit or resource control on locked memory.
     EBUSY              When the selection criteria match, some or all of
                        the addresses in the range [
addr, 
addr + 
len) are
                        locked and MC_SYNC with the MS_INVALIDATE option was
                        specified.
     EINVAL             The 
addr argument specifies invalid selection
                        criteria or is not a multiple of the page size as
                        returned by 
sysconf(3C); the 
addr and/or 
len                        argument does not have the value 0 when MC_LOCKAS or
                        MC_UNLOCKAS is specified; the 
arg argument is not
                        valid for the function specified; 
mha_pagesize or                        
mha_cmd is invalid; or MC_HAT_ADVISE is specified
                        and not all pages in the specified region have the
                        same access permissions within the given size
                        boundaries.
     ENOMEM             When the selection criteria match, some or all of
                        the addresses in the range [
addr, 
addr + 
len) are
                        invalid for the address space of a process or
                        specify one or more pages which are not mapped.
     EPERM              The {PRIV_PROC_LOCK_MEMORY} privilege is not
                        asserted in the effective set of the calling process
                        and MC_LOCK, MC_LOCKAS, MC_UNLOCK, or MC_UNLOCKAS
                        was specified.
MT-LEVEL     MT-SafeSEE ALSO
     ppgsz(1), 
fork(2), 
mmap(2), 
mprotect(2), 
getpagesizes(3C), 
mlock(3C),     
mlockall(3C), 
msync(3C), 
plock(3C), 
sysconf(3C), 
attributes(7),     
privileges(7)illumos                        March 13, 2022                        illumos