From: Vladimir Davydov <vdavydov@parallels.com>
To: Johannes Weiner <hannes@cmpxchg.org>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Dave Chinner <david@fromorbit.com>,
linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: Re: [patch] mm: vmscan: invoke slab shrinkers from shrink_zone()
Date: Fri, 28 Nov 2014 19:06:37 +0300 [thread overview]
Message-ID: <20141128160637.GH6948@esperanza> (raw)
In-Reply-To: <1416939830-20289-1-git-send-email-hannes@cmpxchg.org>
Hi Johannes,
The patch generally looks good to me, because it simplifies the code
flow significantly and makes it easier for me to introduce per memcg
slab reclaim (thanks!). However, it has one serious flaw. Please see the
comment inline.
On Tue, Nov 25, 2014 at 01:23:50PM -0500, Johannes Weiner wrote:
[...]
> diff --git a/mm/vmscan.c b/mm/vmscan.c
> index a384339bf718..8c2b45bfe610 100644
> --- a/mm/vmscan.c
> +++ b/mm/vmscan.c
[...]
> @@ -2376,12 +2407,7 @@ static bool shrink_zones(struct zonelist *zonelist, struct scan_control *sc)
> struct zone *zone;
> unsigned long nr_soft_reclaimed;
> unsigned long nr_soft_scanned;
> - unsigned long lru_pages = 0;
> - struct reclaim_state *reclaim_state = current->reclaim_state;
> gfp_t orig_mask;
> - struct shrink_control shrink = {
> - .gfp_mask = sc->gfp_mask,
> - };
> enum zone_type requested_highidx = gfp_zone(sc->gfp_mask);
> bool reclaimable = false;
>
> @@ -2394,10 +2420,8 @@ static bool shrink_zones(struct zonelist *zonelist, struct scan_control *sc)
> if (buffer_heads_over_limit)
> sc->gfp_mask |= __GFP_HIGHMEM;
>
> - nodes_clear(shrink.nodes_to_scan);
> -
> for_each_zone_zonelist_nodemask(zone, z, zonelist,
> - gfp_zone(sc->gfp_mask), sc->nodemask) {
> + requested_highidx, sc->nodemask) {
> if (!populated_zone(zone))
> continue;
> /*
> @@ -2409,9 +2433,6 @@ static bool shrink_zones(struct zonelist *zonelist, struct scan_control *sc)
> GFP_KERNEL | __GFP_HARDWALL))
> continue;
>
> - lru_pages += zone_reclaimable_pages(zone);
> - node_set(zone_to_nid(zone), shrink.nodes_to_scan);
> -
> if (sc->priority != DEF_PRIORITY &&
> !zone_reclaimable(zone))
> continue; /* Let kswapd poll it */
> @@ -2450,7 +2471,7 @@ static bool shrink_zones(struct zonelist *zonelist, struct scan_control *sc)
> /* need some check for avoid more shrink_zone() */
> }
>
> - if (shrink_zone(zone, sc))
> + if (shrink_zone(zone, sc, zone_idx(zone) == requested_highidx))
> reclaimable = true;
>
> if (global_reclaim(sc) &&
If the highest zone (zone_idx=requested_highidx) is not populated, we
won't scan slab caches on direct reclaim, which may result in OOM kill
even if there are plenty of freeable dentries available.
It's especially relevant for VMs, which often have less than 4G of RAM,
in which case we will only have ZONE_DMA and ZONE_DMA32 populated and
empty ZONE_NORMAL on x86_64.
What about distributing the pressure proportionally to the number of
present pages on the zone? Something like this:
next prev parent reply other threads:[~2014-11-28 16:06 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-25 18:23 [patch] mm: vmscan: invoke slab shrinkers from shrink_zone() Johannes Weiner
2014-11-26 21:41 ` Andrew Morton
2014-11-28 16:06 ` Vladimir Davydov [this message]
2015-04-16 3:57 ` Joonsoo Kim
2015-04-16 14:34 ` Johannes Weiner
2015-04-16 23:17 ` Dave Chinner
2015-04-17 5:09 ` Joonsoo Kim
2015-04-17 5:06 ` Joonsoo Kim
2015-04-24 11:47 ` Vlastimil Babka
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20141128160637.GH6948@esperanza \
--to=vdavydov@parallels.com \
--cc=akpm@linux-foundation.org \
--cc=david@fromorbit.com \
--cc=hannes@cmpxchg.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).