Messages in this thread Patch in this message | | | Date | Tue, 12 May 2009 10:53:19 +0800 | From | Wu Fengguang <> | Subject | [PATCH -mm] vmscan: merge duplicate code in shrink_active_list() |
| |
The "move pages to active list" and "move pages to inactive list" code blocks are mostly identical and can be served by a function.
Thanks to Andrew Morton for pointing this out.
Signed-off-by: Wu Fengguang <fengguang.wu@intel.com> --- mm/vmscan.c | 84 ++++++++++++++++++++------------------------------ 1 file changed, 35 insertions(+), 49 deletions(-)
--- linux.orig/mm/vmscan.c +++ linux/mm/vmscan.c @@ -1225,6 +1225,36 @@ static inline void note_zone_scanning_pr * But we had to alter page->flags anyway. */ +void move_active_pages_to_lru(enum lru_list lru, struct list_head *list) +{ + unsigned long pgmoved = 0; + + while (!list_empty(&list)) { + page = lru_to_page(&list); + prefetchw_prev_lru_page(page, &list, flags); + + VM_BUG_ON(PageLRU(page)); + SetPageLRU(page); + + VM_BUG_ON(!PageActive(page)); + if (lru < LRU_ACTIVE) + ClearPageActive(page); + + list_move(&page->lru, &zone->lru[lru].list); + mem_cgroup_add_lru_list(page, lru); + pgmoved++; + if (!pagevec_add(&pvec, page)) { + spin_unlock_irq(&zone->lru_lock); + if (buffer_heads_over_limit) + pagevec_strip(&pvec); + __pagevec_release(&pvec); + spin_lock_irq(&zone->lru_lock); + } + } + __mod_zone_page_state(zone, NR_LRU_BASE + lru, pgmoved); + if (lru < LRU_ACTIVE) + __count_vm_events(PGDEACTIVATE, pgmoved); +} static void shrink_active_list(unsigned long nr_pages, struct zone *zone, struct scan_control *sc, int priority, int file) @@ -1254,6 +1284,7 @@ static void shrink_active_list(unsigned } reclaim_stat->recent_scanned[!!file] += pgmoved; + __count_zone_vm_events(PGREFILL, zone, pgscanned); if (file) __mod_zone_page_state(zone, NR_ACTIVE_FILE, -pgmoved); else @@ -1293,65 +1324,20 @@ static void shrink_active_list(unsigned } /* - * Move the pages to the [file or anon] inactive list. + * Move pages back to the lru list. */ pagevec_init(&pvec, 1); spin_lock_irq(&zone->lru_lock); /* - * Count referenced pages from currently used mappings as - * rotated, even though they are moved to the inactive list. + * Count referenced pages from currently used mappings as rotated. * This helps balance scan pressure between file and anonymous * pages in get_scan_ratio. */ reclaim_stat->recent_rotated[!!file] += pgmoved; - pgmoved = 0; /* count pages moved to inactive list */ - lru = LRU_BASE + file * LRU_FILE; - while (!list_empty(&l_inactive)) { - page = lru_to_page(&l_inactive); - prefetchw_prev_lru_page(page, &l_inactive, flags); - VM_BUG_ON(PageLRU(page)); - SetPageLRU(page); - VM_BUG_ON(!PageActive(page)); - ClearPageActive(page); - - list_move(&page->lru, &zone->lru[lru].list); - mem_cgroup_add_lru_list(page, lru); - pgmoved++; - if (!pagevec_add(&pvec, page)) { - spin_unlock_irq(&zone->lru_lock); - if (buffer_heads_over_limit) - pagevec_strip(&pvec); - __pagevec_release(&pvec); - spin_lock_irq(&zone->lru_lock); - } - } - __mod_zone_page_state(zone, NR_LRU_BASE + lru, pgmoved); - __count_zone_vm_events(PGREFILL, zone, pgscanned); - __count_vm_events(PGDEACTIVATE, pgmoved); - - pgmoved = 0; /* count pages moved back to active list */ - lru = LRU_ACTIVE + file * LRU_FILE; - while (!list_empty(&l_active)) { - page = lru_to_page(&l_active); - prefetchw_prev_lru_page(page, &l_active, flags); - VM_BUG_ON(PageLRU(page)); - SetPageLRU(page); - VM_BUG_ON(!PageActive(page)); - - list_move(&page->lru, &zone->lru[lru].list); - mem_cgroup_add_lru_list(page, lru); - pgmoved++; - if (!pagevec_add(&pvec, page)) { - spin_unlock_irq(&zone->lru_lock); - if (buffer_heads_over_limit) - pagevec_strip(&pvec); - __pagevec_release(&pvec); - spin_lock_irq(&zone->lru_lock); - } - } - __mod_zone_page_state(zone, NR_LRU_BASE + lru, pgmoved); + move_active_pages_to_lru(LRU_ACTIVE + file * LRU_FILE, &l_active); + move_active_pages_to_lru(LRU_BASE + file * LRU_FILE, &l_inactive); spin_unlock_irq(&zone->lru_lock); if (buffer_heads_over_limit)
| |