Date: Mon, 3 Jun 2013 16:22:19 +0000 (UTC) From: Steven Hartland <smh@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org Subject: svn commit: r251306 - stable/9/sys/geom Message-ID: <201306031622.r53GMJQt065392@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: smh Date: Mon Jun 3 16:22:19 2013 New Revision: 251306 URL: http://svnweb.freebsd.org/changeset/base/251306 Log: MFC r249930: Added a sysctl to control the maximum size of a delete request Modified: stable/9/sys/geom/geom_dev.c Directory Properties: stable/9/sys/ (props changed) Modified: stable/9/sys/geom/geom_dev.c ============================================================================== --- stable/9/sys/geom/geom_dev.c Mon Jun 3 16:14:24 2013 (r251305) +++ stable/9/sys/geom/geom_dev.c Mon Jun 3 16:22:19 2013 (r251306) @@ -52,6 +52,7 @@ __FBSDID("$FreeBSD$"); #include <sys/disk.h> #include <sys/fcntl.h> #include <sys/limits.h> +#include <sys/sysctl.h> #include <geom/geom.h> #include <geom/geom_int.h> #include <machine/stdarg.h> @@ -93,6 +94,19 @@ static struct g_class g_dev_class = { .attrchanged = g_dev_attrchanged }; +/* + * We target 262144 (8 x 32768) sectors by default as this significantly + * increases the throughput on commonly used SSD's with a marginal + * increase in non-interruptible request latency. + */ +static uint64_t g_dev_del_max_sectors = 262144; +SYSCTL_DECL(_kern_geom); +SYSCTL_NODE(_kern_geom, OID_AUTO, dev, CTLFLAG_RW, 0, "GEOM_DEV stuff"); +SYSCTL_QUAD(_kern_geom_dev, OID_AUTO, delete_max_sectors, CTLFLAG_RW, + &g_dev_del_max_sectors, 0, "Maximum number of sectors in a single " + "delete request sent to the provider. Larger requests are chunked " + "so they can be interrupted. (0 = disable chunking)"); + static void g_dev_destroy(void *arg, int flags __unused) { @@ -412,17 +426,20 @@ g_dev_ioctl(struct cdev *dev, u_long cmd } while (length > 0) { chunk = length; - if (chunk > 65536 * cp->provider->sectorsize) - chunk = 65536 * cp->provider->sectorsize; + if (g_dev_del_max_sectors != 0 && chunk > + g_dev_del_max_sectors * cp->provider->sectorsize) { + chunk = g_dev_del_max_sectors * + cp->provider->sectorsize; + } error = g_delete_data(cp, offset, chunk); length -= chunk; offset += chunk; if (error) break; /* - * Since the request size is unbounded, the service - * time is likewise. We make this ioctl interruptible - * by checking for signals for each bio. + * Since the request size can be large, the service + * time can be is likewise. We make this ioctl + * interruptible by checking for signals for each bio. */ if (SIGPENDING(td)) break;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201306031622.r53GMJQt065392>