diff options
author | smh <smh@FreeBSD.org> | 2015-12-11 02:06:03 +0000 |
---|---|---|
committer | smh <smh@FreeBSD.org> | 2015-12-11 02:06:03 +0000 |
commit | 0026debd97a47e3b952758c1d81371421ab2c7bf (patch) | |
tree | b548318abda7d9be5d710d5b0d1939fd5d567cf2 /sys/dev/nvme/nvme_sysctl.c | |
parent | d153dbf650bab72803c26528301ccdbda7ed4b0d (diff) | |
download | FreeBSD-src-0026debd97a47e3b952758c1d81371421ab2c7bf.zip FreeBSD-src-0026debd97a47e3b952758c1d81371421ab2c7bf.tar.gz |
Limit stripesize reported from nvd(4) to 4K
Intel NVMe controllers have a slow path for I/Os that span a 128KB stripe boundary but ZFS limits ashift, which is derived from d_stripesize, to 13 (8KB) so we limit the stripesize reported to geom(8) to 4KB.
This may result in a small number of additional I/Os to require splitting in nvme(4), however the NVMe I/O path is very efficient so these additional I/Os will cause very minimal (if any) difference in performance or CPU utilisation.
This can be controller by the new sysctl kern.nvme.max_optimal_sectorsize.
MFC after: 1 week
Sponsored by: Multiplay
Differential Revision: https://reviews.freebsd.org/D4446
Diffstat (limited to 'sys/dev/nvme/nvme_sysctl.c')
-rw-r--r-- | sys/dev/nvme/nvme_sysctl.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/sys/dev/nvme/nvme_sysctl.c b/sys/dev/nvme/nvme_sysctl.c index 0ebbbf7..8b99111 100644 --- a/sys/dev/nvme/nvme_sysctl.c +++ b/sys/dev/nvme/nvme_sysctl.c @@ -33,6 +33,22 @@ __FBSDID("$FreeBSD$"); #include "nvme_private.h" +SYSCTL_NODE(_kern, OID_AUTO, nvme, CTLFLAG_RD, 0, "NVM Express"); +/* + * Intel NVMe controllers have a slow path for I/Os that span a 128KB + * stripe boundary but ZFS limits ashift, which is derived from + * d_stripesize, to 13 (8KB) so we limit the stripesize reported to + * geom(8) to 4KB by default. + * + * This may result in a small number of additional I/Os to require + * splitting in nvme(4), however the NVMe I/O path is very efficient + * so these additional I/Os will cause very minimal (if any) difference + * in performance or CPU utilisation. + */ +int nvme_max_optimal_sectorsize = 1<<12; +SYSCTL_INT(_kern_nvme, OID_AUTO, max_optimal_sectorsize, CTLFLAG_RWTUN, + &nvme_max_optimal_sectorsize, 0, "The maximum optimal sectorsize reported"); + /* * CTLTYPE_S64 and sysctl_handle_64 were added in r217616. Define these * explicitly here for older kernels that don't include the r217616 |