mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 03:01:39 -04:00
vmalloc: fix __GFP_HIGHMEM usage for vmalloc_32 on 32b systems
Kai Heng Feng has noticed that BUG_ON(PageHighMem(pg)) triggers in drivers/media/common/saa7146/saa7146_core.c since19809c2da2("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. [[email protected]: coding-style fixes] Link: http://lkml.kernel.org/r/[email protected] Fixes:19809c2da2("mm, vmalloc: use __GFP_HIGHMEM implicitly”) Signed-off-by: Michal Hocko <[email protected]> Reported-by: Kai Heng Feng <[email protected]> Cc: Matthew Wilcox <[email protected]> Cc: Laura Abbott <[email protected]> Cc: <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
bdefe01a6b
commit
698d0831ba
1 changed files with 7 additions and 3 deletions
10
mm/vmalloc.c
10
mm/vmalloc.c
|
|
@ -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
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Reference in a new issue