|
@@ -216,6 +216,20 @@ void __frontswap_invalidate_area(unsigned type)
|
|
|
}
|
|
|
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
|
|
|
* under certain circumstances; "shrink" frontswap is essentially a
|
|
@@ -240,11 +254,7 @@ void frontswap_shrink(unsigned long target_pages)
|
|
|
*/
|
|
|
spin_lock(&swap_lock);
|
|
|
locked = true;
|
|
|
- total_pages = 0;
|
|
|
- for (type = swap_list.head; type >= 0; type = si->next) {
|
|
|
- si = swap_info[type];
|
|
|
- total_pages += atomic_read(&si->frontswap_pages);
|
|
|
- }
|
|
|
+ total_pages = __frontswap_curr_pages();
|
|
|
if (total_pages <= target_pages)
|
|
|
goto out;
|
|
|
total_pages_to_unuse = total_pages - target_pages;
|
|
@@ -282,16 +292,12 @@ EXPORT_SYMBOL(frontswap_shrink);
|
|
|
*/
|
|
|
unsigned long frontswap_curr_pages(void)
|
|
|
{
|
|
|
- int type;
|
|
|
unsigned long totalpages = 0;
|
|
|
- struct swap_info_struct *si = NULL;
|
|
|
|
|
|
spin_lock(&swap_lock);
|
|
|
- for (type = swap_list.head; type >= 0; type = si->next) {
|
|
|
- si = swap_info[type];
|
|
|
- totalpages += atomic_read(&si->frontswap_pages);
|
|
|
- }
|
|
|
+ totalpages = __frontswap_curr_pages();
|
|
|
spin_unlock(&swap_lock);
|
|
|
+
|
|
|
return totalpages;
|
|
|
}
|
|
|
EXPORT_SYMBOL(frontswap_curr_pages);
|