vdev shmem

Updated: October 28, 2024

Provide an inter-guest system shared memory device

Synopsis:

vdev shmem options

Options:

allow fnpattern
Allow the guest to create or attach to any shared memory region whose name matches the specified filename pattern (fnpattern).
In this string argument, you can use the same wildcards as the shell uses for filename expansion, including asterisks (*). You can repeat this option as much as necessary to grant the guest access to shared memory.
If you use this option at all, the configuration will include an implicit deny * at the end of the restrictions list, and the guest will be denied access to all shared memory regions not specified by this list. For example:
vdev shmem
    allow test*
    allow pluto
grants the guest access to any shared memory region whose name begins with test and to the region called pluto. The guest is denied access to all other regions.
These semantics mean you need to use one (but not both) of the allow or deny options. For further discussion, see Restrictions list below.
create name,size
Pre-create a shared memory object named name of size bytes.
You can repeat the create option to pre-create multiple shared memory regions.
deny fnpattern
Deny the guest access to any shared memory region whose name matches the specified filename pattern (fnpattern).
In this string argument, you can use the same wildcards as the shell uses for filename expansion, including asterisks (*). You can repeat this option as much as necessary to restrict the guest's access to shared memory.
If you use this option at all, the configuration will include an implicit allow * at the end of the restrictions list, and the guest will be granted access to all shared memory regions not specified by this list. For example:
vdev shmem
    deny live*
    deny pluto
denies the guest access to any shared memory region whose name begins with live and to the region called pluto. The guest can access any other shared memory region, however.
These semantics mean you need to use one (but not both) of the allow or deny options. For further discussion, see Restrictions list below.
Alternatively, after using create directives to pre-create specific named shared memory regions, you can use a deny * directive to deny access to all other regions.
intr intr
If the loc option is specified, you must also specify the value of intr; this sets the guest interrupt that is generated when another guest sends a notification of an update to shared memory.
loc [addr]
The base address of the factory page for the vdev. If addr isn't specified, the vdev appears as a PCI device, and the qvm process automatically assigns the factory page location and adds this location to the PCI BAR register.
If you specify this option, you must also specify the intr option (see above).
sched priority
Use the priority specified by priority for pulses indicating that input is available.
subst [match],prefix
Specify a prefix to add to shared memory region names (see Using the subst option below).
match
The character string in the shared memory region name to substitute, if found, by the character string specified by prefix.
prefix
The character string to substitute for the character string specified by match, or to simply prefix to the shared region name if match isn't specified.

For a list of options available to all vdevs, see Common vdev options at the beginning of this chapter.

Description:

ARM and x86. The shmem vdev allows you to share memory between guests. Normally this device appears as a PCI device, but if the loc and intr options are specified, the guest running in the associated VM will see this device as a memory-mapped I/O (MMIO) device at the specified location.

CAUTION:
If a guest uses the shmem vdev without considering how much memory the host has available, any memory allocation by the guest will fail when its memory usage exceeds the host's RLIMIT_AS setting specified for the underlying qvm process. For more information, see Memory in the “Understanding Virtual Environments” chapter.

Restrictions list

You can use the allow and deny options to define lists of shared memory regions that the guest may or may not access. By limiting access to shared memory and, hence, allocations of shared memory, these options help prevent denial-of-service attacks.

You can repeat either of these options multiple times to specify whatever filename patterns you need to manage the guest's access to shared memory regions. When specifying filename patterns, you can include wildcard characters such as the asterisk (*) to indicate multiple shared memory regions for convenience. We recommend defining either an allow or a deny policy for every named region used by the VM, including when using wildcard naming.

Note: If you use the command line to enter vdev shmem configuration information that includes allow or deny options with wildcard entries, you must use the “\” escape character before the asterisk to get the instruction through the shell (e.g., vdev shmem allow test\*).

For more information about using the shared memory vdev, see Memory sharing in the “Using a QNX Hypervisor System” chapter.

Using the subst option

You can use the subst option to present the host with different names for shared memory regions for each guest, while presenting the same name to each guest so you can use the same executables in the different guests. For example, each guest might see a shared memory region called foomem, but the host would see these regions as guest0mem, guest1mem, etc.

The following VM configurations produce the result presented above by substituting guest* for foo:

VM 0
vdev shmem
    subst foo,guest0
    create foomem,0xf0000
    ...
VM 1
vdev shmem
    subst foo,guest1
    ...

An equivalent result can be achieved by simply adding the guest* prefix, as follows:

VM 0
vdev shmem
    subst ,guest0
    create mem,0xf0000
    ...
VM 1
vdev shmem
    subst ,guest1
    ...
Note: