Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 17 Feb 2016 15:38:05 +0000 (UTC)
From:      Jim Harris <jimharris@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r295705 - in stable/10: share/man/man4 sys/dev/nvd
Message-ID:  <201602171538.u1HFc5Mr069681@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jimharris
Date: Wed Feb 17 15:38:05 2016
New Revision: 295705
URL: https://svnweb.freebsd.org/changeset/base/295705

Log:
  MFC r295022:
  
    nvd: add hw.nvd.delete_max tunable
  
    The NVMe specification does not define a maximum or optimal delete
    size, so technically max delete size is min(full size of namespace,
    2^32 - 1 LBAs).  A single delete operation for a multi-TB NVMe
    namespace though may take much longer to complete than the nvme(4)
    I/O timeout period.  So choose a sensible default here that is still
    suitably large to minimize the number of overall delete operations.
  
    This also fixes possible uint32_t overflow on initial TRIM operation
    for zpool create operations for NVMe namespaces with >4G LBAs.
  
  Approved by:	re (glebius)
  Sponsored by:	Intel

Modified:
  stable/10/share/man/man4/nvd.4
  stable/10/sys/dev/nvd/nvd.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/share/man/man4/nvd.4
==============================================================================
--- stable/10/share/man/man4/nvd.4	Wed Feb 17 15:36:02 2016	(r295704)
+++ stable/10/share/man/man4/nvd.4	Wed Feb 17 15:38:05 2016	(r295705)
@@ -1,5 +1,5 @@
 .\"
-.\" Copyright (c) 2012-2014 Intel Corporation
+.\" Copyright (c) 2012-2016 Intel Corporation
 .\" All rights reserved.
 .\"
 .\" Redistribution and use in source and binary forms, with or without
@@ -33,7 +33,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd March 18, 2014
+.Dd January 28, 2016
 .Dt NVD 4
 .Os
 .Sh NAME
@@ -74,6 +74,15 @@ Note that device nodes from the
 driver are not
 .Xr GEOM 4
 disks and cannot be partitioned.
+.Sh CONFIGURATION
+The
+.Nm
+driver defines a system-wide maximum delete size for NVMe devices.  The
+default is 1GB.  To select a different value, set the following tunable in
+.Xr loader.conf 5 :
+.Bd -literal -offset indent
+hw.nvd.delete_max=<delete size in bytes>
+.Ed
 .Sh SEE ALSO
 .Xr GEOM 4 ,
 .Xr nvme 4 ,

Modified: stable/10/sys/dev/nvd/nvd.c
==============================================================================
--- stable/10/sys/dev/nvd/nvd.c	Wed Feb 17 15:36:02 2016	(r295704)
+++ stable/10/sys/dev/nvd/nvd.c	Wed Feb 17 15:38:05 2016	(r295705)
@@ -1,5 +1,5 @@
 /*-
- * Copyright (C) 2012-2013 Intel Corporation
+ * Copyright (C) 2012-2016 Intel Corporation
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/kernel.h>
 #include <sys/malloc.h>
 #include <sys/module.h>
+#include <sys/sysctl.h>
 #include <sys/systm.h>
 #include <sys/taskqueue.h>
 
@@ -88,6 +89,19 @@ struct nvd_controller {
 static TAILQ_HEAD(, nvd_controller)	ctrlr_head;
 static TAILQ_HEAD(disk_list, nvd_disk)	disk_head;
 
+static SYSCTL_NODE(_hw, OID_AUTO, nvd, CTLFLAG_RD, 0, "nvd driver parameters");
+/*
+ * The NVMe specification does not define a maximum or optimal delete size, so
+ *  technically max delete size is min(full size of the namespace, 2^32 - 1
+ *  LBAs).  A single delete for a multi-TB NVMe namespace though may take much
+ *  longer to complete than the nvme(4) I/O timeout period.  So choose a sensible
+ *  default here that is still suitably large to minimize the number of overall
+ *  delete operations.
+ */
+static uint64_t nvd_delete_max = (1024 * 1024 * 1024);  /* 1GB */
+SYSCTL_UQUAD(_hw_nvd, OID_AUTO, delete_max, CTLFLAG_RDTUN, &nvd_delete_max, 0,
+	     "nvd maximum BIO_DELETE size in bytes");
+
 static int nvd_modevent(module_t mod, int type, void *arg)
 {
 	int error = 0;
@@ -295,6 +309,8 @@ nvd_new_disk(struct nvme_namespace *ns, 
 	disk->d_sectorsize = nvme_ns_get_sector_size(ns);
 	disk->d_mediasize = (off_t)nvme_ns_get_size(ns);
 	disk->d_delmaxsize = (off_t)nvme_ns_get_size(ns);
+	if (disk->d_delmaxsize > nvd_delete_max)
+		disk->d_delmaxsize = nvd_delete_max;
 	disk->d_stripesize = nvme_ns_get_optimal_sector_size(ns);
 
 	if (TAILQ_EMPTY(&disk_head))



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201602171538.u1HFc5Mr069681>