From 8aaa10a9a059589ca8a57c3e91c12ad520fb6f30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Niew=C3=B6hner?= Date: Tue, 6 Aug 2019 13:28:56 +0200 Subject: [PATCH] Check for __GFP_RECLAIM instead of GFP_KERNEL MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Check for __GFP_RECLAIM instead of GFP_KERNEL because zfs modifies IO and FS flags which breaks the check for GFP_KERNEL. Reviewed-by: Brian Behlendorf Reviewed-by: Matt Ahrens Reviewed-by: Sebastian Gottschall Signed-off-by: Michael Niewöhner Closes #9034 --- module/os/linux/spl/spl-kmem.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/module/os/linux/spl/spl-kmem.c b/module/os/linux/spl/spl-kmem.c index d2799b5bd..defbe80a2 100644 --- a/module/os/linux/spl/spl-kmem.c +++ b/module/os/linux/spl/spl-kmem.c @@ -137,6 +137,10 @@ EXPORT_SYMBOL(kmem_strfree); #ifndef __GFP_RETRY_MAYFAIL #define __GFP_RETRY_MAYFAIL __GFP_REPEAT #endif +/* Kernel compatibility for <4.4 */ +#ifndef __GFP_RECLAIM +#define __GFP_RECLAIM __GFP_WAIT +#endif void * spl_kvmalloc(size_t size, gfp_t lflags) @@ -186,14 +190,15 @@ spl_kvmalloc(size_t size, gfp_t lflags) * We first try kmalloc - even for big sizes - and fall back to * __vmalloc if that fails. * - * For non-GFP_KERNEL allocations we always stick to kmalloc_node, - * and fail when kmalloc is not successful (returns NULL). + * For non-__GFP-RECLAIM allocations we always stick to + * kmalloc_node, and fail when kmalloc is not successful (returns + * NULL). * We cannot fall back to __vmalloc in this case because __vmalloc * internally uses GPF_KERNEL allocations. */ void *ptr = kmalloc_node(size, kmalloc_lflags, NUMA_NO_NODE); if (ptr || size <= PAGE_SIZE || - (lflags & GFP_KERNEL) != GFP_KERNEL) { + (lflags & __GFP_RECLAIM) != __GFP_RECLAIM) { return (ptr); }