summaryrefslogtreecommitdiffstats
path: root/sys/dev/nvme/nvme_sysctl.c
diff options
context:
space:
mode:
authorsmh <smh@FreeBSD.org>2015-12-11 02:06:03 +0000
committersmh <smh@FreeBSD.org>2015-12-11 02:06:03 +0000
commit0026debd97a47e3b952758c1d81371421ab2c7bf (patch)
treeb548318abda7d9be5d710d5b0d1939fd5d567cf2 /sys/dev/nvme/nvme_sysctl.c
parentd153dbf650bab72803c26528301ccdbda7ed4b0d (diff)
downloadFreeBSD-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.c16
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
OpenPOWER on IntegriCloud