Commit 96253444 authored by Sasha Levin's avatar Sasha Levin Committed by Konrad Rzeszutek Wilk

mm: frontswap: split out __frontswap_curr_pages

Code was duplicated in two functions, clean it up.

Also, assert that the deduplicated code runs under the swap spinlock.
Reviewed-by: default avatarMinchan Kim <minchan@kernel.org>
Signed-off-by: default avatarSasha Levin <levinsasha928@gmail.com>
Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
parent 4bb3e31e
...@@ -216,6 +216,20 @@ void __frontswap_invalidate_area(unsigned type) ...@@ -216,6 +216,20 @@ void __frontswap_invalidate_area(unsigned type)
} }
EXPORT_SYMBOL(__frontswap_invalidate_area); EXPORT_SYMBOL(__frontswap_invalidate_area);
static unsigned long __frontswap_curr_pages(void)
{
int type;
unsigned long totalpages = 0;
struct swap_info_struct *si = NULL;
assert_spin_locked(&swap_lock);
for (type = swap_list.head; type >= 0; type = si->next) {
si = swap_info[type];
totalpages += atomic_read(&si->frontswap_pages);
}
return totalpages;
}
/* /*
* Frontswap, like a true swap device, may unnecessarily retain pages * Frontswap, like a true swap device, may unnecessarily retain pages
* under certain circumstances; "shrink" frontswap is essentially a * under certain circumstances; "shrink" frontswap is essentially a
...@@ -240,11 +254,7 @@ void frontswap_shrink(unsigned long target_pages) ...@@ -240,11 +254,7 @@ void frontswap_shrink(unsigned long target_pages)
*/ */
spin_lock(&swap_lock); spin_lock(&swap_lock);
locked = true; locked = true;
total_pages = 0; total_pages = __frontswap_curr_pages();
for (type = swap_list.head; type >= 0; type = si->next) {
si = swap_info[type];
total_pages += atomic_read(&si->frontswap_pages);
}
if (total_pages <= target_pages) if (total_pages <= target_pages)
goto out; goto out;
total_pages_to_unuse = total_pages - target_pages; total_pages_to_unuse = total_pages - target_pages;
...@@ -282,16 +292,12 @@ EXPORT_SYMBOL(frontswap_shrink); ...@@ -282,16 +292,12 @@ EXPORT_SYMBOL(frontswap_shrink);
*/ */
unsigned long frontswap_curr_pages(void) unsigned long frontswap_curr_pages(void)
{ {
int type;
unsigned long totalpages = 0; unsigned long totalpages = 0;
struct swap_info_struct *si = NULL;
spin_lock(&swap_lock); spin_lock(&swap_lock);
for (type = swap_list.head; type >= 0; type = si->next) { totalpages = __frontswap_curr_pages();
si = swap_info[type];
totalpages += atomic_read(&si->frontswap_pages);
}
spin_unlock(&swap_lock); spin_unlock(&swap_lock);
return totalpages; return totalpages;
} }
EXPORT_SYMBOL(frontswap_curr_pages); EXPORT_SYMBOL(frontswap_curr_pages);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment