fix #1633: potential deadlock with THPs
see https://marc.info/?l=linux-mm&m=151683828707588 Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
This commit is contained in:
		
							parent
							
								
									8d06c0d3d4
								
							
						
					
					
						commit
						5a7ad156fa
					
				| @ -0,0 +1,46 @@ | ||||
| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||||
| From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> | ||||
| Date: Thu, 15 Mar 2018 18:07:47 +0300 | ||||
| Subject: [PATCH] mm/thp: Do not wait for lock_page() in deferred_split_scan() | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| deferred_split_scan() gets called from reclaim path. Waiting for page | ||||
| lock may lead to deadlock there. | ||||
| 
 | ||||
| Replace lock_page() with trylock_page() and skip the page if we failed | ||||
| to lock it. We will get to the page on the next scan. | ||||
| 
 | ||||
| Fixes: 9a982250f773 ("thp: introduce deferred_split_huge_page()") | ||||
| 
 | ||||
| Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> | ||||
| Acked-by: Michal Hocko <mhocko@suse.com> | ||||
| (cherry-picked from https://patchwork.kernel.org/patch/10284703/) | ||||
| Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com> | ||||
| ---
 | ||||
|  mm/huge_memory.c | 4 +++- | ||||
|  1 file changed, 3 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| diff --git a/mm/huge_memory.c b/mm/huge_memory.c
 | ||||
| index 8b887db33383..5c4093e0be8d 100644
 | ||||
| --- a/mm/huge_memory.c
 | ||||
| +++ b/mm/huge_memory.c
 | ||||
| @@ -2621,11 +2621,13 @@ static unsigned long deferred_split_scan(struct shrinker *shrink,
 | ||||
|   | ||||
|  	list_for_each_safe(pos, next, &list) { | ||||
|  		page = list_entry((void *)pos, struct page, mapping); | ||||
| -		lock_page(page);
 | ||||
| +		if (!trylock_page(page))
 | ||||
| +			goto next;
 | ||||
|  		/* split_huge_page() removes page from list on success */ | ||||
|  		if (!split_huge_page(page)) | ||||
|  			split++; | ||||
|  		unlock_page(page); | ||||
| +next:
 | ||||
|  		put_page(page); | ||||
|  	} | ||||
|   | ||||
| -- 
 | ||||
| 2.14.2 | ||||
| 
 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Fabian Grünbichler
						Fabian Grünbichler