summaryrefslogtreecommitdiffstats
path: root/sys/cddl/contrib/opensolaris/uts
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2014-01-05 22:09:18 +0000
committermav <mav@FreeBSD.org>2014-01-05 22:09:18 +0000
commitfe82b61321d95949dd3b45f4e9ea7923b97ec6d8 (patch)
tree8618a1d268205f0114f8e8fbe9fac74ebfb08806 /sys/cddl/contrib/opensolaris/uts
parent1bba01828c15c706eae833685b7f0c07c42f7c54 (diff)
downloadFreeBSD-src-fe82b61321d95949dd3b45f4e9ea7923b97ec6d8.zip
FreeBSD-src-fe82b61321d95949dd3b45f4e9ea7923b97ec6d8.tar.gz
MFC r258137:
Introduce allocation cache to store LZ4 compression contexts without kicking VM subsystem twice for every written record. Tests on 24-core system show double reduction of CPU time spent on copying single large well-compressed file. This patch is not really needed on illumos (while not harm either) since their memory allocator by default uses caching for all requests up to 128K.
Diffstat (limited to 'sys/cddl/contrib/opensolaris/uts')
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/lz4.c26
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c2
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio_compress.h2
3 files changed, 28 insertions, 2 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/lz4.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/lz4.c
index 0f55cc8..a7691d6 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/lz4.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/lz4.c
@@ -44,6 +44,8 @@ static int LZ4_compressCtx(void *ctx, const char *source, char *dest,
static int LZ4_compress64kCtx(void *ctx, const char *source, char *dest,
int isize, int osize);
+static kmem_cache_t *lz4_ctx_cache;
+
/*ARGSUSED*/
size_t
lz4_compress(void *s_start, void *d_start, size_t s_len, size_t d_len, int n)
@@ -840,7 +842,7 @@ static int
real_LZ4_compress(const char *source, char *dest, int isize, int osize)
{
#if HEAPMODE
- void *ctx = kmem_zalloc(sizeof (struct refTables), KM_NOSLEEP);
+ void *ctx = kmem_cache_alloc(lz4_ctx_cache, KM_NOSLEEP);
int result;
/*
@@ -850,12 +852,13 @@ real_LZ4_compress(const char *source, char *dest, int isize, int osize)
if (ctx == NULL)
return (0);
+ bzero(ctx, sizeof(struct refTables));
if (isize < LZ4_64KLIMIT)
result = LZ4_compress64kCtx(ctx, source, dest, isize, osize);
else
result = LZ4_compressCtx(ctx, source, dest, isize, osize);
- kmem_free(ctx, sizeof (struct refTables));
+ kmem_cache_free(lz4_ctx_cache, ctx);
return (result);
#else
if (isize < (int)LZ4_64KLIMIT)
@@ -1001,3 +1004,22 @@ LZ4_uncompress_unknownOutputSize(const char *source, char *dest, int isize,
_output_error:
return (int)(-(((char *)ip) - source));
}
+
+extern void
+lz4_init(void)
+{
+
+#if HEAPMODE
+ lz4_ctx_cache = kmem_cache_create("lz4_ctx", sizeof(struct refTables),
+ 0, NULL, NULL, NULL, NULL, NULL, 0);
+#endif
+}
+
+extern void
+lz4_fini(void)
+{
+
+#if HEAPMODE
+ kmem_cache_destroy(lz4_ctx_cache);
+#endif
+}
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c
index d92bcf0..17983bf 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c
@@ -1739,6 +1739,7 @@ spa_init(int mode)
unique_init();
space_map_init();
zio_init();
+ lz4_init();
dmu_init();
zil_init();
vdev_cache_stat_init();
@@ -1764,6 +1765,7 @@ spa_fini(void)
vdev_cache_stat_fini();
zil_fini();
dmu_fini();
+ lz4_fini();
zio_fini();
space_map_fini();
unique_fini();
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio_compress.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio_compress.h
index 85b8a99..c0be314 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio_compress.h
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio_compress.h
@@ -70,6 +70,8 @@ extern size_t zle_compress(void *src, void *dst, size_t s_len, size_t d_len,
int level);
extern int zle_decompress(void *src, void *dst, size_t s_len, size_t d_len,
int level);
+extern void lz4_init(void);
+extern void lz4_fini(void);
extern size_t lz4_compress(void *src, void *dst, size_t s_len, size_t d_len,
int level);
extern int lz4_decompress(void *src, void *dst, size_t s_len, size_t d_len,
OpenPOWER on IntegriCloud