Patch "vmalloc: fix __GFP_HIGHMEM usage for vmalloc_32 on 32b systems" has been added to the 4.14-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
vmalloc: fix __GFP_HIGHMEM usage for vmalloc_32 on 32b systems
to the 4.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
vmalloc-fix-__gfp_highmem-usage-for-vmalloc_32-on-32b-systems.patch
and it can be found in the queue-4.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
698d0831ba87b92ae10b15e8203cfd59f5a59a35Mon Sep 17 00:00:00 2001
From: Michal Hocko <[email protected]>
Date: Wed, 21 Feb 2018 14:46:01 -0800
Subject: vmalloc: fix __GFP_HIGHMEM usage for vmalloc_32 on 32b systems
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
From: Michal Hocko <[email protected]>
commit 698d0831ba87b92ae10b15e8203cfd59f5a59a35 upstream.
Kai Heng Feng has noticed that BUG_ON(PageHighMem(pg)) triggers in drivers/media/common/saa7146/saa7146_core.c since 19809c2da28a ("mm,
vmalloc: use __GFP_HIGHMEM implicitly").
saa7146_vmalloc_build_pgtable uses vmalloc_32 and it is reasonable to expect that the resulting page is not in highmem. The above commit aimed to add __GFP_HIGHMEM only for those requests which do not specify any zone modifier gfp flag. vmalloc_32 relies on GFP_VMALLOC32 which should do the right thing. Except it has been missed that GFP_VMALLOC32 is an alias for GFP_KERNEL on 32b architectures. Thanks to Matthew to notice this.
Fix the problem by unconditionally setting GFP_DMA32 in GFP_VMALLOC32 for !64b arches (as a bailout). This should do the right thing and use ZONE_NORMAL which should be always below 4G on 32b systems.
Debugged by Matthew Wilcox.
--- mm/vmalloc.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
mm/vmalloc.c +7 -3
@@ -1943,11 +1943,15 @@ void *vmalloc_exec(unsigned long size) }#if defined(CONFIG_64BIT ) && defined(CONFIG_ZONE_DMA32 ) -#define GFP_VMALLOC32 GFP_DMA32 | GFP_KERNEL +#define GFP_VMALLOC32 (GFP_DMA32 | GFP_KERNEL)#elif defined(CONFIG_64BIT ) && defined(CONFIG_ZONE_DMA ) -#define GFP_VMALLOC32 GFP_DMA | GFP_KERNEL +#define GFP_VMALLOC32 (GFP_DMA | GFP_KERNEL)#else -#define GFP_VMALLOC32 GFP_KERNEL +/* +* 64b systems should always have either DMA or DMA32 zones. For others +* GFP_DMA32 should do the right thing and use the normal zone. +*/ +#define GFP_VMALLOC32 GFP_DMA32 | GFP_KERNEL#endif /**
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/vmalloc-fix-__gfp_highmem-usage-for-vmalloc_32-on-32b-systems.patch