diff options
| -rw-r--r-- | include/linux/swap.h | 2 | ||||
| -rw-r--r-- | mm/filemap.c | 10 | ||||
| -rw-r--r-- | mm/swap.c | 37 | 
3 files changed, 19 insertions, 30 deletions
| diff --git a/include/linux/swap.h b/include/linux/swap.h index 4286e7ac2b00..0b3377650c85 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -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 */ diff --git a/mm/filemap.c b/mm/filemap.c index 07e9d9258b48..239d36163bbe 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -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);  } diff --git a/mm/swap.c b/mm/swap.c index aa1139ccf3a7..91e194445a5e 100644 --- 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); +	}  }  /* | 
