On Thu, Jul 21, 2016 at 03:11:01PM +0100, Mel Gorman wrote: > 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 <mgorman@xxxxxxxxxxxxxxxxxxx> > --- > 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@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>