All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <20130121015222.GA3666@blaptop>

diff --git a/a/1.txt b/N1/1.txt
index 8b4e28b..9e58faa 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -94,3 +94,96 @@ Thanks!
 [1] mm: prevent addition of pages to swap if may_writepage is unset
 
 -------------- &< --------------------
+
+>From 94086dc7152359d052802c55c82ef19509fe8cce Mon Sep 17 00:00:00 2001
+From: Minchan Kim <minchan@kernel.org>
+Date: Mon, 21 Jan 2013 10:43:43 +0900
+Subject: [PATCH] mm: Use up free swap space before reaching OOM kill
+
+Recently, Luigi reported there are lots of free swap space when
+OOM happens. It's easily reproduced on zram-over-swap, where
+many instance of memory hogs are running and laptop_mode is enabled.
+He said there was no problem when he disabled laptop_mode.
+The problem when I investigate problem is following as.
+
+Assumption for easy explanation: There are no page cache page in system
+because they all are already reclaimed.
+
+1. try_to_free_pages disable may_writepage when laptop_mode is enabled.
+2. shrink_inactive_list isolates victim pages from inactive anon lru list.
+3. shrink_page_list adds them to swapcache via add_to_swap but it doesn't
+   pageout because sc->may_writepage is 0 so the page is rotated back into
+   inactive anon lru list. The add_to_swap made the page Dirty by SetPageDirty.
+4. 3 couldn't reclaim any pages so do_try_to_free_pages increase priority and
+   retry reclaim with higher priority.
+5. shrink_inactlive_list try to isolate victim pages from inactive anon lru list
+   but got failed because it try to isolate pages with ISOLATE_CLEAN mode but
+   inactive anon lru list is full of dirty pages by 3 so it just returns
+   without  any reclaim progress.
+6. do_try_to_free_pages doesn't set may_writepage due to zero total_scanned.
+   Because sc->nr_scanned is increased by shrink_page_list but we don't call
+   shrink_page_list in 5 due to short of isolated pages.
+
+Above loop is continued until OOM happens.
+The problem didn't happen before [1] was merged because old logic's
+isolatation in shrink_inactive_list was successful and tried to call
+shrink_page_list to pageout them but it still ends up failed to page out
+by may_writepage. But important point is that sc->nr_scanned was increased
+although we couldn't swap out them so do_try_to_free_pages could set
+may_writepages.
+
+Since [1] was introduced, it's not a good idea any more to depends on
+only the number of scanned pages for setting may_writepage. So this patch
+adds new trigger point of setting may_writepage as below DEF_PRIOIRTY - 2
+which is used to show the significant memory pressure in VM so it's good
+fit for our purpose which would be better to lose power saving or clickety
+rather than OOM killing.
+
+[1] f80c067[mm: zone_reclaim: make isolate_lru_page() filter-aware]
+
+Reported-by: Luigi Semenzato <semenzato@google.com>
+Signed-off-by: Minchan Kim <minchan@kernel.org>
+---
+ mm/vmscan.c |   15 ++++++++++-----
+ 1 file changed, 10 insertions(+), 5 deletions(-)
+
+diff --git a/mm/vmscan.c b/mm/vmscan.c
+index 740bad9..d333df0 100644
+--- a/mm/vmscan.c
++++ b/mm/vmscan.c
+@@ -2204,6 +2204,13 @@ static unsigned long do_try_to_free_pages(struct zonelist *zonelist,
+ 			goto out;
+ 
+ 		/*
++		 * If we're getting trouble reclaiming, start doing
++		 * writepage even in laptop mode.
++		 */
++		if (sc->priority < DEF_PRIORITY - 2)
++			sc->may_writepage = 1;
++
++		/*
+ 		 * Try to write back as many pages as we just scanned.  This
+ 		 * tends to cause slow streaming writers to write data to the
+ 		 * disk smoothly, at the dirtying rate, which is nice.   But
+@@ -2774,12 +2781,10 @@ loop_again:
+ 			}
+ 
+ 			/*
+-			 * If we've done a decent amount of scanning and
+-			 * the reclaim ratio is low, start doing writepage
+-			 * even in laptop mode
++			 * If we're getting trouble reclaiming, start doing
++			 * writepage even in laptop mode.
+ 			 */
+-			if (total_scanned > SWAP_CLUSTER_MAX * 2 &&
+-			    total_scanned > sc.nr_reclaimed + sc.nr_reclaimed / 2)
++			if (sc.priority < DEF_PRIORITY - 2)
+ 				sc.may_writepage = 1;
+ 
+ 			if (zone->all_unreclaimable) {
+-- 
+1.7.9.5
+
+>- 
+Kind regards,
+Minchan Kim
diff --git a/a/content_digest b/N1/content_digest
index e532c90..98b21f4 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -113,6 +113,99 @@
  "\n"
  "[1] mm: prevent addition of pages to swap if may_writepage is unset\n"
  "\n"
- -------------- &< --------------------
+ "-------------- &< --------------------\n"
+ "\n"
+ ">From 94086dc7152359d052802c55c82ef19509fe8cce Mon Sep 17 00:00:00 2001\n"
+ "From: Minchan Kim <minchan@kernel.org>\n"
+ "Date: Mon, 21 Jan 2013 10:43:43 +0900\n"
+ "Subject: [PATCH] mm: Use up free swap space before reaching OOM kill\n"
+ "\n"
+ "Recently, Luigi reported there are lots of free swap space when\n"
+ "OOM happens. It's easily reproduced on zram-over-swap, where\n"
+ "many instance of memory hogs are running and laptop_mode is enabled.\n"
+ "He said there was no problem when he disabled laptop_mode.\n"
+ "The problem when I investigate problem is following as.\n"
+ "\n"
+ "Assumption for easy explanation: There are no page cache page in system\n"
+ "because they all are already reclaimed.\n"
+ "\n"
+ "1. try_to_free_pages disable may_writepage when laptop_mode is enabled.\n"
+ "2. shrink_inactive_list isolates victim pages from inactive anon lru list.\n"
+ "3. shrink_page_list adds them to swapcache via add_to_swap but it doesn't\n"
+ "   pageout because sc->may_writepage is 0 so the page is rotated back into\n"
+ "   inactive anon lru list. The add_to_swap made the page Dirty by SetPageDirty.\n"
+ "4. 3 couldn't reclaim any pages so do_try_to_free_pages increase priority and\n"
+ "   retry reclaim with higher priority.\n"
+ "5. shrink_inactlive_list try to isolate victim pages from inactive anon lru list\n"
+ "   but got failed because it try to isolate pages with ISOLATE_CLEAN mode but\n"
+ "   inactive anon lru list is full of dirty pages by 3 so it just returns\n"
+ "   without  any reclaim progress.\n"
+ "6. do_try_to_free_pages doesn't set may_writepage due to zero total_scanned.\n"
+ "   Because sc->nr_scanned is increased by shrink_page_list but we don't call\n"
+ "   shrink_page_list in 5 due to short of isolated pages.\n"
+ "\n"
+ "Above loop is continued until OOM happens.\n"
+ "The problem didn't happen before [1] was merged because old logic's\n"
+ "isolatation in shrink_inactive_list was successful and tried to call\n"
+ "shrink_page_list to pageout them but it still ends up failed to page out\n"
+ "by may_writepage. But important point is that sc->nr_scanned was increased\n"
+ "although we couldn't swap out them so do_try_to_free_pages could set\n"
+ "may_writepages.\n"
+ "\n"
+ "Since [1] was introduced, it's not a good idea any more to depends on\n"
+ "only the number of scanned pages for setting may_writepage. So this patch\n"
+ "adds new trigger point of setting may_writepage as below DEF_PRIOIRTY - 2\n"
+ "which is used to show the significant memory pressure in VM so it's good\n"
+ "fit for our purpose which would be better to lose power saving or clickety\n"
+ "rather than OOM killing.\n"
+ "\n"
+ "[1] f80c067[mm: zone_reclaim: make isolate_lru_page() filter-aware]\n"
+ "\n"
+ "Reported-by: Luigi Semenzato <semenzato@google.com>\n"
+ "Signed-off-by: Minchan Kim <minchan@kernel.org>\n"
+ "---\n"
+ " mm/vmscan.c |   15 ++++++++++-----\n"
+ " 1 file changed, 10 insertions(+), 5 deletions(-)\n"
+ "\n"
+ "diff --git a/mm/vmscan.c b/mm/vmscan.c\n"
+ "index 740bad9..d333df0 100644\n"
+ "--- a/mm/vmscan.c\n"
+ "+++ b/mm/vmscan.c\n"
+ "@@ -2204,6 +2204,13 @@ static unsigned long do_try_to_free_pages(struct zonelist *zonelist,\n"
+ " \t\t\tgoto out;\n"
+ " \n"
+ " \t\t/*\n"
+ "+\t\t * If we're getting trouble reclaiming, start doing\n"
+ "+\t\t * writepage even in laptop mode.\n"
+ "+\t\t */\n"
+ "+\t\tif (sc->priority < DEF_PRIORITY - 2)\n"
+ "+\t\t\tsc->may_writepage = 1;\n"
+ "+\n"
+ "+\t\t/*\n"
+ " \t\t * Try to write back as many pages as we just scanned.  This\n"
+ " \t\t * tends to cause slow streaming writers to write data to the\n"
+ " \t\t * disk smoothly, at the dirtying rate, which is nice.   But\n"
+ "@@ -2774,12 +2781,10 @@ loop_again:\n"
+ " \t\t\t}\n"
+ " \n"
+ " \t\t\t/*\n"
+ "-\t\t\t * If we've done a decent amount of scanning and\n"
+ "-\t\t\t * the reclaim ratio is low, start doing writepage\n"
+ "-\t\t\t * even in laptop mode\n"
+ "+\t\t\t * If we're getting trouble reclaiming, start doing\n"
+ "+\t\t\t * writepage even in laptop mode.\n"
+ " \t\t\t */\n"
+ "-\t\t\tif (total_scanned > SWAP_CLUSTER_MAX * 2 &&\n"
+ "-\t\t\t    total_scanned > sc.nr_reclaimed + sc.nr_reclaimed / 2)\n"
+ "+\t\t\tif (sc.priority < DEF_PRIORITY - 2)\n"
+ " \t\t\t\tsc.may_writepage = 1;\n"
+ " \n"
+ " \t\t\tif (zone->all_unreclaimable) {\n"
+ "-- \n"
+ "1.7.9.5\n"
+ "\n"
+ ">- \n"
+ "Kind regards,\n"
+ Minchan Kim
 
-f24e6816dc1716024159a5b1304ffdffeb6d520d2b418a5ab40cda015ad78d99
+742eeab2af972617c23335ee52a17e13824770e0222958528ee317e2d9ee97df

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.