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++; > + This logic has potential unbounded retry problem. src would not become empty if __isolate_lru_page() return -EBUSY since we move failed page to src list again in this case. Thanks. > 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. > + */ > + scan += list_empty(src) ? total_skipped : total_skipped >> 2; > + > + list_splice(&pages_skipped, src); > } > *nr_scanned = scan; > trace_mm_vmscan_lru_isolate(sc->reclaim_idx, sc->order, nr_to_scan, scan, > -- > 2.6.4 > > -- > 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> -- 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>