From: Michal Hocko <mhocko@suse.cz> To: David Rientjes <rientjes@google.com> Cc: Andrew Morton <akpm@linux-foundation.org>, KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>, KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: Re: [patch 2/4] mm, oom: cleanup pagefault oom handler Date: Wed, 14 Nov 2012 14:32:07 +0100 [thread overview] Message-ID: <20121114133207.GB4929@dhcp22.suse.cz> (raw) In-Reply-To: <alpine.DEB.2.00.1211140113020.32125@chino.kir.corp.google.com> On Wed 14-11-12 01:15:22, David Rientjes wrote: > To lock the entire system from parallel oom killing, it's possible to > pass in a zonelist with all zones rather than using > for_each_populated_zone() for the iteration. This obsoletes > try_set_system_oom() and clear_system_oom() so that they can be removed. > > Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> > Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> > Cc: Michal Hocko <mhocko@suse.cz> > Signed-off-by: David Rientjes <rientjes@google.com> The only _potential_ problem I can see with this is that if we ever have a HW which requires that a node zonelist doesn't contain others nodes' zones then this wouldn't work. I do not think such a HW exists. Such a HW would need more changes in the code anyway. so Reviewed-by: Michal Hocko <mhocko@suse.cz> > --- > mm/oom_kill.c | 49 +++++++------------------------------------------ > 1 files changed, 7 insertions(+), 42 deletions(-) > > diff --git a/mm/oom_kill.c b/mm/oom_kill.c > --- a/mm/oom_kill.c > +++ b/mm/oom_kill.c > @@ -591,43 +591,6 @@ void clear_zonelist_oom(struct zonelist *zonelist, gfp_t gfp_mask) > spin_unlock(&zone_scan_lock); > } > > -/* > - * Try to acquire the oom killer lock for all system zones. Returns zero if a > - * parallel oom killing is taking place, otherwise locks all zones and returns > - * non-zero. > - */ > -static int try_set_system_oom(void) > -{ > - struct zone *zone; > - int ret = 1; > - > - spin_lock(&zone_scan_lock); > - for_each_populated_zone(zone) > - if (zone_is_oom_locked(zone)) { > - ret = 0; > - goto out; > - } > - for_each_populated_zone(zone) > - zone_set_flag(zone, ZONE_OOM_LOCKED); > -out: > - spin_unlock(&zone_scan_lock); > - return ret; > -} > - > -/* > - * Clears ZONE_OOM_LOCKED for all system zones so that failed allocation > - * attempts or page faults may now recall the oom killer, if necessary. > - */ > -static void clear_system_oom(void) > -{ > - struct zone *zone; > - > - spin_lock(&zone_scan_lock); > - for_each_populated_zone(zone) > - zone_clear_flag(zone, ZONE_OOM_LOCKED); > - spin_unlock(&zone_scan_lock); > -} > - > /** > * out_of_memory - kill the "best" process when we run out of memory > * @zonelist: zonelist pointer > @@ -708,15 +671,17 @@ out: > > /* > * The pagefault handler calls here because it is out of memory, so kill a > - * memory-hogging task. If a populated zone has ZONE_OOM_LOCKED set, a parallel > - * oom killing is already in progress so do nothing. If a task is found with > - * TIF_MEMDIE set, it has been killed so do nothing and allow it to exit. > + * memory-hogging task. If any populated zone has ZONE_OOM_LOCKED set, a > + * parallel oom killing is already in progress so do nothing. > */ > void pagefault_out_of_memory(void) > { > - if (try_set_system_oom()) { > + struct zonelist *zonelist = node_zonelist(first_online_node, > + GFP_KERNEL); > + > + if (try_set_zonelist_oom(zonelist, GFP_KERNEL)) { > out_of_memory(NULL, 0, 0, NULL, false); > - clear_system_oom(); > + clear_zonelist_oom(zonelist, GFP_KERNEL); > } > schedule_timeout_killable(1); > } -- Michal Hocko SUSE Labs
WARNING: multiple messages have this Message-ID (diff)
From: Michal Hocko <mhocko@suse.cz> To: David Rientjes <rientjes@google.com> Cc: Andrew Morton <akpm@linux-foundation.org>, KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>, KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: Re: [patch 2/4] mm, oom: cleanup pagefault oom handler Date: Wed, 14 Nov 2012 14:32:07 +0100 [thread overview] Message-ID: <20121114133207.GB4929@dhcp22.suse.cz> (raw) In-Reply-To: <alpine.DEB.2.00.1211140113020.32125@chino.kir.corp.google.com> On Wed 14-11-12 01:15:22, David Rientjes wrote: > To lock the entire system from parallel oom killing, it's possible to > pass in a zonelist with all zones rather than using > for_each_populated_zone() for the iteration. This obsoletes > try_set_system_oom() and clear_system_oom() so that they can be removed. > > Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> > Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> > Cc: Michal Hocko <mhocko@suse.cz> > Signed-off-by: David Rientjes <rientjes@google.com> The only _potential_ problem I can see with this is that if we ever have a HW which requires that a node zonelist doesn't contain others nodes' zones then this wouldn't work. I do not think such a HW exists. Such a HW would need more changes in the code anyway. so Reviewed-by: Michal Hocko <mhocko@suse.cz> > --- > mm/oom_kill.c | 49 +++++++------------------------------------------ > 1 files changed, 7 insertions(+), 42 deletions(-) > > diff --git a/mm/oom_kill.c b/mm/oom_kill.c > --- a/mm/oom_kill.c > +++ b/mm/oom_kill.c > @@ -591,43 +591,6 @@ void clear_zonelist_oom(struct zonelist *zonelist, gfp_t gfp_mask) > spin_unlock(&zone_scan_lock); > } > > -/* > - * Try to acquire the oom killer lock for all system zones. Returns zero if a > - * parallel oom killing is taking place, otherwise locks all zones and returns > - * non-zero. > - */ > -static int try_set_system_oom(void) > -{ > - struct zone *zone; > - int ret = 1; > - > - spin_lock(&zone_scan_lock); > - for_each_populated_zone(zone) > - if (zone_is_oom_locked(zone)) { > - ret = 0; > - goto out; > - } > - for_each_populated_zone(zone) > - zone_set_flag(zone, ZONE_OOM_LOCKED); > -out: > - spin_unlock(&zone_scan_lock); > - return ret; > -} > - > -/* > - * Clears ZONE_OOM_LOCKED for all system zones so that failed allocation > - * attempts or page faults may now recall the oom killer, if necessary. > - */ > -static void clear_system_oom(void) > -{ > - struct zone *zone; > - > - spin_lock(&zone_scan_lock); > - for_each_populated_zone(zone) > - zone_clear_flag(zone, ZONE_OOM_LOCKED); > - spin_unlock(&zone_scan_lock); > -} > - > /** > * out_of_memory - kill the "best" process when we run out of memory > * @zonelist: zonelist pointer > @@ -708,15 +671,17 @@ out: > > /* > * The pagefault handler calls here because it is out of memory, so kill a > - * memory-hogging task. If a populated zone has ZONE_OOM_LOCKED set, a parallel > - * oom killing is already in progress so do nothing. If a task is found with > - * TIF_MEMDIE set, it has been killed so do nothing and allow it to exit. > + * memory-hogging task. If any populated zone has ZONE_OOM_LOCKED set, a > + * parallel oom killing is already in progress so do nothing. > */ > void pagefault_out_of_memory(void) > { > - if (try_set_system_oom()) { > + struct zonelist *zonelist = node_zonelist(first_online_node, > + GFP_KERNEL); > + > + if (try_set_zonelist_oom(zonelist, GFP_KERNEL)) { > out_of_memory(NULL, 0, 0, NULL, false); > - clear_system_oom(); > + clear_zonelist_oom(zonelist, GFP_KERNEL); > } > schedule_timeout_killable(1); > } -- Michal Hocko SUSE Labs -- 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:[~2012-11-14 13:32 UTC|newest] Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top 2012-11-14 9:15 [patch 1/4] mm, oom: ensure sysrq+f always passes valid zonelist David Rientjes 2012-11-14 9:15 ` David Rientjes 2012-11-14 9:15 ` [patch 2/4] mm, oom: cleanup pagefault oom handler David Rientjes 2012-11-14 9:15 ` David Rientjes 2012-11-14 13:32 ` Michal Hocko [this message] 2012-11-14 13:32 ` Michal Hocko 2012-11-15 8:45 ` Kamezawa Hiroyuki 2012-11-15 8:45 ` Kamezawa Hiroyuki 2012-11-15 9:02 ` Michal Hocko 2012-11-15 9:02 ` Michal Hocko 2012-11-15 21:01 ` David Rientjes 2012-11-15 21:01 ` David Rientjes 2012-11-14 9:15 ` [patch 3/4] mm, oom: remove redundant sleep in " David Rientjes 2012-11-14 9:15 ` David Rientjes 2012-11-14 13:45 ` Michal Hocko 2012-11-14 13:45 ` Michal Hocko 2012-11-15 8:46 ` Kamezawa Hiroyuki 2012-11-15 8:46 ` Kamezawa Hiroyuki 2012-11-14 9:15 ` [patch 4/4] mm, oom: remove statically defined arch functions of same name David Rientjes 2012-11-14 9:15 ` David Rientjes 2012-11-14 9:15 ` David Rientjes 2012-11-14 9:15 ` David Rientjes 2012-11-14 13:47 ` Michal Hocko 2012-11-14 13:47 ` Michal Hocko 2012-11-14 13:47 ` Michal Hocko 2012-11-14 13:47 ` Michal Hocko 2012-11-15 8:48 ` Kamezawa Hiroyuki 2012-11-15 8:48 ` Kamezawa Hiroyuki 2012-11-15 8:48 ` Kamezawa Hiroyuki 2012-11-15 8:48 ` Kamezawa Hiroyuki 2012-11-14 10:50 ` [patch 1/4] mm, oom: ensure sysrq+f always passes valid zonelist Michal Hocko 2012-11-14 10:50 ` Michal Hocko 2012-11-14 11:03 ` David Rientjes 2012-11-14 11:03 ` David Rientjes 2012-11-14 13:31 ` Michal Hocko 2012-11-14 13:31 ` Michal Hocko 2012-11-15 8:41 ` Kamezawa Hiroyuki 2012-11-15 8:41 ` Kamezawa Hiroyuki
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=20121114133207.GB4929@dhcp22.suse.cz \ --to=mhocko@suse.cz \ --cc=akpm@linux-foundation.org \ --cc=kamezawa.hiroyu@jp.fujitsu.com \ --cc=kosaki.motohiro@jp.fujitsu.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=rientjes@google.com \ /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: linkBe 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.