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
This commit is contained in:
Pawel Jakub Dawidek 2010-05-16 15:14:59 +00:00
parent cfb3e98d37
commit ed3c664257

View File

@ -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);
}
/*