PATCH 1/2 cpusetmm-update-tasks-mems_allowed-in-time-fix Against: 2.6.30-rc3-mmotm-090424-1814 The rework of mpol_new() to extract the adjusting of the node mask to apply cpuset and mpol flags "context" breaks set_mempolicy() and mbind() with MPOL_PREFERRED and a NULL nodemask--i.e., explicit local allocation. Fix this by adding the check for MPOL_PREFERRED and empty node mask to mpol_new_mpolicy(). Remove the now unneeded 'nodes = NULL' from mpol_new(). Note that mpol_new_mempolicy() is always called with a non-NULL 'nodes' parameter now that it has been removed from mpol_new(). Therefore, we don't need to test nodes for NULL before testing it for 'empty'. However, just to be extra paranoid, add a VM_BUG_ON() to verify this assumption. Tested on x86_64 with numactl-2.0.3-rc2+ regression test. Signed-off-by: Lee Schermerhorn <lee.schermerhorn@xxxxxx> mm/mempolicy.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) Index: linux-2.6.30-rc3-mmotm-090424-1814/mm/mempolicy.c =================================================================== --- linux-2.6.30-rc3-mmotm-090424-1814.orig/mm/mempolicy.c 2009-04-27 13:42:53.000000000 -0400 +++ linux-2.6.30-rc3-mmotm-090424-1814/mm/mempolicy.c 2009-04-28 13:32:32.000000000 -0400 @@ -182,8 +182,9 @@ static int mpol_new_bind(struct mempolic return 0; } /* - * This function is called after mpol_new(). The parameter -- nodes needn't - * been check because mpol_new() has done it. Maybe this implement is ugly. + * This function is called after mpol_new(). mpol_new() has already validated + * the nodes parameter with respect to the policy mode and flags. But, we + * need to handle an empty nodemaks with MPOL_PREFERRED here. * * We use task's alloc_lock to protect task's mems_allowed and mempolicy. * so this function should be called with task's alloc_lock held. @@ -197,7 +198,10 @@ static int mpol_new_mempolicy(struct mem if (pol == NULL) return 0; - if (nodes) { + VM_BUG_ON(!nodes); + if (pol->mode == MPOL_PREFERRED && nodes_empty(*nodes)) + nodes = NULL; /* explicit local allocation */ + else { if (pol->flags & MPOL_F_RELATIVE_NODES) mpol_relative_nodemask(&cpuset_context_nmask, nodes, &cpuset_current_mems_allowed); @@ -243,7 +247,6 @@ static struct mempolicy *mpol_new(unsign if (((flags & MPOL_F_STATIC_NODES) || (flags & MPOL_F_RELATIVE_NODES))) return ERR_PTR(-EINVAL); - nodes = NULL; /* flag local alloc */ } } else if (nodes_empty(*nodes)) return ERR_PTR(-EINVAL); -- To unsubscribe from this list: send the line "unsubscribe linux-numa" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html