mm: rotate_reclaimable_page() cleanup
authorMiklos Szeredi <mszeredi@suse.cz>
Mon, 28 Apr 2008 09:12:38 +0000 (02:12 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 28 Apr 2008 15:58:20 +0000 (08:58 -0700)
Clean up messy conditional calling of test_clear_page_writeback() from both
rotate_reclaimable_page() and end_page_writeback().

The only user of rotate_reclaimable_page() is end_page_writeback() so this is
OK.

Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
include/linux/swap.h
mm/filemap.c
mm/swap.c

index 4286e7a..0b33776 100644 (file)
@@ -177,7 +177,7 @@ extern void activate_page(struct page *);
 extern void mark_page_accessed(struct page *);
 extern void lru_add_drain(void);
 extern int lru_add_drain_all(void);
-extern int rotate_reclaimable_page(struct page *page);
+extern void rotate_reclaimable_page(struct page *page);
 extern void swap_setup(void);
 
 /* linux/mm/vmscan.c */
index 07e9d92..239d361 100644 (file)
@@ -576,10 +576,12 @@ EXPORT_SYMBOL(unlock_page);
  */
 void end_page_writeback(struct page *page)
 {
-       if (!TestClearPageReclaim(page) || rotate_reclaimable_page(page)) {
-               if (!test_clear_page_writeback(page))
-                       BUG();
-       }
+       if (TestClearPageReclaim(page))
+               rotate_reclaimable_page(page);
+
+       if (!test_clear_page_writeback(page))
+               BUG();
+
        smp_mb__after_clear_bit();
        wake_up_page(page, PG_writeback);
 }
index aa1139c..91e1944 100644 (file)
--- a/mm/swap.c
+++ b/mm/swap.c
@@ -132,34 +132,21 @@ static void pagevec_move_tail(struct pagevec *pvec)
  * Writeback is about to end against a page which has been marked for immediate
  * reclaim.  If it still appears to be reclaimable, move it to the tail of the
  * inactive list.
- *
- * Returns zero if it cleared PG_writeback.
  */
-int rotate_reclaimable_page(struct page *page)
+void  rotate_reclaimable_page(struct page *page)
 {
-       struct pagevec *pvec;
-       unsigned long flags;
-
-       if (PageLocked(page))
-               return 1;
-       if (PageDirty(page))
-               return 1;
-       if (PageActive(page))
-               return 1;
-       if (!PageLRU(page))
-               return 1;
-
-       page_cache_get(page);
-       local_irq_save(flags);
-       pvec = &__get_cpu_var(lru_rotate_pvecs);
-       if (!pagevec_add(pvec, page))
-               pagevec_move_tail(pvec);
-       local_irq_restore(flags);
-
-       if (!test_clear_page_writeback(page))
-               BUG();
+       if (!PageLocked(page) && !PageDirty(page) && !PageActive(page) &&
+           PageLRU(page)) {
+               struct pagevec *pvec;
+               unsigned long flags;
 
-       return 0;
+               page_cache_get(page);
+               local_irq_save(flags);
+               pvec = &__get_cpu_var(lru_rotate_pvecs);
+               if (!pagevec_add(pvec, page))
+                       pagevec_move_tail(pvec);
+               local_irq_restore(flags);
+       }
 }
 
 /*