summary refs log tree commit diff
path: root/mm
diff options
context:
space:
mode:
authorChristoph Lameter <clameter@engr.sgi.com>2006-01-18 17:42:37 -0800
committerLinus Torvalds <torvalds@g5.osdl.org>2006-01-18 19:20:18 -0800
commit86c562a9d6683063e071692fe14e0a18e64ee1be (patch)
treedd64f8bff4624f17f2245aeadf962e0d6d5974a0 /mm
parentdc85da15d42b0efc792b0f5eab774dc5dbc1ceec (diff)
downloadlinux-86c562a9d6683063e071692fe14e0a18e64ee1be.tar.gz
[PATCH] mm: optimize numa policy handling in slab allocator
Move the interrupt check from slab_node into ___cache_alloc and adds an
"unlikely()" to avoid pipeline stalls on some architectures.

Signed-off-by: Christoph Lameter <clameter@sgi.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'mm')
-rw-r--r--mm/mempolicy.c3
-rw-r--r--mm/slab.c2
2 files changed, 1 insertions, 4 deletions
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
index 71430d440822..73790188b0eb 100644
--- a/mm/mempolicy.c
+++ b/mm/mempolicy.c
@@ -982,9 +982,6 @@ static unsigned interleave_nodes(struct mempolicy *policy)
  */
 unsigned slab_node(struct mempolicy *policy)
 {
-	if (in_interrupt())
-		return numa_node_id();
-
 	switch (policy->policy) {
 	case MPOL_INTERLEAVE:
 		return interleave_nodes(policy);
diff --git a/mm/slab.c b/mm/slab.c
index 9025608696ec..6f8495e2185b 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -2574,7 +2574,7 @@ static inline void *____cache_alloc(kmem_cache_t *cachep, gfp_t flags)
 	struct array_cache *ac;
 
 #ifdef CONFIG_NUMA
-	if (current->mempolicy) {
+	if (unlikely(current->mempolicy && !in_interrupt())) {
 		int nid = slab_node(current->mempolicy);
 
 		if (nid != numa_node_id())