diff options
author | mav <mav@FreeBSD.org> | 2009-12-28 20:08:01 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2009-12-28 20:08:01 +0000 |
commit | f60568ce2e9a52bcb63e2ad46f8bc34bf16b6273 (patch) | |
tree | 19ac67f810c8b99485f8cc69f04ff987d83ce637 /sys/geom/geom_dev.c | |
parent | 504913dcc8db18d78e4d44060377ba5ffe9f99b1 (diff) | |
download | FreeBSD-src-f60568ce2e9a52bcb63e2ad46f8bc34bf16b6273.zip FreeBSD-src-f60568ce2e9a52bcb63e2ad46f8bc34bf16b6273.tar.gz |
Add BIO_DELETE support to ada(4):
- For SSDs use TRIM feature of DATA SET MANAGEMENT command, as defined by
ACS-2 specification working draft.
- For CompactFlash use CFA ERASE command, same as ad(4) does.
With this patch, `newfs -E /dev/ada1` was able to restore write speed of
my heavily weared OCZ Vertex SSD (firmware 1.4) up to the initial level
for the most part of it's capacity. Previous 1.3 firmware, even reportiong
TRIM capabilty bit set, was not working, reporting ABORT error for every
DSM command.
I have no idea whether it is normal, but for some reason it takes 200ms
to handle any TRIM command on this drive, that was making delete extremely
slow. But TRIM command is able to accept long list of LBAs and the length of
that list seems doesn't affect it's execution time. Implemented request
clusting algorithm allowed me to rise delete rate up to reasonable numbers,
when many parallel DELETE requests running.
Diffstat (limited to 'sys/geom/geom_dev.c')
-rw-r--r-- | sys/geom/geom_dev.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/sys/geom/geom_dev.c b/sys/geom/geom_dev.c index af05618..b2d9d3b 100644 --- a/sys/geom/geom_dev.c +++ b/sys/geom/geom_dev.c @@ -299,8 +299,8 @@ g_dev_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, struct thread } while (length > 0) { chunk = length; - if (chunk > 1024 * cp->provider->sectorsize) - chunk = 1024 * cp->provider->sectorsize; + if (chunk > 65536 * cp->provider->sectorsize) + chunk = 65536 * cp->provider->sectorsize; error = g_delete_data(cp, offset, chunk); length -= chunk; offset += chunk; |