summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2010-05-16 15:14:59 +0000
committerpjd <pjd@FreeBSD.org>2010-05-16 15:14:59 +0000
commit0e169b2cc79c453acd04e46d2d7adbb230f9920a (patch)
treef30a76a7134d0235338101bdd3943baaa00f492d
parenteb30e42c89aa7f37d121daa051efdbc6ff771d97 (diff)
downloadFreeBSD-src-0e169b2cc79c453acd04e46d2d7adbb230f9920a.zip
FreeBSD-src-0e169b2cc79c453acd04e46d2d7adbb230f9920a.tar.gz
Allow to configure UMA usage for ZIO data via loader and turn it on by
default for amd64. On i386 I saw performance degradation when UMA was used, but for amd64 it should help. MFC after: 3 days
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c60
1 files changed, 31 insertions, 29 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
index 7f5416d..512a70f 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
@@ -33,6 +33,17 @@
#include <sys/zio_compress.h>
#include <sys/zio_checksum.h>
+#if defined(__amd64__)
+static int zio_use_uma = 1;
+#else
+static int zio_use_uma = 0;
+#endif
+SYSCTL_DECL(_vfs_zfs);
+SYSCTL_NODE(_vfs_zfs, OID_AUTO, zio, CTLFLAG_RW, 0, "ZFS ZIO");
+TUNABLE_INT("vfs.zfs.zio.use_uma", &zio_use_uma);
+SYSCTL_INT(_vfs_zfs_zio, OID_AUTO, use_uma, CTLFLAG_RDTUN, &zio_use_uma, 0,
+ "Use uma(9) for ZIO allocations");
+
/*
* ==========================================================================
* I/O priority table
@@ -69,10 +80,8 @@ char *zio_type_name[ZIO_TYPES] = {
* ==========================================================================
*/
kmem_cache_t *zio_cache;
-#ifdef ZIO_USE_UMA
kmem_cache_t *zio_buf_cache[SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT];
kmem_cache_t *zio_data_buf_cache[SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT];
-#endif
#ifdef _KERNEL
extern vmem_t *zio_alloc_arena;
@@ -88,13 +97,13 @@ extern vmem_t *zio_alloc_arena;
void
zio_init(void)
{
-#ifdef ZIO_USE_UMA
size_t c;
-#endif
zio_cache = kmem_cache_create("zio_cache", sizeof (zio_t), 0,
NULL, NULL, NULL, NULL, NULL, 0);
-#ifdef ZIO_USE_UMA
+ if (!zio_use_uma)
+ goto end;
+
/*
* For small buffers, we want a cache for each multiple of
* SPA_MINBLOCKSIZE. For medium-size buffers, we want a cache
@@ -138,15 +147,13 @@ zio_init(void)
if (zio_data_buf_cache[c - 1] == NULL)
zio_data_buf_cache[c - 1] = zio_data_buf_cache[c];
}
-#endif
-
+end:
zio_inject_init();
}
void
zio_fini(void)
{
-#ifdef ZIO_USE_UMA
size_t c;
kmem_cache_t *last_cache = NULL;
kmem_cache_t *last_data_cache = NULL;
@@ -164,7 +171,6 @@ zio_fini(void)
}
zio_data_buf_cache[c] = NULL;
}
-#endif
kmem_cache_destroy(zio_cache);
@@ -186,15 +192,14 @@ zio_fini(void)
void *
zio_buf_alloc(size_t size)
{
-#ifdef ZIO_USE_UMA
size_t c = (size - 1) >> SPA_MINBLOCKSHIFT;
ASSERT(c < SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT);
- return (kmem_cache_alloc(zio_buf_cache[c], KM_PUSHPAGE));
-#else
- return (kmem_alloc(size, KM_SLEEP));
-#endif
+ if (zio_use_uma)
+ return (kmem_cache_alloc(zio_buf_cache[c], KM_PUSHPAGE));
+ else
+ return (kmem_alloc(size, KM_SLEEP));
}
/*
@@ -206,43 +211,40 @@ zio_buf_alloc(size_t size)
void *
zio_data_buf_alloc(size_t size)
{
-#ifdef ZIO_USE_UMA
size_t c = (size - 1) >> SPA_MINBLOCKSHIFT;
ASSERT(c < SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT);
- return (kmem_cache_alloc(zio_data_buf_cache[c], KM_PUSHPAGE));
-#else
- return (kmem_alloc(size, KM_SLEEP));
-#endif
+ if (zio_use_uma)
+ return (kmem_cache_alloc(zio_data_buf_cache[c], KM_PUSHPAGE));
+ else
+ return (kmem_alloc(size, KM_SLEEP));
}
void
zio_buf_free(void *buf, size_t size)
{
-#ifdef ZIO_USE_UMA
size_t c = (size - 1) >> SPA_MINBLOCKSHIFT;
ASSERT(c < SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT);
- kmem_cache_free(zio_buf_cache[c], buf);
-#else
- kmem_free(buf, size);
-#endif
+ if (zio_use_uma)
+ kmem_cache_free(zio_buf_cache[c], buf);
+ else
+ kmem_free(buf, size);
}
void
zio_data_buf_free(void *buf, size_t size)
{
-#ifdef ZIO_USE_UMA
size_t c = (size - 1) >> SPA_MINBLOCKSHIFT;
ASSERT(c < SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT);
- kmem_cache_free(zio_data_buf_cache[c], buf);
-#else
- kmem_free(buf, size);
-#endif
+ if (zio_use_uma)
+ kmem_cache_free(zio_data_buf_cache[c], buf);
+ else
+ kmem_free(buf, size);
}
/*
OpenPOWER on IntegriCloud