Re: [PATCH 5/5] mm, vmscan: Account for skipped pages as a partial scan
From: Minchan Kim <minchan@kernel.org>
Date: 2016-07-25 08:38:52
Also in:
lkml
On Thu, Jul 21, 2016 at 03:11:01PM +0100, Mel Gorman wrote:
quoted hunk ↗ jump to hunk
Page reclaim determines whether a pgdat is unreclaimable by examining how many pages have been scanned since a page was freed and comparing that to the LRU sizes. Skipped pages are not reclaim candidates but contribute to scanned. This can prematurely mark a pgdat as unreclaimable and trigger an OOM kill. This patch accounts for skipped pages as a partial scan so that an unreclaimable pgdat will still be marked as such but by scaling the cost of a skip, it'll avoid the pgdat being marked prematurely. Signed-off-by: Mel Gorman <redacted> --- mm/vmscan.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-)diff --git a/mm/vmscan.c b/mm/vmscan.c index 6810d81f60c7..e5af357dd4ac 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c@@ -1424,7 +1424,7 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan, LIST_HEAD(pages_skipped); for (scan = 0; scan < nr_to_scan && nr_taken < nr_to_scan && - !list_empty(src); scan++) { + !list_empty(src);) { struct page *page; page = lru_to_page(src);@@ -1438,6 +1438,12 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan, continue; } + /* + * Account for scanned and skipped separetly to avoid the pgdat + * being prematurely marked unreclaimable by pgdat_reclaimable. + */ + scan++; + switch (__isolate_lru_page(page, mode)) { case 0: nr_pages = hpage_nr_pages(page);@@ -1465,14 +1471,24 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan, */ if (!list_empty(&pages_skipped)) { int zid; + unsigned long total_skipped = 0; - list_splice(&pages_skipped, src); for (zid = 0; zid < MAX_NR_ZONES; zid++) { if (!nr_skipped[zid]) continue; __count_zid_vm_events(PGSCAN_SKIP, zid, nr_skipped[zid]); + total_skipped += nr_skipped[zid]; } + + /* + * Account skipped pages as a partial scan as the pgdat may be + * close to unreclaimable. If the LRU list is empty, account + * skipped pages as a full scan. + */
node-lru made OOM detection lengthy because a freeing of any zone will reset NR_PAGES_SCANNED easily so that it's hard to meet a situation pgdat_reclaimable returns *false*. When I perform stress test, it seems I encounter the situation easily although I have no number now. Anyway, this patch makes sense to me because it's better than now. About accounting scan, I supports this idea. But still, I doubt it's okay to continue skipping pages under irq-disabled-spin lock without any condition. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>