nvme
— Intel NVMe
compliant storage driver
The nvme
driver uses the
blkdev(4D) framework to provide
access to NVMe compliant solid-state storage devices. All NVMe version 1.x
and 2.X devices are supported.
NVMe devices supporting multiple namespaces will present each
namespace as its own blkdev(4D)
instance in the system.
The nvme
driver can be configured by
defining properties in the nvme.conf file. The
parameters are considered an unstable interface, subject to change without
notice. The following properties are currently supported:
- strict-version
- This can be set to 0 to allow
nvme
to attach to
devices supporting newer version of the NVMe specification. The default
value is 1, limiting nvme
to work with devices
that support major version 1 or 2.
- ignore-unknown-vendor-status
- This can be set to 1 to allow
nvme
to continue
operating even if it receives an unknown vendor command status.
- admin-queue-len
- This is the number of entries in the admin command queue. Legal values are
between 16 and 4096, the default value is 256.
- io-squeue-len
- This is the number of entries in each I/O submission queue. Legal values
are between 16 and 65536, the default value is 1024.
- io-cqueue-len
- This is the number of entries in each I/O completion queue. Legal values
are between 16 and 65536, the default value is 2048. When the number of
submission and completion queues are the same, the queue lengths will be
both set to the lesser of io-squeue-len and
io-cqueue-len.
- async-event-limit
- This is the maximum number of asynchronous event requests issued by the
driver. Asynchronous events are used to report error conditions. The
driver will never use more asynchronous events than this value, or what
the hardware supports if it is less, or 1/10th of the admin queue length
if it is less.
- volatile-write-cache-enable
- This property can be set to 0 to disable the volatile write cache, if the
hardware supports it. The default setting is 1, which enables the volatile
write cache.
- min-phys-block-size
- This is the minimum physical block size that is reported to
blkdev(4D). This value must be a
power of 2 greater than or equal to 512. If the device reports a best
block size larger than what is specified here the driver will ignore the
value specified here.
- max-submission-queues
- This is the maximum number of submission queues the driver will create per
device. Legal values are between 1 and 65535, the default is to match the
number for max-completion-queues. The number of queues
created will not be allowed to exceed the drive's hardware limitation. If
the number of submission queues is larger than
max-completion-queues the completion queues will be
shared across the submission queues.
- max-completion-queues
- This is the maximum number of completion queues the driver will create per
device. Legal values are between 1 and 65535, the default is to match the
number of interrupt vectors allocated to the drive. The number of queues
created will not exceed the number of interrupt vectors,
max-submission-queues, or the drive's hardware
limitation.
In addition to the above properties, some device-specific tunables
can be configured in nvme.conf using the
nvme-config-list global property. The value of this
property is a list of triplets. The formal syntax is:
nvme-config-list |
::= <triplet> [, <triplet>]* ; |
<triplet> |
::= "<model>" , "<rev-list>" ,
"<tuple-list>" |
<rev-list> |
::= [<fwrev> [, <fwrev>]*] |
<tuple-list> |
::= <tunable> [, <tunable>]* |
<tunable> |
::= "<name>" : "<value>" |
The <model> and
<fwrev> are the strings that are returned in the
"Model Number" and "Firmware Revision" fields,
respectively, in the "Identify Controller" data structure as
returned by the "IDENTIFY" command. Specifying a
<rev-list> is optional, an empty string
("") may be used instead.
The <tuple-list> contains one or more
tunables to apply to all controllers that match the specified model number
and optional firmware revisions. Each <tunable>
is a <name> :
<value> pair. Supported tunable names are:
- ignore-unknown-vendor-status
- Similar to the global property, this property accepts a boolean value
specified as either "on", "off", "true", or
"false" to enable or disable the driver continuing operation
even if it receives an unknown vendor command status from a
controller.
- min-phys-block-size
- Same as the global property, this is the minimum physical block size that
is reported to blkdev(4D). This
value must be a power of 2 greater than or equal to 512. If the device
reports a best block size larger than what is specified here the driver
will ignore the value specified here.
- volatile-write-cache
- Similar to the global property
volatile-write-cache-enable, this property accepts a
boolean value specified as either "on", "off",
"true", or "false" to enable or disable the volatile
write cache, if the hardware supports it. By default the volatile write
cache is enabled.
- /dev/dsk/cntnd0sn
- Block device minor nodes.
- /dev/rdsk/cntnd0sn
- Raw block device minor nodes.
In the device minor nodes, the following substitutions may
occur:
- cn
- A controller number, typically one for each
nvme
device found. Controller numbers are dynamically assigned by the
system.
- tn
- The target number. This is the namespace EUI64 if available, or the
namespace ID used by the hardware. Namespace ID 0 is reserved, hence
target numbers start with 1.
- sn
- This is the
slice
number, representing a subset of the disk. See
dkio(4I).