forked from mirrors/linux
		
	mm/vmscan: fix NR_ISOLATED_FILE corruption on 64-bit
Previously the negated unsigned long would be cast back to signed long which would have the correct negative value. After commit730ec8c01a("mm/vmscan.c: change prototype for shrink_page_list"), the large unsigned int converts to a large positive signed long. Symptoms include CMA allocations hanging forever holding the cma_mutex due to alloc_contig_range->...->isolate_migratepages_block waiting forever in "while (unlikely(too_many_isolated(pgdat)))". [akpm@linux-foundation.org: fix -stat.nr_lazyfree_fail as well, per Michal] Fixes:730ec8c01a("mm/vmscan.c: change prototype for shrink_page_list") Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Acked-by: Michal Hocko <mhocko@suse.com> Cc: Vaneet Narang <v.narang@samsung.com> Cc: Maninder Singh <maninder1.s@samsung.com> Cc: Amit Sahrawat <a.sahrawat@samsung.com> Cc: Mel Gorman <mgorman@suse.de> Cc: Vlastimil Babka <vbabka@suse.cz> Cc: <stable@vger.kernel.org> Link: https://lkml.kernel.org/r/20201029032320.1448441-1-npiggin@gmail.com Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									d20bdd571e
								
							
						
					
					
						commit
						2da9f6305f
					
				
					 1 changed files with 3 additions and 2 deletions
				
			
		| 
						 | 
					@ -1516,7 +1516,8 @@ unsigned int reclaim_clean_pages_from_list(struct zone *zone,
 | 
				
			||||||
	nr_reclaimed = shrink_page_list(&clean_pages, zone->zone_pgdat, &sc,
 | 
						nr_reclaimed = shrink_page_list(&clean_pages, zone->zone_pgdat, &sc,
 | 
				
			||||||
			TTU_IGNORE_ACCESS, &stat, true);
 | 
								TTU_IGNORE_ACCESS, &stat, true);
 | 
				
			||||||
	list_splice(&clean_pages, page_list);
 | 
						list_splice(&clean_pages, page_list);
 | 
				
			||||||
	mod_node_page_state(zone->zone_pgdat, NR_ISOLATED_FILE, -nr_reclaimed);
 | 
						mod_node_page_state(zone->zone_pgdat, NR_ISOLATED_FILE,
 | 
				
			||||||
 | 
								    -(long)nr_reclaimed);
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Since lazyfree pages are isolated from file LRU from the beginning,
 | 
						 * Since lazyfree pages are isolated from file LRU from the beginning,
 | 
				
			||||||
	 * they will rotate back to anonymous LRU in the end if it failed to
 | 
						 * they will rotate back to anonymous LRU in the end if it failed to
 | 
				
			||||||
| 
						 | 
					@ -1526,7 +1527,7 @@ unsigned int reclaim_clean_pages_from_list(struct zone *zone,
 | 
				
			||||||
	mod_node_page_state(zone->zone_pgdat, NR_ISOLATED_ANON,
 | 
						mod_node_page_state(zone->zone_pgdat, NR_ISOLATED_ANON,
 | 
				
			||||||
			    stat.nr_lazyfree_fail);
 | 
								    stat.nr_lazyfree_fail);
 | 
				
			||||||
	mod_node_page_state(zone->zone_pgdat, NR_ISOLATED_FILE,
 | 
						mod_node_page_state(zone->zone_pgdat, NR_ISOLATED_FILE,
 | 
				
			||||||
			    -stat.nr_lazyfree_fail);
 | 
								    -(long)stat.nr_lazyfree_fail);
 | 
				
			||||||
	return nr_reclaimed;
 | 
						return nr_reclaimed;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue