mm: frontswap: split frontswap_shrink further to simplify locking
Split frontswap_shrink to simplify the locking in the original code. Also, assert that the function that was split still runs under the swap spinlock. Signed-off-by: Sasha Levin <levinsasha928@gmail.com> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
This commit is contained in:
		
							parent
							
								
									f116695a50
								
							
						
					
					
						commit
						69217b4cd0
					
				| @ -265,6 +265,24 @@ static int __frontswap_unuse_pages(unsigned long total, unsigned long *unused, | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| static int __frontswap_shrink(unsigned long target_pages, | ||||
| 				unsigned long *pages_to_unuse, | ||||
| 				int *type) | ||||
| { | ||||
| 	unsigned long total_pages = 0, total_pages_to_unuse; | ||||
| 
 | ||||
| 	assert_spin_locked(&swap_lock); | ||||
| 
 | ||||
| 	total_pages = __frontswap_curr_pages(); | ||||
| 	if (total_pages <= target_pages) { | ||||
| 		/* Nothing to do */ | ||||
| 		*pages_to_unuse = 0; | ||||
| 		return 0; | ||||
| 	} | ||||
| 	total_pages_to_unuse = total_pages - target_pages; | ||||
| 	return __frontswap_unuse_pages(total_pages_to_unuse, pages_to_unuse, type); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Frontswap, like a true swap device, may unnecessarily retain pages | ||||
|  * under certain circumstances; "shrink" frontswap is essentially a | ||||
| @ -275,10 +293,8 @@ static int __frontswap_unuse_pages(unsigned long total, unsigned long *unused, | ||||
|  */ | ||||
| void frontswap_shrink(unsigned long target_pages) | ||||
| { | ||||
| 	unsigned long total_pages = 0, total_pages_to_unuse; | ||||
| 	unsigned long pages_to_unuse = 0; | ||||
| 	int type, ret; | ||||
| 	bool locked = false; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * we don't want to hold swap_lock while doing a very | ||||
| @ -286,20 +302,10 @@ void frontswap_shrink(unsigned long target_pages) | ||||
| 	 * so restart scan from swap_list.head each time | ||||
| 	 */ | ||||
| 	spin_lock(&swap_lock); | ||||
| 	locked = true; | ||||
| 	total_pages = __frontswap_curr_pages(); | ||||
| 	if (total_pages <= target_pages) | ||||
| 		goto out; | ||||
| 	total_pages_to_unuse = total_pages - target_pages; | ||||
| 	ret = __frontswap_unuse_pages(total_pages_to_unuse, &pages_to_unuse, &type); | ||||
| 	if (ret < 0) | ||||
| 		goto out; | ||||
| 	locked = false; | ||||
| 	ret = __frontswap_shrink(target_pages, &pages_to_unuse, &type); | ||||
| 	spin_unlock(&swap_lock); | ||||
| 	try_to_unuse(type, true, pages_to_unuse); | ||||
| out: | ||||
| 	if (locked) | ||||
| 		spin_unlock(&swap_lock); | ||||
| 	if (ret == 0 && pages_to_unuse) | ||||
| 		try_to_unuse(type, true, pages_to_unuse); | ||||
| 	return; | ||||
| } | ||||
| EXPORT_SYMBOL(frontswap_shrink); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user