summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2012-09-07 14:28:07 -0700
committerBrian Behlendorf <[email protected]>2012-09-07 14:36:26 -0700
commit95331f4437d57f0d0a719d38355159b90a52f40d (patch)
treebc5dcab56c1c83d1e160e0539f545da37c37deff
parentcb5c2acebb86da5b50f099b39209d22845eda8c7 (diff)
Set KMC_NOEMERGENCY for zlib workspaces
The workspace required by zlib to perform compression is roughly 512MB (order-7). These allocations are so large that we should never attempt to directly kmalloc an emergency object for them. It is far preferable to asynchronously vmalloc an additional slab in case it's needed. Then simply block waiting for an existing object to be released or for the new slab to be allocated. This can be accomplished by disabling emergency slab objects by passing the KMC_NOEMERGENCY flag at slab creation time. Signed-off-by: Brian Behlendorf <[email protected]> zfsonlinux/zfs#917
-rw-r--r--module/spl/spl-zlib.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/module/spl/spl-zlib.c b/module/spl/spl-zlib.c
index 7bed00ca4..4f88cb4e0 100644
--- a/module/spl/spl-zlib.c
+++ b/module/spl/spl-zlib.c
@@ -205,8 +205,10 @@ spl_zlib_init(void)
size = MAX(spl_zlib_deflate_workspacesize(MAX_WBITS, MAX_MEM_LEVEL),
zlib_inflate_workspacesize());
- zlib_workspace_cache = kmem_cache_create("spl_zlib_workspace_cache",
- size, 0, NULL, NULL, NULL, NULL, NULL, KMC_VMEM);
+ zlib_workspace_cache = kmem_cache_create(
+ "spl_zlib_workspace_cache",
+ size, 0, NULL, NULL, NULL, NULL, NULL,
+ KMC_VMEM | KMC_NOEMERGENCY);
if (!zlib_workspace_cache)
SRETURN(1);