lkml.org 
[lkml]   [2016]   [Jul]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5/5] mm, vmscan: Account for skipped pages as a partial scan
    Date
    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@techsingularity.net>
    ---
    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.
    + */
    + 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
    \
     
     \ /
      Last update: 2016-07-21 16:41    [W:3.771 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site