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:
parent
cfb3e98d37
commit
ed3c664257
@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user