[PATCH 1/4] vmscan: simplify shrink_inactive_list()

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: KOSAKI Motohiro
Date: Thursday, April 15, 2010 - 3:23 am

Now, max_scan of shrink_inactive_list() is always passed less than
SWAP_CLUSTER_MAX. then, we can remove scanning pages loop in it.
This patch also help stack diet.

detail
 - remove "while (nr_scanned < max_scan)" loop
 - remove nr_freed (now, we use nr_reclaimed directly)
 - remove nr_scan (now, we use nr_scanned directly)
 - rename max_scan to nr_to_scan
 - pass nr_to_scan into isolate_pages() directly instead
   using SWAP_CLUSTER_MAX

Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
---
 mm/vmscan.c |  190 ++++++++++++++++++++++++++++-------------------------------
 1 files changed, 89 insertions(+), 101 deletions(-)

diff --git a/mm/vmscan.c b/mm/vmscan.c
index eab6028..4de4029 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -1137,16 +1137,22 @@ static int too_many_isolated(struct zone *zone, int file,
  * shrink_inactive_list() is a helper for shrink_zone().  It returns the number
  * of reclaimed pages
  */
-static unsigned long shrink_inactive_list(unsigned long max_scan,
+static unsigned long shrink_inactive_list(unsigned long nr_to_scan,
 			struct zone *zone, struct scan_control *sc,
 			int file)
 {
 	LIST_HEAD(page_list);
 	struct pagevec pvec;
-	unsigned long nr_scanned = 0;
+	unsigned long nr_scanned;
 	unsigned long nr_reclaimed = 0;
 	struct zone_reclaim_stat *reclaim_stat = get_reclaim_stat(zone, sc);
 	int lumpy_reclaim = 0;
+	struct page *page;
+	unsigned long nr_taken;
+	unsigned long nr_active;
+	unsigned int count[NR_LRU_LISTS] = { 0, };
+	unsigned long nr_anon;
+	unsigned long nr_file;
 
 	while (unlikely(too_many_isolated(zone, file, sc))) {
 		congestion_wait(BLK_RW_ASYNC, HZ/10);
@@ -1172,119 +1178,101 @@ static unsigned long shrink_inactive_list(unsigned long max_scan,
 
 	lru_add_drain();
 	spin_lock_irq(&zone->lru_lock);
-	do {
-		struct page *page;
-		unsigned long nr_taken;
-		unsigned long nr_scan;
-		unsigned long nr_freed;
-		unsigned long nr_active;
-		unsigned int count[NR_LRU_LISTS] = { 0, };
-		int mode = lumpy_reclaim ? ISOLATE_BOTH : ISOLATE_INACTIVE;
-		unsigned long nr_anon;
-		unsigned long nr_file;
-
-		nr_taken = sc->isolate_pages(SWAP_CLUSTER_MAX,
-			     &page_list, &nr_scan, sc->order, mode,
-				zone, sc->mem_cgroup, 0, file);
+	nr_taken = sc->isolate_pages(nr_to_scan,
+				     &page_list, &nr_scanned, sc->order,
+				     lumpy_reclaim ? ISOLATE_BOTH : ISOLATE_INACTIVE,
+				     zone, sc->mem_cgroup, 0, file);
 
-		if (scanning_global_lru(sc)) {
-			zone->pages_scanned += nr_scan;
-			if (current_is_kswapd())
-				__count_zone_vm_events(PGSCAN_KSWAPD, zone,
-						       nr_scan);
-			else
-				__count_zone_vm_events(PGSCAN_DIRECT, zone,
-						       nr_scan);
-		}
+	if (scanning_global_lru(sc)) {
+		zone->pages_scanned += nr_scanned;
+		if (current_is_kswapd())
+			__count_zone_vm_events(PGSCAN_KSWAPD, zone, nr_scanned);
+		else
+			__count_zone_vm_events(PGSCAN_DIRECT, zone, nr_scanned);
+	}
 
-		if (nr_taken == 0)
-			goto done;
+	if (nr_taken == 0)
+		goto done;
 
-		nr_active = clear_active_flags(&page_list, count);
-		__count_vm_events(PGDEACTIVATE, nr_active);
+	nr_active = clear_active_flags(&page_list, count);
+	__count_vm_events(PGDEACTIVATE, nr_active);
 
-		__mod_zone_page_state(zone, NR_ACTIVE_FILE,
-						-count[LRU_ACTIVE_FILE]);
-		__mod_zone_page_state(zone, NR_INACTIVE_FILE,
-						-count[LRU_INACTIVE_FILE]);
-		__mod_zone_page_state(zone, NR_ACTIVE_ANON,
-						-count[LRU_ACTIVE_ANON]);
-		__mod_zone_page_state(zone, NR_INACTIVE_ANON,
-						-count[LRU_INACTIVE_ANON]);
+	__mod_zone_page_state(zone, NR_ACTIVE_FILE,
+			      -count[LRU_ACTIVE_FILE]);
+	__mod_zone_page_state(zone, NR_INACTIVE_FILE,
+			      -count[LRU_INACTIVE_FILE]);
+	__mod_zone_page_state(zone, NR_ACTIVE_ANON,
+			      -count[LRU_ACTIVE_ANON]);
+	__mod_zone_page_state(zone, NR_INACTIVE_ANON,
+			      -count[LRU_INACTIVE_ANON]);
 
-		nr_anon = count[LRU_ACTIVE_ANON] + count[LRU_INACTIVE_ANON];
-		nr_file = count[LRU_ACTIVE_FILE] + count[LRU_INACTIVE_FILE];
-		__mod_zone_page_state(zone, NR_ISOLATED_ANON, nr_anon);
-		__mod_zone_page_state(zone, NR_ISOLATED_FILE, nr_file);
+	nr_anon = count[LRU_ACTIVE_ANON] + count[LRU_INACTIVE_ANON];
+	nr_file = count[LRU_ACTIVE_FILE] + count[LRU_INACTIVE_FILE];
+	__mod_zone_page_state(zone, NR_ISOLATED_ANON, nr_anon);
+	__mod_zone_page_state(zone, NR_ISOLATED_FILE, nr_file);
 
-		reclaim_stat->recent_scanned[0] += nr_anon;
-		reclaim_stat->recent_scanned[1] += nr_file;
+	reclaim_stat->recent_scanned[0] += nr_anon;
+	reclaim_stat->recent_scanned[1] += nr_file;
 
-		spin_unlock_irq(&zone->lru_lock);
+	spin_unlock_irq(&zone->lru_lock);
 
-		nr_scanned += nr_scan;
-		nr_freed = shrink_page_list(&page_list, sc, PAGEOUT_IO_ASYNC);
+	nr_reclaimed = shrink_page_list(&page_list, sc, PAGEOUT_IO_ASYNC);
+
+	/*
+	 * If we are direct reclaiming for contiguous pages and we do
+	 * not reclaim everything in the list, try again and wait
+	 * for IO to complete. This will stall high-order allocations
+	 * but that should be acceptable to the caller
+	 */
+	if (nr_reclaimed < nr_taken && !current_is_kswapd() && lumpy_reclaim) {
+		congestion_wait(BLK_RW_ASYNC, HZ/10);
 
 		/*
-		 * If we are direct reclaiming for contiguous pages and we do
-		 * not reclaim everything in the list, try again and wait
-		 * for IO to complete. This will stall high-order allocations
-		 * but that should be acceptable to the caller
+		 * The attempt at page out may have made some
+		 * of the pages active, mark them inactive again.
 		 */
-		if (nr_freed < nr_taken && !current_is_kswapd() &&
-		    lumpy_reclaim) {
-			congestion_wait(BLK_RW_ASYNC, HZ/10);
-
-			/*
-			 * The attempt at page out may have made some
-			 * of the pages active, mark them inactive again.
-			 */
-			nr_active = clear_active_flags(&page_list, count);
-			count_vm_events(PGDEACTIVATE, nr_active);
-
-			nr_freed += shrink_page_list(&page_list, sc,
-							PAGEOUT_IO_SYNC);
-		}
+		nr_active = clear_active_flags(&page_list, count);
+		count_vm_events(PGDEACTIVATE, nr_active);
 
-		nr_reclaimed += nr_freed;
+		nr_reclaimed += shrink_page_list(&page_list, sc,
+						 PAGEOUT_IO_SYNC);
+	}
 
-		local_irq_disable();
-		if (current_is_kswapd())
-			__count_vm_events(KSWAPD_STEAL, nr_freed);
-		__count_zone_vm_events(PGSTEAL, zone, nr_freed);
+	local_irq_disable();
+	if (current_is_kswapd())
+		__count_vm_events(KSWAPD_STEAL, nr_reclaimed);
+	__count_zone_vm_events(PGSTEAL, zone, nr_reclaimed);
 
-		spin_lock(&zone->lru_lock);
-		/*
-		 * Put back any unfreeable pages.
-		 */
-		while (!list_empty(&page_list)) {
-			int lru;
-			page = lru_to_page(&page_list);
-			VM_BUG_ON(PageLRU(page));
-			list_del(&page->lru);
-			if (unlikely(!page_evictable(page, NULL))) {
-				spin_unlock_irq(&zone->lru_lock);
-				putback_lru_page(page);
-				spin_lock_irq(&zone->lru_lock);
-				continue;
-			}
-			SetPageLRU(page);
-			lru = page_lru(page);
-			add_page_to_lru_list(zone, page, lru);
-			if (is_active_lru(lru)) {
-				int file = is_file_lru(lru);
-				reclaim_stat->recent_rotated[file]++;
-			}
-			if (!pagevec_add(&pvec, page)) {
-				spin_unlock_irq(&zone->lru_lock);
-				__pagevec_release(&pvec);
-				spin_lock_irq(&zone->lru_lock);
-			}
+	spin_lock(&zone->lru_lock);
+	/*
+	 * Put back any unfreeable pages.
+	 */
+	while (!list_empty(&page_list)) {
+		int lru;
+		page = lru_to_page(&page_list);
+		VM_BUG_ON(PageLRU(page));
+		list_del(&page->lru);
+		if (unlikely(!page_evictable(page, NULL))) {
+			spin_unlock_irq(&zone->lru_lock);
+			putback_lru_page(page);
+			spin_lock_irq(&zone->lru_lock);
+			continue;
 		}
-		__mod_zone_page_state(zone, NR_ISOLATED_ANON, -nr_anon);
-		__mod_zone_page_state(zone, NR_ISOLATED_FILE, -nr_file);
-
-  	} while (nr_scanned < max_scan);
+		SetPageLRU(page);
+		lru = page_lru(page);
+		add_page_to_lru_list(zone, page, lru);
+		if (is_active_lru(lru)) {
+			int file = is_file_lru(lru);
+			reclaim_stat->recent_rotated[file]++;
+		}
+		if (!pagevec_add(&pvec, page)) {
+			spin_unlock_irq(&zone->lru_lock);
+			__pagevec_release(&pvec);
+			spin_lock_irq(&zone->lru_lock);
+		}
+	}
+	__mod_zone_page_state(zone, NR_ISOLATED_ANON, -nr_anon);
+	__mod_zone_page_state(zone, NR_ISOLATED_FILE, -nr_file);
 
 done:
 	spin_unlock_irq(&zone->lru_lock);
-- 
1.6.5.2



--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH] mm: disallow direct reclaim page writeback, Dave Chinner, (Mon Apr 12, 5:17 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, KOSAKI Motohiro, (Tue Apr 13, 1:31 am)
Re: [PATCH] mm: disallow direct reclaim page writeback, Dave Chinner, (Tue Apr 13, 3:29 am)
Re: [PATCH] mm: disallow direct reclaim page writeback, Dave Chinner, (Tue Apr 13, 4:19 am)
Re: [PATCH] mm: disallow direct reclaim page writeback, KOSAKI Motohiro, (Tue Apr 13, 4:39 am)
Re: [PATCH] mm: disallow direct reclaim page writeback, Dave Chinner, (Tue Apr 13, 7:36 am)
Re: [PATCH] mm: disallow direct reclaim page writeback, Mel Gorman, (Tue Apr 13, 12:34 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, Chris Mason, (Tue Apr 13, 1:20 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, Minchan Kim, (Tue Apr 13, 5:24 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, Dave Chinner, (Tue Apr 13, 6:40 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, Dave Chinner, (Tue Apr 13, 8:12 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, Dave Chinner, (Tue Apr 13, 9:44 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, KAMEZAWA Hiroyuki, (Tue Apr 13, 9:59 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, Dave Chinner, (Tue Apr 13, 10:41 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, KOSAKI Motohiro, (Tue Apr 13, 10:54 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, Minchan Kim, (Tue Apr 13, 11:13 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, KOSAKI Motohiro, (Tue Apr 13, 11:52 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, KOSAKI Motohiro, (Tue Apr 13, 11:52 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, KOSAKI Motohiro, (Tue Apr 13, 11:52 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, KOSAKI Motohiro, (Tue Apr 13, 11:52 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, Dave Chinner, (Wed Apr 14, 12:06 am)
Re: [PATCH] mm: disallow direct reclaim page writeback, Minchan Kim, (Wed Apr 14, 12:19 am)
Re: [PATCH] mm: disallow direct reclaim page writeback, Dave Chinner, (Wed Apr 14, 12:28 am)
Re: [PATCH] mm: disallow direct reclaim page writeback, Dave Chinner, (Wed Apr 14, 12:36 am)
Re: [PATCH] mm: disallow direct reclaim page writeback, Minchan Kim, (Wed Apr 14, 12:54 am)
Re: [PATCH] mm: disallow direct reclaim page writeback, KAMEZAWA Hiroyuki, (Wed Apr 14, 2:42 am)
Re: [PATCH] mm: disallow direct reclaim page writeback, Minchan Kim, (Wed Apr 14, 3:01 am)
Re: [PATCH] mm: disallow direct reclaim page writeback, Minchan Kim, (Wed Apr 14, 3:16 am)
Re: [PATCH] mm: disallow direct reclaim page writeback, Chris Mason, (Wed Apr 14, 4:20 am)
Re: [PATCH] mm: disallow direct reclaim page writeback, Chris Mason, (Wed Apr 14, 7:07 am)
Re: [PATCH] mm: disallow direct reclaim page writeback, Dave Chinner, (Wed Apr 14, 6:34 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, Dave Chinner, (Wed Apr 14, 6:56 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, Johannes Weiner, (Wed Apr 14, 7:37 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, KOSAKI Motohiro, (Wed Apr 14, 7:43 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, KOSAKI Motohiro, (Wed Apr 14, 9:09 pm)
[PATCH 2/4] vmscan: kill prev_priority completely, KOSAKI Motohiro, (Wed Apr 14, 9:13 pm)
[PATCH 3/4] vmscan: move priority variable into scan_control, KOSAKI Motohiro, (Wed Apr 14, 9:14 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, KOSAKI Motohiro, (Wed Apr 14, 9:35 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, Dave Chinner, (Wed Apr 14, 11:20 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, Dave Chinner, (Wed Apr 14, 11:32 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, Dave Chinner, (Wed Apr 14, 11:58 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, Dave Chinner, (Thu Apr 15, 1:54 am)
Re: [PATCH] mm: disallow direct reclaim page writeback, KOSAKI Motohiro, (Thu Apr 15, 3:21 am)
[PATCH 1/4] vmscan: simplify shrink_inactive_list(), KOSAKI Motohiro, (Thu Apr 15, 3:23 am)
[PATCH 2/4] [cleanup] mm: introduce free_pages_prepare, KOSAKI Motohiro, (Thu Apr 15, 3:24 am)
Re: [PATCH] mm: disallow direct reclaim page writeback, Chris Mason, (Thu Apr 15, 6:42 am)
Re: [PATCH 3/4] mm: introduce free_pages_bulk, Mel Gorman, (Thu Apr 15, 6:46 am)
Re: [PATCH 1/4] vmscan: delegate pageout io to flusher thr ..., Suleiman Souhlal, (Thu Apr 15, 10:24 am)
Re: [PATCH 1/4] vmscan: delegate pageout io to flusher thr ..., Suleiman Souhlal, (Thu Apr 15, 10:27 am)
Re: [PATCH 1/4] vmscan: simplify shrink_inactive_list(), Valdis.Kletnieks, (Thu Apr 15, 11:22 am)
Re: [PATCH 1/4] vmscan: simplify shrink_inactive_list(), Dave Chinner, (Thu Apr 15, 4:40 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, KAMEZAWA Hiroyuki, (Thu Apr 15, 6:13 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, Dave Chinner, (Thu Apr 15, 9:14 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, KAMEZAWA Hiroyuki, (Thu Apr 15, 9:18 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, Johannes Weiner, (Fri Apr 16, 4:56 pm)
Re: [PATCH 1/4] vmscan: simplify shrink_inactive_list(), Dave Chinner, (Fri Apr 16, 7:37 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, Andrew Morton, (Sat Apr 17, 5:32 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, Andrew Morton, (Sun Apr 18, 9:31 am)
Re: [PATCH] mm: disallow direct reclaim page writeback, Christoph Hellwig, (Sun Apr 18, 12:05 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, Sorin Faibish, (Sun Apr 18, 12:10 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, Sorin Faibish, (Sun Apr 18, 12:11 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, Christoph Hellwig, (Sun Apr 18, 12:35 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, Sorin Faibish, (Sun Apr 18, 4:34 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, Dave Chinner, (Sun Apr 18, 5:35 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, Arjan van de Ven, (Sun Apr 18, 5:49 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, Dave Chinner, (Sun Apr 18, 6:08 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, Arjan van de Ven, (Sun Apr 18, 9:32 pm)
Re: [PATCH] mm: disallow direct reclaim page writeback, Dave Chinner, (Thu Apr 22, 6:06 pm)