* [BUGFIX][PATCH] vmscan: don't use return value trick when oom_killer_disabled
@ 2010-09-01 0:31 KOSAKI Motohiro
2010-09-01 1:45 ` Minchan Kim
0 siblings, 1 reply; 9+ messages in thread
From: KOSAKI Motohiro @ 2010-09-01 0:31 UTC (permalink / raw)
To: Johannes Weiner, Rik van Riel, Rafael J. Wysocki, M. Vefa Bicakci,
LKML, linux-mm, Andrew Morton
Cc: kosaki.motohiro
M. Vefa Bicakci reported 2.6.35 kernel hang up when hibernation on his
32bit 3GB mem machine. (https://bugzilla.kernel.org/show_bug.cgi?id=16771)
Also he was bisected first bad commit is below
commit bb21c7ce18eff8e6e7877ca1d06c6db719376e3c
Author: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Date: Fri Jun 4 14:15:05 2010 -0700
vmscan: fix do_try_to_free_pages() return value when priority==0 reclaim failure
At first impression, this seemed very strange because the above commit only
chenged function return value and hibernate_preallocate_memory() ignore
return value of shrink_all_memory(). But it's related.
Now, page allocation from hibernation code may enter infinite loop if
the system has highmem.
The reasons are two. 1) hibernate_preallocate_memory() call
alloc_pages() wrong order 2) vmscan don't care enough OOM case when
oom_killer_disabled.
This patch only fix (2). Why is oom_killer_disabled so special?
because when hibernation case, zone->all_unreclaimable never be turned on.
hibernation freeze all tasks at first, then kswapd can't works in this
case, and zone->all_unreclaimable is only turned from kswapd.
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Rik van Riel <riel@redhat.com>
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
Cc: M. Vefa Bicakci <bicave@superonline.com>
Cc: stable@kernel.org
Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
---
mm/vmscan.c | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/mm/vmscan.c b/mm/vmscan.c
index c391c32..1919d8a 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -40,6 +40,7 @@
#include <linux/memcontrol.h>
#include <linux/delayacct.h>
#include <linux/sysctl.h>
+#include <linux/oom.h>
#include <asm/tlbflush.h>
#include <asm/div64.h>
@@ -1931,7 +1932,7 @@ out:
return sc->nr_reclaimed;
/* top priority shrink_zones still had more to do? don't OOM, then */
- if (scanning_global_lru(sc) && !all_unreclaimable)
+ if (scanning_global_lru(sc) && !all_unreclaimable && !oom_killer_disabled)
return 1;
return 0;
--
1.6.5.2
--
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>
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [BUGFIX][PATCH] vmscan: don't use return value trick when oom_killer_disabled
2010-09-01 0:31 [BUGFIX][PATCH] vmscan: don't use return value trick when oom_killer_disabled KOSAKI Motohiro
@ 2010-09-01 1:45 ` Minchan Kim
2010-09-01 1:55 ` KOSAKI Motohiro
0 siblings, 1 reply; 9+ messages in thread
From: Minchan Kim @ 2010-09-01 1:45 UTC (permalink / raw)
To: KOSAKI Motohiro
Cc: Johannes Weiner, Rik van Riel, Rafael J. Wysocki, M. Vefa Bicakci,
LKML, linux-mm, Andrew Morton
Hi KOSAKI,
On Wed, Sep 1, 2010 at 9:31 AM, KOSAKI Motohiro
<kosaki.motohiro@jp.fujitsu.com> wrote:
> M. Vefa Bicakci reported 2.6.35 kernel hang up when hibernation on his
> 32bit 3GB mem machine. (https://bugzilla.kernel.org/show_bug.cgi?id=16771)
> Also he was bisected first bad commit is below
>
> commit bb21c7ce18eff8e6e7877ca1d06c6db719376e3c
> Author: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
> Date: Fri Jun 4 14:15:05 2010 -0700
>
> vmscan: fix do_try_to_free_pages() return value when priority==0 reclaim failure
>
> At first impression, this seemed very strange because the above commit only
> chenged function return value and hibernate_preallocate_memory() ignore
> return value of shrink_all_memory(). But it's related.
>
> Now, page allocation from hibernation code may enter infinite loop if
> the system has highmem.
>
> The reasons are two. 1) hibernate_preallocate_memory() call
> alloc_pages() wrong order 2) vmscan don't care enough OOM case when
> oom_killer_disabled.
>
> This patch only fix (2). Why is oom_killer_disabled so special?
> because when hibernation case, zone->all_unreclaimable never be turned on
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [BUGFIX][PATCH] vmscan: don't use return value trick when oom_killer_disabled
2010-09-01 1:45 ` Minchan Kim
@ 2010-09-01 1:55 ` KOSAKI Motohiro
2010-09-01 2:01 ` Minchan Kim
0 siblings, 1 reply; 9+ messages in thread
From: KOSAKI Motohiro @ 2010-09-01 1:55 UTC (permalink / raw)
To: Minchan Kim
Cc: kosaki.motohiro, Johannes Weiner, Rik van Riel, Rafael J. Wysocki,
M. Vefa Bicakci, LKML, linux-mm, Andrew Morton
Hi
Thank you for good commenting!
> I don't like use oom_killer_disabled directly.
> That's because we have wrapper inline functions to handle the
> variable(ex, oom_killer_[disable/enable]).
> It means we are reluctant to use the global variable directly.
> So should we make new function as is_oom_killer_disable?
>
> I think NO.
>
> As I read your description, this problem is related to only hibernation.
> Since hibernation freezes all processes(include kswapd), this problem
> happens. Of course, now oom_killer_disabled is used by only
> hibernation. But it can be used others in future(Off-topic : I don't
> want it). Others can use it without freezing processes. Then kswapd
> can set zone->all_unreclaimable and the problem can't happen.
>
> So I want to use sc->hibernation_mode which is already used
> do_try_to_free_pages instead of oom_killer_disabled.
Unfortunatelly, It's impossible. shrink_all_memory() turn on
sc->hibernation_mode. but other hibernation caller merely call
alloc_pages(). so we don't have any hint.
--
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>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [BUGFIX][PATCH] vmscan: don't use return value trick when oom_killer_disabled
2010-09-01 1:55 ` KOSAKI Motohiro
@ 2010-09-01 2:01 ` Minchan Kim
2010-09-01 15:56 ` Minchan Kim
0 siblings, 1 reply; 9+ messages in thread
From: Minchan Kim @ 2010-09-01 2:01 UTC (permalink / raw)
To: KOSAKI Motohiro
Cc: Johannes Weiner, Rik van Riel, Rafael J. Wysocki, M. Vefa Bicakci,
LKML, linux-mm, Andrew Morton
On Wed, Sep 1, 2010 at 10:55 AM, KOSAKI Motohiro
<kosaki.motohiro@jp.fujitsu.com> wrote:
> Hi
>
> Thank you for good commenting!
>
>
>> I don't like use oom_killer_disabled directly.
>> That's because we have wrapper inline functions to handle the
>> variable(ex, oom_killer_[disable/enable]).
>> It means we are reluctant to use the global variable directly.
>> So should we make new function as is_oom_killer_disable?
>>
>> I think NO.
>>
>> As I read your description, this problem is related to only hibernation.
>> Since hibernation freezes all processes(include kswapd), this problem
>> happens. Of course, now oom_killer_disabled is used by only
>> hibernation. But it can be used others in future(Off-topic : I don't
>> want it). Others can use it without freezing processes. Then kswapd
>> can set zone->all_unreclaimable and the problem can't happen.
>>
>> So I want to use sc->hibernation_mode which is already used
>> do_try_to_free_pages instead of oom_killer_disabled.
>
> Unfortunatelly, It's impossible. shrink_all_memory() turn on
> sc->hibernation_mode. but other hibernation caller merely call
> alloc_pages(). so we don't have any hint.
>
Ahh.. True. Sorry for that.
I will think some better method.
if I can't find it, I don't mind this patch. :)
Thanks.
--
Kind regards,
Minchan Kim
--
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>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [BUGFIX][PATCH] vmscan: don't use return value trick when oom_killer_disabled
2010-09-01 2:01 ` Minchan Kim
@ 2010-09-01 15:56 ` Minchan Kim
2010-09-02 0:57 ` KOSAKI Motohiro
0 siblings, 1 reply; 9+ messages in thread
From: Minchan Kim @ 2010-09-01 15:56 UTC (permalink / raw)
To: KOSAKI Motohiro
Cc: Johannes Weiner, Rik van Riel, Rafael J. Wysocki, M. Vefa Bicakci,
LKML, linux-mm, Andrew Morton
On Wed, Sep 01, 2010 at 11:01:43AM +0900, Minchan Kim wrote:
> On Wed, Sep 1, 2010 at 10:55 AM, KOSAKI Motohiro
> <kosaki.motohiro@jp.fujitsu.com> wrote:
> > Hi
> >
> > Thank you for good commenting!
> >
> >
> >> I don't like use oom_killer_disabled directly.
> >> That's because we have wrapper inline functions to handle the
> >> variable(ex, oom_killer_[disable/enable]).
> >> It means we are reluctant to use the global variable directly.
> >> So should we make new function as is_oom_killer_disable?
> >>
> >> I think NO.
> >>
> >> As I read your description, this problem is related to only hibernation.
> >> Since hibernation freezes all processes(include kswapd), this problem
> >> happens. Of course, now oom_killer_disabled is used by only
> >> hibernation. But it can be used others in future(Off-topic : I don't
> >> want it). Others can use it without freezing processes. Then kswapd
> >> can set zone->all_unreclaimable and the problem can't happen.
> >>
> >> So I want to use sc->hibernation_mode which is already used
> >> do_try_to_free_pages instead of oom_killer_disabled.
> >
> > Unfortunatelly, It's impossible. shrink_all_memory() turn on
> > sc->hibernation_mode. but other hibernation caller merely call
> > alloc_pages(). so we don't have any hint.
> >
> Ahh.. True. Sorry for that.
> I will think some better method.
> if I can't find it, I don't mind this patch. :)
It seems that the poblem happens following as.
(I might miss something since I just read theyour description)
hibernation
oom_disable
alloc_pages
do_try_to_free_pages
if (scanning_global_lru(sc) && !all_unreclaimable)
return 1;
If kswapd is not freezed, it would set zone->all_unreclaimable to 1 and then
shrink_zones maybe return true. so alloc_pages could go to _nopage_.
If it is, it's no problem.
Right?
I think the problem would come from shrink_zones.
It set false to all_unreclaimable blindly even though shrink_zone can't reclaim
any page. It doesn't make sense.
How about this?
I think we need this regardless of the problem.
What do you think about?
diff --git a/mm/vmscan.c b/mm/vmscan.c
index d8fd87d..22017b3 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -1901,7 +1901,8 @@ static bool shrink_zones(int priority, struct zonelist *zonelist,
}
shrink_zone(priority, zone, sc);
- all_unreclaimable = false;
+ if (sc->nr_reclaimed)
+ all_unreclaimable = false;
}
return all_unreclaimable;
}
--
Kind regards,
Minchan Kim
--
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>
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [BUGFIX][PATCH] vmscan: don't use return value trick when oom_killer_disabled
2010-09-01 15:56 ` Minchan Kim
@ 2010-09-02 0:57 ` KOSAKI Motohiro
2010-09-02 2:55 ` Minchan Kim
0 siblings, 1 reply; 9+ messages in thread
From: KOSAKI Motohiro @ 2010-09-02 0:57 UTC (permalink / raw)
To: Minchan Kim
Cc: kosaki.motohiro, Johannes Weiner, Rik van Riel, Rafael J. Wysocki,
M. Vefa Bicakci, LKML, linux-mm, Andrew Morton
> On Wed, Sep 01, 2010 at 11:01:43AM +0900, Minchan Kim wrote:
> > On Wed, Sep 1, 2010 at 10:55 AM, KOSAKI Motohiro
> > <kosaki.motohiro@jp.fujitsu.com> wrote:
> > > Hi
> > >
> > > Thank you for good commenting!
> > >
> > >
> > >> I don't like use oom_killer_disabled directly.
> > >> That's because we have wrapper inline functions to handle the
> > >> variable(ex, oom_killer_[disable/enable]).
> > >> It means we are reluctant to use the global variable directly.
> > >> So should we make new function as is_oom_killer_disable?
> > >>
> > >> I think NO.
> > >>
> > >> As I read your description, this problem is related to only hibernation.
> > >> Since hibernation freezes all processes(include kswapd), this problem
> > >> happens. Of course, now oom_killer_disabled is used by only
> > >> hibernation. But it can be used others in future(Off-topic : I don't
> > >> want it). Others can use it without freezing processes. Then kswapd
> > >> can set zone->all_unreclaimable and the problem can't happen.
> > >>
> > >> So I want to use sc->hibernation_mode which is already used
> > >> do_try_to_free_pages instead of oom_killer_disabled.
> > >
> > > Unfortunatelly, It's impossible. shrink_all_memory() turn on
> > > sc->hibernation_mode. but other hibernation caller merely call
> > > alloc_pages(). so we don't have any hint.
> > >
> > Ahh.. True. Sorry for that.
> > I will think some better method.
> > if I can't find it, I don't mind this patch. :)
>
> It seems that the poblem happens following as.
> (I might miss something since I just read theyour description)
>
> hibernation
> oom_disable
> alloc_pages
> do_try_to_free_pages
> if (scanning_global_lru(sc) && !all_unreclaimable)
> return 1;
> If kswapd is not freezed, it would set zone->all_unreclaimable to 1 and then
> shrink_zones maybe return true. so alloc_pages could go to _nopage_.
> If it is, it's no problem.
> Right?
>
> I think the problem would come from shrink_zones.
> It set false to all_unreclaimable blindly even though shrink_zone can't reclaim
> any page. It doesn't make sense.
> How about this?
> I think we need this regardless of the problem.
> What do you think about?
>
> diff --git a/mm/vmscan.c b/mm/vmscan.c
> index d8fd87d..22017b3 100644
> --- a/mm/vmscan.c
> +++ b/mm/vmscan.c
> @@ -1901,7 +1901,8 @@ static bool shrink_zones(int priority, struct zonelist *zonelist,
> }
>
> shrink_zone(priority, zone, sc);
> - all_unreclaimable = false;
> + if (sc->nr_reclaimed)
> + all_unreclaimable = false;
> }
> return all_unreclaimable;
> }
here is brief of shrink_zones().
for_each_zone_zonelist_nodemask(zone, z, zonelist,
gfp_zone(sc->gfp_mask), sc->nodemask) {
if (!populated_zone(zone))
continue;
if (zone->all_unreclaimable && priority != DEF_PRIORITY)
continue; /* Let kswapd poll it */
shrink_zone(priority, zone, sc);
all_unreclaimable = false;
}
That said,
all zone's zone->all_unreclaimable are true
-> all_unreclaimable local variable become true.
otherwise
-> all_unreclaimable local variable become false.
The intention is, we don't want to invoke oom-killer if there are
!all_unreclaimable zones. So your patch makes big design change and
seems to increase OOM risk.
I don't want to send risky patch to -stable.
--
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>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [BUGFIX][PATCH] vmscan: don't use return value trick when oom_killer_disabled
2010-09-02 0:57 ` KOSAKI Motohiro
@ 2010-09-02 2:55 ` Minchan Kim
2010-09-02 3:05 ` KOSAKI Motohiro
0 siblings, 1 reply; 9+ messages in thread
From: Minchan Kim @ 2010-09-02 2:55 UTC (permalink / raw)
To: KOSAKI Motohiro
Cc: Johannes Weiner, Rik van Riel, Rafael J. Wysocki, M. Vefa Bicakci,
LKML, linux-mm, Andrew Morton
[-- Attachment #1: Type: text/plain, Size: 7209 bytes --]
On Thu, Sep 2, 2010 at 9:57 AM, KOSAKI Motohiro
<kosaki.motohiro@jp.fujitsu.com> wrote:
>> On Wed, Sep 01, 2010 at 11:01:43AM +0900, Minchan Kim wrote:
>> > On Wed, Sep 1, 2010 at 10:55 AM, KOSAKI Motohiro
>> > <kosaki.motohiro@jp.fujitsu.com> wrote:
>> > > Hi
>> > >
>> > > Thank you for good commenting!
>> > >
>> > >
>> > >> I don't like use oom_killer_disabled directly.
>> > >> That's because we have wrapper inline functions to handle the
>> > >> variable(ex, oom_killer_[disable/enable]).
>> > >> It means we are reluctant to use the global variable directly.
>> > >> So should we make new function as is_oom_killer_disable?
>> > >>
>> > >> I think NO.
>> > >>
>> > >> As I read your description, this problem is related to only hibernation.
>> > >> Since hibernation freezes all processes(include kswapd), this problem
>> > >> happens. Of course, now oom_killer_disabled is used by only
>> > >> hibernation. But it can be used others in future(Off-topic : I don't
>> > >> want it). Others can use it without freezing processes. Then kswapd
>> > >> can set zone->all_unreclaimable and the problem can't happen.
>> > >>
>> > >> So I want to use sc->hibernation_mode which is already used
>> > >> do_try_to_free_pages instead of oom_killer_disabled.
>> > >
>> > > Unfortunatelly, It's impossible. shrink_all_memory() turn on
>> > > sc->hibernation_mode. but other hibernation caller merely call
>> > > alloc_pages(). so we don't have any hint.
>> > >
>> > Ahh.. True. Sorry for that.
>> > I will think some better method.
>> > if I can't find it, I don't mind this patch. :)
>>
>> It seems that the poblem happens following as.
>> (I might miss something since I just read theyour description)
>>
>> hibernation
>> oom_disable
>> alloc_pages
>> do_try_to_free_pages
>> if (scanning_global_lru(sc) && !all_unreclaimable)
>> return 1;
>> If kswapd is not freezed, it would set zone->all_unreclaimable to 1 and then
>> shrink_zones maybe return true. so alloc_pages could go to _nopage_.
>> If it is, it's no problem.
>> Right?
>>
>> I think the problem would come from shrink_zones.
>> It set false to all_unreclaimable blindly even though shrink_zone can't reclaim
>> any page. It doesn't make sense.
>> How about this?
>> I think we need this regardless of the problem.
>> What do you think about?
>>
>> diff --git a/mm/vmscan.c b/mm/vmscan.c
>> index d8fd87d..22017b3 100644
>> --- a/mm/vmscan.c
>> +++ b/mm/vmscan.c
>> @@ -1901,7 +1901,8 @@ static bool shrink_zones(int priority, struct zonelist *zonelist,
>> }
>>
>> shrink_zone(priority, zone, sc);
>> - all_unreclaimable = false;
>> + if (sc->nr_reclaimed)
>> + all_unreclaimable = false;
>> }
>> return all_unreclaimable;
>> }
>
> here is brief of shrink_zones().
>
> for_each_zone_zonelist_nodemask(zone, z, zonelist,
> gfp_zone(sc->gfp_mask), sc->nodemask) {
> if (!populated_zone(zone))
> continue;
> if (zone->all_unreclaimable && priority != DEF_PRIORITY)
> continue; /* Let kswapd poll it */
> shrink_zone(priority, zone, sc);
> all_unreclaimable = false;
> }
>
> That said,
> all zone's zone->all_unreclaimable are true
> -> all_unreclaimable local variable become true.
> otherwise
> -> all_unreclaimable local variable become false.
>
> The intention is, we don't want to invoke oom-killer if there are
> !all_unreclaimable zones. So your patch makes big design change and
> seems to increase OOM risk.
Right. Thanks for pointing me out.
> I don't want to send risky patch to -stable.
Still I don't want to use oom_killer_disabled magic.
But I don't want to prevent urgent stable patch due to my just nitpick.
This is my last try(just quick patch, even I didn't tried compile test).
If this isn't good, first of all, let's try merge yours.
And then we can fix it later.
Thanks for comment.
-- CUT HERE --
Why do we check zone->all_unreclaimable in only kswapd?
If kswapd is freezed in hibernation, OOM can happen.
Let's the check in direct reclaim path, too.
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 3109ff7..41493ba 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -1878,12 +1878,11 @@ static void shrink_zone(int priority, struct zone *zone,
* If a zone is deemed to be full of pinned pages then just give it a light
* scan then give up on it.
*/
-static bool shrink_zones(int priority, struct zonelist *zonelist,
+static void shrink_zones(int priority, struct zonelist *zonelist,
struct scan_control *sc)
{
struct zoneref *z;
struct zone *zone;
- bool all_unreclaimable = true;
for_each_zone_zonelist_nodemask(zone, z, zonelist,
gfp_zone(sc->gfp_mask), sc->nodemask) {
@@ -1901,8 +1900,25 @@ static bool shrink_zones(int priority, struct
zonelist *zonelist,
}
shrink_zone(priority, zone, sc);
- all_unreclaimable = false;
}
+}
+
+static inline int all_unreclaimable(struct zonelist *zonelist, struct
scan_control *sc)
+{
+ struct zoneref *z;
+ struct zone *zone;
+ bool all_unreclaimable = true;
+
+ for_each_zone_zonelist_nodemask(zone, z, zonelist,
+ gfp_zone(sc->gfp_mask), sc->nodemask) {
+ if (!populated_zone(zone))
+ continue;
+ if (zone->pages_scanned < (zone_reclaimable_pages(zone) * 6)) {
+ all_unreclaimable = false;
+ break;
+ }
+ }
+
return all_unreclaimable;
}
@@ -1926,7 +1942,6 @@ static unsigned long do_try_to_free_pages(struct
zonelist *zonelist,
struct scan_control *sc)
{
int priority;
- bool all_unreclaimable;
unsigned long total_scanned = 0;
struct reclaim_state *reclaim_state = current->reclaim_state;
struct zoneref *z;
@@ -1943,7 +1958,7 @@ static unsigned long do_try_to_free_pages(struct
zonelist *zonelist,
sc->nr_scanned = 0;
if (!priority)
disable_swap_token();
- all_unreclaimable = shrink_zones(priority, zonelist, sc);
+ shrink_zones(priority, zonelist, sc);
/*
* Don't shrink slabs when reclaiming memory from
* over limit cgroups
@@ -2005,7 +2020,7 @@ out:
return sc->nr_reclaimed;
/* top priority shrink_zones still had more to do? don't OOM, then */
- if (scanning_global_lru(sc) && !all_unreclaimable)
+ if (scanning_global_lru(sc) && !all_unreclaimable(zonelist, sc))
return 1;
return 0;
--
Kind regards,
Minchan Kim
[-- Attachment #2: all_unreclaimable.patch --]
[-- Type: text/x-diff, Size: 2184 bytes --]
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 3109ff7..41493ba 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -1878,12 +1878,11 @@ static void shrink_zone(int priority, struct zone *zone,
* If a zone is deemed to be full of pinned pages then just give it a light
* scan then give up on it.
*/
-static bool shrink_zones(int priority, struct zonelist *zonelist,
+static void shrink_zones(int priority, struct zonelist *zonelist,
struct scan_control *sc)
{
struct zoneref *z;
struct zone *zone;
- bool all_unreclaimable = true;
for_each_zone_zonelist_nodemask(zone, z, zonelist,
gfp_zone(sc->gfp_mask), sc->nodemask) {
@@ -1901,8 +1900,25 @@ static bool shrink_zones(int priority, struct zonelist *zonelist,
}
shrink_zone(priority, zone, sc);
- all_unreclaimable = false;
}
+}
+
+static inline int all_unreclaimable(struct zonelist *zonelist, struct scan_control *sc)
+{
+ struct zoneref *z;
+ struct zone *zone;
+ bool all_unreclaimable = true;
+
+ for_each_zone_zonelist_nodemask(zone, z, zonelist,
+ gfp_zone(sc->gfp_mask), sc->nodemask) {
+ if (!populated_zone(zone))
+ continue;
+ if (zone->pages_scanned < (zone_reclaimable_pages(zone) * 6)) {
+ all_unreclaimable = false;
+ break;
+ }
+ }
+
return all_unreclaimable;
}
@@ -1926,7 +1942,6 @@ static unsigned long do_try_to_free_pages(struct zonelist *zonelist,
struct scan_control *sc)
{
int priority;
- bool all_unreclaimable;
unsigned long total_scanned = 0;
struct reclaim_state *reclaim_state = current->reclaim_state;
struct zoneref *z;
@@ -1943,7 +1958,7 @@ static unsigned long do_try_to_free_pages(struct zonelist *zonelist,
sc->nr_scanned = 0;
if (!priority)
disable_swap_token();
- all_unreclaimable = shrink_zones(priority, zonelist, sc);
+ shrink_zones(priority, zonelist, sc);
/*
* Don't shrink slabs when reclaiming memory from
* over limit cgroups
@@ -2005,7 +2020,7 @@ out:
return sc->nr_reclaimed;
/* top priority shrink_zones still had more to do? don't OOM, then */
- if (scanning_global_lru(sc) && !all_unreclaimable)
+ if (scanning_global_lru(sc) && !all_unreclaimable(zonelist, sc))
return 1;
return 0;
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [BUGFIX][PATCH] vmscan: don't use return value trick when oom_killer_disabled
2010-09-02 2:55 ` Minchan Kim
@ 2010-09-02 3:05 ` KOSAKI Motohiro
2010-09-02 3:18 ` Minchan Kim
0 siblings, 1 reply; 9+ messages in thread
From: KOSAKI Motohiro @ 2010-09-02 3:05 UTC (permalink / raw)
To: Minchan Kim
Cc: kosaki.motohiro, Johannes Weiner, Rik van Riel, Rafael J. Wysocki,
M. Vefa Bicakci, LKML, linux-mm, Andrew Morton
> > I don't want to send risky patch to -stable.
>
> Still I don't want to use oom_killer_disabled magic.
> But I don't want to prevent urgent stable patch due to my just nitpick.
>
> This is my last try(just quick patch, even I didn't tried compile test).
Looks like conceptually correct. If you will test it and fix whitespace damage,
I'll ack this one gladly.
Thanks.
> If this isn't good, first of all, let's try merge yours.
> And then we can fix it later.
>
> Thanks for comment.
>
> -- CUT HERE --
>
> Why do we check zone->all_unreclaimable in only kswapd?
> If kswapd is freezed in hibernation, OOM can happen.
> Let's the check in direct reclaim path, too.
>
>
> diff --git a/mm/vmscan.c b/mm/vmscan.c
> index 3109ff7..41493ba 100644
> --- a/mm/vmscan.c
> +++ b/mm/vmscan.c
> @@ -1878,12 +1878,11 @@ static void shrink_zone(int priority, struct zone *zone,
> * If a zone is deemed to be full of pinned pages then just give it a light
> * scan then give up on it.
> */
> -static bool shrink_zones(int priority, struct zonelist *zonelist,
> +static void shrink_zones(int priority, struct zonelist *zonelist,
> struct scan_control *sc)
> {
> struct zoneref *z;
> struct zone *zone;
> - bool all_unreclaimable = true;
>
> for_each_zone_zonelist_nodemask(zone, z, zonelist,
> gfp_zone(sc->gfp_mask), sc->nodemask) {
> @@ -1901,8 +1900,25 @@ static bool shrink_zones(int priority, struct
> zonelist *zonelist,
> }
>
> shrink_zone(priority, zone, sc);
> - all_unreclaimable = false;
> }
> +}
> +
> +static inline int all_unreclaimable(struct zonelist *zonelist, struct
> scan_control *sc)
> +{
> + struct zoneref *z;
> + struct zone *zone;
> + bool all_unreclaimable = true;
> +
> + for_each_zone_zonelist_nodemask(zone, z, zonelist,
> + gfp_zone(sc->gfp_mask), sc->nodemask) {
> + if (!populated_zone(zone))
> + continue;
> + if (zone->pages_scanned < (zone_reclaimable_pages(zone) * 6)) {
> + all_unreclaimable = false;
> + break;
> + }
> + }
> +
> return all_unreclaimable;
> }
>
> @@ -1926,7 +1942,6 @@ static unsigned long do_try_to_free_pages(struct
> zonelist *zonelist,
> struct scan_control *sc)
> {
> int priority;
> - bool all_unreclaimable;
> unsigned long total_scanned = 0;
> struct reclaim_state *reclaim_state = current->reclaim_state;
> struct zoneref *z;
> @@ -1943,7 +1958,7 @@ static unsigned long do_try_to_free_pages(struct
> zonelist *zonelist,
> sc->nr_scanned = 0;
> if (!priority)
> disable_swap_token();
> - all_unreclaimable = shrink_zones(priority, zonelist, sc);
> + shrink_zones(priority, zonelist, sc);
> /*
> * Don't shrink slabs when reclaiming memory from
> * over limit cgroups
> @@ -2005,7 +2020,7 @@ out:
> return sc->nr_reclaimed;
>
> /* top priority shrink_zones still had more to do? don't OOM, then */
> - if (scanning_global_lru(sc) && !all_unreclaimable)
> + if (scanning_global_lru(sc) && !all_unreclaimable(zonelist, sc))
> return 1;
>
> return 0;
>
>
> --
> Kind regards,
> Minchan Kim
--
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>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [BUGFIX][PATCH] vmscan: don't use return value trick when oom_killer_disabled
2010-09-02 3:05 ` KOSAKI Motohiro
@ 2010-09-02 3:18 ` Minchan Kim
0 siblings, 0 replies; 9+ messages in thread
From: Minchan Kim @ 2010-09-02 3:18 UTC (permalink / raw)
To: KOSAKI Motohiro
Cc: Johannes Weiner, Rik van Riel, Rafael J. Wysocki, M. Vefa Bicakci,
LKML, linux-mm, Andrew Morton
On Thu, Sep 2, 2010 at 12:05 PM, KOSAKI Motohiro
<kosaki.motohiro@jp.fujitsu.com> wrote:
>> > I don't want to send risky patch to -stable.
>>
>> Still I don't want to use oom_killer_disabled magic.
>> But I don't want to prevent urgent stable patch due to my just nitpick.
>>
>> This is my last try(just quick patch, even I didn't tried compile test).
>
> Looks like conceptually correct. If you will test it and fix whitespace damage,
> I'll ack this one gladly.
>
> Thanks.
>
I will resend formal patch ASAP. Maybe tonight after out of office.
Thanks for quick reply.
--
Kind regards,
Minchan Kim
--
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>
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2010-09-02 3:18 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-09-01 0:31 [BUGFIX][PATCH] vmscan: don't use return value trick when oom_killer_disabled KOSAKI Motohiro
2010-09-01 1:45 ` Minchan Kim
2010-09-01 1:55 ` KOSAKI Motohiro
2010-09-01 2:01 ` Minchan Kim
2010-09-01 15:56 ` Minchan Kim
2010-09-02 0:57 ` KOSAKI Motohiro
2010-09-02 2:55 ` Minchan Kim
2010-09-02 3:05 ` KOSAKI Motohiro
2010-09-02 3:18 ` Minchan Kim
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).