diff options
author | Richard Yao <[email protected]> | 2012-06-06 22:38:12 -0400 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2012-07-11 11:44:27 -0700 |
commit | 36811b4430aaea8c8b91bbe7d812a26799865499 (patch) | |
tree | b61719801e34ed403f48987c7f557a047639424f /module/spl/spl-kmem.c | |
parent | 973e8269bd99f9440149892d598f8914113d0278 (diff) |
Detect kernels that honor gfp flags passed to vmalloc()
zfsonlinux/spl@2092cf68d89a51eb0d6193aeadabb579dfc4b4a0 used
PF_MEMALLOC to workaround a bug in the Linux kernel where
allocations did not honor the gfp flags passed to vmalloc().
Unfortunately, PF_MEMALLOC has the side effect of permitting
allocations to allocate pages outside of ZONE_NORMAL. This
has been observed to result in the depletion of ZONE_DMA32.
A kernel patch is available in the Gentoo bug tracker for
this issue.
https://bugs.gentoo.org/show_bug.cgi?id=416685
This negates any benefit PF_MEMALLOC provides, so we introduce
an autotools check to disable the use of PF_MEMALLOC on
systems with patched kernels.
Signed-off-by: Richard Yao <[email protected]>
Signed-off-by: Brian Behlendorf <[email protected]>
Closes #126
Diffstat (limited to 'module/spl/spl-kmem.c')
-rw-r--r-- | module/spl/spl-kmem.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/module/spl/spl-kmem.c b/module/spl/spl-kmem.c index a6d09f9a2..80c4ff4b9 100644 --- a/module/spl/spl-kmem.c +++ b/module/spl/spl-kmem.c @@ -843,6 +843,9 @@ kv_alloc(spl_kmem_cache_t *skc, int size, int flags) if (skc->skc_flags & KMC_KMEM) { ptr = (void *)__get_free_pages(flags, get_order(size)); } else { +#ifdef HAVE_PMD_ALLOC_WITH_MASK + ptr = __vmalloc(size, flags|__GFP_HIGHMEM, PAGE_KERNEL); +#else /* * As part of vmalloc() an __pte_alloc_kernel() allocation * may occur. This internal allocation does not honor the @@ -866,6 +869,7 @@ kv_alloc(spl_kmem_cache_t *skc, int size, int flags) } else { ptr = __vmalloc(size, flags|__GFP_HIGHMEM, PAGE_KERNEL); } +#endif } /* Resulting allocated memory will be page aligned */ |