forked from mirrors/linux
		
	memory-hotplug: update mce_bad_pages when removing the memory
When we hotremove a memory device, we will free the memory to store struct page. If the page is hwpoisoned page, we should decrease mce_bad_pages. [akpm@linux-foundation.org: cleanup ifdefs] Signed-off-by: Wen Congyang <wency@cn.fujitsu.com> Cc: David Rientjes <rientjes@google.com> Cc: Jiang Liu <liuj97@gmail.com> Cc: Len Brown <len.brown@intel.com> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Christoph Lameter <cl@linux.com> Cc: Minchan Kim <minchan.kim@gmail.com> Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Cc: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com> Cc: Dave Hansen <dave@linux.vnet.ibm.com> Cc: Mel Gorman <mel@csn.ul.ie> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									b023f46813
								
							
						
					
					
						commit
						95a4774d05
					
				
					 1 changed files with 22 additions and 0 deletions
				
			
		
							
								
								
									
										22
									
								
								mm/sparse.c
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								mm/sparse.c
									
									
									
									
									
								
							|  | @ -771,6 +771,27 @@ int __meminit sparse_add_one_section(struct zone *zone, unsigned long start_pfn, | |||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| #ifdef CONFIG_MEMORY_FAILURE | ||||
| static void clear_hwpoisoned_pages(struct page *memmap, int nr_pages) | ||||
| { | ||||
| 	int i; | ||||
| 
 | ||||
| 	if (!memmap) | ||||
| 		return; | ||||
| 
 | ||||
| 	for (i = 0; i < PAGES_PER_SECTION; i++) { | ||||
| 		if (PageHWPoison(&memmap[i])) { | ||||
| 			atomic_long_sub(1, &mce_bad_pages); | ||||
| 			ClearPageHWPoison(&memmap[i]); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| #else | ||||
| static inline void clear_hwpoisoned_pages(struct page *memmap, int nr_pages) | ||||
| { | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| void sparse_remove_one_section(struct zone *zone, struct mem_section *ms) | ||||
| { | ||||
| 	struct page *memmap = NULL; | ||||
|  | @ -784,6 +805,7 @@ void sparse_remove_one_section(struct zone *zone, struct mem_section *ms) | |||
| 		ms->pageblock_flags = NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	clear_hwpoisoned_pages(memmap, PAGES_PER_SECTION); | ||||
| 	free_section_usemap(memmap, usemap); | ||||
| } | ||||
| #endif | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Wen Congyang
						Wen Congyang