diff --git a/include/os/linux/spl/sys/kmem.h b/include/os/linux/spl/sys/kmem.h index fe34de9c1..705f9c4d7 100644 --- a/include/os/linux/spl/sys/kmem.h +++ b/include/os/linux/spl/sys/kmem.h @@ -66,7 +66,10 @@ void *spl_kvmalloc(size_t size, gfp_t flags); static inline gfp_t kmem_flags_convert(int flags) { - gfp_t lflags = __GFP_NOWARN | __GFP_COMP; + gfp_t lflags = __GFP_NOWARN; + + if (!(flags & KM_VMEM)) + lflags |= __GFP_COMP; if (flags & KM_NOSLEEP) { lflags |= GFP_ATOMIC | __GFP_NORETRY; diff --git a/module/os/linux/spl/spl-kmem-cache.c b/module/os/linux/spl/spl-kmem-cache.c index 211180e08..3b9518a60 100644 --- a/module/os/linux/spl/spl-kmem-cache.c +++ b/module/os/linux/spl/spl-kmem-cache.c @@ -139,7 +139,7 @@ static void spl_cache_shrink(spl_kmem_cache_t *skc, void *obj); static void * kv_alloc(spl_kmem_cache_t *skc, int size, int flags) { - gfp_t lflags = kmem_flags_convert(flags); + gfp_t lflags = kmem_flags_convert(flags | KM_VMEM); void *ptr; if (skc->skc_flags & KMC_RECLAIMABLE)