lkml.org 
[lkml]   [2017]   [Mar]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 29/91] mm: vmpressure: fix sending wrong events on underflow
    Date
    4.4-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Vinayak Menon <vinmenon@codeaurora.org>

    commit e1587a4945408faa58d0485002c110eb2454740c upstream.

    At the end of a window period, if the reclaimed pages is greater than
    scanned, an unsigned underflow can result in a huge pressure value and
    thus a critical event. Reclaimed pages is found to go higher than
    scanned because of the addition of reclaimed slab pages to reclaimed in
    shrink_node without a corresponding increment to scanned pages.

    Minchan Kim mentioned that this can also happen in the case of a THP
    page where the scanned is 1 and reclaimed could be 512.

    Link: http://lkml.kernel.org/r/1486641577-11685-1-git-send-email-vinmenon@codeaurora.org
    Signed-off-by: Vinayak Menon <vinmenon@codeaurora.org>
    Acked-by: Minchan Kim <minchan@kernel.org>
    Acked-by: Michal Hocko <mhocko@suse.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Mel Gorman <mgorman@techsingularity.net>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: Rik van Riel <riel@redhat.com>
    Cc: Vladimir Davydov <vdavydov.dev@gmail.com>
    Cc: Anton Vorontsov <anton.vorontsov@linaro.org>
    Cc: Shiraz Hashim <shashim@codeaurora.org>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    mm/vmpressure.c | 10 +++++++++-
    1 file changed, 9 insertions(+), 1 deletion(-)

    --- a/mm/vmpressure.c
    +++ b/mm/vmpressure.c
    @@ -112,9 +112,16 @@ static enum vmpressure_levels vmpressure
    unsigned long reclaimed)
    {
    unsigned long scale = scanned + reclaimed;
    - unsigned long pressure;
    + unsigned long pressure = 0;

    /*
    + * reclaimed can be greater than scanned in cases
    + * like THP, where the scanned is 1 and reclaimed
    + * could be 512
    + */
    + if (reclaimed >= scanned)
    + goto out;
    + /*
    * We calculate the ratio (in percents) of how many pages were
    * scanned vs. reclaimed in a given time frame (window). Note that
    * time is in VM reclaimer's "ticks", i.e. number of pages
    @@ -124,6 +131,7 @@ static enum vmpressure_levels vmpressure
    pressure = scale - (reclaimed * scale / scanned);
    pressure = pressure * 100 / scale;

    +out:
    pr_debug("%s: %3lu (s: %lu r: %lu)\n", __func__, pressure,
    scanned, reclaimed);


    \
     
     \ /
      Last update: 2017-03-10 12:44    [W:4.149 / U:0.088 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site