]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Check for __GFP_RECLAIM instead of GFP_KERNEL
authorMichael Niewöhner <foss@mniewoehner.de>
Tue, 6 Aug 2019 11:28:56 +0000 (13:28 +0200)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 13 Nov 2019 18:05:23 +0000 (10:05 -0800)
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 <behlendorf1@llnl.gov>
Reviewed-by: Matt Ahrens <matt@delphix.com>
Reviewed-by: Sebastian Gottschall <s.gottschall@dd-wrt.com>
Signed-off-by: Michael Niewöhner <foss@mniewoehner.de>
Closes #9034

module/os/linux/spl/spl-kmem.c

index d2799b5bd399ffce4ef0dfa2136feb7a6f32b9c6..defbe80a26ae332b668f3bd5decb7d765e6bfbb6 100644 (file)
@@ -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);
        }