|
Next: Accepted msort 8.52-1.1 (source i386 all)
|
| Author |
Message |
External

Since: Sep 09, 2005 Posts: 97
|
(Msg. 1) Posted: Wed Nov 04, 2009 4:25 am
Post subject: [BUGFIX][PATCH] oom-kill: fix NUMA consraint check with nodemask Archived from groups: linux>kernel (more info?)
|
|
|
If clarification is not enough, let me know.
Thank you for all your review in RFC version.
Thanks,
-Kame
==
From: KAMEZAWA Hiroyuki <kamezawa.hioryu RemoveThis @jp.fujitsu.com>
Fixing node-oriented allocation handling in oom-kill.c
I myself think this as bugfix not as enhancement.
In these days, things are changed as
- alloc_pages() eats nodemask as its arguments, __alloc_pages_nodemask().
- mempolicy don't maintain its own private zonelists.
(And cpuset doesn't use nodemask for __alloc_pages_nodemask())
So, current oom-killer's check function is wrong.
This patch does
- check nodemask, if nodemask && nodemask != node_states[N_HIGH_MEMORY]
this is never be CONSTRAINT_NONE. We assume this from mempolicy.
- Scan all zonelist under nodemask, if it hits cpuset's wall
this faiulre is from cpuset.
And
- modifies the caller of out_of_memory not to call oom if __GFP_THISNODE.
This doesn't change "current" behavior.
If callers use __GFP_THISNODE, it should handle "page allocation failure"
by itself.
Changelog: 2009/11/04
- cut out as bug-fix for passing nodemask.
- added GFP_THISNODE sanity check.
Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hioryu RemoveThis @jp.fujitsu.com>
---
drivers/char/sysrq.c | 2 +-
mm/oom_kill.c | 38 ++++++++++++++++++++++++++------------
mm/page_alloc.c | 10 ++++++++--
3 files changed, 35 insertions(+), 15 deletions(-)
Index: mmotm-2.6.32-Nov2/drivers/char/sysrq.c
===================================================================
--- mmotm-2.6.32-Nov2.orig/drivers/char/sysrq.c
+++ mmotm-2.6.32-Nov2/drivers/char/sysrq.c
@@ -339,7 +339,7 @@ static struct sysrq_key_op sysrq_term_op
static void moom_callback(struct work_struct *ignored)
{
- out_of_memory(node_zonelist(0, GFP_KERNEL), GFP_KERNEL, 0);
+ out_of_memory(node_zonelist(0, GFP_KERNEL), GFP_KERNEL, 0, NULL);
}
static DECLARE_WORK(moom_work, moom_callback);
Index: mmotm-2.6.32-Nov2/mm/oom_kill.c
===================================================================
--- mmotm-2.6.32-Nov2.orig/mm/oom_kill.c
+++ mmotm-2.6.32-Nov2/mm/oom_kill.c
@@ -196,27 +196,40 @@ unsigned long badness(struct task_struct
/*
* Determine the type of allocation constraint.
*/
+#ifdef CONFIG_NUMA
static inline enum oom_constraint constrained_alloc(struct zonelist *zonelist,
- gfp_t gfp_mask)
+ gfp_t gfp_mask, nodemask_t *nodemask)
{
-#ifdef CONFIG_NUMA
struct zone *zone;
struct zoneref *z;
enum zone_type high_zoneidx = gfp_zone(gfp_mask);
- nodemask_t nodes = node_states[N_HIGH_MEMORY];
+ int ret = CONSTRAINT_NONE;
- for_each_zone_zonelist(zone, z, zonelist, high_zoneidx)
- if (cpuset_zone_allowed_softwall(zone, gfp_mask))
- node_clear(zone_to_nid(zone), nodes);
- else
+ /*
+ * The nodemask here is a nodemask passed to alloc_pages(). Now,
+ * cpuset doesn't use this nodemask for its hardwall/softwall/hierarchy
+ * feature. Then, only mempolicy use this nodemask.
+ */
+ if (nodemask && nodes_equal(*nodemask, node_states[N_HIGH_MEMORY]))
+ ret = CONSTRAINT_MEMORY_POLICY;
+
+ /* Check this allocation failure is caused by cpuset's wall function */
+ for_each_zone_zonelist_nodemask(zone, z, zonelist,
+ high_zoneidx, nodemask)
+ if (!cpuset_zone_allowed_softwall(zone, gfp_mask))
return CONSTRAINT_CPUSET;
- if (!nodes_empty(nodes))
- return CONSTRAINT_MEMORY_POLICY;
-#endif
+ /* __GFP_THISNODE never calls OOM.*/
+ return ret;
+}
+#else
+static inline enum oom_constraint constrained_alloc(struct zonelist *zonelist,
+ gfp_t gfp_mask, nodemask_t *nodemask)
+{
return CONSTRAINT_NONE;
}
+#endif
/*
* Simple selection loop. We chose the process with the highest
@@ -603,7 +616,8 @@ rest_and_return:
* OR try to be smart about which process to kill. Note that we
* don't have to be perfect here, we just have to be good.
*/
-void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, int order)
+void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask,
+ int order, nodemask_t *nodemask)
{
unsigned long freed = 0;
enum oom_constraint constraint;
@@ -622,7 +636,7 @@ void out_of_memory(struct zonelist *zone
* Check if there were limitations on the allocation (only relevant for
* NUMA) that may require different handling.
*/
- constraint = constrained_alloc(zonelist, gfp_mask);
+ constraint = constrained_alloc(zonelist, gfp_mask, nodemask);
read_lock(&tasklist_lock);
switch (constraint) {
Index: mmotm-2.6.32-Nov2/mm/page_alloc.c
===================================================================
--- mmotm-2.6.32-Nov2.orig/mm/page_alloc.c
+++ mmotm-2.6.32-Nov2/mm/page_alloc.c
@@ -1667,9 +1667,15 @@ __alloc_pages_may_oom(gfp_t gfp_mask, un
/* The OOM killer will not help higher order allocs */
if (order > PAGE_ALLOC_COSTLY_ORDER && !(gfp_mask & __GFP_NOFAIL))
goto out;
-
+ /*
+ * In usual, GFP_THISNODE contains __GFP_NORETRY and we never hit this.
+ * Sanity check for bare calls of __GFP_THISNODE, not real OOM.
+ * Note: Hugepage uses it but will hit PAGE_ALLOC_COSTLY_ORDER.
+ */
+ if (gfp_mask & __GFP_THISNODE)
+ goto out;
/* Exhausted what can be done so it's blamo time */
- out_of_memory(zonelist, gfp_mask, order);
+ out_of_memory(zonelist, gfp_mask, order, nodemask);
out:
clear_zonelist_oom(zonelist, gfp_mask);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo RemoveThis @vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/ |
|
| Back to top |
|
 |  |
External

Since: Sep 09, 2005 Posts: 97
|
(Msg. 2) Posted: Thu Nov 05, 2009 8:25 pm
Post subject: [BUGFIX][PATCH] oom-kill: fix NUMA consraint check with nodemask v2 [Login to view extended thread Info.] Archived from groups: per prev. post (more info?)
|
|
|
On Wed, 4 Nov 2009 17:09:44 +0900
KAMEZAWA Hiroyuki <kamezawa.hiroyu DeleteThis @jp.fujitsu.com> wrote:
> drivers/char/sysrq.c | 2 +-
> mm/oom_kill.c | 38 ++++++++++++++++++++++++++------------
> mm/page_alloc.c | 10 ++++++++--
Very sorry, this patch doesn't includes changes to oom.h...
From: KAMEZAWA Hiroyuki <kamezawa.hioryu DeleteThis @jp.fujitsu.com>
Fixing node-oriented allocation handling in oom-kill.c
I myself think this as bugfix not as ehnancement.
In these days, things are changed as
- alloc_pages() eats nodemask as its arguments, __alloc_pages_nodemask().
- mempolicy don't maintain its own private zonelists.
(And cpuset doesn't use nodemask for __alloc_pages_nodemask())
So, current oom-killer's check function is wrong.
This patch does
- check nodemask, if nodemask && nodemask != node_states[N_HIGH_MEMORY]
this is never be CONSTRAINT_NONE. We assume this from mempolicy.
- Scan all zonelist under nodemask, if it hits cpuset's wall
this faiulre is from cpuset.
And
- modifies the caller of out_of_memory not to call oom if __GFP_THISNODE.
This doesn't change "current" behavior.
If callers use __GFP_THISNODE, it should handle "page allocation failure"
by itself.
Changelog: 2009/11/06
- fixed lack of oom.h
Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hioryu DeleteThis @jp.fujitsu.com>
---
drivers/char/sysrq.c | 2 +-
include/linux/oom.h | 3 ++-
mm/oom_kill.c | 38 ++++++++++++++++++++++++++------------
mm/page_alloc.c | 10 ++++++++--
4 files changed, 37 insertions(+), 16 deletions(-)
Index: mmotm-2.6.32-Nov2/drivers/char/sysrq.c
===================================================================
--- mmotm-2.6.32-Nov2.orig/drivers/char/sysrq.c
+++ mmotm-2.6.32-Nov2/drivers/char/sysrq.c
@@ -339,7 +339,7 @@ static struct sysrq_key_op sysrq_term_op
static void moom_callback(struct work_struct *ignored)
{
- out_of_memory(node_zonelist(0, GFP_KERNEL), GFP_KERNEL, 0);
+ out_of_memory(node_zonelist(0, GFP_KERNEL), GFP_KERNEL, 0, NULL);
}
static DECLARE_WORK(moom_work, moom_callback);
Index: mmotm-2.6.32-Nov2/mm/oom_kill.c
===================================================================
--- mmotm-2.6.32-Nov2.orig/mm/oom_kill.c
+++ mmotm-2.6.32-Nov2/mm/oom_kill.c
@@ -196,27 +196,40 @@ unsigned long badness(struct task_struct
/*
* Determine the type of allocation constraint.
*/
+#ifdef CONFIG_NUMA
static inline enum oom_constraint constrained_alloc(struct zonelist *zonelist,
- gfp_t gfp_mask)
+ gfp_t gfp_mask, nodemask_t *nodemask)
{
-#ifdef CONFIG_NUMA
struct zone *zone;
struct zoneref *z;
enum zone_type high_zoneidx = gfp_zone(gfp_mask);
- nodemask_t nodes = node_states[N_HIGH_MEMORY];
+ int ret = CONSTRAINT_NONE;
- for_each_zone_zonelist(zone, z, zonelist, high_zoneidx)
- if (cpuset_zone_allowed_softwall(zone, gfp_mask))
- node_clear(zone_to_nid(zone), nodes);
- else
+ /*
+ * The nodemask here is a nodemask passed to alloc_pages(). Now,
+ * cpuset doesn't use this nodemask for its hardwall/softwall/hierarchy
+ * feature. Then, only mempolicy use this nodemask.
+ */
+ if (nodemask && nodes_equal(*nodemask, node_states[N_HIGH_MEMORY]))
+ ret = CONSTRAINT_MEMORY_POLICY;
+
+ /* Check this allocation failure is caused by cpuset's wall function */
+ for_each_zone_zonelist_nodemask(zone, z, zonelist,
+ high_zoneidx, nodemask)
+ if (!cpuset_zone_allowed_softwall(zone, gfp_mask))
return CONSTRAINT_CPUSET;
- if (!nodes_empty(nodes))
- return CONSTRAINT_MEMORY_POLICY;
-#endif
+ /* __GFP_THISNODE never calls OOM.*/
+ return ret;
+}
+#else
+static inline enum oom_constraint constrained_alloc(struct zonelist *zonelist,
+ gfp_t gfp_mask, nodemask_t *nodemask)
+{
return CONSTRAINT_NONE;
}
+#endif
/*
* Simple selection loop. We chose the process with the highest
@@ -603,7 +616,8 @@ rest_and_return:
* OR try to be smart about which process to kill. Note that we
* don't have to be perfect here, we just have to be good.
*/
-void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, int order)
+void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask,
+ int order, nodemask_t *nodemask)
{
unsigned long freed = 0;
enum oom_constraint constraint;
@@ -622,7 +636,7 @@ void out_of_memory(struct zonelist *zone
* Check if there were limitations on the allocation (only relevant for
* NUMA) that may require different handling.
*/
- constraint = constrained_alloc(zonelist, gfp_mask);
+ constraint = constrained_alloc(zonelist, gfp_mask, nodemask);
read_lock(&tasklist_lock);
switch (constraint) {
Index: mmotm-2.6.32-Nov2/mm/page_alloc.c
===================================================================
--- mmotm-2.6.32-Nov2.orig/mm/page_alloc.c
+++ mmotm-2.6.32-Nov2/mm/page_alloc.c
@@ -1667,9 +1667,15 @@ __alloc_pages_may_oom(gfp_t gfp_mask, un
/* The OOM killer will not help higher order allocs */
if (order > PAGE_ALLOC_COSTLY_ORDER && !(gfp_mask & __GFP_NOFAIL))
goto out;
-
+ /*
+ * In usual, GFP_THISNODE contains __GFP_NORETRY and we never hit this.
+ * Sanity check for bare calls of __GFP_THISNODE, not real OOM.
+ * Note: Hugepage uses it but will hit PAGE_ALLOC_COSTLY_ORDER.
+ */
+ if (gfp_mask & __GFP_THISNODE)
+ goto out;
/* Exhausted what can be done so it's blamo time */
- out_of_memory(zonelist, gfp_mask, order);
+ out_of_memory(zonelist, gfp_mask, order, nodemask);
out:
clear_zonelist_oom(zonelist, gfp_mask);
Index: mmotm-2.6.32-Nov2/include/linux/oom.h
===================================================================
--- mmotm-2.6.32-Nov2.orig/include/linux/oom.h
+++ mmotm-2.6.32-Nov2/include/linux/oom.h
@@ -27,7 +27,8 @@ enum oom_constraint {
extern int try_set_zone_oom(struct zonelist *zonelist, gfp_t gfp_flags);
extern void clear_zonelist_oom(struct zonelist *zonelist, gfp_t gfp_flags);
-extern void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, int order);
+extern void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask,
+ int order, nodemask_t *mask);
extern int register_oom_notifier(struct notifier_block *nb);
extern int unregister_oom_notifier(struct notifier_block *nb);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo DeleteThis @vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/ |
|
| Back to top |
|
 |  |
External

Since: Jul 05, 2009 Posts: 67
|
(Msg. 3) Posted: Tue Nov 10, 2009 3:25 am
Post subject: Re: [BUGFIX][PATCH] oom-kill: fix NUMA consraint check with nodemask v2 [Login to view extended thread Info.] Archived from groups: per prev. post (more info?)
|
|
|
Hi
> ===================================================================
> --- mmotm-2.6.32-Nov2.orig/mm/oom_kill.c
> +++ mmotm-2.6.32-Nov2/mm/oom_kill.c
> @@ -196,27 +196,40 @@ unsigned long badness(struct task_struct
> /*
> * Determine the type of allocation constraint.
> */
> +#ifdef CONFIG_NUMA
> static inline enum oom_constraint constrained_alloc(struct zonelist *zonelist,
> - gfp_t gfp_mask)
> + gfp_t gfp_mask, nodemask_t *nodemask)
> {
> -#ifdef CONFIG_NUMA
> struct zone *zone;
> struct zoneref *z;
> enum zone_type high_zoneidx = gfp_zone(gfp_mask);
> - nodemask_t nodes = node_states[N_HIGH_MEMORY];
> + int ret = CONSTRAINT_NONE;
>
> - for_each_zone_zonelist(zone, z, zonelist, high_zoneidx)
> - if (cpuset_zone_allowed_softwall(zone, gfp_mask))
> - node_clear(zone_to_nid(zone), nodes);
> - else
> + /*
> + * The nodemask here is a nodemask passed to alloc_pages(). Now,
> + * cpuset doesn't use this nodemask for its hardwall/softwall/hierarchy
> + * feature. Then, only mempolicy use this nodemask.
> + */
> + if (nodemask && nodes_equal(*nodemask, node_states[N_HIGH_MEMORY]))
> + ret = CONSTRAINT_MEMORY_POLICY;
!nodes_equal() ?
> +
> + /* Check this allocation failure is caused by cpuset's wall function */
> + for_each_zone_zonelist_nodemask(zone, z, zonelist,
> + high_zoneidx, nodemask)
> + if (!cpuset_zone_allowed_softwall(zone, gfp_mask))
> return CONSTRAINT_CPUSET;
If cpuset and MPOL_BIND are both used, Probably CONSTRAINT_MEMORY_POLICY is
better choice.
>
> - if (!nodes_empty(nodes))
> - return CONSTRAINT_MEMORY_POLICY;
> -#endif
> + /* __GFP_THISNODE never calls OOM.*/
>
> + return ret;
> +}
> +#else
> +static inline enum oom_constraint constrained_alloc(struct zonelist *zonelist,
> + gfp_t gfp_mask, nodemask_t *nodemask)
> +{
> return CONSTRAINT_NONE;
> }
> +#endif
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo.RemoveThis@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/ |
|
| Back to top |
|
 |  |
External

Since: Sep 09, 2005 Posts: 97
|
(Msg. 4) Posted: Tue Nov 10, 2009 3:25 am
Post subject: Re: [BUGFIX][PATCH] oom-kill: fix NUMA consraint check with nodemask v2 [Login to view extended thread Info.] Archived from groups: per prev. post (more info?)
|
|
|
On Tue, 10 Nov 2009 16:24:22 +0900 (JST)
KOSAKI Motohiro <kosaki.motohiro.DeleteThis@jp.fujitsu.com> wrote:
> Hi
>
> > ===================================================================
> > --- mmotm-2.6.32-Nov2.orig/mm/oom_kill.c
> > +++ mmotm-2.6.32-Nov2/mm/oom_kill.c
> > @@ -196,27 +196,40 @@ unsigned long badness(struct task_struct
> > /*
> > * Determine the type of allocation constraint.
> > */
> > +#ifdef CONFIG_NUMA
> > static inline enum oom_constraint constrained_alloc(struct zonelist *zonelist,
> > - gfp_t gfp_mask)
> > + gfp_t gfp_mask, nodemask_t *nodemask)
> > {
> > -#ifdef CONFIG_NUMA
> > struct zone *zone;
> > struct zoneref *z;
> > enum zone_type high_zoneidx = gfp_zone(gfp_mask);
> > - nodemask_t nodes = node_states[N_HIGH_MEMORY];
> > + int ret = CONSTRAINT_NONE;
> >
> > - for_each_zone_zonelist(zone, z, zonelist, high_zoneidx)
> > - if (cpuset_zone_allowed_softwall(zone, gfp_mask))
> > - node_clear(zone_to_nid(zone), nodes);
> > - else
> > + /*
> > + * The nodemask here is a nodemask passed to alloc_pages(). Now,
> > + * cpuset doesn't use this nodemask for its hardwall/softwall/hierarchy
> > + * feature. Then, only mempolicy use this nodemask.
> > + */
> > + if (nodemask && nodes_equal(*nodemask, node_states[N_HIGH_MEMORY]))
> > + ret = CONSTRAINT_MEMORY_POLICY;
>
> !nodes_equal() ?
>
yes. will fix.
>
> > +
> > + /* Check this allocation failure is caused by cpuset's wall function */
> > + for_each_zone_zonelist_nodemask(zone, z, zonelist,
> > + high_zoneidx, nodemask)
> > + if (!cpuset_zone_allowed_softwall(zone, gfp_mask))
> > return CONSTRAINT_CPUSET;
>
> If cpuset and MPOL_BIND are both used, Probably CONSTRAINT_MEMORY_POLICY is
> better choice.
>
No. this memory allocation is failed by limitation of cpuset's alloc mask.
Not from mempolicy.
Thanks,
-Kame
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo.DeleteThis@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/ |
|
| Back to top |
|
 |  |
External

Since: Jul 05, 2009 Posts: 67
|
(Msg. 5) Posted: Tue Nov 10, 2009 3:25 am
Post subject: Re: [BUGFIX][PATCH] oom-kill: fix NUMA consraint check with nodemask v2 [Login to view extended thread Info.] Archived from groups: per prev. post (more info?)
|
|
|
> > > +
> > > + /* Check this allocation failure is caused by cpuset's wall function */
> > > + for_each_zone_zonelist_nodemask(zone, z, zonelist,
> > > + high_zoneidx, nodemask)
> > > + if (!cpuset_zone_allowed_softwall(zone, gfp_mask))
> > > return CONSTRAINT_CPUSET;
> >
> > If cpuset and MPOL_BIND are both used, Probably CONSTRAINT_MEMORY_POLICY is
> > better choice.
>
> No. this memory allocation is failed by limitation of cpuset's alloc mask.
> Not from mempolicy.
But CONSTRAINT_CPUSET doesn't help to free necessary node memory. It isn't
your fault. original code is wrong too. but I hope we should fix it.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo.RemoveThis@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/ |
|
| Back to top |
|
 |  |
External

Since: Sep 09, 2005 Posts: 97
|
(Msg. 6) Posted: Tue Nov 10, 2009 3:25 am
Post subject: Re: [BUGFIX][PATCH] oom-kill: fix NUMA consraint check with nodemask v2 [Login to view extended thread Info.] Archived from groups: per prev. post (more info?)
|
|
|
On Tue, 10 Nov 2009 16:39:02 +0900 (JST)
KOSAKI Motohiro <kosaki.motohiro RemoveThis @jp.fujitsu.com> wrote:
> > > > +
> > > > + /* Check this allocation failure is caused by cpuset's wall function */
> > > > + for_each_zone_zonelist_nodemask(zone, z, zonelist,
> > > > + high_zoneidx, nodemask)
> > > > + if (!cpuset_zone_allowed_softwall(zone, gfp_mask))
> > > > return CONSTRAINT_CPUSET;
> > >
> > > If cpuset and MPOL_BIND are both used, Probably CONSTRAINT_MEMORY_POLICY is
> > > better choice.
> >
> > No. this memory allocation is failed by limitation of cpuset's alloc mask.
> > Not from mempolicy.
>
> But CONSTRAINT_CPUSET doesn't help to free necessary node memory. It isn't
> your fault. original code is wrong too. but I hope we should fix it.
>
Hmm, maybe fair enough.
My 3rd version will use "kill always current(CONSTRAINT_MEMPOLICY does this)
if it uses mempolicy" logic.
Objections ?
Thanks,
-Kame
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo RemoveThis @vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/ |
|
| Back to top |
|
 |  |
External

Since: Aug 13, 2009 Posts: 3
|
(Msg. 7) Posted: Tue Nov 10, 2009 4:25 am
Post subject: Re: [BUGFIX][PATCH] oom-kill: fix NUMA consraint check with nodemask v2 [Login to view extended thread Info.] Archived from groups: per prev. post (more info?)
|
|
|
On Tue, 10 Nov 2009 16:40:55 +0900, KAMEZAWA Hiroyuki <kamezawa.hiroyu.RemoveThis@jp.fujitsu.com> wrote:
> On Tue, 10 Nov 2009 16:39:02 +0900 (JST)
> KOSAKI Motohiro <kosaki.motohiro.RemoveThis@jp.fujitsu.com> wrote:
>
> > > > > +
> > > > > + /* Check this allocation failure is caused by cpuset's wall function */
> > > > > + for_each_zone_zonelist_nodemask(zone, z, zonelist,
> > > > > + high_zoneidx, nodemask)
> > > > > + if (!cpuset_zone_allowed_softwall(zone, gfp_mask))
> > > > > return CONSTRAINT_CPUSET;
> > > >
> > > > If cpuset and MPOL_BIND are both used, Probably CONSTRAINT_MEMORY_POLICY is
> > > > better choice.
> > >
> > > No. this memory allocation is failed by limitation of cpuset's alloc mask.
> > > Not from mempolicy.
> >
> > But CONSTRAINT_CPUSET doesn't help to free necessary node memory. It isn't
> > your fault. original code is wrong too. but I hope we should fix it.
> >
I think so too.
> Hmm, maybe fair enough.
>
> My 3rd version will use "kill always current(CONSTRAINT_MEMPOLICY does this)
> if it uses mempolicy" logic.
>
"if it uses mempoicy" ?
You mean "kill allways current if memory allocation has failed by limitation of
cpuset's mask"(i.e. CONSTRAINT_CPUSET case) ?
Thanks,
Daisuke Nishimura.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo.RemoveThis@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/ |
|
| Back to top |
|
 |  |
External

Since: Sep 09, 2005 Posts: 97
|
(Msg. 8) Posted: Tue Nov 10, 2009 4:25 am
Post subject: Re: [BUGFIX][PATCH] oom-kill: fix NUMA consraint check with nodemask v2 [Login to view extended thread Info.] Archived from groups: per prev. post (more info?)
|
|
|
On Tue, 10 Nov 2009 17:03:38 +0900
Daisuke Nishimura <nishimura.DeleteThis@mxp.nes.nec.co.jp> wrote:
> On Tue, 10 Nov 2009 16:40:55 +0900, KAMEZAWA Hiroyuki <kamezawa.hiroyu.DeleteThis@jp.fujitsu.com> wrote:
> > On Tue, 10 Nov 2009 16:39:02 +0900 (JST)
> > KOSAKI Motohiro <kosaki.motohiro.DeleteThis@jp.fujitsu.com> wrote:
> >
> > > > > > +
> > > > > > + /* Check this allocation failure is caused by cpuset's wall function */
> > > > > > + for_each_zone_zonelist_nodemask(zone, z, zonelist,
> > > > > > + high_zoneidx, nodemask)
> > > > > > + if (!cpuset_zone_allowed_softwall(zone, gfp_mask))
> > > > > > return CONSTRAINT_CPUSET;
> > > > >
> > > > > If cpuset and MPOL_BIND are both used, Probably CONSTRAINT_MEMORY_POLICY is
> > > > > better choice.
> > > >
> > > > No. this memory allocation is failed by limitation of cpuset's alloc mask.
> > > > Not from mempolicy.
> > >
> > > But CONSTRAINT_CPUSET doesn't help to free necessary node memory. It isn't
> > > your fault. original code is wrong too. but I hope we should fix it.
> > >
> I think so too.
>
> > Hmm, maybe fair enough.
> >
> > My 3rd version will use "kill always current(CONSTRAINT_MEMPOLICY does this)
> > if it uses mempolicy" logic.
> >
> "if it uses mempoicy" ?
> You mean "kill allways current if memory allocation has failed by limitation of
> cpuset's mask"(i.e. CONSTRAINT_CPUSET case) ?
>
No. "kill always current process if memory allocation uses mempolicy"
regardless of cpuset. If the task doesn't use mempolicy allocation,
usual CONSTRAINT_CPUSET/CONSTRAINT_NONE oom handler will be invoked.
Now, without patch, CONSTRAINT_MEMPOLICY is not returned at all. I'd
like to limit the scope of this patch to return it. If it's returned,
current will be killed.
Finally, we'll have to consinder "how to manage oom under cpuset"
problem, again. It's not handled in good way, now.
The main problems are...
- Cpuset allows intersection of nodes among groups.
- Task can be migrated to other cpuset withoug moving memory.
- We don't have per-node-rss information per task.
Then,
- We have to scan all tasks.
- We have to invoke Totally-Random-Innocent-Task-Killer and pray that
someone bad will be killed.
IMHO, "find correct one" is too heavy to the kernel (under cpuset).
If we can have notifier to userland, some daemon can check numa_maps of all
tasks and will do something reasonbale.
Thanks,
-Kame
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo.DeleteThis@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/ |
|
| Back to top |
|
 |  |
External

Since: Sep 09, 2005 Posts: 97
|
(Msg. 9) Posted: Tue Nov 10, 2009 10:27 pm
Post subject: [BUGFIX][PATCH] oom-kill: fix NUMA consraint check with nodemask v3 [Login to view extended thread Info.] Archived from groups: per prev. post (more info?)
|
|
|
From: KAMEZAWA Hiroyuki <kamezawa.hioryu.TakeThisOut@jp.fujitsu.com>
Fixing node-oriented allocation handling in oom-kill.c
I myself think this as bugfix not as ehnancement.
In these days, things are changed as
- alloc_pages() eats nodemask as its arguments, __alloc_pages_nodemask().
- mempolicy don't maintain its own private zonelists.
(And cpuset doesn't use nodemask for __alloc_pages_nodemask())
But, current oom-killer's doesn't handle nodemask and it's wrong.
This patch does
- check nodemask, if nodemask && nodemask doesn't cover all
node_states[N_HIGH_MEMORY], this is CONSTRAINT_MEMORY_POLICY.
- Scan all zonelist under nodemask, if it hits cpuset's wall
this faiulre is from cpuset.
And
- modifies the caller of out_of_memory not to call oom if __GFP_THISNODE.
This doesn't change "current" behavior.
If callers use __GFP_THISNODE, it should handle "page allocation failure"
by itself.
Changelog: 2009/11/11
- fixed nodes_equal() calculation.
- return CONSTRAINT_MEMPOLICY always if given nodemask is not enough big.
Changelog: 2009/11/06
- fixed lack of oom.h
Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hioryu.TakeThisOut@jp.fujitsu.com>
---
drivers/char/sysrq.c | 2 +-
include/linux/oom.h | 4 +++-
mm/oom_kill.c | 44 ++++++++++++++++++++++++++++++++------------
mm/page_alloc.c | 10 ++++++++--
4 files changed, 44 insertions(+), 16 deletions(-)
Index: mm-test-kernel/drivers/char/sysrq.c
===================================================================
--- mm-test-kernel.orig/drivers/char/sysrq.c
+++ mm-test-kernel/drivers/char/sysrq.c
@@ -339,7 +339,7 @@ static struct sysrq_key_op sysrq_term_op
static void moom_callback(struct work_struct *ignored)
{
- out_of_memory(node_zonelist(0, GFP_KERNEL), GFP_KERNEL, 0);
+ out_of_memory(node_zonelist(0, GFP_KERNEL), GFP_KERNEL, 0, NULL);
}
static DECLARE_WORK(moom_work, moom_callback);
Index: mm-test-kernel/mm/oom_kill.c
===================================================================
--- mm-test-kernel.orig/mm/oom_kill.c
+++ mm-test-kernel/mm/oom_kill.c
@@ -196,27 +196,45 @@ unsigned long badness(struct task_struct
/*
* Determine the type of allocation constraint.
*/
+#ifdef CONFIG_NUMA
static inline enum oom_constraint constrained_alloc(struct zonelist *zonelist,
- gfp_t gfp_mask)
+ gfp_t gfp_mask, nodemask_t *nodemask)
{
-#ifdef CONFIG_NUMA
struct zone *zone;
struct zoneref *z;
enum zone_type high_zoneidx = gfp_zone(gfp_mask);
- nodemask_t nodes = node_states[N_HIGH_MEMORY];
+ int ret = CONSTRAINT_NONE;
- for_each_zone_zonelist(zone, z, zonelist, high_zoneidx)
- if (cpuset_zone_allowed_softwall(zone, gfp_mask))
- node_clear(zone_to_nid(zone), nodes);
- else
+ /*
+ * The nodemask here is a nodemask passed to alloc_pages(). Now,
+ * cpuset doesn't use this nodemask for its hardwall/softwall/hierarchy
+ * feature. mempolicy is an only user of nodemask here.
+ */
+ if (nodemask) {
+ nodemask_t mask;
+ /* check mempolicy's nodemask contains all N_HIGH_MEMORY */
+ nodes_and(mask, *nodemask, node_states[N_HIGH_MEMORY]);
+ if (!nodes_equal(mask, node_states[N_HIGH_MEMORY]))
+ return CONSTRAINT_MEMORY_POLICY;
+ }
+
+ /* Check this allocation failure is caused by cpuset's wall function */
+ for_each_zone_zonelist_nodemask(zone, z, zonelist,
+ high_zoneidx, nodemask)
+ if (!cpuset_zone_allowed_softwall(zone, gfp_mask))
return CONSTRAINT_CPUSET;
- if (!nodes_empty(nodes))
- return CONSTRAINT_MEMORY_POLICY;
-#endif
+ /* __GFP_THISNODE never calls OOM.*/
return CONSTRAINT_NONE;
}
+#else
+static inline enum oom_constraint constrained_alloc(struct zonelist *zonelist,
+ gfp_t gfp_mask, nodemask_t *nodemask)
+{
+ return CONSTRAINT_NONE;
+}
+#endif
/*
* Simple selection loop. We chose the process with the highest
@@ -603,7 +621,8 @@ rest_and_return:
* OR try to be smart about which process to kill. Note that we
* don't have to be perfect here, we just have to be good.
*/
-void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, int order)
+void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask,
+ int order, nodemask_t *nodemask)
{
unsigned long freed = 0;
enum oom_constraint constraint;
@@ -622,11 +641,12 @@ void out_of_memory(struct zonelist *zone
* Check if there were limitations on the allocation (only relevant for
* NUMA) that may require different handling.
*/
- constraint = constrained_alloc(zonelist, gfp_mask);
+ constraint = constrained_alloc(zonelist, gfp_mask, nodemask);
read_lock(&tasklist_lock);
switch (constraint) {
case CONSTRAINT_MEMORY_POLICY:
+ /* kill by process's its own memory alloc limitation */
oom_kill_process(current, gfp_mask, order, 0, NULL,
"No available memory (MPOL_BIND)");
break;
Index: mm-test-kernel/mm/page_alloc.c
===================================================================
--- mm-test-kernel.orig/mm/page_alloc.c
+++ mm-test-kernel/mm/page_alloc.c
@@ -1667,9 +1667,15 @@ __alloc_pages_may_oom(gfp_t gfp_mask, un
/* The OOM killer will not help higher order allocs */
if (order > PAGE_ALLOC_COSTLY_ORDER && !(gfp_mask & __GFP_NOFAIL))
goto out;
-
+ /*
+ * In usual, GFP_THISNODE contains __GFP_NORETRY and we never hit this.
+ * Sanity check for bare calls of __GFP_THISNODE, not real OOM.
+ * Note: Hugepage uses it but will hit PAGE_ALLOC_COSTLY_ORDER.
+ */
+ if (gfp_mask & __GFP_THISNODE)
+ goto out;
/* Exhausted what can be done so it's blamo time */
- out_of_memory(zonelist, gfp_mask, order);
+ out_of_memory(zonelist, gfp_mask, order, nodemask);
out:
clear_zonelist_oom(zonelist, gfp_mask);
Index: mm-test-kernel/include/linux/oom.h
===================================================================
--- mm-test-kernel.orig/include/linux/oom.h
+++ mm-test-kernel/include/linux/oom.h
@@ -10,6 +10,7 @@
#ifdef __KERNEL__
#include <linux/types.h>
+#include <linux/nodemask.h>
struct zonelist;
struct notifier_block;
@@ -26,7 +27,8 @@ enum oom_constraint {
extern int try_set_zone_oom(struct zonelist *zonelist, gfp_t gfp_flags);
extern void clear_zonelist_oom(struct zonelist *zonelist, gfp_t gfp_flags);
-extern void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, int order);
+extern void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask,
+ int order, nodemask_t *mask);
extern int register_oom_notifier(struct notifier_block *nb);
extern int unregister_oom_notifier(struct notifier_block *nb);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo.TakeThisOut@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/ |
|
| Back to top |
|
 |  |
External

Since: Jul 05, 2009 Posts: 67
|
(Msg. 10) Posted: Tue Nov 10, 2009 10:27 pm
Post subject: Re: [BUGFIX][PATCH] oom-kill: fix NUMA consraint check with nodemask v3 [Login to view extended thread Info.] Archived from groups: per prev. post (more info?)
|
|
|
> From: KAMEZAWA Hiroyuki <kamezawa.hioryu.TakeThisOut@jp.fujitsu.com>
>
> Fixing node-oriented allocation handling in oom-kill.c
> I myself think this as bugfix not as ehnancement.
>
> In these days, things are changed as
> - alloc_pages() eats nodemask as its arguments, __alloc_pages_nodemask().
> - mempolicy don't maintain its own private zonelists.
> (And cpuset doesn't use nodemask for __alloc_pages_nodemask())
>
> But, current oom-killer's doesn't handle nodemask and it's wrong.
>
> This patch does
> - check nodemask, if nodemask && nodemask doesn't cover all
> node_states[N_HIGH_MEMORY], this is CONSTRAINT_MEMORY_POLICY.
> - Scan all zonelist under nodemask, if it hits cpuset's wall
> this faiulre is from cpuset.
> And
> - modifies the caller of out_of_memory not to call oom if __GFP_THISNODE.
> This doesn't change "current" behavior.
> If callers use __GFP_THISNODE, it should handle "page allocation failure"
> by itself.
>
> Changelog: 2009/11/11
> - fixed nodes_equal() calculation.
> - return CONSTRAINT_MEMPOLICY always if given nodemask is not enough big.
>
> Changelog: 2009/11/06
> - fixed lack of oom.h
>
> Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hioryu.TakeThisOut@jp.fujitsu.com>
> ---
> drivers/char/sysrq.c | 2 +-
> include/linux/oom.h | 4 +++-
> mm/oom_kill.c | 44 ++++++++++++++++++++++++++++++++------------
> mm/page_alloc.c | 10 ++++++++--
> 4 files changed, 44 insertions(+), 16 deletions(-)
>
Looks good to me.
Reviewed-by: KOSAKI Motohiro <kosaki.motohiro.TakeThisOut@jp.fujitsu.com>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo.TakeThisOut@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/ |
|
| Back to top |
|
 |  |
External

Since: Jul 07, 2009 Posts: 20
|
(Msg. 11) Posted: Wed Nov 11, 2009 1:26 am
Post subject: Re: [BUGFIX][PATCH] oom-kill: fix NUMA consraint check with nodemask v3 [Login to view extended thread Info.] Archived from groups: per prev. post (more info?)
|
|
|
On Wed, 11 Nov 2009, KAMEZAWA Hiroyuki wrote:
> Index: mm-test-kernel/drivers/char/sysrq.c
> ===================================================================
> --- mm-test-kernel.orig/drivers/char/sysrq.c
> +++ mm-test-kernel/drivers/char/sysrq.c
> @@ -339,7 +339,7 @@ static struct sysrq_key_op sysrq_term_op
>
> static void moom_callback(struct work_struct *ignored)
> {
> - out_of_memory(node_zonelist(0, GFP_KERNEL), GFP_KERNEL, 0);
> + out_of_memory(node_zonelist(0, GFP_KERNEL), GFP_KERNEL, 0, NULL);
> }
>
> static DECLARE_WORK(moom_work, moom_callback);
> Index: mm-test-kernel/mm/oom_kill.c
> ===================================================================
> --- mm-test-kernel.orig/mm/oom_kill.c
> +++ mm-test-kernel/mm/oom_kill.c
> @@ -196,27 +196,45 @@ unsigned long badness(struct task_struct
> /*
> * Determine the type of allocation constraint.
> */
> +#ifdef CONFIG_NUMA
> static inline enum oom_constraint constrained_alloc(struct zonelist *zonelist,
> - gfp_t gfp_mask)
> + gfp_t gfp_mask, nodemask_t *nodemask)
We should probably remove the inline specifier, there's only one caller
currently and if additional ones were added in the future this function
should probably not be replicated.
> {
> -#ifdef CONFIG_NUMA
> struct zone *zone;
> struct zoneref *z;
> enum zone_type high_zoneidx = gfp_zone(gfp_mask);
> - nodemask_t nodes = node_states[N_HIGH_MEMORY];
> + int ret = CONSTRAINT_NONE;
>
> - for_each_zone_zonelist(zone, z, zonelist, high_zoneidx)
> - if (cpuset_zone_allowed_softwall(zone, gfp_mask))
> - node_clear(zone_to_nid(zone), nodes);
> - else
> + /*
> + * The nodemask here is a nodemask passed to alloc_pages(). Now,
> + * cpuset doesn't use this nodemask for its hardwall/softwall/hierarchy
> + * feature. mempolicy is an only user of nodemask here.
> + */
> + if (nodemask) {
> + nodemask_t mask;
> + /* check mempolicy's nodemask contains all N_HIGH_MEMORY */
> + nodes_and(mask, *nodemask, node_states[N_HIGH_MEMORY]);
> + if (!nodes_equal(mask, node_states[N_HIGH_MEMORY]))
> + return CONSTRAINT_MEMORY_POLICY;
> + }
Although a nodemask_t was previously allocated on the stack, we should
probably change this to use NODEMASK_ALLOC() for kernels with higher
CONFIG_NODES_SHIFT since allocations can happen very deep into the stack.
There should be a way around that, however. Shouldn't
if (nodes_subset(node_states[N_HIGH_MEMORY], *nodemask))
return CONSTRAINT_MEMORY_POLICY;
be sufficient?
> +
> + /* Check this allocation failure is caused by cpuset's wall function */
> + for_each_zone_zonelist_nodemask(zone, z, zonelist,
> + high_zoneidx, nodemask)
> + if (!cpuset_zone_allowed_softwall(zone, gfp_mask))
> return CONSTRAINT_CPUSET;
>
> - if (!nodes_empty(nodes))
> - return CONSTRAINT_MEMORY_POLICY;
> -#endif
> + /* __GFP_THISNODE never calls OOM.*/
>
> return CONSTRAINT_NONE;
> }
> +#else
> +static inline enum oom_constraint constrained_alloc(struct zonelist *zonelist,
> + gfp_t gfp_mask, nodemask_t *nodemask)
> +{
> + return CONSTRAINT_NONE;
> +}
> +#endif
>
> /*
> * Simple selection loop. We chose the process with the highest
> @@ -603,7 +621,8 @@ rest_and_return:
> * OR try to be smart about which process to kill. Note that we
> * don't have to be perfect here, we just have to be good.
> */
> -void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, int order)
> +void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask,
> + int order, nodemask_t *nodemask)
> {
> unsigned long freed = 0;
> enum oom_constraint constraint;
> @@ -622,11 +641,12 @@ void out_of_memory(struct zonelist *zone
> * Check if there were limitations on the allocation (only relevant for
> * NUMA) that may require different handling.
> */
> - constraint = constrained_alloc(zonelist, gfp_mask);
> + constraint = constrained_alloc(zonelist, gfp_mask, nodemask);
> read_lock(&tasklist_lock);
>
> switch (constraint) {
> case CONSTRAINT_MEMORY_POLICY:
> + /* kill by process's its own memory alloc limitation */
I don't understand this comment.
> oom_kill_process(current, gfp_mask, order, 0, NULL,
> "No available memory (MPOL_BIND)");
> break;
> Index: mm-test-kernel/mm/page_alloc.c
> ===================================================================
> --- mm-test-kernel.orig/mm/page_alloc.c
> +++ mm-test-kernel/mm/page_alloc.c
> @@ -1667,9 +1667,15 @@ __alloc_pages_may_oom(gfp_t gfp_mask, un
> /* The OOM killer will not help higher order allocs */
> if (order > PAGE_ALLOC_COSTLY_ORDER && !(gfp_mask & __GFP_NOFAIL))
> goto out;
> -
> + /*
> + * In usual, GFP_THISNODE contains __GFP_NORETRY and we never hit this.
> + * Sanity check for bare calls of __GFP_THISNODE, not real OOM.
> + * Note: Hugepage uses it but will hit PAGE_ALLOC_COSTLY_ORDER.
> + */
> + if (gfp_mask & __GFP_THISNODE)
> + goto out;
> /* Exhausted what can be done so it's blamo time */
> - out_of_memory(zonelist, gfp_mask, order);
> + out_of_memory(zonelist, gfp_mask, order, nodemask);
>
> out:
> clear_zonelist_oom(zonelist, gfp_mask);
This doesn't seem like the right place for this check; should we even try
direct reclaim for bare users of __GFP_THISNODE? If we're adding it for
sanity even though no callers would currently hit it, it also is a
potential escape route for __GFP_NOFAIL.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo.TakeThisOut@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/ |
|
| Back to top |
|
 |  |
External

Since: Sep 09, 2005 Posts: 97
|
(Msg. 12) Posted: Wed Nov 11, 2009 1:26 am
Post subject: Re: [BUGFIX][PATCH] oom-kill: fix NUMA consraint check with nodemask v3 [Login to view extended thread Info.] Archived from groups: per prev. post (more info?)
|
|
|
On Tue, 10 Nov 2009 18:49:51 -0800 (PST)
David Rientjes <rientjes DeleteThis @google.com> wrote:
> On Wed, 11 Nov 2009, KAMEZAWA Hiroyuki wrote:
>
> > Index: mm-test-kernel/drivers/char/sysrq.c
> > ===================================================================
> > --- mm-test-kernel.orig/drivers/char/sysrq.c
> > +++ mm-test-kernel/drivers/char/sysrq.c
> > @@ -339,7 +339,7 @@ static struct sysrq_key_op sysrq_term_op
> >
> > static void moom_callback(struct work_struct *ignored)
> > {
> > - out_of_memory(node_zonelist(0, GFP_KERNEL), GFP_KERNEL, 0);
> > + out_of_memory(node_zonelist(0, GFP_KERNEL), GFP_KERNEL, 0, NULL);
> > }
> >
> > static DECLARE_WORK(moom_work, moom_callback);
> > Index: mm-test-kernel/mm/oom_kill.c
> > ===================================================================
> > --- mm-test-kernel.orig/mm/oom_kill.c
> > +++ mm-test-kernel/mm/oom_kill.c
> > @@ -196,27 +196,45 @@ unsigned long badness(struct task_struct
> > /*
> > * Determine the type of allocation constraint.
> > */
> > +#ifdef CONFIG_NUMA
> > static inline enum oom_constraint constrained_alloc(struct zonelist *zonelist,
> > - gfp_t gfp_mask)
> > + gfp_t gfp_mask, nodemask_t *nodemask)
>
> We should probably remove the inline specifier, there's only one caller
> currently and if additional ones were added in the future this function
> should probably not be replicated.
>
Hmm, ok, remove.
> > {
> > -#ifdef CONFIG_NUMA
> > struct zone *zone;
> > struct zoneref *z;
> > enum zone_type high_zoneidx = gfp_zone(gfp_mask);
> > - nodemask_t nodes = node_states[N_HIGH_MEMORY];
> > + int ret = CONSTRAINT_NONE;
> >
> > - for_each_zone_zonelist(zone, z, zonelist, high_zoneidx)
> > - if (cpuset_zone_allowed_softwall(zone, gfp_mask))
> > - node_clear(zone_to_nid(zone), nodes);
> > - else
> > + /*
> > + * The nodemask here is a nodemask passed to alloc_pages(). Now,
> > + * cpuset doesn't use this nodemask for its hardwall/softwall/hierarchy
> > + * feature. mempolicy is an only user of nodemask here.
> > + */
> > + if (nodemask) {
> > + nodemask_t mask;
> > + /* check mempolicy's nodemask contains all N_HIGH_MEMORY */
> > + nodes_and(mask, *nodemask, node_states[N_HIGH_MEMORY]);
> > + if (!nodes_equal(mask, node_states[N_HIGH_MEMORY]))
> > + return CONSTRAINT_MEMORY_POLICY;
> > + }
>
> Although a nodemask_t was previously allocated on the stack, we should
> probably change this to use NODEMASK_ALLOC() for kernels with higher
> CONFIG_NODES_SHIFT since allocations can happen very deep into the stack.
>
> There should be a way around that, however. Shouldn't
>
> if (nodes_subset(node_states[N_HIGH_MEMORY], *nodemask))
> return CONSTRAINT_MEMORY_POLICY;
>
> be sufficient?
>
Ah, I didn't notice nodes_subset(). Thank you, I'll use it.
> > +
> > + /* Check this allocation failure is caused by cpuset's wall function */
> > + for_each_zone_zonelist_nodemask(zone, z, zonelist,
> > + high_zoneidx, nodemask)
> > + if (!cpuset_zone_allowed_softwall(zone, gfp_mask))
> > return CONSTRAINT_CPUSET;
> >
> > - if (!nodes_empty(nodes))
> > - return CONSTRAINT_MEMORY_POLICY;
> > -#endif
> > + /* __GFP_THISNODE never calls OOM.*/
> >
> > return CONSTRAINT_NONE;
> > }
> > +#else
> > +static inline enum oom_constraint constrained_alloc(struct zonelist *zonelist,
> > + gfp_t gfp_mask, nodemask_t *nodemask)
> > +{
> > + return CONSTRAINT_NONE;
> > +}
> > +#endif
> >
> > /*
> > * Simple selection loop. We chose the process with the highest
> > @@ -603,7 +621,8 @@ rest_and_return:
> > * OR try to be smart about which process to kill. Note that we
> > * don't have to be perfect here, we just have to be good.
> > */
> > -void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, int order)
> > +void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask,
> > + int order, nodemask_t *nodemask)
> > {
> > unsigned long freed = 0;
> > enum oom_constraint constraint;
> > @@ -622,11 +641,12 @@ void out_of_memory(struct zonelist *zone
> > * Check if there were limitations on the allocation (only relevant for
> > * NUMA) that may require different handling.
> > */
> > - constraint = constrained_alloc(zonelist, gfp_mask);
> > + constraint = constrained_alloc(zonelist, gfp_mask, nodemask);
> > read_lock(&tasklist_lock);
> >
> > switch (constraint) {
> > case CONSTRAINT_MEMORY_POLICY:
> > + /* kill by process's its own memory alloc limitation */
>
> I don't understand this comment.
>
remove this. But it seems not to be well known that current is always killed if
CONSTRAINT_MEMPOLICY.
> > oom_kill_process(current, gfp_mask, order, 0, NULL,
> > "No available memory (MPOL_BIND)");
> > break;
> > Index: mm-test-kernel/mm/page_alloc.c
> > ===================================================================
> > --- mm-test-kernel.orig/mm/page_alloc.c
> > +++ mm-test-kernel/mm/page_alloc.c
> > @@ -1667,9 +1667,15 @@ __alloc_pages_may_oom(gfp_t gfp_mask, un
> > /* The OOM killer will not help higher order allocs */
> > if (order > PAGE_ALLOC_COSTLY_ORDER && !(gfp_mask & __GFP_NOFAIL))
> > goto out;
> > -
> > + /*
> > + * In usual, GFP_THISNODE contains __GFP_NORETRY and we never hit this.
> > + * Sanity check for bare calls of __GFP_THISNODE, not real OOM.
> > + * Note: Hugepage uses it but will hit PAGE_ALLOC_COSTLY_ORDER.
> > + */
> > + if (gfp_mask & __GFP_THISNODE)
> > + goto out;
> > /* Exhausted what can be done so it's blamo time */
> > - out_of_memory(zonelist, gfp_mask, order);
> > + out_of_memory(zonelist, gfp_mask, order, nodemask);
> >
> > out:
> > clear_zonelist_oom(zonelist, gfp_mask);
>
> This doesn't seem like the right place for this check; should we even try
> direct reclaim for bare users of __GFP_THISNODE?
No, hugepage has to do reclaim.
> If we're adding it for sanity even though no callers would currently hit it,
> it also is a potential escape route for __GFP_NOFAIL.
will add __GFP_NOFAIL check.
Thanks,
-Kame
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo DeleteThis @vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/ |
|
| Back to top |
|
 |  |
External

Since: Sep 09, 2005 Posts: 97
|
(Msg. 13) Posted: Wed Nov 11, 2009 1:26 am
Post subject: Re: [BUGFIX][PATCH] oom-kill: fix NUMA consraint check with nodemask v3 [Login to view extended thread Info.] Archived from groups: per prev. post (more info?)
|
|
|
On Wed, 11 Nov 2009 12:02:06 +0900 (JST)
KOSAKI Motohiro <kosaki.motohiro.DeleteThis@jp.fujitsu.com> wrote:
> > There should be a way around that, however. Shouldn't
> >
> > if (nodes_subset(node_states[N_HIGH_MEMORY], *nodemask))
> > return CONSTRAINT_MEMORY_POLICY;
> >
> > be sufficient?
>
> Is this safe on memory hotplug case?
>
N_HIGH_MEMORY is updated at memory hotplug.
Thanks,
-Kame
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo.DeleteThis@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/ |
|
| Back to top |
|
 |  |
External

Since: Sep 09, 2005 Posts: 97
|
(Msg. 14) Posted: Wed Nov 11, 2009 1:27 am
Post subject: [BUGFIX][PATCH] oom-kill: fix NUMA consraint check with nodemask v4 [Login to view extended thread Info.] Archived from groups: per prev. post (more info?)
|
|
|
From: KAMEZAWA Hiroyuki <kamezawa.hioryu RemoveThis @jp.fujitsu.com>
Fixing node-oriented allocation handling in oom-kill.c
I myself think this as bugfix not as ehnancement.
In these days, things are changed as
- alloc_pages() eats nodemask as its arguments, __alloc_pages_nodemask().
- mempolicy don't maintain its own private zonelists.
(And cpuset doesn't use nodemask for __alloc_pages_nodemask())
So, current oom-killer's check function is wrong.
This patch does
- check nodemask, if nodemask && nodemask doesn't cover all
node_states[N_HIGH_MEMORY], this is CONSTRAINT_MEMORY_POLICY.
- Scan all zonelist under nodemask, if it hits cpuset's wall
this faiulre is from cpuset.
And
- modifies the caller of out_of_memory not to call oom if __GFP_THISNODE.
This doesn't change "current" behavior. If callers use __GFP_THISNODE
it should handle "page allocation failure" by itself.
- handle __GFP_NOFAIL+__GFP_THISNODE path.
This is something like a FIXME but this gfpmask is not used now.
Changelog: 2009/11/11(2)
- uses nodes_subset().
- clean up.
- added __GFP_NOFAIL case. And added waring.
Changelog: 2009/11/11
- fixed nodes_equal() calculation.
- return CONSTRAINT_MEMPOLICY always if given nodemask is not enough big.
Changelog: 2009/11/06
- fixed lack of oom.h
Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hioryu RemoveThis @jp.fujitsu.com>
---
drivers/char/sysrq.c | 2 +-
include/linux/oom.h | 4 +++-
mm/oom_kill.c | 45 +++++++++++++++++++++++++++++++++------------
mm/page_alloc.c | 20 +++++++++++++++-----
4 files changed, 52 insertions(+), 19 deletions(-)
Index: mm-test-kernel/drivers/char/sysrq.c
===================================================================
--- mm-test-kernel.orig/drivers/char/sysrq.c
+++ mm-test-kernel/drivers/char/sysrq.c
@@ -339,7 +339,7 @@ static struct sysrq_key_op sysrq_term_op
static void moom_callback(struct work_struct *ignored)
{
- out_of_memory(node_zonelist(0, GFP_KERNEL), GFP_KERNEL, 0);
+ out_of_memory(node_zonelist(0, GFP_KERNEL), GFP_KERNEL, 0, NULL);
}
static DECLARE_WORK(moom_work, moom_callback);
Index: mm-test-kernel/mm/oom_kill.c
===================================================================
--- mm-test-kernel.orig/mm/oom_kill.c
+++ mm-test-kernel/mm/oom_kill.c
@@ -196,27 +196,47 @@ unsigned long badness(struct task_struct
/*
* Determine the type of allocation constraint.
*/
+#ifdef CONFIG_NUMA
static inline enum oom_constraint constrained_alloc(struct zonelist *zonelist,
- gfp_t gfp_mask)
+ gfp_t gfp_mask, nodemask_t *nodemask)
{
-#ifdef CONFIG_NUMA
struct zone *zone;
struct zoneref *z;
enum zone_type high_zoneidx = gfp_zone(gfp_mask);
- nodemask_t nodes = node_states[N_HIGH_MEMORY];
+ int ret = CONSTRAINT_NONE;
- for_each_zone_zonelist(zone, z, zonelist, high_zoneidx)
- if (cpuset_zone_allowed_softwall(zone, gfp_mask))
- node_clear(zone_to_nid(zone), nodes);
- else
- return CONSTRAINT_CPUSET;
+ /*
+ * Reach here only when __GFP_NOFAIL is used. So, we should avoid
+ * to kill current.We have to random task kill in this case.
+ * Hopefully, CONSTRAINT_THISNODE...but no way to handle it, now.
+ */
+ if (gfp_mask & __GPF_THISNODE)
+ return ret;
- if (!nodes_empty(nodes))
+ /*
+ * The nodemask here is a nodemask passed to alloc_pages(). Now,
+ * cpuset doesn't use this nodemask for its hardwall/softwall/hierarchy
+ * feature. mempolicy is an only user of nodemask here.
+ * check mempolicy's nodemask contains all N_HIGH_MEMORY
+ */
+ if (nodemask && !nodes_subset(node_states[N_HIGH_MEMORY], *nodemask))
return CONSTRAINT_MEMORY_POLICY;
-#endif
+ /* Check this allocation failure is caused by cpuset's wall function */
+ for_each_zone_zonelist_nodemask(zone, z, zonelist,
+ high_zoneidx, nodemask)
+ if (!cpuset_zone_allowed_softwall(zone, gfp_mask))
+ return CONSTRAINT_CPUSET;
+
+ return CONSTRAINT_NONE;
+}
+#else
+static inline enum oom_constraint constrained_alloc(struct zonelist *zonelist,
+ gfp_t gfp_mask, nodemask_t *nodemask)
+{
return CONSTRAINT_NONE;
}
+#endif
/*
* Simple selection loop. We chose the process with the highest
@@ -603,7 +623,8 @@ rest_and_return:
* OR try to be smart about which process to kill. Note that we
* don't have to be perfect here, we just have to be good.
*/
-void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, int order)
+void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask,
+ int order, nodemask_t *nodemask)
{
unsigned long freed = 0;
enum oom_constraint constraint;
@@ -622,7 +643,7 @@ void out_of_memory(struct zonelist *zone
* Check if there were limitations on the allocation (only relevant for
* NUMA) that may require different handling.
*/
- constraint = constrained_alloc(zonelist, gfp_mask);
+ constraint = constrained_alloc(zonelist, gfp_mask, nodemask);
read_lock(&tasklist_lock);
switch (constraint) {
Index: mm-test-kernel/mm/page_alloc.c
===================================================================
--- mm-test-kernel.orig/mm/page_alloc.c
+++ mm-test-kernel/mm/page_alloc.c
@@ -1664,12 +1664,22 @@ __alloc_pages_may_oom(gfp_t gfp_mask, un
if (page)
goto out;
- /* The OOM killer will not help higher order allocs */
- if (order > PAGE_ALLOC_COSTLY_ORDER && !(gfp_mask & __GFP_NOFAIL))
- goto out;
-
+ if (!(gfp_mask & __GFP_NOFAIL)) {
+ /* The OOM killer will not help higher order allocs */
+ if (order > PAGE_ALLOC_COSTLY_ORDER)
+ goto out;
+ /*
+ * GFP_THISNODE contains __GFP_NORETRY and we never hit this.
+ * Sanity check for bare calls of __GFP_THISNODE, not real OOM.
+ * The caller should handle page allocation failure by itself if
+ * it specifies __GFP_THISNODE.
+ * Note: Hugepage uses it but will hit PAGE_ALLOC_COSTLY_ORDER.
+ */
+ if (gfp_mask & __GFP_THISNODE)
+ goto out;
+ }
/* Exhausted what can be done so it's blamo time */
- out_of_memory(zonelist, gfp_mask, order);
+ out_of_memory(zonelist, gfp_mask, order, nodemask);
out:
clear_zonelist_oom(zonelist, gfp_mask);
Index: mm-test-kernel/include/linux/oom.h
===================================================================
--- mm-test-kernel.orig/include/linux/oom.h
+++ mm-test-kernel/include/linux/oom.h
@@ -10,6 +10,7 @@
#ifdef __KERNEL__
#include <linux/types.h>
+#include <linux/nodemask.h>
struct zonelist;
struct notifier_block;
@@ -26,7 +27,8 @@ enum oom_constraint {
extern int try_set_zone_oom(struct zonelist *zonelist, gfp_t gfp_flags);
extern void clear_zonelist_oom(struct zonelist *zonelist, gfp_t gfp_flags);
-extern void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, int order);
+extern void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask,
+ int order, nodemask_t *mask);
extern int register_oom_notifier(struct notifier_block *nb);
extern int unregister_oom_notifier(struct notifier_block *nb);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo RemoveThis @vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/ |
|
| Back to top |
|
 |  |
External

Since: Sep 09, 2005 Posts: 97
|
(Msg. 15) Posted: Wed Nov 11, 2009 1:27 am
Post subject: [BUGFIX][PATCH] oom-kill: fix NUMA consraint check with nodemask v4.1 [Login to view extended thread Info.] Archived from groups: per prev. post (more info?)
|
|
|
Sorry, missed to remove 'inline'...
==
From: KAMEZAWA Hiroyuki <kamezawa.hioryu DeleteThis @jp.fujitsu.com>
Fixing node-oriented allocation handling in oom-kill.c
I myself think this as bugfix not as ehnancement.
In these days, things are changed as
- alloc_pages() eats nodemask as its arguments, __alloc_pages_nodemask().
- mempolicy don't maintain its own private zonelists.
(And cpuset doesn't use nodemask for __alloc_pages_nodemask())
So, current oom-killer's check function is wrong.
This patch does
- check nodemask, if nodemask && nodemask doesn't cover all
node_states[N_HIGH_MEMORY], this is CONSTRAINT_MEMORY_POLICY.
- Scan all zonelist under nodemask, if it hits cpuset's wall
this faiulre is from cpuset.
And
- modifies the caller of out_of_memory not to call oom if __GFP_THISNODE.
This doesn't change "current" behavior. If callers use __GFP_THISNODE
it should handle "page allocation failure" by itself.
- handle __GFP_NOFAIL+__GFP_THISNODE path.
This is something like a FIXME but this gfpmask is not used now.
Changelog: 2009/11/11(2)
- uses nodes_subset().
- clean up.
- added __GFP_NOFAIL case. And added waring.
- removed inline
Changelog: 2009/11/11
- fixed nodes_equal() calculation.
- return CONSTRAINT_MEMPOLICY always if given nodemask is not enough big.
Changelog: 2009/11/06
- fixed lack of oom.h
Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hioryu DeleteThis @jp.fujitsu.com>
---
drivers/char/sysrq.c | 2 +-
include/linux/oom.h | 4 +++-
mm/oom_kill.c | 47 ++++++++++++++++++++++++++++++++++-------------
mm/page_alloc.c | 20 +++++++++++++++-----
4 files changed, 53 insertions(+), 20 deletions(-)
Index: mm-test-kernel/drivers/char/sysrq.c
===================================================================
--- mm-test-kernel.orig/drivers/char/sysrq.c
+++ mm-test-kernel/drivers/char/sysrq.c
@@ -339,7 +339,7 @@ static struct sysrq_key_op sysrq_term_op
static void moom_callback(struct work_struct *ignored)
{
- out_of_memory(node_zonelist(0, GFP_KERNEL), GFP_KERNEL, 0);
+ out_of_memory(node_zonelist(0, GFP_KERNEL), GFP_KERNEL, 0, NULL);
}
static DECLARE_WORK(moom_work, moom_callback);
Index: mm-test-kernel/mm/oom_kill.c
===================================================================
--- mm-test-kernel.orig/mm/oom_kill.c
+++ mm-test-kernel/mm/oom_kill.c
@@ -196,27 +196,47 @@ unsigned long badness(struct task_struct
/*
* Determine the type of allocation constraint.
*/
-static inline enum oom_constraint constrained_alloc(struct zonelist *zonelist,
- gfp_t gfp_mask)
-{
#ifdef CONFIG_NUMA
+static enum oom_constraint constrained_alloc(struct zonelist *zonelist,
+ gfp_t gfp_mask, nodemask_t *nodemask)
+{
struct zone *zone;
struct zoneref *z;
enum zone_type high_zoneidx = gfp_zone(gfp_mask);
- nodemask_t nodes = node_states[N_HIGH_MEMORY];
+ int ret = CONSTRAINT_NONE;
- for_each_zone_zonelist(zone, z, zonelist, high_zoneidx)
- if (cpuset_zone_allowed_softwall(zone, gfp_mask))
- node_clear(zone_to_nid(zone), nodes);
- else
- return CONSTRAINT_CPUSET;
+ /*
+ * Reach here only when __GFP_NOFAIL is used. So, we should avoid
+ * to kill current.We have to random task kill in this case.
+ * Hopefully, CONSTRAINT_THISNODE...but no way to handle it, now.
+ */
+ if (gfp_mask & __GPF_THISNODE)
+ return ret;
- if (!nodes_empty(nodes))
+ /*
+ * The nodemask here is a nodemask passed to alloc_pages(). Now,
+ * cpuset doesn't use this nodemask for its hardwall/softwall/hierarchy
+ * feature. mempolicy is an only user of nodemask here.
+ * check mempolicy's nodemask contains all N_HIGH_MEMORY
+ */
+ if (nodemask && !nodes_subset(node_states[N_HIGH_MEMORY], *nodemask))
return CONSTRAINT_MEMORY_POLICY;
-#endif
+ /* Check this allocation failure is caused by cpuset's wall function */
+ for_each_zone_zonelist_nodemask(zone, z, zonelist,
+ high_zoneidx, nodemask)
+ if (!cpuset_zone_allowed_softwall(zone, gfp_mask))
+ return CONSTRAINT_CPUSET;
+
+ return CONSTRAINT_NONE;
+}
+#else
+static enum oom_constraint constrained_alloc(struct zonelist *zonelist,
+ gfp_t gfp_mask, nodemask_t *nodemask)
+{
return CONSTRAINT_NONE;
}
+#endif
/*
* Simple selection loop. We chose the process with the highest
@@ -603,7 +623,8 @@ rest_and_return:
* OR try to be smart about which process to kill. Note that we
* don't have to be perfect here, we just have to be good.
*/
-void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, int order)
+void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask,
+ int order, nodemask_t *nodemask)
{
unsigned long freed = 0;
enum oom_constraint constraint;
@@ -622,7 +643,7 @@ void out_of_memory(struct zonelist *zone
* Check if there were limitations on the allocation (only relevant for
* NUMA) that may require different handling.
*/
- constraint = constrained_alloc(zonelist, gfp_mask);
+ constraint = constrained_alloc(zonelist, gfp_mask, nodemask);
read_lock(&tasklist_lock);
switch (constraint) {
Index: mm-test-kernel/mm/page_alloc.c
===================================================================
--- mm-test-kernel.orig/mm/page_alloc.c
+++ mm-test-kernel/mm/page_alloc.c
@@ -1664,12 +1664,22 @@ __alloc_pages_may_oom(gfp_t gfp_mask, un
if (page)
goto out;
- /* The OOM killer will not help higher order allocs */
- if (order > PAGE_ALLOC_COSTLY_ORDER && !(gfp_mask & __GFP_NOFAIL))
- goto out;
-
+ if (!(gfp_mask & __GFP_NOFAIL)) {
+ /* The OOM killer will not help higher order allocs */
+ if (order > PAGE_ALLOC_COSTLY_ORDER)
+ goto out;
+ /*
+ * GFP_THISNODE contains __GFP_NORETRY and we never hit this.
+ * Sanity check for bare calls of __GFP_THISNODE, not real OOM.
+ * The caller should handle page allocation failure by itself if
+ * it specifies __GFP_THISNODE.
+ * Note: Hugepage uses it but will hit PAGE_ALLOC_COSTLY_ORDER.
+ */
+ if (gfp_mask & __GFP_THISNODE)
+ goto out;
+ }
/* Exhausted what can be done so it's blamo time */
- out_of_memory(zonelist, gfp_mask, order);
+ out_of_memory(zonelist, gfp_mask, order, nodemask);
out:
clear_zonelist_oom(zonelist, gfp_mask);
Index: mm-test-kernel/include/linux/oom.h
===================================================================
--- mm-test-kernel.orig/include/linux/oom.h
+++ mm-test-kernel/include/linux/oom.h
@@ -10,6 +10,7 @@
#ifdef __KERNEL__
#include <linux/types.h>
+#include <linux/nodemask.h>
struct zonelist;
struct notifier_block;
@@ -26,7 +27,8 @@ enum oom_constraint {
extern int try_set_zone_oom(struct zonelist *zonelist, gfp_t gfp_flags);
extern void clear_zonelist_oom(struct zonelist *zonelist, gfp_t gfp_flags);
-extern void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, int order);
+extern void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask,
+ int order, nodemask_t *mask);
extern int register_oom_notifier(struct notifier_block *nb);
extern int unregister_oom_notifier(struct notifier_block *nb);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo DeleteThis @vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/ |
|
| Back to top |
|
 |  |
| Related Topics: | Agenda for NUMA BOF @OLS & NUMA paper - I have given a number of talks about various NUMA issues in the last months and tried to put the most important points together in a paper that begins to explain NUMA from scratch and then gets into some of the current issues. That paper is available....
[PATCH] (1/43) Kconfig fix (alpha NUMA) - NUMA is broken on alpha; marked as such Signed-off-by: Al Viro <viro@parcelfarce.linux.theplanet.co.uk> ---- diff -urN RC13-rc6-git13-disable-DI/arch/alpha/Kconfig RC13-rc6-git13-alpha-NUMA/arch/alpha/Kconfig ---..
[PATCH] NUMA: broken per cpu pageset counters - The NUMA counters in struct per_cpu_pageset (linux/mmzone.h) are never cleared today. This works ok for CPU 0 on NUMA machines because boot_pageset[] is already zero, but for other CPU:s this results in uninitialized counters. Signed-off-by: Magnus Dam...
[PATCH 1/1] define node_*_pfn for non-NUMA builds - FWIW "Latest fs/proc/kcore updates" in the changelog are these from mmotm: > kcore-use-registerd-physmem-information.patch > kcore-use-registerd-physmem-information-fix.patch > kcore-use-registerd-physmem-information-checkpatch-fixes.p...
[PATCH 6/5] cpuset: rebind numa vma mempolicy fix - The patch: [PATCH 2/5] cpuset: rebind numa vma mempolicy requires this fix to avoid a deadlock situation in certain cpuset removal cases. It's ok to not complete the refresh_mems() operation if we notice we are already holding mmap_sem. We will try.. |
|
You can post new topics in this forum You can reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|
|
|