mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	mm/thp: allow dropping THP from page cache
Once a THP is added to the page cache, it cannot be dropped via
/proc/sys/vm/drop_caches.  Fix this issue with proper handling in
invalidate_mapping_pages().
Link: http://lkml.kernel.org/r/20191017164223.2762148-5-songliubraving@fb.com
Fixes: 99cb0dbd47 ("mm,thp: add read-only THP support for (non-shmem) FS")
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Signed-off-by: Song Liu <songliubraving@fb.com>
Tested-by: Song Liu <songliubraving@fb.com>
Acked-by: Yang Shi <yang.shi@linux.alibaba.com>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Cc: William Kucharski <william.kucharski@oracle.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
			
			
This commit is contained in:
		
							parent
							
								
									906d278d75
								
							
						
					
					
						commit
						ef18a1ca84
					
				
					 1 changed files with 12 additions and 0 deletions
				
			
		| 
						 | 
					@ -592,6 +592,16 @@ unsigned long invalidate_mapping_pages(struct address_space *mapping,
 | 
				
			||||||
					unlock_page(page);
 | 
										unlock_page(page);
 | 
				
			||||||
					continue;
 | 
										continue;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									/* Take a pin outside pagevec */
 | 
				
			||||||
 | 
									get_page(page);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									/*
 | 
				
			||||||
 | 
									 * Drop extra pins before trying to invalidate
 | 
				
			||||||
 | 
									 * the huge page.
 | 
				
			||||||
 | 
									 */
 | 
				
			||||||
 | 
									pagevec_remove_exceptionals(&pvec);
 | 
				
			||||||
 | 
									pagevec_release(&pvec);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			ret = invalidate_inode_page(page);
 | 
								ret = invalidate_inode_page(page);
 | 
				
			||||||
| 
						 | 
					@ -602,6 +612,8 @@ unsigned long invalidate_mapping_pages(struct address_space *mapping,
 | 
				
			||||||
			 */
 | 
								 */
 | 
				
			||||||
			if (!ret)
 | 
								if (!ret)
 | 
				
			||||||
				deactivate_file_page(page);
 | 
									deactivate_file_page(page);
 | 
				
			||||||
 | 
								if (PageTransHuge(page))
 | 
				
			||||||
 | 
									put_page(page);
 | 
				
			||||||
			count += ret;
 | 
								count += ret;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		pagevec_remove_exceptionals(&pvec);
 | 
							pagevec_remove_exceptionals(&pvec);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue