| cmd | The following commands
can be passed in: VM_PA_SET_PSIZE or VM_PA_GET_PSIZEThese commands set or retrieve the page size used for a specified
memory range.VM_PA_GET_RMUSAGEThis command retrieves the amount of the real memory in bytes
being used for a specified memory range.VM_PA_SET_PSPA or VM_PA_GET_PSPAThese commands set or retrieve the page size promotion aggressiveness
factor for a specified memory range.VM_PA_GET_PSPA_ALIGNThis command retrieves the minimum memory alignment necessary
for memory ranges specified to the vm_pattr kernel service
when using the VM_PA_SET_PSPA command.VM_PA_CHECK_PSIZEThis command reports if a specified page size can be used for
a memory range.VM_PA_SET_LSA_POLICYThis command allows the shared memory address space allocator
to be tuned according to a process requirements. This command should
be run before any shared memory regions are created.VM_PA_SET_PSIZE_EXTENDED or VM_PA_GET_PSIZE_EXTENDEDThese commands provide variable large page size segment 	support.
 | 
| pid | Specifies the ID of the
process whose memory attributes are to be queried or modified. A value
of -1 specifies the calling process. The root user can specify any
process ID, but other users can only specify processes they own (that
is, the target process's user ID must match the calling process's
user ID). The vm_pattr system call is only supported on
user processes while the kvm_pattr kernel service can target
user processes or its own kernel process (for example, pid =
-1). | 
| attr | A pointer to a structure
describing the effective address range for the memory being queried
or modified and additional data depending on the command. The range
is specified through the following vm_pa_range  structure:   struct vm_pa_range
              {
                     ptr64_t  rng_start;
                     size64_t rng_size;
              };
 
The range specified must be in the target
process's address space and must correspond to one of these process
areas:  Main program data (initialized, bss, or heap).Shared library data or private module load area data.Privately loaded text.Initial thread stack area.Anonymous shared memory (System V shared memory, extended System
V shared through EXTSHM, and POSIX real-time shared memory). The target
process must have write access to the memory in order to change the
attributes of the shared memory range.Anonymous mmap memory.
 
If the memory range specified includes shared memory or mmap
memory, the calling process must have write access to the memory according
to the shared memory descriptor or mapping attributes in order to
change the attributes of the range. The range can have additional
restrictions based on the following commands.The structure
specified through the attr  parameter must be a pointer to one
of the following structures:  VM_PA_SET_PSIZE or VM_PA_GET_PSIZEThese commands take a pointer to the following structure: For the VM_PA_SET_PSIZE command,
the pa_psize parameter is the page size (in bytes) to use for
the given range. This is an advisory setting that might or might not
be used at the operating system's discretion. This must be a valid
page size between the minimum and maximum page sizes of all segments
in the range. Additionally, the range must start and end on a multiple
of the specified page size. If an error occurs during the processing
of this command, any successfully altered page size settings can remain
set.struct vm_pa_psize
              {
                     struct vm_pa_range pa_range;
                     psize_t            pa_psize;
              };
 For the VM_PA_GET_PSIZE command, the page size (in
bytes) backing the specified memory range is returned in the pa_psize parameter.
The range must start and end on a multiple of the smallest page size
supported as reported by the sysconf(_SC_PAGE_SIZE) subroutine.
If the range is using multiple page sizes, the smallest page size
in the range is reported. Unlike the VM_PAGE_INFO command of
the vmgetinfo subroutine that reports the segment's base page
size, the page size reported by the VM_PA_GET_PSIZE command
is the actual page size being used at the time the vm_pattr system
call was called. The page size reported is transient because the operating
system can change the backing page size at any time. Therefore, the
page size reported must be for informational purposes only.VM_PA_SET_PSIZE_EXTENDEDThis command takes a pointer to the following structure:struct vm_pa_psize_extended
				{
					struct vm_pa_range   pa_range;
					psize_t              pa_psize;
					size_t               pa_info_size;
					uint64_t            *pa_info;
				}
 This command is essentially the same as VM_PA_SET_PSIZE except
that pa_psize must be 16 MB and, if not NULL, pa_info can
be used to pass additional information specifying one or more affinity
domains. The info passed by the parameter is advisory request,
and the system might choose to ignore it. The pa_range is
scanned for subregions that begin and end on a 16 MB boundary, are
fully backed with 4 KB or 64 KB  pages, and have uniform page attributes.
The page attributes include read or write page protection, storage
key protection, and  no-execute protection. The data in qualifying
16 MB subregions is colocated to	a 16 MB contiguous block of physical
memory, and it uses 16 MB hardware translations. If the pa_info pointer
is NULL, the memory for collocation is allocated from any memory SRAD,
affinity domain chosen by the operating system. If parameter
value is not NULL, pa_info must point to an rsethandle_t that
	describes a set of affinity domains from which the physical memory
for the collocation must be allocated. The object should be allocated
by a call to rs_alloc (RS_EMPTY). It must then be initialized
with one rs_op(RS_ADDRESOURCE, ..., R_MEMPS, srad#) call per
affinity domain being requested. This command can potentially
affect system performance and is not generally recommended; therefore,
this command requires you to have either the CAP_BYPASS_RAC_VMM and
CAP_PROPAGATE 	capabilities or root authority.VM_PA_GET_PSIZE_EXTENDEDThis command is essentially the same as the VM_PA_GET_PSIZE  command	except
that it can also return the 64 KB and 16 MB subregions that are using
an hardware translation page size different from the underlying segments
default page size.
If the pa_info field is NULL, this command
is identical 	to the VM_PA_GET_PSIZE command. The pa_info field
should point to an array containing two 64 bit integers. The pa_info_size field
should be set to the size of the array. In the first 64-bit
integer, this command reports the number of 64-KB sized and aligned
subregions in the specified pa_range  range that consist of
16 contiguous 4-KB pages 	that are promoted to using a 64-KB page
size hardware translation. In the second 64-bit integer, this command
reports the number of 16 MB sized and aligned subregions in the specified
range that consist of either 4096 4 KB or 256 64-KB contiguous pages
that are promoted to using a 16-MB page size hardware translation. The pa_psize field
reports the smallest page size found for the specified range. The
information reported is transient because the operating system can
change the backing page size at any time. Therefore,	the page size
reported must be for informational purposes only. | 
| attr (continued) |  VM_PA_GET_RMUSAGEThis command takes a pointer to the following structure: This command reports the amount of real
memory (in bytes) used for the given range in the pa_rbytes field.
This can help an application decide whether it needs to use a large
page size for a specific range based on how much real memory the range
is using. For example, if a 64KB range is only using 4KB of real memory,
then it does not make sense to try to use a 64KB page size for that
range. But if it is using all 64KB or some large percentage of it,
then the application might decide to use a 64KB page size. The range
specified for this command has no alignment requirements for this
command, and the command includes only those bytes in the range that
are using real memory.struct vm_pa_rmusage
              {
                     struct vm_pa_range pa_range;
                     size64_t           pa_rbytes;
              };
VM_PA_SET_PSPA or VM_PA_GET_PSPAThese commands take a pointer to the following structure: The VM_PA_SET_PSPA command can
set the page size promotion aggressiveness for the specified range.
The pa_pspa setting is in the same units as the vmm_default_pspa
vmo tunable. This setting is the inverse of the real memory occupancy
threshold needed to promote to a large page size and ranges from -1
to 100. The value of -1 indicates that no page promotion can occur
regardless of the occupancy of the memory range. A value of 0 indicates
a page size promotion can only be done when the memory range is fully
occupied. A value of 100 indicates a page promotion must be done at
the first reference to the memory range.struct vm_pa_pspa
              {
                     struct vm_pa_range pa_range;
                     int    pa_pspa;
              };
 This setting is only supported
at a segment granularity, so the range must start and end on a segment
boundary. The alignment requirement for the range can be found using
the VM_PA_GET_PSPA_ALIGN command with the vm_pattr system
call. If an error occurs during the processing of the VM_PA_SET_PSPA command,
the vm_pattr system call can return after altering the page
size promotion thresholds for part of the specified range. The VM_PA_GET_PSPA command
retrieves the page size promotion aggressiveness factor for the specified
range. If the range spans multiple segments consisting of different
page promotion thresholds, the pa_pspa field is updated with
the least aggressive PSPA setting (the smallest PSPA setting across
all of the segments). The PSPA commands are not supported on
mmap or EXTSHM memory ranges.
 | 
| attr (continued) |  VM_PA_GET_PSPA_ALIGNThis command takes a pointer to the following structure: The VM_PA_GET_PSPA_ALIGN command
returns the minimum memory alignment requirements of a memory range
for the VM_PA_SET_PSPA command in the pa_pspa_align field
based on what segments are contained in the specified memory range.
If a memory range spans segments with different alignment requirements,
this command returns the largest of the alignment requirements. struct vm_pa_pspa_align
              {
                     struct vm_pa_range pa_range;
                     size64_t pa_pspa_align;
              };
 The
alignment requirements for the VM_PA_SET_PSPA command are as
follows:
 | 
| attr (continued) |  VM_PA_SET_LSA_POLICYThis command takes a pointer to the following structure: The following settings are allowed:struct vm_pa_lsa_options
 {
 u_int64_t setting;
 size64_t value;
 };
 VM_PA_SHM_1TB_SHAREDThis setting controls the threshold of the number of 256 MB segments
required before a SHM object is considered big enough to be placed
in its own 1 TB region to be promoted to the large alias segments.
 Values can range from 0 to 4 KB.VM_PA_SHM_1TB_UNSHAREDThis setting controls the threshold of the number of 256 MB segments
required before a group of SHM object packed in a 1 TB aligned group
is promoted to the large alias segments.  Values can range from 0
to 4 KB.
 Process's Memory Area Minimum Alignment  Main
process data 256 MB Process stack 256 MB Shared Library
data 256 MB  Privately loaded module data 256 MB Privately
loaded module text 256 MB  POSIX Real-Time Shared Memory 256
MB Anonymous MMAP 256 MB Anonymous Extended System V Shared
memory 256 MB Anonymous System V Shared memory with page sizes
less than or equal to 256 MB 256 MB Anonymous System V shared
memory backed with 16 GB page size 1 TB | 
|  | VM_PA_CHECK_PSIZEThis command takes a pointer to the following structure: The VM_PA_CHECK_PSIZE command
determines if a specific page size is allowed by the VM_PA_SET_PSIZE command
for a specified memory range. The VM_PA_CHECK_PSIZE command
can be used when the application wants more detailed information about
why a VM_PA_SET_PSIZE operation fails, or to check if a VM_PA_SET_PSIZE operation
will successfully modify the page size for the range specified.struct vm_pa_psize_check
              {
                     struct vm_pa_range pa_range;
                     psize_t            pa_psize;
                     int                pa_reason;
              };
 This
command must be used on a memory range that spans a single page and
is aligned to the page size specified by the pa_psize parameter.
If the page size can be used for that range, the pa_reason parameter
is set to 0. Otherwise, it is set to a reason code defined in the vmpattr.h header
file.
 VMPATTR_SET_PSIZE_VALID The specified page
size can be used for the specified range. VMPATTR_INVALID_MPSS_PSIZE The
specified page size is not supported in mixed page size segments. VMPATTR_NON_MPSS_SEGMENT 
The address range specified is from a segment that does not support
mixed page sizes. VMPATTR_NON_MPSS_PAGE  The size of
the target page cannot be modified. For example, this reason code
can be returned when trying to set an address range to a 64 KB page
size if a portion of the range has page protection settings that do
not match the rest of the range. VMPATTR_RDONLY_MEM The
target range cannot be modified because the caller does not have write
access to the memory specified. VMPATTR_PAGE_ATTRIBUTES The
address range specified does not have  uniform page attributes. VMPATTR_NOT_FULLY_POPULATED The address range
specified does not fully reside in memory. VMPATTR_PHYSICAL_ATTACHMENTS The
address range specified has memory affinity attachments that specify
more than one						 affinity domain. VMPATTR_MEMORY_TYPE_UNSUPPORTED The
address range contains a memory object that does not support the requested
page size in                                                  a mixed
page size segment. | 
| attr_size | The attr_size parameter
must be the size of the structure needed, or greater for the specified
command. |