]> Pileus Git - ~andy/linux/blobdiff - mm/frontswap.c
mm: frontswap: split out __frontswap_curr_pages
[~andy/linux] / mm / frontswap.c
index 7ec53d53c13ae23e4e2c49670044027c0f058c6e..5faf840f872614d6d33e2391bd0795a5a6333685 100644 (file)
@@ -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);