Fix for vmalloc_32 failure (rhbz 1482249)
This commit is contained in:
		
							parent
							
								
									ee7eaf6837
								
							
						
					
					
						commit
						94d0b8629a
					
				
							
								
								
									
										73
									
								
								0001-mm-vmalloc-Don-t-unconditonally-use-__GFP_HIGHMEM.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								0001-mm-vmalloc-Don-t-unconditonally-use-__GFP_HIGHMEM.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,73 @@ | ||||
| From caa7919d0402b9ebe40ac3f5228c31e28a933327 Mon Sep 17 00:00:00 2001 | ||||
| From: Laura Abbott <labbott@redhat.com> | ||||
| Date: Wed, 16 Aug 2017 14:56:31 -0700 | ||||
| Subject: [PATCH] mm/vmalloc: Don't unconditonally use __GFP_HIGHMEM | ||||
| To: Andrew Morton <akpm@linux-foundation.org> | ||||
| To: Michal Hocko <mhocko@suse.com> | ||||
| To: Vlastimil Babka <vbabka@suse.cz> | ||||
| To: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> | ||||
| Cc: linux-mm@kvack.org | ||||
| Cc: linux-kernel@vger.kernel.org | ||||
| 
 | ||||
| Commit 19809c2da28a ("mm, vmalloc: use __GFP_HIGHMEM implicitly") | ||||
| added use of __GFP_HIGHMEM for allocations. vmalloc_32 may use | ||||
| GFP_DMA/GFP_DMA32 which does not play nice with __GFP_HIGHMEM | ||||
| and will drigger a BUG in gfp_zone. Only add __GFP_HIGHMEM if | ||||
| we aren't using GFP_DMA/GFP_DMA32. | ||||
| 
 | ||||
| Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1482249 | ||||
| Fixes: 19809c2da28a ("mm, vmalloc: use __GFP_HIGHMEM implicitly") | ||||
| Signed-off-by: Laura Abbott <labbott@redhat.com> | ||||
| ---
 | ||||
|  mm/vmalloc.c | 13 ++++++++----- | ||||
|  1 file changed, 8 insertions(+), 5 deletions(-) | ||||
| 
 | ||||
| diff --git a/mm/vmalloc.c b/mm/vmalloc.c
 | ||||
| index 8698c1c86c4d..a47e3894c775 100644
 | ||||
| --- a/mm/vmalloc.c
 | ||||
| +++ b/mm/vmalloc.c
 | ||||
| @@ -1671,7 +1671,10 @@ static void *__vmalloc_area_node(struct vm_struct *area, gfp_t gfp_mask,
 | ||||
|  	struct page **pages; | ||||
|  	unsigned int nr_pages, array_size, i; | ||||
|  	const gfp_t nested_gfp = (gfp_mask & GFP_RECLAIM_MASK) | __GFP_ZERO; | ||||
| -	const gfp_t alloc_mask = gfp_mask | __GFP_HIGHMEM | __GFP_NOWARN;
 | ||||
| +	const gfp_t alloc_mask = gfp_mask | __GFP_NOWARN;
 | ||||
| +	const gfp_t highmem_mask = (gfp_mask & (GFP_DMA | GFP_DMA32)) ?
 | ||||
| +					0 :
 | ||||
| +					__GFP_HIGHMEM;
 | ||||
|   | ||||
|  	nr_pages = get_vm_area_size(area) >> PAGE_SHIFT; | ||||
|  	array_size = (nr_pages * sizeof(struct page *)); | ||||
| @@ -1679,7 +1682,7 @@ static void *__vmalloc_area_node(struct vm_struct *area, gfp_t gfp_mask,
 | ||||
|  	area->nr_pages = nr_pages; | ||||
|  	/* Please note that the recursion is strictly bounded. */ | ||||
|  	if (array_size > PAGE_SIZE) { | ||||
| -		pages = __vmalloc_node(array_size, 1, nested_gfp|__GFP_HIGHMEM,
 | ||||
| +		pages = __vmalloc_node(array_size, 1, nested_gfp|highmem_mask,
 | ||||
|  				PAGE_KERNEL, node, area->caller); | ||||
|  	} else { | ||||
|  		pages = kmalloc_node(array_size, nested_gfp, node); | ||||
| @@ -1700,9 +1703,9 @@ static void *__vmalloc_area_node(struct vm_struct *area, gfp_t gfp_mask,
 | ||||
|  		} | ||||
|   | ||||
|  		if (node == NUMA_NO_NODE) | ||||
| -			page = alloc_page(alloc_mask);
 | ||||
| +			page = alloc_page(alloc_mask|highmem_mask);
 | ||||
|  		else | ||||
| -			page = alloc_pages_node(node, alloc_mask, 0);
 | ||||
| +			page = alloc_pages_node(node, alloc_mask|highmem_mask, 0);
 | ||||
|   | ||||
|  		if (unlikely(!page)) { | ||||
|  			/* Successfully allocated i pages, free them in __vunmap() */ | ||||
| @@ -1710,7 +1713,7 @@ static void *__vmalloc_area_node(struct vm_struct *area, gfp_t gfp_mask,
 | ||||
|  			goto fail; | ||||
|  		} | ||||
|  		area->pages[i] = page; | ||||
| -		if (gfpflags_allow_blocking(gfp_mask))
 | ||||
| +		if (gfpflags_allow_blocking(gfp_mask|highmem_mask))
 | ||||
|  			cond_resched(); | ||||
|  	} | ||||
|   | ||||
| -- 
 | ||||
| 2.13.0 | ||||
| 
 | ||||
| @ -649,6 +649,9 @@ Patch617: Fix-for-module-sig-verification.patch | ||||
| # request for bug fix | ||||
| Patch618: iio-race-fix.patch | ||||
| 
 | ||||
| # rhbz 1482249 | ||||
| Patch619: 0001-mm-vmalloc-Don-t-unconditonally-use-__GFP_HIGHMEM.patch | ||||
| 
 | ||||
| # END OF PATCH DEFINITIONS | ||||
| 
 | ||||
| %endif | ||||
| @ -2202,6 +2205,9 @@ fi | ||||
| # | ||||
| # | ||||
| %changelog | ||||
| * Thu Aug 17 2017 Laura Abbott <labbott@fedoraproject.org> | ||||
| - Fix for vmalloc_32 failure (rhbz 1482249) | ||||
| 
 | ||||
| * Wed Aug 16 2017 Laura Abbott <labbott@fedoraproject.org> - 4.13.0-0.rc5.git2.1 | ||||
| - Linux v4.13-rc5-67-g510c8a899caf | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user