cpusets: replace zone allowed functions with node allowed

The cpuset_zone_allowed() variants are actually only a function of the
zone's node.

Cc: Paul Menage <menage@google.com>
Acked-by: Christoph Lameter <cl@linux-foundation.org>
Cc: Randy Dunlap <randy.dunlap@oracle.com>
Signed-off-by: David Rientjes <rientjes@google.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
David Rientjes 2009-04-02 16:57:54 -07:00 committed by Linus Torvalds
parent 7f81b1ae18
commit a1bc5a4eee
2 changed files with 52 additions and 40 deletions

View File

@ -12,6 +12,7 @@
#include <linux/cpumask.h> #include <linux/cpumask.h>
#include <linux/nodemask.h> #include <linux/nodemask.h>
#include <linux/cgroup.h> #include <linux/cgroup.h>
#include <linux/mm.h>
#ifdef CONFIG_CPUSETS #ifdef CONFIG_CPUSETS
@ -29,19 +30,29 @@ void cpuset_init_current_mems_allowed(void);
void cpuset_update_task_memory_state(void); void cpuset_update_task_memory_state(void);
int cpuset_nodemask_valid_mems_allowed(nodemask_t *nodemask); int cpuset_nodemask_valid_mems_allowed(nodemask_t *nodemask);
extern int __cpuset_zone_allowed_softwall(struct zone *z, gfp_t gfp_mask); extern int __cpuset_node_allowed_softwall(int node, gfp_t gfp_mask);
extern int __cpuset_zone_allowed_hardwall(struct zone *z, gfp_t gfp_mask); extern int __cpuset_node_allowed_hardwall(int node, gfp_t gfp_mask);
static int inline cpuset_zone_allowed_softwall(struct zone *z, gfp_t gfp_mask) static inline int cpuset_node_allowed_softwall(int node, gfp_t gfp_mask)
{ {
return number_of_cpusets <= 1 || return number_of_cpusets <= 1 ||
__cpuset_zone_allowed_softwall(z, gfp_mask); __cpuset_node_allowed_softwall(node, gfp_mask);
} }
static int inline cpuset_zone_allowed_hardwall(struct zone *z, gfp_t gfp_mask) static inline int cpuset_node_allowed_hardwall(int node, gfp_t gfp_mask)
{ {
return number_of_cpusets <= 1 || return number_of_cpusets <= 1 ||
__cpuset_zone_allowed_hardwall(z, gfp_mask); __cpuset_node_allowed_hardwall(node, gfp_mask);
}
static inline int cpuset_zone_allowed_softwall(struct zone *z, gfp_t gfp_mask)
{
return cpuset_node_allowed_softwall(zone_to_nid(z), gfp_mask);
}
static inline int cpuset_zone_allowed_hardwall(struct zone *z, gfp_t gfp_mask)
{
return cpuset_node_allowed_hardwall(zone_to_nid(z), gfp_mask);
} }
extern int cpuset_mems_allowed_intersects(const struct task_struct *tsk1, extern int cpuset_mems_allowed_intersects(const struct task_struct *tsk1,
@ -112,6 +123,16 @@ static inline int cpuset_nodemask_valid_mems_allowed(nodemask_t *nodemask)
return 1; return 1;
} }
static inline int cpuset_node_allowed_softwall(int node, gfp_t gfp_mask)
{
return 1;
}
static inline int cpuset_node_allowed_hardwall(int node, gfp_t gfp_mask)
{
return 1;
}
static inline int cpuset_zone_allowed_softwall(struct zone *z, gfp_t gfp_mask) static inline int cpuset_zone_allowed_softwall(struct zone *z, gfp_t gfp_mask)
{ {
return 1; return 1;

View File

@ -2181,26 +2181,24 @@ static const struct cpuset *nearest_hardwall_ancestor(const struct cpuset *cs)
} }
/** /**
* cpuset_zone_allowed_softwall - Can we allocate on zone z's memory node? * cpuset_node_allowed_softwall - Can we allocate on a memory node?
* @z: is this zone on an allowed node? * @node: is this an allowed node?
* @gfp_mask: memory allocation flags * @gfp_mask: memory allocation flags
* *
* If we're in interrupt, yes, we can always allocate. If * If we're in interrupt, yes, we can always allocate. If __GFP_THISNODE is
* __GFP_THISNODE is set, yes, we can always allocate. If zone * set, yes, we can always allocate. If node is in our task's mems_allowed,
* z's node is in our tasks mems_allowed, yes. If it's not a * yes. If it's not a __GFP_HARDWALL request and this node is in the nearest
* __GFP_HARDWALL request and this zone's nodes is in the nearest * hardwalled cpuset ancestor to this task's cpuset, yes. If the task has been
* hardwalled cpuset ancestor to this tasks cpuset, yes. * OOM killed and has access to memory reserves as specified by the TIF_MEMDIE
* If the task has been OOM killed and has access to memory reserves * flag, yes.
* as specified by the TIF_MEMDIE flag, yes.
* Otherwise, no. * Otherwise, no.
* *
* If __GFP_HARDWALL is set, cpuset_zone_allowed_softwall() * If __GFP_HARDWALL is set, cpuset_node_allowed_softwall() reduces to
* reduces to cpuset_zone_allowed_hardwall(). Otherwise, * cpuset_node_allowed_hardwall(). Otherwise, cpuset_node_allowed_softwall()
* cpuset_zone_allowed_softwall() might sleep, and might allow a zone * might sleep, and might allow a node from an enclosing cpuset.
* from an enclosing cpuset.
* *
* cpuset_zone_allowed_hardwall() only handles the simpler case of * cpuset_node_allowed_hardwall() only handles the simpler case of hardwall
* hardwall cpusets, and never sleeps. * cpusets, and never sleeps.
* *
* The __GFP_THISNODE placement logic is really handled elsewhere, * The __GFP_THISNODE placement logic is really handled elsewhere,
* by forcibly using a zonelist starting at a specified node, and by * by forcibly using a zonelist starting at a specified node, and by
@ -2239,20 +2237,17 @@ static const struct cpuset *nearest_hardwall_ancestor(const struct cpuset *cs)
* GFP_USER - only nodes in current tasks mems allowed ok. * GFP_USER - only nodes in current tasks mems allowed ok.
* *
* Rule: * Rule:
* Don't call cpuset_zone_allowed_softwall if you can't sleep, unless you * Don't call cpuset_node_allowed_softwall if you can't sleep, unless you
* pass in the __GFP_HARDWALL flag set in gfp_flag, which disables * pass in the __GFP_HARDWALL flag set in gfp_flag, which disables
* the code that might scan up ancestor cpusets and sleep. * the code that might scan up ancestor cpusets and sleep.
*/ */
int __cpuset_node_allowed_softwall(int node, gfp_t gfp_mask)
int __cpuset_zone_allowed_softwall(struct zone *z, gfp_t gfp_mask)
{ {
int node; /* node that zone z is on */
const struct cpuset *cs; /* current cpuset ancestors */ const struct cpuset *cs; /* current cpuset ancestors */
int allowed; /* is allocation in zone z allowed? */ int allowed; /* is allocation in zone z allowed? */
if (in_interrupt() || (gfp_mask & __GFP_THISNODE)) if (in_interrupt() || (gfp_mask & __GFP_THISNODE))
return 1; return 1;
node = zone_to_nid(z);
might_sleep_if(!(gfp_mask & __GFP_HARDWALL)); might_sleep_if(!(gfp_mask & __GFP_HARDWALL));
if (node_isset(node, current->mems_allowed)) if (node_isset(node, current->mems_allowed))
return 1; return 1;
@ -2281,15 +2276,15 @@ int __cpuset_zone_allowed_softwall(struct zone *z, gfp_t gfp_mask)
} }
/* /*
* cpuset_zone_allowed_hardwall - Can we allocate on zone z's memory node? * cpuset_node_allowed_hardwall - Can we allocate on a memory node?
* @z: is this zone on an allowed node? * @node: is this an allowed node?
* @gfp_mask: memory allocation flags * @gfp_mask: memory allocation flags
* *
* If we're in interrupt, yes, we can always allocate. * If we're in interrupt, yes, we can always allocate. If __GFP_THISNODE is
* If __GFP_THISNODE is set, yes, we can always allocate. If zone * set, yes, we can always allocate. If node is in our task's mems_allowed,
* z's node is in our tasks mems_allowed, yes. If the task has been * yes. If the task has been OOM killed and has access to memory reserves as
* OOM killed and has access to memory reserves as specified by the * specified by the TIF_MEMDIE flag, yes.
* TIF_MEMDIE flag, yes. Otherwise, no. * Otherwise, no.
* *
* The __GFP_THISNODE placement logic is really handled elsewhere, * The __GFP_THISNODE placement logic is really handled elsewhere,
* by forcibly using a zonelist starting at a specified node, and by * by forcibly using a zonelist starting at a specified node, and by
@ -2297,20 +2292,16 @@ int __cpuset_zone_allowed_softwall(struct zone *z, gfp_t gfp_mask)
* any node on the zonelist except the first. By the time any such * any node on the zonelist except the first. By the time any such
* calls get to this routine, we should just shut up and say 'yes'. * calls get to this routine, we should just shut up and say 'yes'.
* *
* Unlike the cpuset_zone_allowed_softwall() variant, above, * Unlike the cpuset_node_allowed_softwall() variant, above,
* this variant requires that the zone be in the current tasks * this variant requires that the node be in the current task's
* mems_allowed or that we're in interrupt. It does not scan up the * mems_allowed or that we're in interrupt. It does not scan up the
* cpuset hierarchy for the nearest enclosing mem_exclusive cpuset. * cpuset hierarchy for the nearest enclosing mem_exclusive cpuset.
* It never sleeps. * It never sleeps.
*/ */
int __cpuset_node_allowed_hardwall(int node, gfp_t gfp_mask)
int __cpuset_zone_allowed_hardwall(struct zone *z, gfp_t gfp_mask)
{ {
int node; /* node that zone z is on */
if (in_interrupt() || (gfp_mask & __GFP_THISNODE)) if (in_interrupt() || (gfp_mask & __GFP_THISNODE))
return 1; return 1;
node = zone_to_nid(z);
if (node_isset(node, current->mems_allowed)) if (node_isset(node, current->mems_allowed))
return 1; return 1;
/* /*