From: Johannes Weiner <hannes@cmpxchg.org>
To: MinChan Kim <minchan.kim@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
linux-mm <linux-mm@kvack.org>,
LKML <linux-kernel@vger.kernel.org>,
"Rafael J. Wysocki" <rjw@sisk.pl>, Rik van Riel <riel@redhat.com>
Subject: Re: [PATCH v2] shrink_all_memory() use sc.nr_reclaimed
Date: Thu, 12 Feb 2009 12:25:58 +0100 [thread overview]
Message-ID: <20090212112557.GA6677@cmpxchg.org> (raw)
In-Reply-To: <20090212163310.b204e80a.minchan.kim@barrios-desktop>
On Thu, Feb 12, 2009 at 04:33:10PM +0900, MinChan Kim wrote:
>
> Impact: cleanup
>
> Commit a79311c14eae4bb946a97af25f3e1b17d625985d "vmscan: bail out of
> direct reclaim after swap_cluster_max pages" moved the nr_reclaimed
> counter into the scan control to accumulate the number of all
> reclaimed pages in a reclaim invocation.
>
> The shrink_all_memory() can use the same mechanism. it increases code
> consistency and readability.
>
> It's based on mmtom 2009-02-11-17-15.
>
> Signed-off-by: MinChan Kim <minchan.kim@gmail.com>
> Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
> Cc: Johannes Weiner <hannes@cmpxchg.org>
> Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
> Cc: Rik van Riel <riel@redhat.com>
>
>
> ---
> mm/vmscan.c | 51 ++++++++++++++++++++++++++++++---------------------
> 1 files changed, 30 insertions(+), 21 deletions(-)
>
> diff --git a/mm/vmscan.c b/mm/vmscan.c
> index ae4202b..caa2de5 100644
> --- a/mm/vmscan.c
> +++ b/mm/vmscan.c
> @@ -2055,16 +2055,15 @@ unsigned long global_lru_pages(void)
> #ifdef CONFIG_PM
> /*
> * Helper function for shrink_all_memory(). Tries to reclaim 'nr_pages' pages
> - * from LRU lists system-wide, for given pass and priority, and returns the
> - * number of reclaimed pages
> + * from LRU lists system-wide, for given pass and priority.
> *
> * For pass > 3 we also try to shrink the LRU lists that contain a few pages
> */
> -static unsigned long shrink_all_zones(unsigned long nr_pages, int prio,
> +static void shrink_all_zones(unsigned long nr_pages, int prio,
> int pass, struct scan_control *sc)
> {
> struct zone *zone;
> - unsigned long ret = 0;
> + unsigned long nr_reclaimed = 0;
Why this extra variable? You could use sc->nr_reclaimed throughout,
like you do in shrink_all_memory().
> for_each_populated_zone(zone) {
> enum lru_list l;
> @@ -2087,14 +2086,16 @@ static unsigned long shrink_all_zones(unsigned long nr_pages, int prio,
>
> zone->lru[l].nr_scan = 0;
> nr_to_scan = min(nr_pages, lru_pages);
> - ret += shrink_list(l, nr_to_scan, zone,
> + nr_reclaimed += shrink_list(l, nr_to_scan, zone,
> sc, prio);
> - if (ret >= nr_pages)
> - return ret;
> + if (nr_reclaimed >= nr_pages) {
> + sc->nr_reclaimed = nr_reclaimed;
> + return;
> + }
> }
> }
> }
> - return ret;
> + sc->nr_reclaimed = nr_reclaimed;
> }
>
> /*
> @@ -2126,13 +2127,15 @@ unsigned long shrink_all_memory(unsigned long nr_pages)
> /* If slab caches are huge, it's better to hit them first */
> while (nr_slab >= lru_pages) {
> reclaim_state.reclaimed_slab = 0;
> - shrink_slab(nr_pages, sc.gfp_mask, lru_pages);
> + shrink_slab(sc.swap_cluster_max, sc.gfp_mask, lru_pages);
> if (!reclaim_state.reclaimed_slab)
> break;
>
> - ret += reclaim_state.reclaimed_slab;
> - if (ret >= nr_pages)
> + sc.nr_reclaimed += reclaim_state.reclaimed_slab;
> + if (sc.nr_reclaimed >= sc.swap_cluster_max) {
> + ret = sc.nr_reclaimed;
Why do you still maintain `ret'? Just return sc.nr_reclaimed at the
end and get rid of ret alltogether.
Using sc.swap_cluster_max here seems to be a good idea at first sight
but really it is not.
Usually, swap_cluster_max is smaller than the reclaim goal and reclaim
code uses it combined with other conditions to bail out BEFORE the
original reclaim goal is met. But sc.swap_cluster_max IS our original
reclaim goal, so it means something different.
It's btw buggy, we never decrease swap_cluster_max which leads to
funky overreclaim in shrink_inactive_list(). I will send the original
patch from Kosaki-san for using sc->nr_reclaimed and a patch for the
overreclaim problem.
Hannes
WARNING: multiple messages have this Message-ID (diff)
From: Johannes Weiner <hannes@cmpxchg.org>
To: MinChan Kim <minchan.kim@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
linux-mm <linux-mm@kvack.org>,
LKML <linux-kernel@vger.kernel.org>,
"Rafael J. Wysocki" <rjw@sisk.pl>, Rik van Riel <riel@redhat.com>
Subject: Re: [PATCH v2] shrink_all_memory() use sc.nr_reclaimed
Date: Thu, 12 Feb 2009 12:25:58 +0100 [thread overview]
Message-ID: <20090212112557.GA6677@cmpxchg.org> (raw)
In-Reply-To: <20090212163310.b204e80a.minchan.kim@barrios-desktop>
On Thu, Feb 12, 2009 at 04:33:10PM +0900, MinChan Kim wrote:
>
> Impact: cleanup
>
> Commit a79311c14eae4bb946a97af25f3e1b17d625985d "vmscan: bail out of
> direct reclaim after swap_cluster_max pages" moved the nr_reclaimed
> counter into the scan control to accumulate the number of all
> reclaimed pages in a reclaim invocation.
>
> The shrink_all_memory() can use the same mechanism. it increases code
> consistency and readability.
>
> It's based on mmtom 2009-02-11-17-15.
>
> Signed-off-by: MinChan Kim <minchan.kim@gmail.com>
> Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
> Cc: Johannes Weiner <hannes@cmpxchg.org>
> Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
> Cc: Rik van Riel <riel@redhat.com>
>
>
> ---
> mm/vmscan.c | 51 ++++++++++++++++++++++++++++++---------------------
> 1 files changed, 30 insertions(+), 21 deletions(-)
>
> diff --git a/mm/vmscan.c b/mm/vmscan.c
> index ae4202b..caa2de5 100644
> --- a/mm/vmscan.c
> +++ b/mm/vmscan.c
> @@ -2055,16 +2055,15 @@ unsigned long global_lru_pages(void)
> #ifdef CONFIG_PM
> /*
> * Helper function for shrink_all_memory(). Tries to reclaim 'nr_pages' pages
> - * from LRU lists system-wide, for given pass and priority, and returns the
> - * number of reclaimed pages
> + * from LRU lists system-wide, for given pass and priority.
> *
> * For pass > 3 we also try to shrink the LRU lists that contain a few pages
> */
> -static unsigned long shrink_all_zones(unsigned long nr_pages, int prio,
> +static void shrink_all_zones(unsigned long nr_pages, int prio,
> int pass, struct scan_control *sc)
> {
> struct zone *zone;
> - unsigned long ret = 0;
> + unsigned long nr_reclaimed = 0;
Why this extra variable? You could use sc->nr_reclaimed throughout,
like you do in shrink_all_memory().
> for_each_populated_zone(zone) {
> enum lru_list l;
> @@ -2087,14 +2086,16 @@ static unsigned long shrink_all_zones(unsigned long nr_pages, int prio,
>
> zone->lru[l].nr_scan = 0;
> nr_to_scan = min(nr_pages, lru_pages);
> - ret += shrink_list(l, nr_to_scan, zone,
> + nr_reclaimed += shrink_list(l, nr_to_scan, zone,
> sc, prio);
> - if (ret >= nr_pages)
> - return ret;
> + if (nr_reclaimed >= nr_pages) {
> + sc->nr_reclaimed = nr_reclaimed;
> + return;
> + }
> }
> }
> }
> - return ret;
> + sc->nr_reclaimed = nr_reclaimed;
> }
>
> /*
> @@ -2126,13 +2127,15 @@ unsigned long shrink_all_memory(unsigned long nr_pages)
> /* If slab caches are huge, it's better to hit them first */
> while (nr_slab >= lru_pages) {
> reclaim_state.reclaimed_slab = 0;
> - shrink_slab(nr_pages, sc.gfp_mask, lru_pages);
> + shrink_slab(sc.swap_cluster_max, sc.gfp_mask, lru_pages);
> if (!reclaim_state.reclaimed_slab)
> break;
>
> - ret += reclaim_state.reclaimed_slab;
> - if (ret >= nr_pages)
> + sc.nr_reclaimed += reclaim_state.reclaimed_slab;
> + if (sc.nr_reclaimed >= sc.swap_cluster_max) {
> + ret = sc.nr_reclaimed;
Why do you still maintain `ret'? Just return sc.nr_reclaimed at the
end and get rid of ret alltogether.
Using sc.swap_cluster_max here seems to be a good idea at first sight
but really it is not.
Usually, swap_cluster_max is smaller than the reclaim goal and reclaim
code uses it combined with other conditions to bail out BEFORE the
original reclaim goal is met. But sc.swap_cluster_max IS our original
reclaim goal, so it means something different.
It's btw buggy, we never decrease swap_cluster_max which leads to
funky overreclaim in shrink_inactive_list(). I will send the original
patch from Kosaki-san for using sc->nr_reclaimed and a patch for the
overreclaim problem.
Hannes
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2009-02-12 11:26 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-02-12 7:33 [PATCH v2] shrink_all_memory() use sc.nr_reclaimed MinChan Kim
2009-02-12 7:33 ` MinChan Kim
2009-02-12 9:31 ` MinChan Kim
2009-02-12 9:31 ` MinChan Kim
2009-02-12 11:25 ` Johannes Weiner [this message]
2009-02-12 11:25 ` Johannes Weiner
2009-02-12 13:11 ` MinChan Kim
2009-02-12 13:11 ` MinChan Kim
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=20090212112557.GA6677@cmpxchg.org \
--to=hannes@cmpxchg.org \
--cc=akpm@linux-foundation.org \
--cc=kosaki.motohiro@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=minchan.kim@gmail.com \
--cc=riel@redhat.com \
--cc=rjw@sisk.pl \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.